我有一个问题,涉及我围绕一些代码包装一个while循环,我认为可以有效地进行矢量化.但是,在每一步中,我的停止条件都依赖于该阶段的值.将此示例视为我的问题的表示模型:使用
生成N(0,1)个随机变量,rnorm()
直到您采样大于任意值的值为止k
.
编辑:在评论中讨论的我的问题的一个警告是,我不能先验地知道在停止条件之前需要多少样本的近似值.
一种方法:
使用while循环,采样适当大小的正常随机向量(例如,一次rnorm(50)
采样50个标准法线,或者rnorm(1)
如果k接近零).检查此向量以查看是否有任何观察值大于k.
如果是,请停止并返回所有先前的值.否则,将步骤1中的矢量与通过重复步骤1制作的新矢量组合.
另一种方法是为给定的k指定完全过度杀戮的随机抽取数.这可能意味着如果k = 2,则使用样本1,000个正态随机变量rnorm(1000)
.
利用的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
Run Code Online (Sandbox Code Playgroud)