MCMC에서 높은 자기 상관 관리


10

R과 JAGS를 사용하여 메타 분석을 위해 다소 복잡한 계층 적 베이지안 모델을 만들고 있습니다. 비트를 단순화하면 모형의 두 가지 주요 수준은 α j = h γ h ( j ) + ϵ j입니다. 여기서 y i j 는 끝점 의 i 번째 관측치입니다 (이 경우 · 연구에 GM 대 비 GM 작물 수확량) J , α j는 학습에 대한 효과 Jγ

와이나는제이=α제이+ϵ나는
α제이=hγh(제이)+ϵ제이
와이나는제이나는제이α제이제이γ는 함수 패밀리 의해 인덱스 된 다양한 연구 수준 변수 (연구가 수행 된 국가의 경제 개발 상태, 작물 종, 연구 방법 등) 에 영향을 미치며 ϵ 는 오류 항입니다. 점을 유의 γ S가 가변 수의 계수가 아니다. 대신, 다른 연구 수준 값에 대한 별개의 γ 변수가 있습니다. 예를 들어 개발 도상국 에는 γ d e v e l o p i n gγ d e v e l o p e d가 있습니다hϵγγγ이자형V이자형영형나는γ이자형V이자형영형이자형 선진국.

나는 주로 의 값을 추정하는데 관심이 있습니다. 이는 모델에서 스터디 수준 변수를 삭제하는 것이 좋은 옵션이 아님을 의미합니다. γ

여러 연구 수준 변수 사이에 높은 상관 관계가 있으며 이것이 MCMC 체인에서 큰 자기 상관을 생성한다고 생각합니다. 이 진단 플롯은 연쇄 궤적 (왼쪽)과 결과 자기 상관 (오른쪽)을 보여줍니다.
MCMC 출력에서 ​​높은 자기 상관

자기 상관의 결과로, 각각 10,000 개 샘플의 4 개 체인에서 60-120의 효과적인 샘플 크기를 얻고 있습니다.

두 가지 질문이 있습니다. 하나는 분명히 객관적이고 다른 하나는 더 주관적입니다.

  1. 희석, 체인 추가 및 샘플러 실행 시간 외에이 자기 상관 문제를 관리하는 데 어떤 기술을 사용할 수 있습니까? "관리"는 "합리적인 시간 내에 합리적으로 좋은 견적을 작성합니다"를 의미합니다. 컴퓨팅 성능 측면에서 MacBook Pro에서 이러한 모델을 실행하고 있습니다.

  2. 이 정도의 자기 상관은 얼마나 심각합니까? 모두 토론 여기존 Kruschke의 블로그는 우리가 충분히 모델을 실행하는 경우, (Kruschke을) "를 큰 덩어리의 자기 상관이 아마 평균화 된"것을 제안하고, 그래서 정말 큰 문제가 아니다.

누군가가 세부 사항을 살펴볼만큼 관심이있는 경우를 대비하여 위의 플롯을 생성 한 모델의 JAGS 코드는 다음과 같습니다.

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
가치가있는 것은 복잡한 다중 레벨 모델이 Stan이 존재하는 이유와 거의 동일하기 때문입니다.
Sycorax는 Reinstate Monica

처음 몇 달 전에 Stan에서 이것을 만들려고했습니다. 연구에는 다른 수의 결과가 포함되어 있습니다 (적어도 한 번; 변경 사항이 있는지 확인하지는 않았지만). 그렇게 빨리.
Dan Hicks

1
HMC가 후자를 탐색하는 효율성만큼 속도를 생각하지 않았습니다. 내 이해는 HMC가 훨씬 더 많은 근거를 다룰 수 있기 때문에 각 반복은 자기 상관이 낮다는 것입니다.
Sycorax는 Reinstate Monica

네, 흥미로운 지적입니다. 나는 그것을 시도 할 것들의 목록에 넣을 것이다.
Dan Hicks

답변:


6

user777의 제안에 따르면 첫 번째 질문에 대한 대답은 "Stan 사용"인 것 같습니다. Stan에서 모델을 재 작성한 후 다음은 궤도 (번인 후 4 개의 체인 x 5000 반복)입니다.
여기에 이미지 설명을 입력하십시오 그리고 자기 상관도 :
여기에 이미지 설명을 입력하십시오

훨씬 낫다! 완성도를 높이기 위해 Stan 코드는 다음과 같습니다.

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);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.