2016-04-05 10 views
1

werde ich gefragt, in den folgenden zwei Möglichkeiten, um „zu simulieren x als unabhängige identisch verteilte (iid) Normalvariable mit dem Mittelwert = 0, std = 1,5 mit Probenlänge 500“Was ist der Unterschied zwischen replyate n mal und n direkt in Stichprobe von R generieren?

ich die Probenahme tue:

set.seed(8402) 
X <- rnorm(500, 0, 1.5) 
head(X) 

und ich bekam

-1.8297969 -0.1862884 1.4219400 -1.0841421 -1.5276701 1.6159368 

wenn ich jedoch

X <- replicate(500, rnorm(1,0,1.5)) 
head(X) 
tun

und ich bekam

-0.04032755 0.92002552 -2.28001943 -1.36840869 1.49820718 0.06205003 

Meine Frage ist, was der richtige Weg ist iid normale Variable zu generieren? Was ist der Unterschied zwischen diesen beiden Möglichkeiten?

Vielen Dank!

+1

Ausführen Ihres Codes Ich erhalte das gleiche Ergebnis auf beide Arten (wie erwartet). Ich erhalte Ihr zweites Ergebnis, wenn ich den Zufallssatz nicht zum zweiten Mal setze. Der erste Weg ist effizienter und daher empfehlenswert. – Roland

+0

@Roland Können Sie erklären, was Sie meinen, indem Sie den Zufallssamen das zweite Mal setzen? – zack

+0

@AlphaBetaGamma Danke! – zack

Antwort

2

R Internal

intern R, die C-Funktion aus <Rmath.h>: double rnorm (double mean, double sd) Funktion erzeugt eine Zufallszahl zu einer Zeit. Wenn Sie die R-Wrapper-Funktion rnorm(n, mean, sd) aufrufen, ruft sie die C-Level-Funktion n mal auf.

Dies ist das gleiche wie Sie R-Funktion nur einmal mit n = 1 aufrufen, aber replizieren Sie es n mal mit .

Die erste Methode ist viel schneller (möglicherweise wird der Unterschied gesehen werden, wenn n wirklich groß ist), da alles auf C-Ebene getan wird. replicate ist jedoch ein Wrapper von sapply, so ist es nicht wirklich eine vektorisierte Funktion (lesen Sie Is the "*apply" family really not vectorized?).

Wenn Sie für beide den gleichen zufälligen Startwert festlegen, erhalten Sie denselben Satz von Zufallszahlen.


Ein anschauliches Experiment

In meinem Kommentar unten, sage ich, dass zufällige Samen nur einmal auf Eintrag gesetzt ist. Um Menschen zu helfen, dies zu verstehen, stelle ich dieses Beispiel vor. Es ist nicht notwendig, große n zu verwenden. n = 4 ist ausreichend.

Lassen Sie uns zuerst gesetzt Samen bei 0, während 4-Standard normalen Proben zu erzeugen:

set.seed(0); rnorm(4, 0, 1) 
## we get 
[1] 1.2629543 -0.3262334 1.3297993 1.2724293 

Beachten Sie, dass in diesem Fall alle vier Zahlen aus dem Eintrag Samen 0.

Jetzt erhalten werden, lassen Sie uns tun dies:

set.seed(0) 
rnorm(2, 0, 1) 
## we get 
[1] 1.2629543 -0.3262334 
## do not reset seed, but continue with the previous seed 
replicate(2, rnorm(1, 0, 1)) 
## we get 
[1] 1.329799 1.272429 

Sehen Sie?

Aber wenn wir Samen in der Mitte zurückzusetzen, zum Beispiel, setzen Sie ihn auf 0 zurück

set.seed(0) 
rnorm(2, 0, 1) 
## we get 
[1] 1.2629543 -0.3262334 
## reset seed 
set.seed(0) 
replicate(2, rnorm(1, 0, 1)) 
## we get 
[1] 1.2629543 -0.3262334 

Dies ist, was ich mit „Eintrag“ bedeuten.

+0

Warum ist es ein Unterschied, wenn ich set.seed (8402) einmal verwende? – zack

+0

Verstanden! Vielen Dank! – zack

Verwandte Themen