我正在使用Runjags包run.jags
的功能。问题是即使对于不需要它的模型也会强制适应阶段。我想让 JAGS 自己决定适应阶段的必要性和默认长度(有些模型确实需要适应阶段,有些则不需要)。然而,即使对于显然不需要它的模型,包装器也会强制自适应阶段默认为 1000 次迭代。run.jags
run.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只是有时出现的原因)。