Buduję raczej złożony hierarchiczny model bayesowski do metaanalizy przy użyciu R i JAGS. Upraszczając nieco, dwa kluczowe poziomy modelu mają gdzie jest obserwacją punkt końcowy (w tym przypadku plony GMO i GMO) w badaniu , jest efektem dla badania , są efektami dla różnych zmiennych na poziomie badania (status rozwoju gospodarczego kraju, w którym badanie zostało przeprowadzone, gatunki upraw, metoda badania itp.) indeksowane przez rodzinę funkcji i
Interesuje mnie przede wszystkim szacowanie wartości . Oznacza to, że usunięcie zmiennych na poziomie badania z modelu nie jest dobrym rozwiązaniem.
Istnieje kilka korelacji między kilkoma zmiennymi na poziomie badania i myślę, że powoduje to dużą autokorelację w moich łańcuchach MCMC. Ten wykres diagnostyczny ilustruje trajektorie łańcucha (po lewej) i wynikową autokorelację (po prawej):
W wyniku autokorelacji uzyskuję skuteczne wielkości próbek 60–120 z 4 łańcuchów po 10 000 próbek.
Mam dwa pytania, jedno wyraźnie obiektywne, a drugie bardziej subiektywne.
Jakie techniki można wykorzystać do zarządzania tym problemem autokorelacji, oprócz przerzedzania, dodawania kolejnych łańcuchów i dłuższego uruchamiania samplera? Przez „zarządzaj” mam na myśli „przedstawianie dość dobrych oszacowań w rozsądnym czasie”. Pod względem mocy obliczeniowej używam tych modeli na MacBooku Pro.
Jak poważny jest ten stopień autokorelacji? Dyskusje zarówno tutaj, jak i na blogu Johna Kruschke sugerują, że jeśli poprowadzimy ten model wystarczająco długo, „grudkowata autokorelacja prawdopodobnie wszystkie zostały uśrednione” (Kruschke), a więc nie jest to naprawdę wielka sprawa.
Oto kod JAGS dla modelu, który wyprodukował powyższą fabułę, na wypadek, gdyby ktoś był wystarczająco zainteresowany, aby przejrzeć szczegóły:
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)
}
}
źródło
Odpowiedzi:
Zgodnie z sugestią użytkownika777 wygląda na to, że odpowiedź na moje pierwsze pytanie brzmi „użyj Stana”. Po przepisaniu modelu w Stan, oto trajektorie (4 łańcuchy x 5000 iteracji po wypaleniu):
I wykresy autokorelacji:
Dużo lepiej! Dla kompletności, oto kod Stan:
źródło