2017-01-24 8 views
2

私はベイジアン解析の初心者です。rstanを使用して事後密度分布を推定しようとしています。演習では私の大学からスタンを使って与えられた例を再作成しようとしていますが、変数を正しく変換する方法について少し混乱しています。私の現在のコードはエラーなく実行されますが、結果は、私たちが大学から与えられたものと一致しません(近いですが)。マニュアルを参考にしてランダムなビットを組み合わせることで作業するコードを得ましたが、特にtargetが必要な理由と、ガンマの変換が本当に正しいかどうかは、あまりよく分かりません。どんな指導もいただければ幸いです!rstanの変数の変換(ベイジアン解析)

モデル

enter image description here

スタンコード

data { 
    int<lower=0> I; 
    int<lower=0> n[I]; 
    int<lower=0> x[I]; 
    real<lower=0> a; 
    real<lower=0> b; 
    real m; 
    real<lower=0> p; 
} 

parameters { 
    real<lower=0> lambda; 
    real mu; 
    real<lower=0, upper=1> theta[I]; 
} 

transformed parameters { 
    real gam[I]; 
    for(j in 1:I) 
    gam[j] = log(theta[j]/(1-theta[j])) ; 
} 


model { 
    target += gamma_lpdf(lambda | a, b); 
    target += normal_lpdf(mu | m , 1/sqrt(p)); 
    target += normal_lpdf(gam | mu, 1/sqrt(lambda)); 
    target += binomial_lpmf(x | n , theta); 
} 

Rコード

library(rstan) 
fit <- stan(
    file = "hospital.stan" , 
    data = dat , 
    iter = 20000, 
    warmup = 2000, 
    chains = 1 
) 

ベン・グッドリッチで指摘したように、DAT

structure(
    list(
     I = 12L, 
     n = c(47, 211, 810, 148, 196, 360, 119, 207, 97, 256, 148, 215), 
     x = c(0, 8, 46, 9, 13, 24, 8, 14, 8, 29, 18, 31), 
     a = 2, 
     b = 2, 
     m = 0, 
     p = 0.01), 
    .Names = c("I", "n", "x", "a", "b", "m", "p") 
) 

---溶液でUPDATE ---

問題は、それが他のされている必要がありますように私はどこシータからのガンマ線を導出していることですガンマは私の無作為な変数です。正しいスタンコードは以下の通りです。

data { 
    int<lower=0> I; 
    int<lower=0> n[I]; 
    int<lower=0> x[I]; 
    real<lower=0> a; 
    real<lower=0> b; 
    real m; 
    real<lower=0> p; 
} 

parameters { 
    real<lower=0> lambda; 
    real mu; 
    real gam[I]; 
} 

transformed parameters { 
    real<lower=0 , upper=1> theta[I]; 
    // theta = inv_logit(gam); // Alternatively can use the in-built inv_logit function which is vectorised 
    for(j in 1:I){ 
     theta[j] = 1/(1 + exp(-gam[j])); 
    } 
} 

model { 
    target += gamma_lpdf(lambda | a, b); 
    target += normal_lpdf(mu | m , 1/sqrt(p)); 
    target += normal_lpdf(gam | mu, 1/sqrt(lambda)); 
    target += binomial_lpmf(x | n , theta); 
} 
+0

'transformed transformed'ブロックは1回だけ実行されます。 「変換されたパラメータ」ブロックは、マルコフ連鎖の反復ごとに何度も実行される。 –

答えて

2

ヒントとして、parametersブロックにgam(MA)を入れてみてください、その後、宣言してあなたが最初に与えた分布に応じてtransformed parametersブロックでthetaを定義します。スタンへ

初心者は、多くの場合、スタンがオーバーが実行されている実際にそれがCにかなり文字通りtranspiledます論理的に自分のスタン・プログラムの意味をうまく能力、++およびtransformed parametersmodelブロックからコードの行に恵まれていることを前提とし、もう一度。

gam(ma)またはthetaがプリミティブパラメータであるかどうかに違いがある理由は、変数変更の原則と関係があります。ヤコビ行列式の項(ログ単位)をtargetに追加すると、元のパラメータ化で同じ結果が得られることがありますが、gam(ma)をparametersブロックに、thetaブロックtransformed parametersに送信します。変数変更の原則の詳細については、case studyを参照してください。

+0

これは修正済みです!答えとしてマークする前に、なぜこれが修正されたのか説明するのに役立つでしょうか?私はガンマの関数としてシータを持つと思っていただろうか、シータの関数としてガンマを持つことは交換可能でなければならないだろうか? – CroGo

+0

私は今、ガンマは正規分布からサンプリングしているrvであるのに対し、シータはそのrvの関数であると考えていると言っています。 – CroGo

関連する問題