Einen zufälligen Weg simulieren

8

Xn kann Werte von -1 oder 1 mit einer Wahrscheinlichkeit von 0,5 annehmen. Und Sn = Sn-1 + Xn Wie kann ich berechnen? die zur Zeit n beobachtete Partialsumme, gegeben durch Sn = X1 + X2 +::: + Xn. Ich versuche hier einen zufälligen Spaziergang zu simulieren. Ich habe Folgendes getan, aber ich bin mir nicht ganz sicher, ob es richtig ist:

%Vor%

Bitte helfen Sie!

    
user3347124 24.02.2014, 14:51
quelle

4 Antworten

3

Diese Antwort soll nur erklären, warum Ihr Code nicht funktioniert hat. @ Jake-Burkhead gab den Weg, wie Sie eigentlich den Code schreiben sollten.

In diesem Code machen Sie nur die Hälfte der Zeit. Dies liegt daran, dass Sie aus xdir abtasten, um zu entscheiden, ob Sie sich bewegen oder nicht. Stattdessen würde ich Ihnen Folgendes in Ihrer Schleife empfehlen:

%Vor%

Der sample(step, 1) Aufruf entscheidet, ob der Weg sich bewegt 1 oder -1 .

Um die Partialsummen zu berechnen, können Sie cumsum() verwenden, nachdem Sie x generiert haben. Das Ergebnis ist ein Vektor der Partialsummen an einem bestimmten Punkt im Schritt.

    
Christopher Louden 24.02.2014, 14:59
quelle
33

Sie können dies auch sehr präzise und effizient mit cumsum

tun %Vor%

    
Jake Burkhead 24.02.2014 15:01
quelle
2

Dieser Beitrag bezieht sich auf Zeiten verschiedener Basis-R-Methoden für diese Berechnung. Dieser Beitrag ist inspiriert von Kommentaren zu diesem Beitrag und dem Kommentar von @josilber in der Post an die schnellste von Jake Burkhead gepostete Methode.

Im Folgenden wird eine Vielzahl von Methoden zur Berechnung des Random Walks verwendet. Um dies zu erreichen, zieht jede Funktion 1000 Werte von 1 oder -1, wie in fnc unten definiert. Der Zeittest verwendet microbenchmark mit 1000 Replikationen für jede Methode.

%Vor%

Hier,

  • "all" verwendet den Vorschlag von Jake Burkhead, cumsum und zieht die Probe auf einmal.
  • "reduce" zieht das Sample auf einmal, verwendet aber Reduce , um die Summierung durchzuführen.
  • laplyRpCln verwendet lapply und unlist , um einen Vektor zurückzugeben, und durchläuft 1000 Instanzen von 1, wobei die Funktion direkt über den Namen aufgerufen wird.
  • laplyRpAn unterscheidet sich in der Verwendung einer anonymen Funktion.
  • laplySqAn verwendet eine anonyme Funktion und erstellt die iterierende Variable mit seq anstatt mit rep .
  • saplyRpCln, laplyRpAn, laplySqAn sind die gleichen wie laplyRpCln usw., außer dass sapply anstelle von lapply / unlist .
  • aufgerufen wird
  • vaplyRpCln usw. sind die gleichen wie laplyRpCln usw., außer dass vapply anstelle von lapply / unlist .
  • verwendet wird
  • replicate ist ein Aufruf von replicate , wobei der Standardwert simply = TRUE ist.
  • forPre verwendet eine for -Schleife, die den Vektor vorlistet und ihn einfüllt.
  • forNoPre verwendet eine for -Schleife, die einen leeren numeric(0) -Vektor erstellt und dann c verwendet, um mit diesem Vektor zu verketten.

Dies gibt

zurück %Vor%

Beachten Sie, dass die erste Methode eindeutig die schnellste ist. Anschließend wird die gesamte Probe auf einmal gezogen und dann Reduce zur Durchführung der Summierung verwendet. Unter den *apply -Funktionen scheinen die "sauberen" Versionen, die den Namen der Funktion verwenden, direkt eine geringfügige Leistungsverbesserung zu haben, und die lapply -Version scheint mit vapply gleich zu sein, aber mit dem Wertebereich , diese Schlussfolgerung ist nicht ganz einfach. sapply scheint am langsamsten zu sein, obwohl die Methode des Funktionsaufrufs den Typ von *apply function dominiert.

Die beiden for -Schleifen erzielten das schlechteste Ergebnis und die vorberechnete for -Schleife übertraf die for -Schleife mit c .

Hier läuft eine gepatchte Version von 3.4.1 (gepatcht am 23. August 2017) auf openSuse 42.1.

Bitte lassen Sie mich wissen, wenn Sie irgendwelche Fehler sehen, und ich werde sie beheben, sobald ich kann. Danke an Ben Bolker, dass er mich angestachelt hat, um die letzte Funktion genauer zu untersuchen, wo ich ein paar Bugs gefunden habe.

    
lmo 27.08.2017 00:10
quelle
0
___ answer21991340 ___

Sie können dies auch sehr präzise und effizient mit %code%

tun %Vor%

    
___ answer219999575 ___

Hier eine Möglichkeit, es zu tun.

%Vor%     
___ tag123r ___ R ist eine freie, quelloffene Programmiersprache und Softwareumgebung für statistische Berechnungen, Bioinformatik, Visualisierung und allgemeine Datenverarbeitung. Stellen Sie minimale, reproduzierbare, repräsentative Beispiele für Ihre Fragen bereit. Verwenden Sie dput () für Daten und geben Sie alle Nicht-Basis-Pakete mit Bibliotheksaufrufen an. Bilder für Daten oder Code nicht einbetten, eingerückte Codeblöcke verwenden. Verwenden Sie für statistische Fragen http://stats.stackexchange.com. ___ qstnhdr ___ Einen zufälligen Weg simulieren ___ answer45900693 ___

