Я новичок в байесовском анализе и стараюсь использовать rstan для оценки распределения плотности задних частот. Упражнение пытается воссоздать пример, предоставленный нам моим университетом, используя stan, но я немного смущен относительно того, как правильно преобразовывать переменные. Мой текущий код работает без ошибок, но результат не соответствует тому, что мы предоставили университету (хотя и близко), ниже на графике ниже для ясности с оценками stan в черном. Я получил код для работы, посоветовавшись с руководством и собирая случайные биты, но, в частности, я не уверен, почему нужен target
, и если преобразование гаммы действительно верно. Любое руководство будет оценено!Трансформация переменных в рдане (байесовский анализ)
Модель
Стан Код
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
)
Дат
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 раствором ---
Этот вопрос, как отметил Бен Goodrich, что я получения гамма от тета, где, как это должно было быть другим так как гамма - это моя случайная величина. Правильный строковый код приведен ниже.
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);
}
Блок «преобразованные данные» выполняется только один раз; блок «преобразованных параметров» выполняется много раз на итерацию Марковской цепи. –