MCMC'de yüksek otokorelasyonu yönetme


10

R ve JAGS kullanarak bir meta-analiz için oldukça karmaşık bir hiyerarşik Bayesian modeli oluşturuyorum. Biraz basitleştirmek, modelin iki temel seviyeleri vardır burada olan inci gözlem son nokta (bu durumda, GM vs GM olmayan ekin verimleri) çalışma içinde j , \ alpha_j çalışması için etkisidir j , \ gama ler çeşitli çalışma düzeyindeki değişkenler için etkileri (ülkenin ekonomik gelişme durumu nerede çalışma yapıldı, bitki türleri, çalışma yöntemi, vb.) h fonksiyonlarından oluşan bir aile ve \ epsilonα j = h γ h ( j ) + ϵ j y i j i j α j j γ h ϵ

yij=αj+ϵi
αj=hγh(j)+ϵj
yijijαjjγhϵs hata terimleridir. γ kukla değişkenler üzerinde katsayılar olmadığını unutmayın . Bunun yerine, farklı çalışma düzeyi değerleri için farklı γ değişkenleri vardır. Örneğin, γdeveloping olan ülkeler için \ gamma_ {gelişmekte} ve gelişmiş ülkeler için γdeveloped bulunmaktadır.

Öncelikle γ s değerlerini tahmin etmekle ilgileniyorum . Bu, çalışma düzeyi değişkenlerinin modelden çıkarılmasının iyi bir seçenek olmadığı anlamına gelir.

Çalışma düzeyi değişkenlerinin bazıları arasında yüksek korelasyon var ve bence bu MCMC zincirlerimde büyük otokorelasyonlar üretiyor. Bu diyagnostik çizim, zincir yörüngelerini (solda) ve ortaya çıkan otokorelasyonu (sağda) gösterir:
MCMC çıkışında yüksek otokorelasyon

Otokorelasyonun bir sonucu olarak, her biri 10.000 numunenin 4 zincirinden 60-120 etkili örnek boyutları elde ediyorum.

Biri nesnel ve diğeri daha öznel olmak üzere iki sorum var.

  1. İnceltme, daha fazla zincir ekleme ve örnekleyiciyi daha uzun süre çalıştırma dışında, bu otokorelasyon sorununu yönetmek için hangi teknikleri kullanabilirim? "Yönetmek" derken "makul bir süre içinde oldukça iyi tahminler üretmek" demek istiyorum. Bilgi işlem gücü açısından, bu modelleri bir MacBook Pro'da çalıştırıyorum.

  2. Bu otokorelasyon derecesi ne kadar ciddidir? Her iki Tartışmalar burada ve John Kruschke blogunda biz sadece yeterince uzun modeli çalıştırırsanız, (Kruschke) "clumpy otokorelasyon muhtemelen tüm dışarı ortalama olmuştur" önerisini ve bu yüzden gerçekten büyük bir anlaşma değil.

Aşağıda, yukarıdaki ayrıntıları oluşturan modelin JAGS kodu, herkesin ayrıntılara girecek kadar ilgilenmesi durumunda:

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
Değerine göre, karmaşık çok düzeyli modeller, Stan'in var olmasının nedeni, tam olarak belirlediğiniz nedenlerden dolayı.
Sycorax, Reinstate Monica'yı

Başlangıçta bunu birkaç ay önce Stan'da yapmaya çalıştım. Çalışmalar farklı sayıda bulgu içeriyor, (en azından o zaman; şeylerin değişip değişmediğini kontrol etmedim) koda başka bir karmaşıklık katmanı eklemeyi gerektiriyordu ve Stan'in matris hesaplamalarından yararlanamayacağı anlamına geliyordu. bu kadar hızlı.
Dan Hicks

1
Hızı HMC'nin posterioru araştırdığı verimlilik kadar düşünmüyordum. Anladığım kadarıyla HMC çok daha fazla zemin kaplayabildiğinden, her yinelemenin daha düşük otokorelasyonu vardır.
Sycorax, Reinstate Monica'yı

Oh, evet, bu ilginç bir nokta. Bunu denemek için listeme koyacağım.
Dan Hicks

Yanıtlar:


6

