MCMCでの高い自己相関の管理


10

私は、RとJAGSを使用したメタ分析のためのやや複雑な階層ベイズモデルを構築しています。ビットを簡略化、モデルの2つの主要なレベルが有する α J = Σ H γ H J + ε J Y I jがあるIこの場合、エンドポイントの目を観察( 、研究における対非GM作物の収量GM)jはα jは、研究のための効果であるJγ

yij=αj+ϵi
αj=hγh(j)+ϵj
yijijαjjγSは関数の家族によって様々な研究レベルの変数(などの研究が行われた国の経済発展状況、作物種、勉強法、)のための効果インデックス化されている、およびε sがエラー項です。ことを注意γ sがダミー変数の係数はありません。代わりに、さまざまな研究レベルの値に対して異なるγ変数があります。例えば、あるγ D 、E 、V 、E 、L 、O 、P 、I 、N 、G、発展途上国とのためのγ のD 、E のV EのL O のP のE dがhϵγγγdevelopingγdeveloped 先進国のために。

私は主の値を推定することに興味が秒。つまり、モデルからスタディレベルの変数を削除することは適切なオプションではありません。 γ

研究レベルの変数のいくつかの間には高い相関関係があり、これが私のMCMCチェーンで大きな自己相関を生み出していると思います。この診断プロットは、チェーンの軌跡(左)と結果の自己相関(右)を示しています。
MCMC出力の高い自己相関

自己相関の結果として、それぞれ10,000サンプルの4つのチェーンから60〜120の効果的なサンプルサイズを取得しています。

2つの質問があります。1つは明らかに客観的で、もう1つは主観的です。

  1. 間引き、チェーンの追加、サンプラーの実行時間の延長以外に、この自己相関問題を管理するためにどのようなテクニックを使用できますか?「管理」とは、「妥当な時間内に合理的に優れた見積もりを作成する」ことを意味します。計算能力に関しては、私はこれらのモデルをMacBook Proで実行しています。

  2. この程度の自己相関はどの程度深刻ですか?ここJohn 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は、モニカを2015

私は数か月前にスタンでこれを最初に構築しようとしました。調査にはさまざまな調査結果が含まれており、(少なくとも現時点では、状況が変化したかどうかを確認していません)、コードにさらに複雑なレイヤーを追加する必要があり、スタンはマトリックス計算を利用できませんでした。それはそれをとても速くします。
Dan Hicks

1
HMCが後方を探索する効率ほど速度については考えていませんでした。私の理解では、HMCはより広い範囲をカバーできるため、各反復の自己相関は低くなります。
Sycoraxは、モニカを2015

ああ、はい、それは興味深い点です。私はそれを私のやることリストに載せます。
Dan Hicks

回答:


6

user777からの提案に続き、私の最初の質問に対する答えは「use Stan」のようです。Stanでモデルを書き換えた後の軌跡は次のとおりです(4チェーンxバーンイン後の5000回の反復):
ここに画像の説明を入力してください そして、自己相関プロット:
ここに画像の説明を入力してください

ずっといい!完全を期すために、ここにスタンコードがあります:

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.