primarycensored
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
29real primarycensored_gamma_uniform_lcdf(data real d, real q, array[] real params, data real pwindow) {
30 real shape = params[1];
31 real rate = params[2];
32 real shape_1 = shape + 1;
33 real log_window = log(pwindow);
34
35 real log_F_T = gamma_lcdf(d | shape, rate);
36 real log_F_T_kp1 = gamma_lcdf(d | shape_1, rate);
37
38 real log_delta_F_T_kp1;
39 real log_delta_F_T_k;
40 real log_F_Splus;
41
42 if (q != 0) {
43 real log_F_T_q = gamma_lcdf(q | shape, rate);
44 real log_F_T_q_kp1 = gamma_lcdf(q | shape_1, rate);
45
46 // Ensure that the first argument is greater than the second
47 log_delta_F_T_kp1 = log_diff_exp(log_F_T_kp1, log_F_T_q_kp1);
48 log_delta_F_T_k = log_diff_exp(log_F_T, log_F_T_q);
49
50 log_F_Splus = log_diff_exp(
51 log_F_T,
52 log_diff_exp(
53 log(shape * inv(rate)) + log_delta_F_T_kp1,
54 log(d - pwindow) + log_delta_F_T_k
55 ) - log_window
56 );
57 } else {
58 log_delta_F_T_kp1 = log_F_T_kp1;
59 log_delta_F_T_k = log_F_T;
60
61 log_F_Splus = log_diff_exp(
62 log_F_T,
63 log_sum_exp(
64 log(shape * inv(rate)) + log_delta_F_T_kp1,
65 log(pwindow - d) + log_delta_F_T_k
66 ) - log_window
67 );
68 }
69
70 return log_F_Splus;
71}
72
85real primarycensored_lognormal_uniform_lcdf(data real d, real q, array[] real params, data real pwindow) {
86 real mu = params[1];
87 real sigma = params[2];
88 real mu_sigma2 = mu + square(sigma);
89 real log_window = log(pwindow);
90
91 real log_F_T = lognormal_lcdf(d | mu, sigma);
92 real log_F_T_mu_sigma2 = lognormal_lcdf(d | mu_sigma2, sigma);
93
94 real log_delta_F_T_mu_sigma;
95 real log_delta_F_T;
96 real log_F_Splus;
97
98 if (q != 0) {
99 real log_F_T_q = lognormal_lcdf(q | mu, sigma);
100 real log_F_T_q_mu_sigma2 = lognormal_lcdf(q | mu_sigma2, sigma);
101
102 // Ensure that the first argument is greater than the second
103 log_delta_F_T_mu_sigma = log_diff_exp(
104 log_F_T_mu_sigma2, log_F_T_q_mu_sigma2
105 );
106 log_delta_F_T = log_diff_exp(log_F_T, log_F_T_q);
107
108 log_F_Splus = log_diff_exp(
109 log_F_T,
110 log_diff_exp(
111 (mu + 0.5 * square(sigma)) + log_delta_F_T_mu_sigma,
112 log(d - pwindow) + log_delta_F_T
113 ) - log_window
114 );
115 } else {
116 log_delta_F_T_mu_sigma = log_F_T_mu_sigma2;
117 log_delta_F_T = log_F_T;
118
119 log_F_Splus = log_diff_exp(
120 log_F_T,
121 log_sum_exp(
122 (mu + 0.5 * square(sigma)) + log_delta_F_T_mu_sigma,
123 log(pwindow - d) + log_delta_F_T
124 ) - log_window
125 );
126 }
127
128 return log_F_Splus;
129}
130
145real log_weibull_g(real t, real shape, real scale) {
146 real x = pow(t * inv(scale), shape);
147 real a = 1 + inv(shape);
148 return log(gamma_p(a, x)) + lgamma(a);
149}
150
163real primarycensored_weibull_uniform_lcdf(data real d, real q, array[] real params, data real pwindow) {
164 real shape = params[1];
165 real scale = params[2];
166 real log_window = log(pwindow);
167
168 real log_F_T = weibull_lcdf(d | shape, scale);
169
170 real log_delta_g;
171 real log_delta_F_T;
172 real log_F_Splus;
173
174 if (q != 0) {
175 real log_F_T_q = weibull_lcdf(q | shape, scale);
176
177 log_delta_g = log_diff_exp(
178 log_weibull_g(d, shape, scale),
179 log_weibull_g(q, shape, scale)
180 );
181 log_delta_F_T = log_diff_exp(log_F_T, log_F_T_q);
182
183 log_F_Splus = log_diff_exp(
184 log_F_T,
185 log_diff_exp(
186 log(scale) + log_delta_g,
187 log(d - pwindow) + log_delta_F_T
188 ) - log_window
189 );
190 } else {
191 log_delta_g = log_weibull_g(d, shape, scale);
192 log_delta_F_T = log_F_T;
193
194 log_F_Splus = log_diff_exp(
195 log_F_T,
196 log_sum_exp(
197 log(scale) + log_delta_g,
198 log(pwindow - d) + log_delta_F_T
199 ) - log_window
200 );
201 }
202
203 return log_F_Splus;
204}
205
211real primarycensored_analytical_lcdf_raw(data real d, int dist_id,
212 array[] real params,
213 data real pwindow,
214 int primary_id) {
215 real q = max({d - pwindow, 0});
216
217 if (dist_id == 2 && primary_id == 1) {
218 return primarycensored_gamma_uniform_lcdf(d | q, params, pwindow);
219 } else if (dist_id == 1 && primary_id == 1) {
220 return primarycensored_lognormal_uniform_lcdf(d | q, params, pwindow);
221 } else if (dist_id == 3 && primary_id == 1) {
222 return primarycensored_weibull_uniform_lcdf(d | q, params, pwindow);
223 }
224 return negative_infinity();
225}
226
243real primarycensored_analytical_lcdf(data real d, int dist_id,
244 array[] real params,
245 data real pwindow, data real L,
246 data real D, int primary_id,
247 array[] real primary_params) {
248 if (d <= L) return negative_infinity();
249 if (d >= D) return 0;
250
252 d, dist_id, params, pwindow, primary_id
253 );
254
255 // Apply truncation normalization
256 if (!is_inf(D) || L > 0) {
257 vector[2] bounds = primarycensored_truncation_bounds(
258 L, D, dist_id, params, pwindow, primary_id, primary_params
259 );
260 real log_cdf_L = bounds[1];
261 real log_cdf_D = bounds[2];
262
263 real log_normalizer = primarycensored_log_normalizer(log_cdf_D, log_cdf_L, L);
264 result = primarycensored_apply_truncation(result, log_cdf_L, log_normalizer, L);
265 }
266
267 return result;
268}
269
286real primarycensored_analytical_cdf(data real d, int dist_id,
287 array[] real params,
288 data real pwindow, data real L,
289 data real D, int primary_id,
290 array[] real primary_params) {
291 return exp(primarycensored_analytical_lcdf(d | dist_id, params, pwindow, L, D, primary_id, primary_params));
292}
real log_weibull_g(real t, real shape, real scale)
int check_for_analytical(int dist_id, int primary_id)
real primarycensored_analytical_lcdf_raw(data real d, int dist_id, array[] real params, data real pwindow, int primary_id)
real primarycensored_weibull_uniform_lcdf(data real d, real q, array[] real params, data real pwindow)
real primarycensored_lognormal_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 L, data real D, int primary_id, array[] real primary_params)
real primarycensored_gamma_uniform_lcdf(data real d, real q, array[] real params, data real pwindow)
real primarycensored_analytical_cdf(data real d, int dist_id, array[] real params, data real pwindow, data real L, data real D, int primary_id, array[] real primary_params)
real primarycensored_apply_truncation(real log_cdf, real log_cdf_L, real log_normalizer, real L)
real primarycensored_log_normalizer(real log_cdf_D, real log_cdf_L, real L)
vector primarycensored_truncation_bounds(data real L, data real D, int dist_id, array[] real params, data real pwindow, int primary_id, array[] real primary_params)