// // This Stan program defines a simple model, with a // vector of values 'y' modeled as normally distributed // with mean 'mu' and standard deviation 'sigma'. // // Learn more about model development with Stan at: // // http://mc-stan.org/users/interfaces/rstan.html // https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started // // The input data is a vector 'y' of length 'N'. data { int D; // number of features int N; // number of observations int L; // number of categories array[N] int y; // vector of dependent variables array[N] int ll; // vector of categories array[N] row_vector[D] x; // independent variables real mu_mean; //hyperprior real mu_stdev; //hyperprior real sigma_location; //hyperprior real sigma_scale; //hyperprior //counterfactuals int Nx; array[Nx] int llx;//vec of categories array[Nx] row_vector[D] counterfact_x_tilde; // Posterior Prediction intervention array[Nx] row_vector[D] counterfact_x; // Posterior Prediction intervention //the two statuses to catch relative difference array[2] int status_indexes; //the two status indexes to compare (order is x[1] - x[2]) } parameters { array[D] real mu; array[D] real sigma; array[L] vector[D] beta; } model { sigma ~ lognormal(sigma_location,sigma_scale); //hyperprior for stdev: shape and inverse scale mu ~ normal(mu_mean, mu_stdev); //hyperprior for mean //TODO: convert to mvnormal for (l in 1:L) { beta[l] ~ normal(mu, sigma); } { vector[N] x_beta_ll; for (n in 1:N) { x_beta_ll[n] = x[n] * beta[ll[n]]; } y ~ bernoulli_logit(x_beta_ll); } } generated quantities { //SETUP PRIOR PREDICTION //preallocate real mu_prior[D]; real sigma_prior[D]; real p_prior[N]; // what I have priors about real p_predicted[N]; //predicted p_values //intervention real p_predicted_default[Nx]; //predicted p_values real p_predicted_intervention[Nx]; //predicted p_values real predicted_difference[Nx]; //difference in predicted values //collect array of relative status differences between array[L] real status_diff; //GENERATE RELATIVE DIFFERENCES BETWEEN STATUSES for (l in 1:L) { status_diff[l] = beta[l,status_indexes[1]] - beta[l,status_indexes[2]]; } //GENERATE PRIOR PREDICTIONS { vector[D] beta_prior[L];//local var //sample parameters for (d in 1:D) { mu_prior[d] = normal_rng(mu_mean,mu_stdev); sigma_prior[d] = lognormal_rng(sigma_location,sigma_scale); } for (l in 1:L) { for (d in 1:D) { beta_prior[l,d] = normal_rng(mu_prior[d],sigma_prior[d]); } } //generate probabilities vector[D] b_prior[N];//local var for (n in 1:N){ b_prior[n] = beta_prior[ll[n]]; p_prior[n] = inv_logit( x[n] * b_prior[n] ); } } //GENERATE POSTERIOR PREDICTIONS for (n in 1:N) { p_predicted[n] = inv_logit( x[n] * beta[ll[n]] ); } //GENERATE POSTERIOR DISTRIBUTION OF DIFFERENCES for (n in 1:Nx) { p_predicted_default[n] = inv_logit( counterfact_x[n] * beta[llx[n]] ); p_predicted_intervention[n] = inv_logit( counterfact_x_tilde[n] * beta[llx[n]] ); //intervention //intervention - base case predicted_difference[n] = p_predicted_intervention[n] - p_predicted_default[n]; } }