Sto costruendo un modello bayesiano gerarchico piuttosto complesso per una meta-analisi usando R e JAGS. Semplificando un po ', i due livelli chiave del modello hanno dove è la esima osservazione del endpoint (in questo caso, rese colturali GM / non GM) nello studio , è l'effetto per lo studio , i s sono effetti per varie variabili a livello di studio (lo stato di sviluppo economico del paese in cui il sono stati fatti studi, specie di colture, metodo di studio, ecc.) indicizzati da una famiglia di funzioni eα j = ∑ h γ h ( j ) + ϵ j y i j i j α j j γ h ϵ
Sono principalmente interessato a stimare i valori di s. Ciò significa che eliminare le variabili a livello di studio dal modello non è una buona opzione.
C'è un'elevata correlazione tra molte delle variabili a livello di studio e penso che questo stia producendo grandi autocorrelazioni nelle mie catene MCMC. Questo diagramma diagnostico illustra le traiettorie a catena (a sinistra) e la risultante autocorrelazione (a destra):
Come conseguenza dell'autocorrelazione, sto ottenendo dimensioni del campione effettive di 60-120 da 4 catene da 10.000 campioni ciascuna.
Ho due domande, una chiaramente obiettiva e l'altra più soggettiva.
Oltre a diradare, aggiungere più catene ed eseguire il campionatore più a lungo, quali tecniche posso usare per gestire questo problema di autocorrelazione? Per "gestire" intendo "produrre stime ragionevolmente buone in un ragionevole lasso di tempo". In termini di potenza di calcolo, sto eseguendo questi modelli su un MacBook Pro.
Quanto è grave questo grado di autocorrelazione? Le discussioni sia qui che sul blog di John Kruschke suggeriscono che, se eseguiamo il modello abbastanza a lungo, "probabilmente la complessa autocorrelazione è stata mediata" (Kruschke) e quindi non è un grosso problema.
Ecco il codice JAGS per il modello che ha prodotto la trama sopra, nel caso in cui qualcuno sia abbastanza interessato a sfogliare i dettagli:
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)
}
}