/
royston_parmar.stan
37 lines (35 loc) · 1.98 KB
/
royston_parmar.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
/************************************************************************************************************************/
data {
int<lower=1> N; // number of data points
int<lower=1> m; // number of basis splines
int<lower=1> NC; // number of covariates
matrix[N,NC] X; // design matrix
int<lower=0, upper=1> is_censored[N]; // delta in the paper
vector[N] log_times; // x=log(t) in the paper
matrix[m,N] basis_evals;
matrix[m,N] deriv_basis_evals;
}
/************************************************************************************************************************/
parameters {
row_vector<lower=0>[m] gammas; // regression coefficients for splines
vector[NC] betas; // regression coefficients for covariates
real gamma_intercept; // \gamma_0 in the paper
}
/************************************************************************************************************************/
model {
vector[N] etas;
gammas ~ normal(0, 2);
betas ~ normal(0,1);
gamma_intercept ~ normal(0,1);
etas = X*betas + (gammas*basis_evals)' + gamma_intercept;
for(i in 1:N) {
if(is_censored[i] == 0) {
target += etas[i] - exp(etas[i]) - log_times[i] + log(gammas*deriv_basis_evals[,i]);
}
else {
target += -exp(etas[i]); // we work with log-likelihood
}
}
}
// TODO: vectorize target+= statements, which can be done. requires that we split data into censored and non-censored
/************************************************************************************************************************/