functions { int sum(int[,] a) { int s; s = 0; for (i in 1:size(a)) for (j in 1:size(a[i])) s = s + a[i,j]; return s; } } data { int NCAT; // NUMBER OF CATEGORIES int NDAT; // NUMBER OF OBSERVATIONS int NCHAR; // NUMBER OF CUSTOMER-LEVEL CHARACTERISTICS int y[NDAT,NCAT]; // PURCHASE MATRIX FOR PREDICTION vector[NCAT] x[NDAT]; // PURCHASE MATRIX LAG 1 vector[NCHAR] x0[NDAT]; // DEMOGRAFIC COSTUMERS MATRIX row_vector[NDAT] t; // BINARY FOR CARD OWNER } // MULTIVARIATE PROBIT TRANSFORMATION FROM USER GUIDE transformed data { int N_pos; int n_pos[sum(y)]; int d_pos[size(n_pos)]; int N_neg; int n_neg[(NDAT * NCAT) - size(n_pos)]; int d_neg[size(n_neg)]; N_pos=size(n_pos); N_neg=size(n_neg); { int i; int j; i=1; j=1; for (n in 1:NDAT) { for (d in 1:NCAT) { if (y[n,d] == 1) { n_pos[i] = n; d_pos[i] = d; i=i + 1; } else { n_neg[j] = n; d_neg[j] = d; j = j + 1; } } } } } parameters { vector[NCAT-1] beta_free; // FREE PARAMETERS TO FIXED ONE vector[NCAT] teta; // PARAMETER FOR CARD OWNERSHIP vector[NDAT] gama; // PARAMETERS FOR INDIVIDUAL HIERARCHY vector[NDAT] tau; vector[NCHAR] delta; cholesky_factor_corr[NCAT] L_Omega; vector[N_pos] z_pos; vector[N_neg] z_neg; } transformed parameters { vector[NCAT] beta; // TRANSFORMATION OF BETA_FREE vector[NDAT] dm; // MATURITY vector[NCAT] utilidad[NDAT]; vector[NCAT] z[NDAT]; beta[1]=1; // FIX BETA 1 // FILL BETA VECTOR for (i in 1:(NCAT-1)) beta[i+1] = beta_free[i]; // MATURITY for (n in 1:NDAT) dm[n] = dot_product(beta,x[n]); // CONSTRUCT LATENT UTILITY OF EACH OBSERVATION for (d in 1:NCAT) for (n in 1:NDAT) utilidad[n, d] = gama[n]*fabs(beta[d]-dm[n])+teta[d]*t[n]; ; for (n in 1:N_pos) z[n_pos[n], d_pos[n]] = z_pos[n]; for (n in 1:N_neg) z[n_neg[n], d_neg[n]] = z_neg[n]; } model { L_Omega ~ lkj_corr_cholesky(4); to_vector(beta_free) ~ normal(0, 5); to_vector(teta) ~ normal(0, 5); to_vector(gama) ~ normal(0, 5); to_vector(delta) ~ normal(0, 5); to_vector(tau) ~ cauchy(0,2.5); { // FILL CUSTOMER-LEVEL PARAMETERS for(n in 1:NDAT) gama[n] ~ normal(dot_product(delta,x0[n]),tau); // HOW ABOUT NON-CENTERED PARAMETERIZATION z ~ multi_normal_cholesky( utilidad , L_Omega); } } generated quantities { corr_matrix[NCAT] Omega; Omega = multiply_lower_tri_self_transpose(L_Omega); }