data{ int N; vector[N] x; vector[2] phi; //hyperparamter for mixing ratio real beta; //hyperparameter for center } parameters{ simplex[2] ratio; real mu; } /** calculate p(x_i,y_i=k|w) for each k **/ transformed parameters{ matrix[N,2] ln_p_xy; for(i in 1:N){ ln_p_xy[i,1] <- log(ratio[1]) + normal_log(x[i],0,1); ln_p_xy[i,2] <- log(ratio[2]) + normal_log(x[i],mu,1); } } model{ vector[2] sum_part; //priors ratio ~ dirichlet(phi); mu ~ normal(0,beta); //log likelihood for(i in 1:N){ increment_log_prob(log_sum_exp(ln_p_xy[i])); } } /** calculate p(y_i=k|x_i,w_j) k=1,2 we can obtain p(y_i=k|x_i, x^n) by sum_{j=1} p(y_i=k|x_i,w_j) / #(w_j) on our interface for stan **/ generated quantities{ matrix[N,2] p_yx; for(i in 1:N){ p_yx[i] <- softmax(ln_p_xy[i]')'; } }