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
220real primarycensored_analytical_lcdf(data real d, int dist_id,
221 array[] real params,
222 data real pwindow, data real D,
223 int primary_id,
224 array[] real primary_params) {
225 real result;
226 real log_cdf_D;
227
228 if (d <= 0) return negative_infinity();
229 if (d >= D) return 0;
230
231 real q = max({d - pwindow, 0});
232
233 if (dist_id == 2 && primary_id == 1) {
234 // Gamma delay with Uniform primary
235 result = primarycensored_gamma_uniform_lcdf(d | q, params, pwindow);
236 } else if (dist_id == 1 && primary_id == 1) {
237 // Lognormal delay with Uniform primary
238 result = primarycensored_lognormal_uniform_lcdf(d | q, params, pwindow);
239 } else if (dist_id == 3 && primary_id == 1) {
240 // Weibull delay with Uniform primary
241 result = primarycensored_weibull_uniform_lcdf(d | q, params, pwindow);
242 } else {
243 // No analytical solution available
244 return negative_infinity();
245 }
246
247 if (!is_inf(D)) {
248 log_cdf_D = primarycensored_lcdf(
249 D | dist_id, params, pwindow, positive_infinity(),
250 primary_id, primary_params
251 );
252 result = result - log_cdf_D;
253 }
254
255 return result;
256}
257
272real primarycensored_analytical_cdf(data real d, int dist_id,
273 array[] real params,
274 data real pwindow, data real D,
275 int primary_id,
276 array[] real primary_params) {
277 return exp(primarycensored_analytical_lcdf(d | dist_id, params, pwindow, D, primary_id, primary_params));
278}
real log_weibull_g(real t, real shape, real scale)
int check_for_analytical(int dist_id, int primary_id)
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 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)