JAGS n.adapt 参数未按预期工作

问题描述 投票:0回答:1

我正在使用

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)


r jags rjags
1个回答
0
投票

扩展 @DaveArmstrong 和 @polkas 的回应,重要的是要认识到老化和适应是指两个不同的事物,并且在

rjags
中独立实现。

Burn-in是使用

update
功能实现的。如果指定,模型将始终以预烧迭代运行。

适应是使用

n.adapt
函数中的
jags.model
参数实现的。然而,模型本身的性质决定了适应过程是否会运行。更深入的研究表明,适应是基于对
isAdaptive
的评估,只有当模型包含共轭时,该评估才会被评估为 TRUE(因此会运行适应)。 [TBD:我想解释这段代码,但找不到如何获取您之前向我展示的共轭位]原始示例不包含共轭,因此不执行任何调整。 [TBD:显示此] [TBD:调整模型以显示包含共轭和运行适应的示例]

因此,在运行 JAGS 模型时,重要的是要考虑如何实现老化和适配,并注意后者是模型驱动的,即使在指定时也并不总是执行。

© www.soinside.com 2019 - 2024. All rights reserved.