primarycensored
Loading...
Searching...
No Matches
primarycensored_ode.stan
Go to the documentation of this file.
1
38int dist_has_positive_support(data int dist_id) {
39 if (dist_id == 1) return 1; // Lognormal
40 if (dist_id == 2) return 1; // Gamma
41 if (dist_id == 3) return 1; // Weibull
42 if (dist_id == 4) return 1; // Exponential
43 if (dist_id == 9) return 1; // Beta (support on [0, 1])
44 if (dist_id == 13) return 1; // Chi-square
45 if (dist_id == 16) return 1; // Inverse Gamma
46 if (dist_id == 19) return 1; // Inverse Chi-square
47 if (dist_id == 21) return 1; // Pareto
48 if (dist_id == 22) return 1; // Scaled inverse Chi-square
49 return 0;
50}
51
52real dist_lcdf(real delay, array[] real params, int dist_id) {
53 if (dist_has_positive_support(dist_id) && delay <= 0) {
54 return negative_infinity();
55 }
56
57 // IDs match pcd_distributions$stan_id in R
58 if (dist_id == 1) return lognormal_lcdf(delay | params[1], params[2]);
59 else if (dist_id == 2) return gamma_lcdf(delay | params[1], params[2]);
60 else if (dist_id == 3) return weibull_lcdf(delay | params[1], params[2]);
61 else if (dist_id == 4) return exponential_lcdf(delay | params[1]);
62 else if (dist_id == 9) return beta_lcdf(delay | params[1], params[2]);
63 else if (dist_id == 12) return cauchy_lcdf(delay | params[1], params[2]);
64 else if (dist_id == 13) return chi_square_lcdf(delay | params[1]);
65 else if (dist_id == 15) return gumbel_lcdf(delay | params[1], params[2]);
66 else if (dist_id == 16) return inv_gamma_lcdf(delay | params[1], params[2]);
67 else if (dist_id == 17) return logistic_lcdf(delay | params[1], params[2]);
68 else if (dist_id == 18) return normal_lcdf(delay | params[1], params[2]);
69 else if (dist_id == 19) return inv_chi_square_lcdf(delay | params[1]);
70 else if (dist_id == 20) return double_exponential_lcdf(delay | params[1], params[2]);
71 else if (dist_id == 21) return pareto_lcdf(delay | params[1], params[2]);
72 else if (dist_id == 22) return scaled_inv_chi_square_lcdf(delay | params[1], params[2]);
73 else if (dist_id == 23) return student_t_lcdf(delay | params[1], params[2], params[3]);
74 else if (dist_id == 24) return uniform_lcdf(delay | params[1], params[2]);
75 else if (dist_id == 25) return von_mises_lcdf(delay | params[1], params[2]);
76 else reject("Invalid distribution identifier: ", dist_id);
77}
78
101real primary_lpdf(real x, int primary_id, array[] real params, real xmin, real xmax) {
102 // Implement switch for different primary distributions
103 if (primary_id == 1) return uniform_lpdf(x | xmin, xmax);
104 if (primary_id == 2) return expgrowth_lpdf(x | xmin, xmax, params[1]);
105 // Add more primary distributions as needed
106 reject("Invalid primary distribution identifier");
107}
108
121vector primarycensored_ode(real t, vector y, array[] real theta,
122 array[] real x_r, array[] int x_i) {
123 real d = x_r[1];
124 int dist_id = x_i[1];
125 int primary_id = x_i[2];
126 real pwindow = x_r[2];
127 int dist_params_len = x_i[3];
128 int primary_params_len = x_i[4];
129
130 // Extract distribution parameters
131 array[dist_params_len] real params;
132 if (dist_params_len) {
133 params = theta[1:dist_params_len];
134 }
135 array[primary_params_len] real primary_params;
136 if (primary_params_len) {
137 int primary_loc = num_elements(theta);
138 primary_params = theta[primary_loc - primary_params_len + 1:primary_loc];
139 }
140
141 real log_cdf = dist_lcdf(t | params, dist_id);
142 real log_primary_pdf = primary_lpdf(d - t | primary_id, primary_params, 0, pwindow);
143
144 return rep_vector(exp(log_cdf + log_primary_pdf), 1);
145}
int dist_has_positive_support(data int dist_id)
real expgrowth_lpdf(real x, real xmin, real xmax, real r)
vector primarycensored_ode(real t, vector y, array[] real theta, array[] real x_r, array[] int x_i)
real primary_lpdf(real x, int primary_id, array[] real params, real xmin, real xmax)
real dist_lcdf(real delay, array[] real params, int dist_id)