epinowcast
Loading...
Searching...
No Matches
log_expected_latent_from_r.stan
Go to the documentation of this file.
1
11vector extract_group_rates(vector r, array[] int r_g, int k, int r_t) {
12 return segment(r, r_g[k] + 1, r_t);
13}
14
64 matrix lexp_latent_int, vector r, array[] int r_g, int r_t,
65 int r_seed, int gt_n, vector lrgt, int t, int g
66) {
67 array[g] vector[t] exp_lobs;
68
69 if (gt_n == 1) {
70 // Exponential growth: cumulative sum on log scale
71 vector[r_t] local_r;
72 for (k in 1:g) {
73 local_r = extract_group_rates(r, r_g, k, r_t);
74 exp_lobs[k][1] = lexp_latent_int[1, k];
75 exp_lobs[k][(r_seed + 1):t] = exp_lobs[k][1] + cumulative_sum(local_r);
76 }
77 } else {
78 // Renewal equation: work on natural scale for numerical stability
79 vector[gt_n] rgt = exp(lrgt);
80 vector[t] exp_obs;
81 vector[r_t] local_R;
82 for (k in 1:g) {
83 // Extract and exponentiate growth rates in one step
84 local_R = exp(extract_group_rates(r, r_g, k, r_t));
85 exp_obs[1:r_seed] = exp(lexp_latent_int[1:r_seed, k]);
86 // Convolve recent cases with generation time to get new cases
87 for (i in 1:r_t) {
88 exp_obs[r_seed + i] = local_R[i] * dot_product(
89 segment(exp_obs, r_seed + i - gt_n, gt_n), rgt
90 );
91 }
92 exp_lobs[k] = log(exp_obs);
93 }
94 }
95 return(exp_lobs);
96}
vector extract_group_rates(vector r, array[] int r_g, int k, int r_t)
array[] vector log_expected_latent_from_r(matrix lexp_latent_int, vector r, array[] int r_g, int r_t, int r_seed, int gt_n, vector lrgt, int t, int g)