重复n次和直接在R的采样中生成n有什么区别?

时间:2016-04-05 13:54:23

标签: r statistics

我被要求“将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正常变量的正确方法是什么?这两种方式有什么区别?

非常感谢!

1 个答案:

答案 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级完成的。 replicatesapply的包装器,因此它不是一个矢量化函数(在Is the "*apply" family really not vectorized?上读取)。

此外,如果为两者设置相同的随机种子,您将获得相同的随机数集。

更具说明性的实验

在下面的评论中,我说随机种子只在入口时设置一次。为了帮助人们理解这一点,我提供了这个例子。无需使用大型nn = 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;。