在使用jags创建的模型上使用update()的原因

时间:2015-05-05 16:18:30

标签: r jags

我正在使用rjags在R中进行分析(基于这篇博文:http://www.sumsar.net/blog/2013/08/bayesian-estimation-of-correlation/),我有一个问题。使用update()更新500个样本的模型,只是将原始模型创建中的n.adapt参数设置为1000而不是500?

换句话说:当我执行以下操作时,run1和run2之间是否存在重要差异:

require(mvtnorm)
require(rjags)

model_string <- "
  model {
    for(i in 1:n) {
      x[i,1:2] ~ dmnorm(mu[], prec[ , ])
    }

    prec[1:2,1:2] <- inverse(cov[,])
    cov[1,1] <- sigma[1] * sigma[1]
    cov[1,2] <- sigma[1] * sigma[2] * rho
    cov[2,1] <- sigma[1] * sigma[2] * rho
    cov[2,2] <- sigma[2] * sigma[2]

    sigma[1] ~ dunif(0, 1000) 
    sigma[2] ~ dunif(0, 1000)
    rho ~ dunif(-1, 1)
    mu[1] ~ dnorm(0, 0.001)
    mu[2] ~ dnorm(0, 0.001)

    x_rand ~ dmnorm(mu[], prec[ , ])
  }

"

mu <- c(10, 30)
sigma <- c(20, 40)
rho <- -0.7
cov_mat <- rbind(c(     sigma[1]^2       , sigma[1]*sigma[2]*rho ),
                 c( sigma[1]*sigma[2]*rho,      sigma[2]^2       ))
x <- rmvnorm(30, mu, cov_mat)

data_list = list(x = x, n = nrow(x))
inits_list = list(mu = c(mean(x[, 1]), mean(x[, 2])),
                  rho = cor(x[, 1], x[, 2]),
                  sigma = c(sd(x[, 1]), sd(x[, 1])))


jags_model <- jags.model(textConnection(model_string), data = data_list, inits = inits_list,
                         n.adapt = 500, n.chains = 3, quiet = T)
update(jags_model, 500)
mcmc_samples <- coda.samples(jags_model, c("mu", "rho", "sigma", "x_rand"),
                             n.iter = 5000)

run1<-summary(mcmc_samples)

jags_model <- jags.model(textConnection(model_string), data = data_list, inits = inits_list,
                         n.adapt = 1000, n.chains = 3, quiet = T)
mcmc_samples <- coda.samples(jags_model, c("mu", "rho", "sigma", "x_rand"),
                             n.iter = 5000)
run2<-summary(mcmc_samples)

1 个答案:

答案 0 :(得分:5)

函数update执行马尔可夫链的老化迭代。如果您未能运行这些老化迭代,那么您的链将不会收敛到其固定分布,并且您生成的任何样本实际上都不会来自正确的后验分布。简而言之,您绝对需要更新您的链条,并且您还应该在最终样品上执行收敛检查(跟踪图/ acfs),以确保您已经将链条烧得足够长。

JAGS执行的自适应迭代不会在迭代中进行刻录。从文档中,&#34;在此自适应阶段生成的样本序列 不是马尔可夫链,因此不能用于模型的后验推断。&#34;在自适应阶段运行您的模型可以提高效率,但您仍然需要更新/老化您的链,以便您实际从正确的后验分布中采样。