1

我正在使用Runjagsrun.jags的功能。问题是即使对于不需要它的模型也会强制适应阶段。我想让 JAGS 自己决定适应阶段的必要性和默认长度(有些模型确实需要适应阶段,有些则不需要)。然而,即使对于显然不需要它的模型,包装器也会强制自适应阶段默认为 1000 次迭代。run.jagsrun.jags

可重现的示例来说明此问题:

library(R2jags)

N <- 1000
y <- rnorm(N)
x <- rnorm(N)
data <- list("N", "y", "x")

inits <- function(){list(beta0=rnorm(1), beta1=rnorm(1), tau=1)}
parameters <- c("beta0", "beta1", "tau")
#inits <- function(){list(beta0=rnorm(1), beta1=rnorm(1), sigma2=1)}
#parameters <- c("beta0", "beta1")

sink("m.bug")
cat("
model{
for (i in 1:N){
y[i] ~ dnorm(mu[i], tau)
mu[i] <- beta0 + beta1*x[i]
}

beta0 ~ dnorm(0, 0.00001)
beta1 ~ dnorm(0, 0.00001)
sigma2 <- 1/tau
tau ~ dgamma(0.001, 0.001)
#sigma2 ~ dunif(0, 100)
#tau <- 1/sigma2
}
")
sink()

m <- R2jags::jags(data, inits, parameters, "m.bug", 
  n.chains=3, n.iter=2000, n.burnin=1000, n.thin=1)

require("runjags")
data2 <- list(N = N, y = y, x = x)
outRJ <- run.jags("m.bug", parameters, data2, 3, inits,
      1000, 1000, thin = 1, summarise=FALSE, plot=FALSE)

现在,如果您查看输出 R2jags::jags,这个模型实际上不需要适应并且调用adapt什么也不做,可能是因为让 JAGS 决定它(更多信息在这里)。而run.jags强制对此模型进行(不必要的)调整,因此需要更多时间来运行。它为适应进行 1000 次迭代,然后为老化进行 1000 次迭代,然后为样本进行 1000 次迭代:

> outRJ <- run.jags("m.bug", parameters, data2, 3, inits,
+       1000, 1000, thin = 1, summarise=FALSE, plot=FALSE)
Compiling rjags model and adapting for 1000 iterations...
Calling the simulation using the rjags method...
  Burning in the model for 1000 iterations...
  |**************************************************| 100%
  Running the model for 1000 iterations...                                                      
  |**************************************************| 100%
Simulation complete
Finished running the simulation

如何让 JAGS 在运行时决定适应阶段run.jags


抛开注意:请不要混淆适应和老化阶段,在 JAGS 中是不同的。适应阶段实际上并不像 MCMC 那样工作,并且对于某些模型来说它是不需要的(这就是为什么这个 bug只是有时出现的原因)。

4

1 回答 1

2

显式适应阶段是为了与 JAGS 的命令行版本保持一致 - 如果留给自己的设备,rjags 和(外部)JAGS 会以不同的方式处理自适应阶段,因此确保它们执行相同操作的唯一方法是强制rjags/JAGS 具有特定的自适应阶段。

adapt 参数允许手动控制自适应阶段,因此您应该能够通过设置 adapt=0 来覆盖它……但我刚刚注意到一个错误,它阻止了 rjags 方法的这种情况,抱歉。但是,如果您指定以下参数,它将按预期工作:sample=1000,burnin=1000,adapt=0,method='simple'。在下一个版本中,我将(修复此错误并)允许“adapt=NA”,这意味着“允许 rjags/JAGS 以它认为合适的方式进行调整”;但不幸的是,这意味着获得的结果将取决于方法……

希望有帮助。

于 2014-03-21T15:37:55.590 回答