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

在R的采样中,重复n次和直接生成n有什么区别?,r,statistics,R,Statistics,我被要求“将x模拟为独立同分布(iid)正态变量,平均值为0,标准值为1.5,样本长度为500” 我通过以下两种方式进行采样: set.seed(8402) X <- rnorm(500, 0, 1.5) head(X) 然而,如果我这样做 X <- replicate(500, rnorm(1,0,1.5)) head(X) 我的问题是,生成iid正态变量的正确方法是什么?这两种方式有什么区别 非常感谢 R内部 在R内部,来自:double rnorm(double mean,

我被要求“将x模拟为独立同分布(iid)正态变量,平均值为0,标准值为1.5,样本长度为500”

我通过以下两种方式进行采样:

set.seed(8402)
X <- rnorm(500, 0, 1.5)
head(X)
然而,如果我这样做

X <- replicate(500, rnorm(1,0,1.5))
head(X)
我的问题是,生成iid正态变量的正确方法是什么?这两种方式有什么区别


非常感谢

R内部

在R内部,来自
:double rnorm(double mean,double sd)
函数的C函数一次生成一个随机数。当您调用它的R包装函数时,它调用C级函数
n

这与您仅使用
n=1
调用R级函数一次相同,但使用
replicate
将其复制
n

第一种方法要快得多(当
n
非常大时,可能会看到差异),因为所有操作都是在C级别完成的
replicate
不过,它是
sapply
的包装器,因此它不是真正的矢量化函数(请继续阅读)

此外,如果为这两个设置相同的随机种子,则将得到相同的随机数集


更具说明性的实验

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

这就是我所说的“entry”(输入)的意思。

运行代码时,两种方法都会得到相同的结果(正如预期的那样)。如果我没有第二次设置随机种子,我会得到你的第二个结果。第一种方法更有效,因此建议使用。@Roland您能解释一下“第二次设置随机种子”是什么意思吗?如果您完全按照问题中提供的方式运行代码,您将无法获得所显示的输出。计算机不太擅长随机数,因为它们实际上不会生成随机数。要测试这一点,请设置一个随机种子,如
set.seed(42)
,然后运行
rnorm(1)
5次(不使用复制)。它们看起来像随机数。现在,再次运行
set.seed(42)
,然后再运行
rnorm(1)
5次。你会注意到它们与你以前得到的数字完全相同。通过第二次运行
set.seed
,您可以“重新启动”R从中提取的数字列表。这就是为什么如果只使用一次
set.seed
,结果会有所不同。
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
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