我正在为使用R和JAGS的元分析建立一个相当复杂的分层贝叶斯模型。简化了一下,该模型的两个关键级别具有 其中是的第观察研究终点(在这种情况下,是转基因作物与非转基因作物的产量),是研究的影响, s是各种研究水平变量的影响(通过函数族和索引完成了研究,作物种类,研究方法等)
s是错误术语。请注意,不是虚拟变量的系数。相反,对于不同的研究水平值,存在不同的变量。例如,有为发展中国家和发达国家。
我主要对估算的值感兴趣。这意味着从模型中删除研究级别的变量不是一个好的选择。
一些研究水平变量之间具有高度相关性,我认为这在我的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)
}
}
1
值得一提的是,复杂的多级模型几乎就是Stan存在的原因,而正是您确定的原因。
—
Sycorax说恢复莫妮卡
几个月前,我最初尝试在Stan中构建它。这些研究涉及不同数量的发现,这些发现(至少在当时;我还没有检查事情是否有所改变)要求在代码中增加另一层复杂性,这意味着Stan无法利用矩阵计算的优势。如此快速。
—
丹·希克斯
我没有想到速度,而是HMC探索后路的效率。我的理解是,由于HMC可以覆盖更多的领域,因此每次迭代的自相关性都较低。
—
Sycorax说恢复莫妮卡
哦,是的,这很有趣。我将其列在要尝试的事情上。
—
丹·希克斯