6

我有一个问题,涉及我围绕一些我认为可以有效矢量化的代码包装一个 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)当考虑到高度向量化的方法是每个元素的元素更快但更浪费时,是否正在像“最快”的方式一样进行小型向量化操作?

4

1 回答 1

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
于 2012-04-21T17:30:50.263 回答