x0 = poly(z, 2) ## N x 2 ; z is the individual level predictorx = [1 x0] ## N x 3 ; added a column of onesdata { int<lower=0> N; // 7000 transactions int<lower=1> K; // 3 (including intercept) int<lower=1> J; // 1000 int<lower=1> L; // 4 (including intercept) int<lower=1,upper=J> jj[N]; // group for individual matrix[N,K] x; // 7000 x 3 matrix[J,L] u; // 1000 x 4 int<lower=0> y[N]; // 7000 x 1 counts = 0,1,2,...}
parameters { matrix[K,J] z; cholesky_factor_corr[K] L_Omega; vector<lower=0,upper=pi()/2>[K] tau_unif; matrix[L,K] gamma; // group coeffs}
transformed parameters { matrix[J,K] beta; vector<lower=0>[K] tau; // prior scale for (k in 1:K) tau[k] = 2.5 * tan(tau_unif[k]); beta = u * gamma + (diag_pre_multiply(tau,L_Omega) * z)';}
model { vector[N] log_lambda;
// priors to_vector(z) ~ normal(0,1);// tau ~ cauchy(0,2.5); L_Omega ~ lkj_corr_cholesky(2); to_vector(gamma) ~ normal(0,1);
for (n in 1:N) log_lambda[n] = x[n] * beta[jj[n]]';
y ~ poisson_log(log_lambda);
}
N <- 1000N_groups <- 100group <- rep(1:N_groups,each=N/N_groups)set.seed(5555)B <- mvrnorm(N_groups,c(-1,0.5,0.25),matrix(c(1,-0.5,-0.5,-0.5,1,0.25,-0.5,0.25,1),3,3))x1 <- runif(N, 1,5) # rnorm(N)x2 <- I(x1^2)cor(x1,x2)y <- rnorm(N, B[group,1] + B[group,2]*x1 + B[group,3]*x2 ,2)
## get the data together
dat1 <- list( N = N, J = N_groups, K = 3, y = y, x = cbind(x1,x2), # x = cbind(scale(x1, scale=FALSE),scale(x2, scale = FALSE)), group = group)Inference for Stan model: mixed_simulated2a.4 chains, each with iter=2000; warmup=1000; thin=1;post-warmup draws per chain=1000, total post-warmup draws=4000.
mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhata -0.56 0.01 0.48 -1.48 -0.89 -0.57 -0.24 0.40 3546 1.00b 0.30 0.01 0.36 -0.40 0.06 0.31 0.55 1.01 3494 1.00c 0.27 0.00 0.11 0.06 0.20 0.27 0.35 0.50 2039 1.00cov_mat[1,1] 0.44 0.02 0.57 0.00 0.08 0.27 0.62 1.69 1167 1.00cov_mat[1,2] -0.11 0.01 0.35 -0.93 -0.12 -0.02 0.02 0.11 903 1.00cov_mat[1,3] -0.10 0.02 0.19 -0.51 -0.21 -0.08 0.01 0.24 79 1.04cov_mat[2,1] -0.11 0.01 0.35 -0.93 -0.12 -0.02 0.02 0.11 903 1.00cov_mat[2,2] 0.35 0.02 0.36 0.00 0.11 0.28 0.47 1.19 372 1.00cov_mat[2,3] -0.10 0.02 0.16 -0.44 -0.20 -0.09 0.00 0.17 107 1.04cov_mat[3,1] -0.10 0.02 0.19 -0.51 -0.21 -0.08 0.01 0.24 79 1.04cov_mat[3,2] -0.10 0.02 0.16 -0.44 -0.20 -0.09 0.00 0.17 107 1.04cov_mat[3,3] 0.89 0.00 0.14 0.65 0.79 0.88 0.97 1.18 1047 1.01Inference for Stan model: mixed_simulated2b.4 chains, each with iter=2000; warmup=1000; thin=1;post-warmup draws per chain=1000, total post-warmup draws=4000.
mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhatbeta[1] 0.31 0.01 0.38 -0.45 0.05 0.32 0.57 1.04 4000 1.00beta[2] 0.28 0.00 0.11 0.06 0.20 0.28 0.35 0.50 1397 1.00a -0.56 0.01 0.50 -1.53 -0.91 -0.56 -0.23 0.44 4000 1.00b 4.32 0.04 1.17 2.02 3.54 4.31 5.09 6.62 1118 1.00c 0.83 0.01 0.33 0.18 0.61 0.82 1.05 1.48 1397 1.00cov_mat[1,1] 2.22 0.11 2.72 0.00 0.24 1.18 3.18 9.67 565 1.00cov_mat[1,2] -3.05 0.54 5.19 -15.65 -5.58 -1.52 0.33 3.90 92 1.04cov_mat[1,3] 0.60 0.09 1.23 -1.24 -0.09 0.29 1.10 3.81 185 1.03cov_mat[2,1] -3.05 0.54 5.19 -15.65 -5.58 -1.52 0.33 3.90 92 1.04cov_mat[2,2] 115.87 0.90 17.74 85.42 103.19 114.24 127.03 154.68 392 1.01cov_mat[2,3] 27.87 0.11 4.26 20.53 24.91 27.58 30.54 36.98 1439 1.00cov_mat[3,1] 0.60 0.09 1.23 -1.24 -0.09 0.29 1.10 3.81 185 1.03cov_mat[3,2] 27.87 0.11 4.26 20.53 24.91 27.58 30.54 36.98 1439 1.00cov_mat[3,3] 7.90 0.06 1.37 5.60 6.96 7.75 8.71 10.91 571 1.01// non-centered version
data{ int N; int J; int K; // = 3, number of observation level predictors including intercept matrix[N,K-1] x; // taking the x predictors real y[N]; int group[N];}parameters{ real a; real b; real c; real<lower=0> sigma; vector<lower=0>[K] tau; cholesky_factor_corr[K] L_Omega; vector[K] z[J];}transformed parameters { vector[K] v[J]; matrix[K,K] Rho;
Rho = L_Omega * L_Omega';
for (j in 1:J) v[j] = diag_pre_multiply(tau,L_Omega) * z[j];}model{ vector[N] mu; for (j in 1:J) z[j] ~ normal(0,1); a ~ normal(0,10); b ~ normal(0,10); L_Omega ~ lkj_corr_cholesky(2); sigma ~ cauchy(0,2); tau ~ cauchy(0,2);
// likelihood for ( i in 1:N ) mu[i] = a + v[group[i],1] + (b + v[group[i],2])*x[i,1] + (c + v[group[i], 3])*x[i,2] ; y ~ normal(mu,sigma);}generated quantities { matrix[K,K] cov_mat;
cov_mat = diag_pre_multiply(tau,L_Omega) * diag_pre_multiply(tau,L_Omega)';}
// non-centered version with QR deocomposition
data{ int N; int J; int K; // = 3, number of observation level predictors including intercept matrix[N,K-1] x; // taking the x predictors real y[N]; int group[N]; // same as jj notation}transformed data {
matrix[N, K-1] Q_ast; matrix[K-1, K-1] R_ast; matrix[K-1, K-1] R_ast_inverse;
Q_ast = qr_Q(x)[, 1:K-1] * sqrt(N - 1);
R_ast = qr_R(x)[1:K-1, ] / sqrt(N - 1);
R_ast_inverse = inverse(R_ast);
}parameters{ real a; real b; real c; real<lower=0> sigma; vector<lower=0>[K] tau; cholesky_factor_corr[K] L_Omega; vector[K] z[J];}transformed parameters { vector[K] v[J]; matrix[K,K] Rho;
Rho = L_Omega * L_Omega';
for (j in 1:J) // PK v[j] = diag_pre_multiply(tau,L_Omega) * z[j];}model{ vector[N] mu; for (j in 1:J) z[j] ~ normal(0,1); a ~ normal(0,10); b ~ normal(0,10); L_Omega ~ lkj_corr_cholesky(2); sigma ~ cauchy(0,2); tau ~ cauchy(0,2);
// likelihood for ( i in 1:N ) mu[i] = a + v[group[i],1] + (b + v[group[i],2])*Q_ast[i,1] + (c + v[group[i], 3])*Q_ast[i,2] ; y ~ normal(mu,sigma);}generated quantities { matrix[K,K] cov_mat; vector[K-1] beta;
cov_mat = diag_pre_multiply(tau,L_Omega) * diag_pre_multiply(tau,L_Omega)';
{ vector[K-1] beta_tilde; beta_tilde[1] = b; beta_tilde[2] = c;
beta = R_ast_inverse * beta_tilde; }}