epinowcast
Loading...
Searching...
No Matches
primarycensored_analytical_cdf.stan
Go to the documentation of this file.
1
10int check_for_analytical(int dist_id, int primary_id) {
11 if (dist_id == 2 && primary_id == 1) return 1; // Gamma delay with Uniform primary
12 if (dist_id == 1 && primary_id == 1) return 1; // Lognormal delay with Uniform primary
13 if (dist_id == 3 && primary_id == 1) return 1; // Weibull delay with Uniform primary
14 return 0; // No analytical solution for other combinations
15}
16
28real primarycensored_gamma_uniform_lcdf(data real d, real q, array[] real params, data real pwindow) {
29 real shape = params[1];
30 real rate = params[2];
31 real shape_1 = shape + 1;
32 real log_window = log(pwindow);
33
34 real log_F_T = gamma_lcdf(d | shape, rate);
35 real log_F_T_kp1 = gamma_lcdf(d | shape_1, rate);
36
37 real log_delta_F_T_kp1;
38 real log_delta_F_T_k;
39 real log_F_Splus;
40
41 if (q != 0) {
42 real log_F_T_q = gamma_lcdf(q | shape, rate);
43 real log_F_T_q_kp1 = gamma_lcdf(q | shape_1, rate);
44
45 // Ensure that the first argument is greater than the second
46 log_delta_F_T_kp1 = log_diff_exp(log_F_T_kp1, log_F_T_q_kp1);
47 log_delta_F_T_k = log_diff_exp(log_F_T, log_F_T_q);
48
49 log_F_Splus = log_diff_exp(
50 log_F_T,
51 log_diff_exp(
52 log(shape * inv(rate)) + log_delta_F_T_kp1,
53 log(d - pwindow) + log_delta_F_T_k
54 ) - log_window
55 );
56 } else {
57 log_delta_F_T_kp1 = log_F_T_kp1;
58 log_delta_F_T_k = log_F_T;
59
60 log_F_Splus = log_diff_exp(
61 log_F_T,
62 log_sum_exp(
63 log(shape * inv(rate)) + log_delta_F_T_kp1,
64 log(pwindow - d) + log_delta_F_T_k
65 ) - log_window
66 );
67 }
68
69 return log_F_Splus;
70}
71
83real primarycensored_lognormal_uniform_lcdf(data real d, real q, array[] real params, data real pwindow) {
84 real mu = params[1];
85 real sigma = params[2];
86 real mu_sigma2 = mu + square(sigma);
87 real log_window = log(pwindow);
88
89 real log_F_T = lognormal_lcdf(d | mu, sigma);
90 real log_F_T_mu_sigma2 = lognormal_lcdf(d | mu_sigma2, sigma);
91
92 real log_delta_F_T_mu_sigma;
93 real log_delta_F_T;
94 real log_F_Splus;
95
96 if (q != 0) {
97 real log_F_T_q = lognormal_lcdf(q | mu, sigma);
98 real log_F_T_q_mu_sigma2 = lognormal_lcdf(q | mu_sigma2, sigma);
99
100 // Ensure that the first argument is greater than the second
101 log_delta_F_T_mu_sigma = log_diff_exp(
102 log_F_T_mu_sigma2, log_F_T_q_mu_sigma2
103 );
104 log_delta_F_T = log_diff_exp(log_F_T, log_F_T_q);
105
106 log_F_Splus = log_diff_exp(
107 log_F_T,
108 log_diff_exp(
109 (mu + 0.5 * square(sigma)) + log_delta_F_T_mu_sigma,
110 log(d - pwindow) + log_delta_F_T
111 ) - log_window
112 );
113 } else {
114 log_delta_F_T_mu_sigma = log_F_T_mu_sigma2;
115 log_delta_F_T = log_F_T;
116
117 log_F_Splus = log_diff_exp(
118 log_F_T,
119 log_sum_exp(
120 (mu + 0.5 * square(sigma)) + log_delta_F_T_mu_sigma,
121 log(pwindow - d) + log_delta_F_T
122 ) - log_window
123 );
124 }
125
126 return log_F_Splus;
127}
128
142real log_weibull_g(real t, real shape, real scale) {
143 real x = pow(t * inv(scale), shape);
144 real a = 1 + inv(shape);
145 return log(gamma_p(a, x)) + lgamma(a);
146}
147
159real primarycensored_weibull_uniform_lcdf(data real d, real q, array[] real params, data real pwindow) {
160 real shape = params[1];
161 real scale = params[2];
162 real log_window = log(pwindow);
163
164 real log_F_T = weibull_lcdf(d | shape, scale);
165
166 real log_delta_g;
167 real log_delta_F_T;
168 real log_F_Splus;
169
170 if (q != 0) {
171 real log_F_T_q = weibull_lcdf(q | shape, scale);
172
173 log_delta_g = log_diff_exp(
174 log_weibull_g(d, shape, scale),
175 log_weibull_g(q, shape, scale)
176 );
177 log_delta_F_T = log_diff_exp(log_F_T, log_F_T_q);
178
179 log_F_Splus = log_diff_exp(
180 log_F_T,
181 log_diff_exp(
182 log(scale) + log_delta_g,
183 log(d - pwindow) + log_delta_F_T
184 ) - log_window
185 );
186 } else {
187 log_delta_g = log_weibull_g(d, shape, scale);
188 log_delta_F_T = log_F_T;
189
190 log_F_Splus = log_diff_exp(
191 log_F_T,
192 log_sum_exp(
193 log(scale) + log_delta_g,
194 log(pwindow - d) + log_delta_F_T
195 ) - log_window
196 );
197 }
198
199 return log_F_Splus;
200}
201
215real primarycensored_analytical_lcdf(data real d, int dist_id,
216 array[] real params,
217 data real pwindow, data real D,
218 int primary_id,
219 array[] real primary_params) {
220 real result;
221 real log_cdf_D;
222
223 if (d <= 0) return negative_infinity();
224 if (d >= D) return 0;
225
226 real q = max({d - pwindow, 0});
227
228 if (dist_id == 2 && primary_id == 1) {
229 // Gamma delay with Uniform primary
230 result = primarycensored_gamma_uniform_lcdf(d | q, params, pwindow);
231 } else if (dist_id == 1 && primary_id == 1) {
232 // Lognormal delay with Uniform primary
233 result = primarycensored_lognormal_uniform_lcdf(d | q, params, pwindow);
234 } else if (dist_id == 3 && primary_id == 1) {
235 // Weibull delay with Uniform primary
236 result = primarycensored_weibull_uniform_lcdf(d | q, params, pwindow);
237 } else {
238 // No analytical solution available
239 return negative_infinity();
240 }
241
242 if (!is_inf(D)) {
243 log_cdf_D = primarycensored_lcdf(
244 D | dist_id, params, pwindow, positive_infinity(),
245 primary_id, primary_params
246 );
247 result = result - log_cdf_D;
248 }
249
250 return result;
251}
252
266real primarycensored_analytical_cdf(data real d, int dist_id,
267 array[] real params,
268 data real pwindow, data real D,
269 int primary_id,
270 array[] real primary_params) {
271 return exp(primarycensored_analytical_lcdf(d | dist_id, params, pwindow, D, primary_id, primary_params));
272}
real primarycensored_lcdf(data real d, int dist_id, array[] real params, data real pwindow, data real D, int primary_id, array[] real primary_params)
real primarycensored_analytical_cdf(data real d, int dist_id, array[] real params, data real pwindow, data real D, int primary_id, array[] real primary_params)
real log_weibull_g(real t, real shape, real scale)
real primarycensored_weibull_uniform_lcdf(data real d, real q, array[] real params, data real pwindow)
real primarycensored_analytical_lcdf(data real d, int dist_id, array[] real params, data real pwindow, data real D, int primary_id, array[] real primary_params)
real primarycensored_lognormal_uniform_lcdf(data real d, real q, array[] real params, data real pwindow)
real primarycensored_gamma_uniform_lcdf(data real d, real q, array[] real params, data real pwindow)
int check_for_analytical(int dist_id, int primary_id)