epinowcast
Loading...
Searching...
No Matches
regression.stan
Go to the documentation of this file.
1
33 array[] real intercept, vector beta, int nobs, int neffs,
34 matrix fdesign,
35 tuple(vector, array[] int, array[] int) sparse,
36 vector beta_sd, matrix rdesign,
37 int add_intercept, int sparse_design,
38 int arima_present, int arima_T, int arima_G,
39 int arima_p, int arima_d, int arima_q, int arima_n_obs,
40 matrix arima_z, vector arima_pacf, vector arima_theta,
41 array[] real arima_sigma,
42 array[] int arima_flat_idx,
43 int gp_present, int gp_T, int gp_G, int gp_M, real gp_L,
44 int gp_type, real gp_nu, int gp_d, matrix gp_PHI, matrix gp_eta,
45 array[] real gp_rho, array[] real gp_alpha,
46 array[] int gp_flat_idx
47) {
48 // Short-circuit when neither latent term is present: return
49 // combine_effects() directly so we skip materialising the
50 // intermediate `base` vector and the apply_* call frames on every
51 // gradient evaluation. Behaviour is identical when a term is present.
52 if (!arima_present && !gp_present) {
53 return combine_effects(
54 intercept, beta, nobs, neffs, fdesign, sparse, beta_sd, rdesign,
55 add_intercept, sparse_design
56 );
57 }
58 vector[nobs] base = combine_effects(
59 intercept, beta, nobs, neffs, fdesign, sparse, beta_sd, rdesign,
60 add_intercept, sparse_design
61 );
62 // ARIMA and GP compose additively; each `apply_*` is inert on its own
63 // presence flag, so passing both through is safe when only one is set.
65 base, arima_n_obs, arima_present, arima_T, arima_G,
66 arima_p, arima_d, arima_q,
67 arima_z, arima_pacf, arima_theta, arima_sigma,
68 arima_flat_idx
69 );
70 return apply_gp_term(
71 base, gp_present, gp_T, gp_G, gp_M, gp_L, gp_type, gp_nu, gp_d,
72 gp_PHI, gp_eta, gp_rho, gp_alpha, gp_flat_idx
73 );
74}
75
77 vector beta, vector beta_sd, array[,] real beta_sd_p,
78 int fixed, int random,
79 int arima_present, int arima_p, int arima_q,
80 matrix arima_z, vector arima_pacf, vector arima_theta,
81 array[] real arima_sigma, array[,] real arima_sigma_p,
82 array[,] real arima_pacf_p
83) {
84 effect_priors_lp(beta, beta_sd, beta_sd_p, fixed, random);
85 if (arima_present) {
86 to_vector(arima_z) ~ std_normal();
87 // Partial autocorrelations are Uniform(-1, 1) by default via their
88 // parameter bounds. A positive prior sd switches to a Normal(mean, sd)
89 // truncated to (-1, 1); the truncation constant is fixed by the bounds
90 // and so is dropped. A non-positive sd leaves the Uniform default.
91 if (arima_p > 0 && arima_pacf_p[2, 1] > 0) {
92 arima_pacf ~ normal(arima_pacf_p[1, 1], arima_pacf_p[2, 1]);
93 }
94 if (arima_q > 0) {
95 arima_theta ~ std_normal();
96 }
97 arima_sigma[1] ~ normal(
98 arima_sigma_p[1, 1], arima_sigma_p[2, 1]
99 ) T[0, ];
100 }
101}
102
112 int gp_present, matrix gp_eta,
113 array[] real gp_rho, array[] real gp_alpha,
114 array[,] real gp_rho_p, array[,] real gp_alpha_p
115) {
116 if (gp_present) {
117 to_vector(gp_eta) ~ std_normal();
118 gp_rho[1] ~ lognormal(gp_rho_p[1, 1], gp_rho_p[2, 1]);
119 gp_alpha[1] ~ normal(gp_alpha_p[1, 1], gp_alpha_p[2, 1]) T[0, ];
120 }
121}
vector apply_arima_residual(vector base, int n_obs, int present, int T, int G, int p, int d, int q, matrix z, vector pacf, vector theta, array[] real sigma, array[] int flat_idx)
vector combine_effects(array[] real intercept, vector beta, int nobs, int neffs, matrix fdesign, tuple(vector, array[] int, array[] int) sparse, vector beta_sd, matrix rdesign, int add_intercept, int sparse_design)
void effect_priors_lp(vector beta, vector beta_sd, array[,] real beta_sd_p, int fixed, int random)
vector apply_gp_term(vector base, int present, int T, int G, int M, real L, int type, real nu, int d, matrix PHI, matrix eta, array[] real rho, array[] real alpha, array[] int flat_idx)
void gp_priors_lp(int gp_present, matrix gp_eta, array[] real gp_rho, array[] real gp_alpha, array[,] real gp_rho_p, array[,] real gp_alpha_p)
vector regression_predictor(array[] real intercept, vector beta, int nobs, int neffs, matrix fdesign, tuple(vector, array[] int, array[] int) sparse, vector beta_sd, matrix rdesign, int add_intercept, int sparse_design, int arima_present, int arima_T, int arima_G, int arima_p, int arima_d, int arima_q, int arima_n_obs, matrix arima_z, vector arima_pacf, vector arima_theta, array[] real arima_sigma, array[] int arima_flat_idx, int gp_present, int gp_T, int gp_G, int gp_M, real gp_L, int gp_type, real gp_nu, int gp_d, matrix gp_PHI, matrix gp_eta, array[] real gp_rho, array[] real gp_alpha, array[] int gp_flat_idx)
void regression_priors_lp(vector beta, vector beta_sd, array[,] real beta_sd_p, int fixed, int random, int arima_present, int arima_p, int arima_q, matrix arima_z, vector arima_pacf, vector arima_theta, array[] real arima_sigma, array[,] real arima_sigma_p, array[,] real arima_pacf_p)