【问题标题】:Repeated sampling until condition重复采样直到条件
【发布时间】:2021-05-31 11:59:54
【问题描述】:

我希望从具有特定条件的分布中重复抽样。 我正在为四次迭代采样 50 个值并保存结果。但是,我需要迭代的每个单独结果都小于同一位置的最后一个结果。

mu.c <- c(7,6,5,3) # Means of control chains

chains.sim <- function(vector, N) {
  all.list <- list()
  
  for (i in 1:length(vector)) { 
    Y <- MASS::rnegbin(n = N, mu = vector[i], theta = 4)
    name <- paste('position:',i, sep = '')
    all.list[[name]] <- Y
  }
  all.list
}

chains.sim(mu.c, 50)

采样部分工作正常,但是 Y 个单独的结果当然并不总是小于上一次迭代的结果(“位置”)。

有没有办法重复采样过程直到结果变小?

非常感谢您的帮助!

【问题讨论】:

    标签: r conditional-statements sampling


    【解决方案1】:

    我会在你的 for 循环中添加一个 while 循环,该循环对数据集进行采样,直到满足条件。

    mu.c <- c(7,6,5,3) # Means of control chains
    
    chain.sim <- function(vector, N) {
      all.list <- list()
      all.list[[1]] <- MASS::rnegbin(n = N, mu = vector[1], theta = 4)
      
      for (i in 2:length(vector)) { 
        is_smaller <- FALSE
        while(!is_smaller){
          Y <- MASS::rnegbin(n = N, mu = vector[i], theta = 4)
          if (all(all.list[[i-1]] >= Y)) is_smaller <- TRUE
        }
        all.list[[i]] <- Y
      }
      all.list
    }
    chain.sim(mu.c, 3)
    

    注意,我把条件改成了&gt;=,因为如果任何一轮都生成0,就永远找不到更小的值。此外,对于 50 个元素,此代码将永远不会停止,因为实际上不太可能获得两个每个值都较小的样本,更不用说 4 个不同的样本了。

    编辑: 正如您所指出的,通过单独采样可以更快

    chain.sim <- function(vector, N) {
      
      all.list <- list()
      all.list[[1]] <- MASS::rnegbin(n = N, mu = vector[1], theta = 4)
      
      for (i in 2:length(vector)) { 
        Y <- numeric(N)
        for (j in 1:N){
          previous_value <- all.list[[i-1]][j]
          if (previous_value == 0){
            Y[j] = 0
            next
          }
          is_smaller <- FALSE
          while(!is_smaller){
            val <- MASS::rnegbin(1, mu = vector[i], theta = 4)
            if (val <= previous_value) is_smaller <- TRUE
            Y[j] <- val
          }
        }
    
        all.list[[i]] <- Y
      }
      all.list
    }
    chain.sim(mu.c, 50)
    

    如果在任何地方遇到 0,则无需进行更多模拟,因为我们知道下一个值只能是 0。这使得模拟速度更快

    【讨论】:

    • 感谢您的快速回答!我认为您的解决方案在某种意义上可以正常工作。我只需要每个列表中的各个位置不同。基本上,在 N=1 的情况下运行你的函数 400 次就可以了。
    • 您也可以对每个单独的位置进行采样,直到它小于前一个位置
    • 是的,这几乎就是我想要做的 :)
    • 不幸的是,我认为你的第二个版本不能正常工作,但我可以replicate 你的第一个函数!
    • 嗯,它确实给了我可靠的数字,哪一部分不适合你?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多