Quản lý tự tương quan cao trong MCMC


10

Tôi đang xây dựng một mô hình Bayes phân cấp khá phức tạp để phân tích tổng hợp bằng R và JAGS. Đơn giản hóa một chút, hai cấp độ chính của mô hình có trong đó là quan sát thứ của điểm cuối (trong trường hợp này, năng suất cây trồng biến đổi gen so với cây trồng không biến đổi gen) trong nghiên cứu , là hiệu ứng cho nghiên cứu , là tác động đối với các biến số cấp độ nghiên cứu khác nhau (tình trạng phát triển kinh tế của quốc gia nơi nghiên cứu đã được thực hiện, các loài cây trồng, phương pháp nghiên cứu, v.v.) được lập chỉ mục bởi một họ các chức năng vàα j = Σ h γ h ( j ) + ε j y i j i j α j j γ h ε γ γ γ d e v đ l o p i n g γ d e v e l o p e d

yij=αj+ϵi
αj=hγh(j)+ϵj
yijijαjjγhϵs là các điều khoản lỗi. Lưu ý rằng không phải là hệ số trên các biến giả. Thay vào đó, có các biến riêng biệt cho các giá trị cấp độ nghiên cứu khác nhau. Ví dụ: có cho các nước đang phát triển và cho các nước phát triển. γγγdevelopingγdeveloped

Tôi chủ yếu quan tâm đến việc ước tính các giá trị của . Điều này có nghĩa là bỏ các biến cấp độ nghiên cứu khỏi mô hình không phải là một lựa chọn tốt. γ

Có mối tương quan cao giữa một số biến cấp độ nghiên cứu và tôi nghĩ rằng điều này đang tạo ra sự tự tương quan lớn trong chuỗi MCMC của tôi. Biểu đồ chẩn đoán này minh họa các quỹ đạo chuỗi (trái) và kết quả tự động tương quan (phải):
tự tương quan cao trong đầu ra MCMC

Do hậu quả của tự động tương quan, tôi nhận được kích thước mẫu hiệu quả là 60-120 từ 4 chuỗi 10.000 mẫu mỗi loại.

Tôi có hai câu hỏi, một câu hỏi rõ ràng khách quan và câu hỏi còn lại chủ quan hơn.

  1. Ngoài việc làm mỏng, thêm nhiều chuỗi và chạy bộ lấy mẫu lâu hơn, tôi có thể sử dụng những kỹ thuật nào để quản lý vấn đề tự tương quan này? Bằng cách "quản lý", ý tôi là "tạo ra các ước tính hợp lý tốt trong một khoảng thời gian hợp lý." Về khả năng tính toán, tôi đang chạy các model này trên MacBook Pro.

  2. Mức độ nghiêm trọng của sự tự kỷ này nghiêm trọng như thế nào? Các cuộc thảo luận ở đâytrên blog của John Kruschke cho thấy rằng, nếu chúng ta chỉ chạy mô hình đủ lâu, "sự tự kỷ khó hiểu có lẽ đã được tính trung bình" (Kruschke) và vì vậy nó không thực sự là vấn đề lớn.

Đây là mã JAGS cho mô hình đã tạo ra cốt truyện ở trên, trong trường hợp bất kỳ ai cũng đủ quan tâm để lội qua các chi tiết:

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
Đối với những gì nó có giá trị, các mô hình đa cấp phức tạp có khá nhiều lý do mà Stan tồn tại, vì chính xác những lý do mà bạn xác định.
Sycorax nói Phục hồi lại

Ban đầu tôi đã cố gắng xây dựng cái này ở Stan, vài tháng trước. Các nghiên cứu liên quan đến số lượng phát hiện khác nhau, (ít nhất là vào thời điểm đó; tôi đã không kiểm tra xem liệu mọi thứ đã thay đổi chưa) yêu cầu thêm một lớp phức tạp khác vào mã và có nghĩa là Stan không thể tận dụng các tính toán ma trận làm cho nó rất nhanh
Dan Hicks

1
Tôi đã không nghĩ về tốc độ nhiều như hiệu quả mà HMC khám phá về phía sau. Sự hiểu biết của tôi là bởi vì HMC có thể bao quát nhiều hơn nữa, mỗi lần lặp lại có độ tự tương quan thấp hơn.
Sycorax nói Phục hồi lại

Ồ, vâng, đó là một điểm thú vị. Tôi sẽ đưa nó vào danh sách những thứ cần thử.
Dan Hicks

Câu trả lời:


6

Theo gợi ý từ user777, có vẻ như câu trả lời cho câu hỏi đầu tiên của tôi là "sử dụng Stan". Sau khi viết lại mô hình trong Stan, đây là các quỹ đạo (4 chuỗi x 5000 lần lặp sau khi burn-in):
nhập mô tả hình ảnh ở đây Và các ô tự động tương quan:
nhập mô tả hình ảnh ở đây

Tốt hơn nhiều! Để hoàn thiện, đây là mã 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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.