我有一个问题,涉及我围绕一些我认为可以有效矢量化的代码包装一个 while 循环。但是,在每一步,我的停止条件都依赖于那个阶段的值。将此示例视为我的问题的代表性模型:
使用 rnorm()
生成 N(0,1) 个随机变量直到您采样一个大于任意值的值,k
.
编辑:在评论中讨论的我的问题的一个警告是,我无法先验地知道在停止条件之前要采集多少样本的良好近似值。
一种方法:
rnorm(50)
一次采样 50 个标准法线,或者 rnorm(1)
如果 k 接近于零)。检查此向量以查看是否有任何观察值大于 k。 另一种方法是为给定的 k 指定一个完全矫枉过正的随机抽奖次数。这可能意味着如果 k=2,使用
rnorm(1000)
抽样 1,000 个正态随机变量.在第二种情况下,利用 R 在第二种情况下提供的矢量化可以提供比循环版本更快的结果,在这种情况下,矫枉过正的数量不会比必要的大太多,但在我的问题中,我对我需要的运行次数没有很好的直觉这样做,所以我需要保守。
问题如下:有没有办法像方法 2 那样执行高度矢量化的过程,但使用像方法 1 那样的条件检查?正在做小的矢量化操作,比如
rnorm(50)
“最快”的方式,当考虑到高度矢量化的方法每个元素更快,但更浪费时?
最佳答案
这是我之前建议的一个实现:使用您的第一种方法,但在每次迭代之间增加新样本的数量,例如,在每次迭代之间代替 50
新样本,在每次迭代之间将该数字乘以 2: 50
,然后 100
, 200
, 400
等
随着您的样本大小遵循不同的几何系列,您可以保证在“几次”迭代中退出。
sample.until.thresh <- function(FUN, exit.thresh,
sample.start = 50,
sample.growth = 2) {
sample.size <- sample.start
all.values <- list()
num.iterations <- 0L
repeat {
num.iterations <- num.iterations + 1L
sample.values <- FUN(sample.size)
all.values[[num.iterations]] <- sample.values
above.thresh <- sample.values > exit.thresh
if (any(above.thresh)) {
first.above <- match(TRUE, above.thresh)
all.values[[num.iterations]] <- sample.values[1:first.above]
break
}
sample.size <- sample.size * sample.growth
}
all.values <- unlist(all.values)
return(list(num.iterations = num.iterations,
sample.size = length(all.values),
sample.values = all.values))
}
set.seed(123456L)
res <- sample.until.thresh(rnorm, 5)
res$num.iterations
# [1] 16
res$sample.size
# [1] 2747703
关于r - 对于需要条件检查的东西,有没有比 while 循环更有效的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10251910/