我正在为使用 R 和 JAGS 的元分析构建一个相当复杂的分层贝叶斯模型。简化一点,模型的两个关键级别有 其中是第个观察值的终点(在这种情况下,转基因与非转基因作物产量),是研究 j 的影响 γ是各种研究级变量的影响(该国的经济发展状况)研究完成,作物种类,研究方法等)由函数族和
s 是误差项。请注意, s 不是虚拟变量的系数。相反,对于不同的研究水平值,存在不同的变量。例如,发展中国家有,发达国家\gamma_{developing} 。
我主要对估计的值感兴趣。这意味着从模型中删除研究级别的变量不是一个好的选择。
几个研究级变量之间存在高度相关性,我认为这在我的 MCMC 链中产生了很大的自相关性。此诊断图说明了链轨迹(左)和产生的自相关(右):
由于自相关,我从 4 个链中的每个 10,000 个样本中获得了 60-120 的有效样本大小。
我有两个问题,一个明显客观,另一个更主观。
除了细化、添加更多链和运行采样器更长时间之外,我可以使用哪些技术来管理这个自相关问题?我所说的“管理”是指“在合理的时间内产生相当好的估计”。在计算能力方面,我在 MacBook Pro 上运行这些模型。
这种自相关程度有多严重?此处和John Kruschke 的博客上的讨论表明,如果我们运行模型足够长的时间,“块状自相关可能已经全部被平均化了”(Kruschke),所以这并不是什么大问题。
这是生成上述图的模型的 JAGS 代码,以防万一有人有兴趣深入了解细节:
model {
for (i in 1:n) {
# Study finding = study effect + noise
# tau = precision (1/variance)
# nu = normality parameter (higher = more Gaussian)
y[i] ~ dt(alpha[study[i]], tau[study[i]], nu)
}
nu <- nu_minus_one + 1
nu_minus_one ~ dexp(1/lambda)
lambda <- 30
# Hyperparameters above study effect
for (j in 1:n_study) {
# Study effect = country-type effect + noise
alpha_hat[j] <- gamma_countr[countr[j]] +
gamma_studytype[studytype[j]] +
gamma_jour[jourtype[j]] +
gamma_industry[industrytype[j]]
alpha[j] ~ dnorm(alpha_hat[j], tau_alpha)
# Study-level variance
tau[j] <- 1/sigmasq[j]
sigmasq[j] ~ dunif(sigmasq_hat[j], sigmasq_hat[j] + pow(sigma_bound, 2))
sigmasq_hat[j] <- eta_countr[countr[j]] +
eta_studytype[studytype[j]] +
eta_jour[jourtype[j]] +
eta_industry[industrytype[j]]
sigma_hat[j] <- sqrt(sigmasq_hat[j])
}
tau_alpha <- 1/pow(sigma_alpha, 2)
sigma_alpha ~ dunif(0, sigma_alpha_bound)
# Priors for country-type effects
# Developing = 1, developed = 2
for (k in 1:2) {
gamma_countr[k] ~ dnorm(gamma_prior_exp, tau_countr[k])
tau_countr[k] <- 1/pow(sigma_countr[k], 2)
sigma_countr[k] ~ dunif(0, gamma_sigma_bound)
eta_countr[k] ~ dunif(0, eta_bound)
}
# Priors for study-type effects
# Farmer survey = 1, field trial = 2
for (k in 1:2) {
gamma_studytype[k] ~ dnorm(gamma_prior_exp, tau_studytype[k])
tau_studytype[k] <- 1/pow(sigma_studytype[k], 2)
sigma_studytype[k] ~ dunif(0, gamma_sigma_bound)
eta_studytype[k] ~ dunif(0, eta_bound)
}
# Priors for journal effects
# Note journal published = 1, journal published = 2
for (k in 1:2) {
gamma_jour[k] ~ dnorm(gamma_prior_exp, tau_jourtype[k])
tau_jourtype[k] <- 1/pow(sigma_jourtype[k], 2)
sigma_jourtype[k] ~ dunif(0, gamma_sigma_bound)
eta_jour[k] ~ dunif(0, eta_bound)
}
# Priors for industry funding effects
for (k in 1:2) {
gamma_industry[k] ~ dnorm(gamma_prior_exp, tau_industrytype[k])
tau_industrytype[k] <- 1/pow(sigma_industrytype[k], 2)
sigma_industrytype[k] ~ dunif(0, gamma_sigma_bound)
eta_industry[k] ~ dunif(0, eta_bound)
}
}