当我尝试复制结果时,我有一个问题,我想出了一个问题。
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
与矢量化相同。我是对的吗?
答案 0 :(得分:2)
使用你的循环,你可以这样做:
set.seed(1)
rnorm(n = 1, 1, 1)
set.seed(1)
rnorm(n = 1, 2, 2)
set.seed(1)
rnorm(n = 1, 3, 3)
使用第二行代码执行此操作:
set.seed(1)
rnorm(3, 1:3, 1:3)
因此结果不同。 换句话说:使用循环你做set.seed(1)并随机选择1个数字3次,首先你从一个平均值和sd为1的分布中绘制一个数字,然后从平均值和sd为2绘制第二名,最后一名是3分的平均值和3分。
另一方面,你直接从均值向量中抽取3个数字,sd由1,2和3组成。然后种子被用于一行代码,其中生成了所有三个3个数字。
如果您希望使用for循环获得相同的结果,则需要使用以下代码:
> set.seed(1)
> rnorm(n = 1, 1, 1)
[1] 0.3735462
> set.seed(1)
> rnorm(n = 1, 2, 2)
[1] 0.7470924
> set.seed(1)
> rnorm(n = 1, 3, 3)
[1] 1.120639
答案 1 :(得分:0)
对于第一种方法
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
您的问题是为什么这两种方法不会产生相同的结果?
那么回答这个问题,我首先要说的是,这两种方法可以产生一致的结果。现在让我们看看为什么伪随机生成的值不同。 简单的方法是运行for循环来看看会发生什么:
sapply(1:3,function(x){set.seed(1);rnorm(x,x,x)})
[[1]]
[1] 0.3735462 #One number produced from mu=1 sd=1
[[2]]
[1] 0.7470924 2.3672866 # Two numbers produced from mu=2 sd=2
[[3]]
[1] 1.1206386 3.5509300 0.4931142 # Three numbers produced from mu=3 sd=3
现在,如果您查看此列表,您会注意到for循环只是取第一个数字,而第二个方法只取最后生成的数字。这就是为什么数字不同但最后,结果是一致的,因为你可以看到,这两个数字都是由相同的均值和sd产生的
因此
set.seed(1)
rnorm(3,1:3,1:3)
is equivalent to
l <- {}
for(i in 1:3){
set.seed(1)
l[i] <- rnorm(n = i, i, i)[i]
}
l
[1] 0.3735462 2.3672866 0.4931142
rnorm(3,1:3,1:3)
[1] 0.3735462 2.3672866 0.4931142