2016-04-05 18 views
1

私は、「サンプル長と平均= 0、STD = 1.5を持つ独立同一分布(IID)通常の変数としてのxをシミュレート500」を求められますRのサンプリングで複製n回とnを直接生成する違いは何ですか?

私は二つの方法以下でサンプリングをしています:

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

と私は

X <- replicate(500, rnorm(1,0,1.5)) 
head(X) 
を行う場合、私は、しかし

-1.8297969 -0.1862884 1.4219400 -1.0841421 -1.5276701 1.6159368 

を得ました

と私は私の質問は、IID通常の変数を生成するための正しい方法は何であるかである

-0.04032755 0.92002552 -2.28001943 -1.36840869 1.49820718 0.06205003 

を得ましたか。これら2つの方法の違いは何ですか?

多くの感謝! Rの内部

+1

コードを実行すると、(期待どおり)両方の方法で同じ結果が得られます。 2回目のランダムシードを設定しないと、2番目の結果が得られます。最初の方法はより効率的で推奨される方法です。 – Roland

+0

@Roland「ランダムシードを2回目に設定する」とはどういう意味ですか? – zack

+0

@AlphaBetaGammaありがとう! – zack

答えて

2

R内部

<Rmath.h>: double rnorm (double mean, double sd)機能からC機能は、一度に1つの乱数を生成します。 Rラッパー関数rnorm(n, mean, sd)を呼び出すと、Cレベル関数n回が呼び出されます。

これはn = 1でRレベル機能を1回だけ呼び出すのと同じですが、n回をreplicateで複製します。

最初の方法ははるかに高速です(nが本当に大きい場合は違いが見られます)。すべてがCレベルで行われるためです。 replicateしかし、sapplyのラッパーなので、実際にベクトル化された関数ではありません(Is the "*apply" family really not vectorized?で読む)。

さらに、両方に同じランダムシードを設定した場合、同じ乱数セットを取得します。以下の私のコメントで


以上の実験例

、私はランダムシードが唯一のエントリで一度設定されていることを言います。人々がこれを理解するのを助けるために、私はこの例を提供します。大きいnを使用する必要はありません。 n = 4で十分です。この場合、すべての4つの数字が0

今エントリ種子から得られること

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

注、みましょう:

最初に、4個の標準の正常なサンプルを生成しながらのは、0にシードを設定できこれを行う:

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 

を参照してください。

しかし、私たちは途中でシードをリセットした場合、例えば、これは私が「エントリ」によって何を意味するかであるバック0

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 

に設定します。

+0

set.seed(8402)を1回使用すると違いはなんですか? – zack

+0

ありがとう! – zack

関連する問題