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+