重复采样直到条件
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。这使得模拟速度更快
我希望从具有特定条件的分布中重复采样。 我正在为四次迭代采样 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。这使得模拟速度更快