我被要求“将x模拟为独立的同分布(iid)正常变量,其中均值= 0,std = 1.5,样本长度为500”
我正在通过以下两种方式进行抽样:
set.seed(8402)
X <- rnorm(500, 0, 1.5)
head(X)
我得到了
-1.8297969 -0.1862884 1.4219400 -1.0841421 -1.5276701 1.6159368
然而,如果我这样做
X <- replicate(500, rnorm(1,0,1.5))
head(X)
我得到了
-0.04032755 0.92002552 -2.28001943 -1.36840869 1.49820718 0.06205003
我的问题是生成iid正常变量的正确方法是什么?这两种方式有什么区别?
非常感谢!
答案 0 :(得分:2)
R内部
在R内部,<Rmath.h>: double rnorm (double mean, double sd)
函数的C函数一次生成一个随机数。当您调用其R包装函数rnorm(n, mean, sd)
时,它会调用C级函数n
次。
这与使用n = 1
仅调用R级功能一次相同,但使用n
复制replicate
次。
第一种方法要快得多(当n
非常大时可能会出现差异),因为一切都是在C级完成的。 replicate
是sapply
的包装器,因此它不是一个矢量化函数(在Is the "*apply" family really not vectorized?上读取)。
此外,如果为两者设置相同的随机种子,您将获得相同的随机数集。
更具说明性的实验
在下面的评论中,我说随机种子只在入口时设置一次。为了帮助人们理解这一点,我提供了这个例子。无需使用大型n
。 n = 4
就足够了。
首先,让种子设为0,同时生成4个标准正常样本:
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
这就是我的意思&#34; entry&#34;。