R中的指数分布

神经痛

我想模拟来自exp(1)分布的一些数据,但是它们必须> 0.5。所以我使用了while循环,但是它似乎不像我想要的那样工作。谢谢您的回应!

x1<-c()

w<-rexp(1) 

while (length(x1) < 100) {

  if (w > 0.5) {

    x1<- w }

  else {

    w<-rexp(1)

  }

}
G.格洛腾迪克

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章