User777'nin önerisini takiben, ilk sorumun cevabı "Stan'ı kullan" gibi görünüyor. Modeli Stan'de yeniden yazdıktan sonra, yörüngeler (4 zincir x yanma sonrası 5000 iterasyon):
resim açıklamasını buraya girin Ve otokorelasyon grafikleri:
resim açıklamasını buraya girin

Çok daha iyi! Tamlık için Stan kodu şöyledir:

data {                          // Data: Exogenously given information
// Data on totals
int n;                      // Number of distinct finding i
int n_study;                // Number of distinct studies j

// Finding-level data
vector[n] y;                // Endpoint for finding i
int study_n[n_study];       // # findings for study j

// Study-level data
int countr[n_study];        // Country type for study j
int studytype[n_study];     // Study type for study j
int jourtype[n_study];      // Was study j published in a journal?
int industrytype[n_study];  // Was study j funded by industry?

// Top-level constants set in R call
real sigma_alpha_bound;     // Upper bound for noise in alphas
real gamma_prior_exp;       // Prior expected value of gamma
real gamma_sigma_bound;     // Upper bound for noise in gammas
real eta_bound;             // Upper bound for etas
}

transformed data {
// Constants set here
int countr_levels;          // # levels for countr
int study_levels;           // # levels for studytype
int jour_levels;            // # levels for jourtype
int industry_levels;        // # levels for industrytype
countr_levels <- 2;
study_levels <- 2;
jour_levels <- 2;
industry_levels <- 2;
}

parameters {                    // Parameters:  Unobserved variables to be estimated
vector[n_study] alpha;      // Study-level mean
real<lower = 0, upper = sigma_alpha_bound> sigma_alpha;     // Noise in alphas

vector<lower = 0, upper = 100>[n_study] sigma;          // Study-level standard deviation

// Gammas:  contextual effects on study-level means
// Country-type effect and noise in its estimate
vector[countr_levels] gamma_countr;     
vector<lower = 0, upper = gamma_sigma_bound>[countr_levels] sigma_countr;
// Study-type effect and noise in its estimate
vector[study_levels] gamma_study;
vector<lower = 0, upper = gamma_sigma_bound>[study_levels] sigma_study;
vector[jour_levels] gamma_jour;
vector<lower = 0, upper = gamma_sigma_bound>[jour_levels] sigma_jour;
vector[industry_levels] gamma_industry;
vector<lower = 0, upper = gamma_sigma_bound>[industry_levels] sigma_industry;


// Etas:  contextual effects on study-level standard deviation
vector<lower = 0, upper = eta_bound>[countr_levels] eta_countr;
vector<lower = 0, upper = eta_bound>[study_levels] eta_study;
vector<lower = 0, upper = eta_bound>[jour_levels] eta_jour;
vector<lower = 0, upper = eta_bound>[industry_levels] eta_industry;
}

transformed parameters {
vector[n_study] alpha_hat;                  // Fitted alpha, based only on gammas
vector<lower = 0>[n_study] sigma_hat;       // Fitted sd, based only on sigmasq_hat

for (j in 1:n_study) {
    alpha_hat[j] <- gamma_countr[countr[j]] + gamma_study[studytype[j]] + 
                    gamma_jour[jourtype[j]] + gamma_industry[industrytype[j]];
    sigma_hat[j] <- sqrt(eta_countr[countr[j]]^2 + eta_study[studytype[j]]^2 +
                        eta_jour[jourtype[j]] + eta_industry[industrytype[j]]);
}
}

model {
// Technique for working w/ ragged data from Stan manual, page 135
int pos;
pos <- 1;
for (j in 1:n_study) {
    segment(y, pos, study_n[j]) ~ normal(alpha[j], sigma[j]);
    pos <- pos + study_n[j];
}

// Study-level mean = fitted alpha + Gaussian noise
alpha ~ normal(alpha_hat, sigma_alpha);

// Study-level variance = gamma distribution w/ mean sigma_hat
sigma ~ gamma(.1 * sigma_hat, .1);

// Priors for gammas
gamma_countr ~ normal(gamma_prior_exp, sigma_countr);
gamma_study ~ normal(gamma_prior_exp, sigma_study);
gamma_jour ~ normal(gamma_prior_exp, sigma_study);
gamma_industry ~ normal(gamma_prior_exp, sigma_study);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.