R 重复取样,直至达到要求

R 重复取样,直至达到要求,r,conditional-statements,sampling,R,Conditional Statements,Sampling,我希望从一个具有特定条件的分布中重复采样。 我对四次迭代的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 =

我希望从一个具有特定条件的分布中重复采样。 我对四次迭代的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)

mu.c我会在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,则无需再进行模拟,因为我们知道下一个值只能是0。这使模拟速度大大加快

感谢您的快速回答!我认为你的解决方案在某种意义上很有效。我只需要每个列表中的各个位置是不同的。基本上,在N=1的情况下运行函数400次就可以了。你也可以对每个位置进行采样,直到它比前一个位置小。是的,这正是我想做的:)不幸的是,我认为你的第二个版本不能正常工作,但我可以复制你的第一个函数!嗯,它确实给了我可靠的数字,哪一部分对你不起作用?
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)