-
Notifications
You must be signed in to change notification settings - Fork 0
/
ovarian_model.stan
52 lines (48 loc) · 2.06 KB
/
ovarian_model.stan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
data {
int <lower=0> N; // number of observations
int <lower=0> d; // number of predictors
array[N] int<lower=0,upper=1> y; // outputs
matrix[N,d] x; // inputs
real <lower=0> scale_icept; // prior std for the intercept
real <lower=0> scale_global; // scale for the half -t prior for tau
real <lower=1> nu_global; // degrees of freedom for the half -t prior for tau
real <lower=1> nu_local; // degrees of freedom for the half -t priors for lambdas
real <lower=0> slab_scale; // slab scale for the regularized horseshoe
real <lower=0> slab_df; // slab degrees of freedom for the regularized horseshoe
//int<lower=0> N_tilde;
//matrix[N_tilde, d] x_tilde;
//array[N_tilde] int<lower=0,upper=1> y_obs;
}
parameters {
real beta0;
vector[d] z;
real <lower=0> tau; // global shrinkage parameter
vector <lower =0>[d] lambda; // local shrinkage parameter
real <lower=0> caux;
}
transformed parameters {
vector <lower =0>[d] lambda_tilde; // ’truncated ’ local shrinkage parameter
real <lower=0> c; // slab scale
vector[d] beta; // regression coefficients
vector[N] f; // latent function values
c = slab_scale * sqrt(caux);
lambda_tilde = sqrt( c^2 * square(lambda) ./ (c^2 + tau^2* square(lambda )) );
beta = z .* lambda_tilde*tau;
f = beta0 + x*beta;
}
model {
z ~ normal(0.0, 1.0); // half -t priors for lambdas and tau , and inverse -gamma for c^2
lambda ~ student_t(nu_local , 0.0, 1.0);
tau ~ student_t(nu_global , 0.0, scale_global);
caux ~ inv_gamma (0.5* slab_df , 0.5* slab_df );
beta0 ~ normal(0.0, scale_icept );
y ~ bernoulli_logit(f);
}
generated quantities {
vector[N] log_lik;
// vector[N_tilde] loo_log_lik;
for (nn in 1:N)
log_lik[nn] = bernoulli_logit_lpmf(y[nn] | x[nn] * beta + beta0);
//for (nn in 1:N_tilde)
// loo_log_lik[nn] = bernoulli_logit_lpmf(y_obs[nn] | x_tilde[nn] * beta + beta0);
}