对于需要条件检查的东西,是否有比循环更有效的方法?

Chr*_*den 6 loops r

我有一个问题,涉及我围绕一些代码包装一个while循环,我认为可以有效地进行矢量化.但是,在每一步中,我的停止条件都依赖于该阶段的值.将此示例视为我的问题的表示模型:使用
生成N(0,1)个随机变量,rnorm()直到您采样大于任意值的值为止k.

编辑:在评论中讨论的我的问题的一个警告是,我不能先验地知道在停止条件之前需要多少样本的近似值.

一种方法:

  1. 使用while循环,采样适当大小的正常随机向量(例如,一次rnorm(50)采样50个标准法线,或者rnorm(1)如果k接近零).检查此向量以查看是否有任何观察值大于k.

  2. 如果是,请停止并返回所有先前的值.否则,将步骤1中的矢量与通过重复步骤1制作的新矢量组合.

另一种方法是为给定的k指定完全过度杀戮的随机抽取数.这可能意味着如果k = 2,则使用样本1,000个正态随机变量rnorm(1000).

利用的R提供在第二种情况下,给出量化的情况相比环版本,其中矫枉过正数量不太多超过必要更大更快的结果,但在我的问题,我没有对我有多少的运行需要一个很好的直觉要做,所以我需要保守.

问题如下:有没有办法像方法2那样进行高度向量化的过程,但是使用方法1之类的条件检查?rnorm(50)当考虑到高度矢量化的方法是元素元素更快,但更浪费时,是否像"最快"方式那样进行小矢量化操作?

flo*_*del 1

这是我之前建议的实现:使用第一种方法,但增加每次迭代之间的新样本数量,例如,不是50每次迭代时使用新样本,而是在每次迭代之间将该数字乘以 2:50,然后100200400等。

由于样本大小遵循发散的几何级数,因此保证您在“几次”迭代中退出。

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)