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
71 matrix lexp_latent_int, vector r, array[] int r_g, int r_t,
72 int r_seed, int gt_n, vector lrgt, int t, int g,
73 vector pop, int use_pop, real pop_floor
74) {
75 array[g] vector[t] exp_lobs;
76
77 if (gt_n == 1) {
78 // Exponential growth: cumulative sum on log scale
79 vector[r_t] local_r;
80 for (k in 1:g) {
81 local_r = extract_group_rates(r, r_g, k, r_t);
82 exp_lobs[k][1] = lexp_latent_int[1, k];
83 exp_lobs[k][(r_seed + 1):t] = exp_lobs[k][1] + cumulative_sum(local_r);
84 }
85 } else {
86 // Renewal equation: work on natural scale for numerical stability
87 vector[gt_n] rgt = exp(lrgt);
88 vector[t] exp_obs;
89 vector[r_t] local_R;
90 for (k in 1:g) {
91 // Extract and exponentiate growth rates in one step
92 local_R = exp(extract_group_rates(r, r_g, k, r_t));
93 exp_obs[1:r_seed] = exp(lexp_latent_int[1:r_seed, k]);
94 if (use_pop) {
95 // Cumulative cases consumed from the pool (incl. seeds).
96 real cum_cases = sum(exp_obs[1:r_seed]);
97 for (i in 1:r_t) {
98 real infectiousness = dot_product(
99 segment(exp_obs, r_seed + i - gt_n, gt_n), rgt
100 );
101 // Scale by remaining susceptible fraction; cap new cases by the pool.
102 real remaining_susceptible = fmax(0, pop[k] - cum_cases);
103 real denom = fmax(pop_floor, remaining_susceptible);
104 real adj = 1 - exp(-local_R[i] * infectiousness / denom);
105 exp_obs[r_seed + i] = fmax(1e-8, remaining_susceptible * adj);
106 cum_cases += exp_obs[r_seed + i];
107 }
108 } else {
109 // Convolve recent cases with generation time to get new cases
110 for (i in 1:r_t) {
111 exp_obs[r_seed + i] = local_R[i] * dot_product(
112 segment(exp_obs, r_seed + i - gt_n, gt_n), rgt
113 );
114 }
115 }
116 exp_lobs[k] = log(exp_obs);
117 }
118 }
119 return(exp_lobs);
120}
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, vector pop, int use_pop, real pop_floor)