我会在你的 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。这使得模拟速度更快