r - 对于需要条件检查的东西,有没有比 while 循环更有效的方法?

标签 r loops

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

编辑:在评论中讨论的我的问题的一个警告是,我无法先验地知道在停止条件之前要采集多少样本的良好近似值。

一种方法:

  • 使用 while 循环,采样大小合适的正态随机向量(例如,rnorm(50) 一次采样 50 个标准法线,或者 rnorm(1) 如果 k 接近于零)。检查此向量以查看是否有任何观察值大于 k。
  • 如果是,停止并返回所有前面的值。否则,将步骤 1 中的向量与重复步骤 1 制作的新向量组合起来。

  • 另一种方法是为给定的 k 指定一个完全矫枉过正的随机抽奖次数。这可能意味着如果 k=2,使用 rnorm(1000) 抽样 1,000 个正态随机变量.

    在第二种情况下,利用 R 在第二种情况下提供的矢量化可以提供比循环版本更快的结果,在这种情况下,矫枉过正的数量不会比必要的大太多,但在我的问题中,我对我需要的运行次数没有很好的直觉这样做,所以我需要保守。

    问题如下:有没有办法像方法 2 那样执行高度矢量化的过程,但使用像方法 1 那样的条件检查?正在做小的矢量化操作,比如 rnorm(50) “最快”的方式,当考虑到高度矢量化的方法每个元素更快,但更浪费时?

    最佳答案

    这是我之前建议的一个实现:使用您的第一种方法,但在每次迭代之间增加新样本的数量,例如,在每次迭代之间代替 50 新样本,在每次迭代之间将该数字乘以 2: 50 ,然后 100200 , 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/

    相关文章:

    javascript - 操作对象数组

    c - 从 C 中的数组中查找最大值和最小值

    javascript - Parse.com 循环内查询

    替换列表中的值

    r - rmarkdown block 的工作目录不是 markdown 所在的位置

    r - 将单个行中的值与不同列中的相应行进行比较

    r - 从列表中获取总和为特定数字的所有数字组合

    javascript - React Redux 如何处理循环中的连续变化

    loops - 如何打破 Go 中的嵌套循环?

    r - 是否有一个函数可以查找字符向量中的所有小写字母?