我想模拟来自exp(1)分布的一些数据,但是它们必须> 0.5。所以我使用了while循环,但是它似乎不像我想要的那样工作。谢谢您的回应!
x1<-c()
w<-rexp(1)
while (length(x1) < 100) {
if (w > 0.5) {
x1<- w }
else {
w<-rexp(1)
}
}
1)问题中的代码存在以下问题:
我们在每次迭代中都需要一个新的随机变量,但是如果if
条件为FALSE,它只会生成新的随机变量
x1
被反复覆盖而不是扩展
尽管while
可以使用repeat
似乎更好,因为在末尾进行测试比在开始时进行测试更合适
我们可以这样解决:
x1 <- c()
repeat {
w <- rexp(1)
if (w > 0.5) {
x1 <- c(x1, w)
if (length(x1) == 100) break
}
}
1a)以下是一个变体。请注意,if
如果没有else
分支,则条件为FALSE的结果将为NULL,因此,如果在标记##的行上条件为FALSE,则不会将任何内容串联到x1
。
x1 <- c()
repeat {
w <- rexp(1)
x1 <- c(x1, if (w > 0.5) w) ##
if (length(x1) == 100) break
}
2)或者,这会生成200个指数随机变量,仅保留那些大于0.5的变量。如果生成的数量少于100,请重复。最后,它从最后一个生成的批次中提取前100个。我们选择了200个足够大的值,以便在大多数运行中仅需要循环的一次迭代。
repeat {
r <- rexp(200)
r <- r[r > 0.5]
if (length(r) >= 100) break
}
r <- head(r, 100)
备选方案(2)实际上比(1)或(1a)更快,因为它的矢量化程度更高。尽管它比其他解决方案丢掉了更多的指数随机变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句