3 if (x < xmin || x > xmax) {
4 return negative_infinity();
7 return -log(xmax - xmin);
9 return log(abs(r)) + r * (x - xmin) -
10 log(abs(exp(r * xmax) - exp(r * xmin)));
13 if (dist_id == 2 && primary_id == 1)
return 1;
14 if (dist_id == 1 && primary_id == 1)
return 1;
15 if (dist_id == 3 && primary_id == 1)
return 1;
19 real shape = params[1];
20 real rate = params[2];
21 real shape_1 = shape + 1;
22 real log_window = log(pwindow);
24 real log_F_T = gamma_lcdf(d | shape, rate);
25 real log_F_T_kp1 = gamma_lcdf(d | shape_1, rate);
27 real log_delta_F_T_kp1;
32 real log_F_T_q = gamma_lcdf(q | shape, rate);
33 real log_F_T_q_kp1 = gamma_lcdf(q | shape_1, rate);
36 log_delta_F_T_kp1 = log_diff_exp(log_F_T_kp1, log_F_T_q_kp1);
37 log_delta_F_T_k = log_diff_exp(log_F_T, log_F_T_q);
39 log_F_Splus = log_diff_exp(
42 log(shape * inv(rate)) + log_delta_F_T_kp1,
43 log(d - pwindow) + log_delta_F_T_k
47 log_delta_F_T_kp1 = log_F_T_kp1;
48 log_delta_F_T_k = log_F_T;
50 log_F_Splus = log_diff_exp(
53 log(shape * inv(rate)) + log_delta_F_T_kp1,
54 log(pwindow - d) + log_delta_F_T_k
63 real sigma = params[2];
64 real mu_sigma2 = mu + square(sigma);
65 real log_window = log(pwindow);
67 real log_F_T = lognormal_lcdf(d | mu, sigma);
68 real log_F_T_mu_sigma2 = lognormal_lcdf(d | mu_sigma2, sigma);
70 real log_delta_F_T_mu_sigma;
75 real log_F_T_q = lognormal_lcdf(q | mu, sigma);
76 real log_F_T_q_mu_sigma2 = lognormal_lcdf(q | mu_sigma2, sigma);
79 log_delta_F_T_mu_sigma = log_diff_exp(
80 log_F_T_mu_sigma2, log_F_T_q_mu_sigma2
82 log_delta_F_T = log_diff_exp(log_F_T, log_F_T_q);
84 log_F_Splus = log_diff_exp(
87 (mu + 0.5 * square(sigma)) + log_delta_F_T_mu_sigma,
88 log(d - pwindow) + log_delta_F_T
92 log_delta_F_T_mu_sigma = log_F_T_mu_sigma2;
93 log_delta_F_T = log_F_T;
95 log_F_Splus = log_diff_exp(
98 (mu + 0.5 * square(sigma)) + log_delta_F_T_mu_sigma,
99 log(pwindow - d) + log_delta_F_T
107 real x = pow(t * inv(scale), shape);
108 real a = 1 + inv(shape);
109 return log(gamma_p(a, x)) + lgamma(a);
112 real shape = params[1];
113 real scale = params[2];
114 real log_window = log(pwindow);
116 real log_F_T = weibull_lcdf(d | shape, scale);
123 real log_F_T_q = weibull_lcdf(q | shape, scale);
125 log_delta_g = log_diff_exp(
129 log_delta_F_T = log_diff_exp(log_F_T, log_F_T_q);
131 log_F_Splus = log_diff_exp(
134 log(scale) + log_delta_g,
135 log(d - pwindow) + log_delta_F_T
140 log_delta_F_T = log_F_T;
142 log_F_Splus = log_diff_exp(
145 log(scale) + log_delta_g,
146 log(pwindow - d) + log_delta_F_T
157 real q = max({d - pwindow, 0});
159 if (dist_id == 2 && primary_id == 1) {
161 }
else if (dist_id == 1 && primary_id == 1) {
163 }
else if (dist_id == 3 && primary_id == 1) {
166 return negative_infinity();
170 data real pwindow, data real L,
171 data real D,
int primary_id,
172 array[] real primary_params) {
173 if (d <= L)
return negative_infinity();
174 if (d >= D)
return 0;
177 d, dist_id, params, pwindow, primary_id
181 if (!is_inf(D) || L > 0) {
183 L, D, dist_id, params, pwindow, primary_id, primary_params
185 real log_cdf_L = bounds[1];
186 real log_cdf_D = bounds[2];
196 data real pwindow, data real L,
197 data real D,
int primary_id,
198 array[] real primary_params) {
201real
dist_lcdf(real delay, array[] real params,
int dist_id) {
202 if (delay <= 0)
return negative_infinity();
205 if (dist_id == 1)
return lognormal_lcdf(delay | params[1], params[2]);
206 else if (dist_id == 2)
return gamma_lcdf(delay | params[1], params[2]);
207 else if (dist_id == 3)
return weibull_lcdf(delay | params[1], params[2]);
208 else if (dist_id == 4)
return exponential_lcdf(delay | params[1]);
209 else if (dist_id == 9)
return beta_lcdf(delay | params[1], params[2]);
210 else if (dist_id == 12)
return cauchy_lcdf(delay | params[1], params[2]);
211 else if (dist_id == 13)
return chi_square_lcdf(delay | params[1]);
212 else if (dist_id == 15)
return gumbel_lcdf(delay | params[1], params[2]);
213 else if (dist_id == 16)
return inv_gamma_lcdf(delay | params[1], params[2]);
214 else if (dist_id == 17)
return logistic_lcdf(delay | params[1], params[2]);
215 else if (dist_id == 18)
return normal_lcdf(delay | params[1], params[2]);
216 else if (dist_id == 19)
return inv_chi_square_lcdf(delay | params[1]);
217 else if (dist_id == 20)
return double_exponential_lcdf(delay | params[1], params[2]);
218 else if (dist_id == 21)
return pareto_lcdf(delay | params[1], params[2]);
219 else if (dist_id == 22)
return scaled_inv_chi_square_lcdf(delay | params[1], params[2]);
220 else if (dist_id == 23)
return student_t_lcdf(delay | params[1], params[2], params[3]);
221 else if (dist_id == 24)
return uniform_lcdf(delay | params[1], params[2]);
222 else if (dist_id == 25)
return von_mises_lcdf(delay | params[1], params[2]);
223 else reject(
"Invalid distribution identifier: ", dist_id);
225real
primary_lpdf(real x,
int primary_id, array[] real params, real xmin, real xmax) {
227 if (primary_id == 1)
return uniform_lpdf(x | xmin, xmax);
228 if (primary_id == 2)
return expgrowth_lpdf(x | xmin, xmax, params[1]);
230 reject(
"Invalid primary distribution identifier");
233 array[] real x_r, array[]
int x_i) {
235 int dist_id = x_i[1];
236 int primary_id = x_i[2];
237 real pwindow = x_r[2];
238 int dist_params_len = x_i[3];
239 int primary_params_len = x_i[4];
242 array[dist_params_len] real params;
243 if (dist_params_len) {
244 params = theta[1:dist_params_len];
246 array[primary_params_len] real primary_params;
247 if (primary_params_len) {
248 int primary_loc = num_elements(theta);
249 primary_params = theta[primary_loc - primary_params_len + 1:primary_loc];
252 real log_cdf =
dist_lcdf(t | params, dist_id);
253 real log_primary_pdf =
primary_lpdf(d - t | primary_id, primary_params, 0, pwindow);
255 return rep_vector(exp(log_cdf + log_primary_pdf), 1);
259 return log_diff_exp(log_cdf_D, log_cdf_L);
265 real log_normalizer, real L) {
267 return log_diff_exp(log_cdf, log_cdf_L) - log_normalizer;
269 return log_cdf - log_normalizer;
273 data real L, data real D,
274 int dist_id, array[] real params, data real pwindow,
275 int primary_id, array[] real primary_params
281 result[1] = negative_infinity();
284 L | dist_id, params, pwindow, 0, positive_infinity(),
285 primary_id, primary_params
294 D | dist_id, params, pwindow, 0, positive_infinity(),
295 primary_id, primary_params
302 data real pwindow, data real L, data real D,
304 array[] real primary_params) {
318 d | dist_id, params, pwindow, L, D, primary_id, primary_params
322 real lower_bound = max({d - pwindow, 1e-6});
323 int n_params = num_elements(params);
324 int n_primary_params = num_elements(primary_params);
325 array[n_params + n_primary_params] real theta = append_array(params, primary_params);
326 array[4]
int ids = {dist_id, primary_id, n_params, n_primary_params};
328 vector[1] y0 = rep_vector(0.0, 1);
329 result = ode_rk45(
primarycensored_ode, y0, lower_bound, {d}, theta, {d, pwindow}, ids)[1, 1];
332 if (!is_inf(D) || L > 0) {
333 real log_result = log(result);
335 L, D, dist_id, params, pwindow, primary_id, primary_params
337 real log_cdf_L = bounds[1];
338 real log_cdf_D = bounds[2];
342 log_result, log_cdf_L, log_normalizer, L
344 result = exp(log_result);
351 data real pwindow, data real L, data real D,
353 array[] real primary_params) {
357 return negative_infinity();
367 d | dist_id, params, pwindow, 0, positive_infinity(), primary_id, primary_params
372 d | dist_id, params, pwindow, 0, positive_infinity(), primary_id, primary_params
377 if (!is_inf(D) || L > 0) {
379 L, D, dist_id, params, pwindow, primary_id, primary_params
381 real log_cdf_L = bounds[1];
382 real log_cdf_D = bounds[2];
391 data real pwindow, data real d_upper,
392 data real L, data real D,
int primary_id,
393 array[] real primary_params) {
395 reject(
"Upper truncation point is greater than D. It is ", d_upper,
396 " and D is ", D,
". Resolve this by increasing D to be greater or equal to d + swindow or decreasing swindow.");
399 reject(
"Upper truncation point is less than or equal to d. It is ", d_upper,
400 " and d is ", d,
". Resolve this by increasing d to be less than d_upper.");
403 return negative_infinity();
406 d_upper | dist_id, params, pwindow, 0, positive_infinity(), primary_id, primary_params
409 d | dist_id, params, pwindow, 0, positive_infinity(), primary_id, primary_params
413 if (!is_inf(D) || L > 0) {
420 log_cdf_L = negative_infinity();
423 log_cdf_L = log_cdf_lower;
427 L | dist_id, params, pwindow, 0, positive_infinity(),
428 primary_id, primary_params
434 log_cdf_D = log_cdf_upper;
435 }
else if (is_inf(D)) {
439 D | dist_id, params, pwindow, 0, positive_infinity(),
440 primary_id, primary_params
445 return log_diff_exp(log_cdf_upper, log_cdf_lower) - log_normalizer;
447 return log_diff_exp(log_cdf_upper, log_cdf_lower);
451 int max_delay, data real L, data real D,
int dist_id,
452 array[] real params, data real pwindow,
453 int primary_id, array[] real primary_params
456 int upper_interval = max_delay + 1;
457 vector[upper_interval] log_pmfs;
458 vector[upper_interval] log_cdfs;
462 if (D < upper_interval) {
463 reject(
"D must be at least max_delay + 1");
468 int start_idx = L > 0 ? max(1, to_int(floor(L))) : 1;
469 for (d in start_idx:upper_interval) {
471 d | dist_id, params, pwindow, 0, positive_infinity(), primary_id,
480 log_cdf_L = negative_infinity();
481 }
else if (L <= upper_interval && floor(L) == L) {
483 log_cdf_L = log_cdfs[to_int(L)];
487 L | dist_id, params, pwindow, 0, positive_infinity(),
488 primary_id, primary_params
494 if (D > upper_interval) {
499 D | dist_id, params, pwindow, 0, positive_infinity(),
500 primary_id, primary_params
504 log_cdf_D = log_cdfs[upper_interval];
510 for (d in 1:upper_interval) {
513 log_pmfs[d] = negative_infinity();
514 }
else if (d - 1 < L) {
516 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdf_L) - log_normalizer;
519 log_pmfs[d] = log_cdfs[d] - log_normalizer;
522 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdfs[d-1]) - log_normalizer;
529 int max_delay, data real L, data real D,
int dist_id,
530 array[] real params, data real pwindow,
532 array[] real primary_params
536 max_delay, L, D, dist_id, params, pwindow, primary_id, primary_params
real dist_lcdf(real delay, array[] real params, int dist_id)
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)
real log_weibull_g(real t, real shape, real scale)
vector primarycensored_ode(real t, vector y, array[] real theta, array[] real x_r, array[] int x_i)
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 expgrowth_lpdf(real x, real xmin, real xmax, real r)
vector primarycensored_sone_pmf_vectorized(int max_delay, data real L, data real D, int dist_id, array[] real params, data real pwindow, int primary_id, array[] real primary_params)
vector primarycensored_sone_lpmf_vectorized(int max_delay, data real L, data real D, int dist_id, array[] real params, data real pwindow, int primary_id, array[] real primary_params)
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)
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_lpmf(data int d, int dist_id, array[] real params, data real pwindow, data real d_upper, 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 primary_lpdf(real x, int primary_id, array[] real params, real xmin, real xmax)
real primarycensored_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_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_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)
int check_for_analytical(int dist_id, int primary_id)