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