【发布时间】:2018-06-03 19:35:32
【问题描述】:
当我尝试复制结果时,我有一个问题,我想出了一个问题。
l <- {}
for(i in 1:3){
set.seed(1)
l[i] <- rnorm(n = 1, i, i)
}
这会产生
0.3735462 0.7470924 1.1206386
但是,如果我写
set.seed(1)
rnorm(n = 3, 1:3, 1:3)
0.3735462 2.3672866 0.4931142
或者
set.seed(1)
rmvnorm(n = 1, 1:3, sqrt(diag(1:3)))
0.3735462 2.21839 1.900251
我没有得到相同的结果。有什么问题? 我的目标是矢量化 for 循环,这就是我提出问题的原因。
更新
下面的答案解释了它如何适用于 rnorm 并且应该适用于 R 中的所有随机数生成器,但是当我使用 rgig 尝试这种方法时(广义逆高斯分发)我又遇到了一个问题。
l <- {}
for(i in 1:3){
set.seed(1)
l[i] <- rgig(n = i, i, i, i)[i]
}
1.629091 1.500733 1.564364
如果我使用
set.seed(1)
rgig(n = 3, 1:3, 1:3, 1:3)
1.629091 1.440166 3.264135
当我使用时
sapply(1:3,function(x){set.seed(1);rgig(x,x,x,x)})
它没有显示与 rnorm 类似的模式。 我假设它 rgig 不支持矢量化,因为如果我们写:
set.seed(1)
rgig(n = 3, 1, 1, 1)
1.629091 1.440166 3.264135
与矢量化的相同之处。我说的对吗?
【问题讨论】:
-
您的预期结果是什么?我不确定我是否完全理解您不想要的第二个 2 示例的含义。
-
最好的方法是将行更改为
rnorm(1, 1)并再次运行。输出将解释逻辑。 -
@griffmer,我的预期结果是,如果我使用 set.seed,矢量化随机数生成器和 for 循环生成器将产生相同的结果。我有两个 R 代码,我想比较它们,但一个用于循环,另一个(我的)矢量化。