Dieser Beitrag bezieht sich auf Zeiten verschiedener Basis-R-Methoden für diese Berechnung. Dieser Beitrag ist inspiriert von Kommentaren zu diesem Beitrag und dem Kommentar von @josilber in der Post an die schnellste von Jake Burkhead gepostete Methode.

Im Folgenden wird eine Vielzahl von Methoden zur Berechnung des Random Walks verwendet. Um dies zu erreichen, zieht jede Funktion 1000 Werte von 1 oder -1, wie in %code% unten definiert. Der Zeittest verwendet %code% mit 1000 Replikationen für jede Methode.

%Vor%

Hier,

  • "all" verwendet den Vorschlag von Jake Burkhead, %code% und zieht die Probe auf einmal.
  • "reduce" zieht das Sample auf einmal, verwendet aber %code% , um die Summierung durchzuführen.
  • laplyRpCln verwendet %code% und %code% , um einen Vektor zurückzugeben, und durchläuft 1000 Instanzen von 1, wobei die Funktion direkt über den Namen aufgerufen wird.
  • laplyRpAn unterscheidet sich in der Verwendung einer anonymen Funktion.
  • laplySqAn verwendet eine anonyme Funktion und erstellt die iterierende Variable mit %code% anstatt mit %code% .
  • saplyRpCln, laplyRpAn, laplySqAn sind die gleichen wie laplyRpCln usw., außer dass %code% anstelle von %code% / %code% .
  • aufgerufen wird
  • vaplyRpCln usw. sind die gleichen wie laplyRpCln usw., außer dass %code% anstelle von %code% / %code% .
  • verwendet wird
  • replicate ist ein Aufruf von %code% , wobei der Standardwert simply = TRUE ist.
  • forPre verwendet eine %code% -Schleife, die den Vektor vorlistet und ihn einfüllt.
  • forNoPre verwendet eine %code% -Schleife, die einen leeren %code% -Vektor erstellt und dann %code% verwendet, um mit diesem Vektor zu verketten.

Dies gibt

zurück %Vor%

Beachten Sie, dass die erste Methode eindeutig die schnellste ist. Anschließend wird die gesamte Probe auf einmal gezogen und dann %code% zur Durchführung der Summierung verwendet. Unter den %code% -Funktionen scheinen die "sauberen" Versionen, die den Namen der Funktion verwenden, direkt eine geringfügige Leistungsverbesserung zu haben, und die %code% -Version scheint mit %code% gleich zu sein, aber mit dem Wertebereich , diese Schlussfolgerung ist nicht ganz einfach. %code% scheint am langsamsten zu sein, obwohl die Methode des Funktionsaufrufs den Typ von %code% function dominiert.

Die beiden %code% -Schleifen erzielten das schlechteste Ergebnis und die vorberechnete %code% -Schleife übertraf die %code% -Schleife mit %code% .

Hier läuft eine gepatchte Version von 3.4.1 (gepatcht am 23. August 2017) auf openSuse 42.1.

Bitte lassen Sie mich wissen, wenn Sie irgendwelche Fehler sehen, und ich werde sie beheben, sobald ich kann. Danke an Ben Bolker, dass er mich angestachelt hat, um die letzte Funktion genauer zu untersuchen, wo ich ein paar Bugs gefunden habe.

    
___ qstntxt ___

Xn kann Werte von -1 oder 1 mit einer Wahrscheinlichkeit von 0,5 annehmen. Und Sn = Sn-1 + Xn Wie kann ich berechnen? die zur Zeit n beobachtete Partialsumme, gegeben durch Sn = X1 + X2 +::: + Xn. Ich versuche hier einen zufälligen Spaziergang zu simulieren. Ich habe Folgendes getan, aber ich bin mir nicht ganz sicher, ob es richtig ist:

%Vor%

Bitte helfen Sie!

    
___ tag123randomwalk ___ Ein Random Walk ist eine mathematische Formalisierung eines Pfades, der aus einer Abfolge von zufälligen Schritten besteht. Ein Random Walk kann eine Markov-Kette oder ein Markov-Prozess sein; Es kann sich um eine Grafik oder eine Gruppe handeln. Zufällige Wanderungen können randomisierte Prozesse in Bereichen wie Ökologie, Ökonomie, Psychologie, Informatik, Physik, Chemie und Biologie modellieren. ___ answer21991302 ___

Diese Antwort soll nur erklären, warum Ihr Code nicht funktioniert hat. @ Jake-Burkhead gab den Weg, wie Sie eigentlich den Code schreiben sollten.

In diesem Code machen Sie nur die Hälfte der Zeit. Dies liegt daran, dass Sie aus %code% abtasten, um zu entscheiden, ob Sie sich bewegen oder nicht. Stattdessen würde ich Ihnen Folgendes in Ihrer Schleife empfehlen:

%Vor%

Der %code% Aufruf entscheidet, ob der Weg sich bewegt %code% oder %code% .

Um die Partialsummen zu berechnen, können Sie %code% verwenden, nachdem Sie %code% generiert haben. Das Ergebnis ist ein Vektor der Partialsummen an einem bestimmten Punkt im Schritt.

    
___
shahram 24.02.2014 21:38
quelle

Tags und Links