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!
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:
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.
Sie können dies auch sehr präzise und effizient mit cumsum
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.
Hier,
cumsum
und zieht die Probe auf einmal. Reduce
, um die Summierung durchzuführen. lapply
und unlist
, um einen Vektor zurückzugeben, und durchläuft 1000 Instanzen von 1, wobei die Funktion direkt über den Namen aufgerufen wird. seq
anstatt mit rep
. sapply
anstelle von lapply
/ unlist
. vapply
anstelle von lapply
/ unlist
. replicate
, wobei der Standardwert simply = TRUE ist. for
-Schleife, die den Vektor vorlistet und ihn einfüllt. 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.
Sie können dies auch sehr präzise und effizient mit %code%
tun %Vor%
Hier eine Möglichkeit, es zu tun.
%Vor%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,
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.
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!
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.
Tags und Links r random-walk