data { int N_obs; // Number of observations int N_S; // Number of sites int S[N_obs]; // Site int N_B; // Maximum number of blocks int B[N_obs]; // Index of blocks int N_Q; // Maximum number of quadrats int Q[N_obs]; // Index of quadrats int Y[N_obs]; // Observations int Treat[N_obs]; // explanatory variable real Height[N_obs]; // explanatory variable real Dist[N_obs]; // explanatory variable } parameters { vector[6] beta; // coefficients vector[3] sigma; // scale parameters real epsilon_S[N_S]; real epsilon_B[N_S, N_B]; real epsilon_Q[N_Q, N_B, N_Q]; } model { for (i in 1:N_obs) { real lambda = exp(beta[1] + beta[2] * Treat[i] + beta[3] * Height[i] + beta[4] * Dist[i] + epsilon_S[S[i]] + epsilon_B[S[i], B[i]] + epsilon_Q[S[i], B[i], Q[i]]); real omega = inv_logit(beta[5] + beta[6] * Dist[i]); if (Y[i] == 0) { vector[2] lp; lp[1] = bernoulli_lpmf(0 | omega); lp[2] = bernoulli_lpmf(1 | omega) + poisson_lpmf(0 | lambda); target += log_sum_exp(lp); } else { target += bernoulli_lpmf(1 | omega) + poisson_lpmf(Y[i] | lambda); } } // Random effects for (s in 1:N_S) { epsilon_S[s] ~ normal(0, sigma[1]); for (b in 1:N_B) { epsilon_B[s, b] ~ normal(0, sigma[2]); for (q in 1:N_Q) epsilon_Q[s, b, q] ~ normal(0, sigma[3]); } } // Priors beta ~ normal(0, 100); sigma ~ normal(0, 10); }