重复采样直到条件

Repeated sampling until condition

我希望从具有特定条件的分布中重复采样。 我正在为四次迭代采样 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个单独的结果当然并不总是小于上一次迭代的结果(“位置”)。

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

非常感谢您的帮助!

我会在你的 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)

注意,我把条件改成了>=,因为如果任何一轮产生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。这使得模拟速度更快