Ich baue ein ziemlich komplexes hierarchisches Bayes'sches Modell für eine Metaanalyse mit R und JAGS auf. Um ein bisschen zu vereinfachen, haben die beiden Schlüsselebenen des Modells α j = ∑ h γ h ( j ) + ϵ j, wobei y i j die i- te Beobachtung des Endpunkts ist (in diesem Fall) , GM vs. nicht gentechnisch veränderte Ernteerträge) in Studie j , α j ist der Effekt für Studie j , der γ
Ich bin hauptsächlich daran interessiert, die Werte der s zu schätzen . Dies bedeutet, dass das Löschen von Variablen auf Studienebene aus dem Modell keine gute Option ist.
Es gibt eine hohe Korrelation zwischen mehreren Variablen auf Studienebene, und ich denke, dies führt zu großen Autokorrelationen in meinen MCMC-Ketten. Dieses Diagnosediagramm zeigt die Kettenverläufe (links) und die daraus resultierende Autokorrelation (rechts):
Als Folge der Autokorrelation erhalte ich effektive Probengrößen von 60-120 aus 4 Ketten mit jeweils 10.000 Proben.
Ich habe zwei Fragen, eine eindeutig objektiv und die andere subjektiver.
Welche Techniken kann ich verwenden, um dieses Autokorrelationsproblem zu lösen, außer Ausdünnen, Hinzufügen weiterer Ketten und längeres Ausführen des Samplers? Mit "verwalten" meine ich "in angemessener Zeit einigermaßen gute Schätzungen erstellen". In Bezug auf die Rechenleistung verwende ich diese Modelle auf einem MacBook Pro.
Wie ernst ist dieser Grad der Autokorrelation? Diskussionen sowohl hier als auch auf John Kruschkes Blog legen nahe, dass, wenn wir das Modell nur lange genug laufen lassen, "die klumpige Autokorrelation wahrscheinlich alle herausgemittelt wurde" (Kruschke) und es daher keine große Sache ist.
Hier ist der JAGS-Code für das Modell, das die obige Darstellung erstellt hat, für den Fall, dass jemand interessiert genug ist, um die Details durchzugehen:
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)
}
}
quelle
Antworten:
Nach dem Vorschlag von user777 lautet die Antwort auf meine erste Frage "Stan verwenden". Nach dem Umschreiben des Modells in Stan sind hier die Trajektorien (4 Ketten x 5000 Iterationen nach dem Einbrennen):
Und die Autokorrelationsdiagramme:
Viel besser! Der Vollständigkeit halber hier der Stan-Code:
quelle