我正在使用
rjags
包(版本 4.15)在 R 中运行 JAGS (JAGS 4.3.2) 模型,但我遇到了 n.adapt
参数的问题。具体来说,当我将 n.adapt
设置为 1000 这样的任何数字时,适应阶段似乎没有按预期发生,因为 jags_model$iter() 返回零,并且没有打印错误消息。最终结果应显示 1001:x,但事实并非如此,这再次确认了适应阶段未运行。顺便提一句。即使我为 n.adapt 设置了一个字符串,它也不会打印错误,并且会以 0 次适应迭代成功运行。
最终模型运行正常,手动预运行也正常(
update(..., n.iter = )
)。因此,模型本身看起来很健康。
我专门查找为什么
n.adapt
中的jags.model
不起作用以及为什么没有JAGS错误消息。
library(rjags)
library(coda)
# Generate synthetic data
set.seed(123)
# Write the JAGS model to a text file
model_string <- "
model {
# Likelihood for arm-based data
for (i in study_ids) {
for (k in 1:num_arms[i]) {
theta[i, k] <- mu[i] + delta[i, k]
measurement[i, k] ~ dnorm(theta[i, k], prec[i, k])
prec[i, k] <- 1 / (error[i, k] * error[i, k])
deviance[i, k] <- pow(measurement[i, k] - theta[i, k], 2) * prec[i, k]
}
}
# Fixed effect model
for (i in study_ids) {
delta[i, 1] <- 0
for (k in 2:num_arms[i]) {
delta[i, k] <- d[treatment[i, 1], treatment[i, k]]
}
}
# Relative effect matrix
d[1, 1] <- 0
d[1, 2] <- d12
d[1, 3] <- d13
d[1, 4] <- d14
d[1, 5] <- d15
d[1, 6] <- d16
for (i in 2:num_treatments) {
for (j in 1:num_treatments) {
d[i, j] <- d[1, j] - d[1, i]
}
}
# Priors
prior_prec <- pow(re_prior_sd, -2)
for (i in study_ids) {
mu[i] ~ dnorm(0, prior_prec)
}
# Effect parameter priors
d12 ~ dnorm(0, prior_prec)
d13 ~ dnorm(0, prior_prec)
d14 ~ dnorm(0, prior_prec)
d15 ~ dnorm(0, prior_prec)
d16 ~ dnorm(0, prior_prec)
}
"
writeLines(model_string, con = "model.txt")
# Prepare data for JAGS
jags_data <- list(
treatment = matrix(sample(1:6, 96, replace = TRUE), nrow = 24, ncol = 4),
measurement = matrix(rnorm(96, -1.5, 1), nrow = 24, ncol = 4),
error = matrix(runif(96, 0.1, 1), nrow = 24, ncol = 4),
num_arms = rep(2:3, length.out = 24),
num_treatments = 6,
re_prior_sd = 1,
study_ids = 1:24
)
# Set up initial values (optional but recommended)
inits <- list(
list(
d12 = rnorm(1, 0, 1), d13 = rnorm(1, 0, 1), d14 = rnorm(1, 0, 1), d15 = rnorm(1, 0, 1), d16 = rnorm(1, 0, 1),
mu = rnorm(24, -1.5, 1)
),
list(
d12 = rnorm(1, 0, 1), d13 = rnorm(1, 0, 1), d14 = rnorm(1, 0, 1), d15 = rnorm(1, 0, 1), d16 = rnorm(1, 0, 1),
mu = rnorm(24, -1.5, 1)
),
list(
d12 = rnorm(1, 0, 1), d13 = rnorm(1, 0, 1), d14 = rnorm(1, 0, 1), d15 = rnorm(1, 0, 1), d16 = rnorm(1, 0, 1),
mu = rnorm(24, -1.5, 1)
),
list(
d12 = rnorm(1, 0, 1), d13 = rnorm(1, 0, 1), d14 = rnorm(1, 0, 1), d15 = rnorm(1, 0, 1), d16 = rnorm(1, 0, 1),
mu = rnorm(24, -1.5, 1)
)
)
# Define parameters to monitor
params <- c("d12", "d13", "d14", "d15", "d16", "mu", "theta", "deviance")
# Create and compile the JAGS model
jags_model <- jags.model("model.txt", data = jags_data, inits = inits, n.chains = 4, n.adapt = 1000)
# Check the iteration number
print(jags_model$iter())
# We can run the adapt manually but I am looking for why the n.adapt is not working
# Run properly
# update(jags_model, n.iter = 1000)
# samples <- coda.samples(jags_model, variable.names = params, n.iter = 5000)
扩展 @DaveArmstrong 和 @polkas 的回应,重要的是要认识到老化和适应是指两个不同的事物,并且在
rjags
中独立实现。
Burn-in是使用
update
功能实现的。如果指定,模型将始终以预烧迭代运行。
适应是使用
n.adapt
函数中的 jags.model
参数实现的。然而,模型本身的性质决定了适应过程是否会运行。更深入的研究表明,适应是基于对 isAdaptive
的评估,只有当模型包含共轭时,该评估才会被评估为 TRUE(因此会运行适应)。 [TBD:我想解释这段代码,但找不到如何获取您之前向我展示的共轭位]原始示例不包含共轭,因此不执行任何调整。 [TBD:显示此] [TBD:调整模型以显示包含共轭和运行适应的示例]
因此,在运行 JAGS 模型时,重要的是要考虑如何实现老化和适配,并注意后者是模型驱动的,即使在指定时也并不总是执行。