Estoy construyendo un modelo bayesiano jerárquico bastante complejo para un metanálisis usando R y JAGS. Simplificando un poco, los dos niveles clave del modelo tienen donde es la ésima observación del punto final (en este caso, rendimientos de cultivos modificados genéticamente vs. no modificados genéticamente) en el estudio , es el efecto para el estudio , los s son efectos para varias variables a nivel de estudio (el estado de desarrollo económico del país donde estudio realizado, especies de cultivo, método de estudio, etc.) indexado por una familia de funciones , y elα j = ∑ h γ h ( j ) + ϵ j y i j i j α j j γ h ϵ γ γ
Estoy principalmente interesado en estimar los valores de s. Esto significa que eliminar variables a nivel de estudio del modelo no es una buena opción.
Hay una alta correlación entre varias de las variables a nivel de estudio, y creo que esto está produciendo grandes autocorrelaciones en mis cadenas MCMC. Este diagrama de diagnóstico ilustra las trayectorias de la cadena (izquierda) y la autocorrelación resultante (derecha):
Como consecuencia de la autocorrelación, obtengo tamaños de muestra efectivos de 60-120 de 4 cadenas de 10,000 muestras cada una.
Tengo dos preguntas, una claramente objetiva y la otra más subjetiva.
Además de adelgazar, agregar más cadenas y ejecutar el muestreador durante más tiempo, ¿qué técnicas puedo usar para manejar este problema de autocorrelación? Por "administrar" quiero decir "producir estimaciones razonablemente buenas en un período de tiempo razonable". En términos de potencia informática, estoy ejecutando estos modelos en una MacBook Pro.
¿Qué tan grave es este grado de autocorrelación? Las discusiones tanto aquí como en el blog de John Kruschke sugieren que, si solo ejecutamos el modelo lo suficiente, "la autocorrelación agrupada probablemente se ha promediado" (Kruschke) y, por lo tanto, no es realmente un gran problema.
Aquí está el código JAGS para el modelo que produjo la trama anterior, en caso de que alguien esté lo suficientemente interesado como para leer los detalles:
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)
}
}
fuente
Respuestas:
Siguiendo la sugerencia del usuario777, parece que la respuesta a mi primera pregunta es "usar Stan". Después de reescribir el modelo en Stan, aquí están las trayectorias (4 cadenas x 5000 iteraciones después del quemado):
y las gráficas de autocorrelación:
¡Mucho mejor! Para completar, aquí está el código Stan:
fuente