-
Notifications
You must be signed in to change notification settings - Fork 0
/
daily.stan
63 lines (56 loc) · 1.25 KB
/
daily.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
53
54
55
56
57
58
59
60
61
62
63
// The input data is a vector 'D' of length 'N' containing daily data.
functions {
real pc_phi_lpdf(real x, real lambda){
return -1.5*log(x) + log(lambda/2.0) - lambda/sqrt(x);
}
}
data {
int<lower=0> N_days;
int<lower=0> D[N_days];
int<lower=0> N_generation;
vector<lower=0>[N_generation] g;
real R0;
real I0;
real alpha;
real beta;
real lambda;
}
transformed data {
}
parameters {
vector<lower=0>[N_days] R_T;
real<lower=0> sigma_R;
real<lower=0> R_0;
real<lower = 0> phi;
real<lower=0> I_negT;
}
transformed parameters {
vector<lower=0>[N_days] mu;
real<lower=0.0> generation_value = 0.0;
mu[1] = D[1];
for(t in 1:N_days){
// Calculate the value of mu
generation_value = 0.0;
for(s in 1:N_generation){
if((t-s)>0){
generation_value+=g[s]*D[t-s];
}else{
generation_value+=g[s]*I_negT;
}
}
mu[t] = R_T[t]*generation_value;
}
}
model {
// Set the priors of interest.
phi ~ pc_phi(lambda);
I_negT ~ normal(I0,sqrt(I0)) T[0,];
sigma_R ~ inv_gamma(alpha,beta);
R_0 ~ normal(R0,4.0) T[0,];
R_T[1] ~ normal(R_0,sigma_R) T[0,];
R_T[2:N_days] ~ normal(R_T[1:N_days-1],sigma_R);
// Data
D ~ neg_binomial_2(mu,phi);
}
generated quantities {
}