Add stan language (#519) · boyter/scc@f4b1daa
1+data{
2+int N_national_polls; // Number of polls
3+int N_state_polls; // Number of polls
4+int T; // Number of days
5+int S; // Number of states (for which at least 1 poll is available) + 1
6+int P; // Number of pollsters
7+int M; // Number of poll modes
8+int Pop; // Number of poll populations
9+int<lower = 1, upper = S + 1> state[N_state_polls]; // State index
10+int<lower = 1, upper = T> day_state[N_state_polls]; // Day index
11+int<lower = 1, upper = T> day_national[N_national_polls]; // Day index
12+int<lower = 1, upper = P> poll_state[N_state_polls]; // Pollster index
13+int<lower = 1, upper = P> poll_national[N_national_polls]; // Pollster index
14+int<lower = 1, upper = M> poll_mode_state[N_state_polls]; // Poll mode index
15+int<lower = 1, upper = M> poll_mode_national[N_national_polls]; // Poll mode index
16+int<lower = 1, upper = Pop> poll_pop_state[N_state_polls]; // Poll mode index
17+int<lower = 1, upper = Pop> poll_pop_national[N_national_polls]; // Poll mode index
18+int n_democrat_national[N_national_polls];
19+int n_two_share_national[N_national_polls];
20+int n_democrat_state[N_state_polls];
21+int n_two_share_state[N_state_polls];
22+vector<lower = 0, upper = 1.0>[N_national_polls] unadjusted_national;
23+vector<lower = 0, upper = 1.0>[N_state_polls] unadjusted_state;
24+// cov_matrix[S] ss_cov_mu_b_walk;
25+// cov_matrix[S] ss_cov_mu_b_T;
26+// cov_matrix[S] ss_cov_poll_bias;
27+//*** prior input
28+vector[S] mu_b_prior;
29+vector[S] state_weights;
30+real sigma_c;
31+real sigma_m;
32+real sigma_pop;
33+real sigma_measure_noise_national;
34+real sigma_measure_noise_state;
35+real sigma_e_bias;
36+// covariance matrix and scales
37+cov_matrix[S] state_covariance_0;
38+real random_walk_scale;
39+real mu_b_T_scale;
40+real polling_bias_scale;
41+}
42+transformed data {
43+real national_cov_matrix_error_sd = sqrt(transpose(state_weights) * state_covariance_0 * state_weights);
44+cholesky_factor_cov[S] cholesky_ss_cov_poll_bias;
45+cholesky_factor_cov[S] cholesky_ss_cov_mu_b_T;
46+cholesky_factor_cov[S] cholesky_ss_cov_mu_b_walk;
47+// scale covariance
48+matrix[S, S] ss_cov_poll_bias = state_covariance_0 * square(polling_bias_scale/national_cov_matrix_error_sd);
49+matrix[S, S] ss_cov_mu_b_T = state_covariance_0 * square(mu_b_T_scale/national_cov_matrix_error_sd);
50+matrix[S, S] ss_cov_mu_b_walk = state_covariance_0 * square(random_walk_scale/national_cov_matrix_error_sd);
51+// transformation
52+ cholesky_ss_cov_poll_bias = cholesky_decompose(ss_cov_poll_bias);
53+ cholesky_ss_cov_mu_b_T = cholesky_decompose(ss_cov_mu_b_T);
54+ cholesky_ss_cov_mu_b_walk = cholesky_decompose(ss_cov_mu_b_walk);
55+}
56+parameters {
57+vector[S] raw_mu_b_T;
58+matrix[S, T] raw_mu_b;
59+vector[P] raw_mu_c;
60+vector[M] raw_mu_m;
61+vector[Pop] raw_mu_pop;
62+real<offset=0, multiplier=0.02> mu_e_bias;
63+real<lower = 0, upper = 1> rho_e_bias;
64+vector[T] raw_e_bias;
65+vector[N_national_polls] raw_measure_noise_national;
66+vector[N_state_polls] raw_measure_noise_state;
67+vector[S] raw_polling_bias;
68+real mu_b_T_model_estimation_error;
69+}
70+transformed parameters {
71+//*** parameters
72+matrix[S, T] mu_b;
73+vector[P] mu_c;
74+vector[M] mu_m;
75+vector[Pop] mu_pop;
76+vector[T] e_bias;
77+vector[S] polling_bias = cholesky_ss_cov_poll_bias * raw_polling_bias;
78+vector[T] national_mu_b_average;
79+real national_polling_bias_average = transpose(polling_bias) * state_weights;
80+real sigma_rho;
81+//*** containers
82+vector[N_state_polls] logit_pi_democrat_state;
83+vector[N_national_polls] logit_pi_democrat_national;
84+//*** construct parameters
85+ mu_b[:,T] = cholesky_ss_cov_mu_b_T * raw_mu_b_T + mu_b_prior; // * mu_b_T_model_estimation_error
86+for (i in 1:(T-1)) mu_b[:, T - i] = cholesky_ss_cov_mu_b_walk * raw_mu_b[:, T - i] + mu_b[:, T + 1 - i];
87+ national_mu_b_average = transpose(mu_b) * state_weights;
88+ mu_c = raw_mu_c * sigma_c;
89+ mu_m = raw_mu_m * sigma_m;
90+ mu_pop = raw_mu_pop * sigma_pop;
91+ e_bias[1] = raw_e_bias[1] * sigma_e_bias;
92+ sigma_rho = sqrt(1-square(rho_e_bias)) * sigma_e_bias;
93+for (t in 2:T) e_bias[t] = mu_e_bias + rho_e_bias * (e_bias[t - 1] - mu_e_bias) + raw_e_bias[t] * sigma_rho;
94+//*** fill pi_democrat
95+for (i in 1:N_state_polls){
96+ logit_pi_democrat_state[i] =
97+ mu_b[state[i], day_state[i]] +
98+ mu_c[poll_state[i]] +
99+ mu_m[poll_mode_state[i]] +
100+ mu_pop[poll_pop_state[i]] +
101+ unadjusted_state[i] * e_bias[day_state[i]] +
102+ raw_measure_noise_state[i] * sigma_measure_noise_state +
103+ polling_bias[state[i]];
104+ }
105+ logit_pi_democrat_national =
106+ national_mu_b_average[day_national] +
107+ mu_c[poll_national] +
108+ mu_m[poll_mode_national] +
109+ mu_pop[poll_pop_national] +
110+ unadjusted_national .* e_bias[day_national] +
111+ raw_measure_noise_national * sigma_measure_noise_national +
112+ national_polling_bias_average;
113+}
114+115+model {
116+//*** priors
117+ raw_mu_b_T ~ std_normal();
118+//mu_b_T_model_estimation_error ~ scaled_inv_chi_square(7, 1);
119+to_vector(raw_mu_b) ~ std_normal();
120+ raw_mu_c ~ std_normal();
121+ raw_mu_m ~ std_normal();
122+ raw_mu_pop ~ std_normal();
123+ mu_e_bias ~ normal(0, 0.02);
124+ rho_e_bias ~ normal(0.7, 0.1);
125+ raw_e_bias ~ std_normal();
126+ raw_measure_noise_national ~ std_normal();
127+ raw_measure_noise_state ~ std_normal();
128+ raw_polling_bias ~ std_normal();
129+//*** likelihood
130+ n_democrat_state ~ binomial_logit(n_two_share_state, logit_pi_democrat_state);
131+ n_democrat_national ~ binomial_logit(n_two_share_national, logit_pi_democrat_national);
132+}
133+134+generated quantities {
135+matrix[T, S] predicted_score;
136+for (s in 1:S){
137+//predicted_score[1:T, s] = inv_logit(mu_a[1:T] + to_vector(mu_b[s, 1:T]));
138+ predicted_score[1:T, s] = inv_logit(to_vector(mu_b[s, 1:T]));
139+ }
140+}
141+