data { int N; // obs int Nprobe; int Nlogger; int Nsite; int pid[N]; // links observation to Probe int psid[Nprobe]; // links Probe to ProbeSet (logger) int site[Nlogger]; // links ProbeSet to Site vector[Nsite] trt; // x, treatment applied at the site level //vector[Nprobe] pidtrt; // links probe to treatment vector[N] y; // y, observed soil temp real scaleattr[2]; // mean and sd of full observation dataset } transformed data { vector[N] y_sc; // scaled and centered but not corrected observations y_sc <- (y - scaleattr[1])/scaleattr[2]; } parameters { vector[Nprobe] a_pid; vector[Nlogger] a_ps; vector[Nsite] a_site; real mu_control_sc; real b_site; real sigma_a_pid; real sigma_a_ps; real sigma_a_site; real sigma_y; } transformed parameters { } model { // Priors mu_control_sc ~ normal(0,1); // half-cauchy priors on sigmas sigma_a_pid ~ cauchy(0,1); sigma_a_ps ~ cauchy(0,1); sigma_a_site ~ cauchy(0,1); sigma_y ~ cauchy(0,1); // likelihood // uncorrected control mean a_site ~ normal(mu_control_sc + trt * b_site, sigma_a_site); { vector[Nlogger] a_ps_hat; for (k in 1:Nlogger) a_ps_hat[k] <- a_site[site[k]]; a_ps ~ normal(a_ps_hat, sigma_a_ps); } { vector[Nprobe] a_pid_hat; for (l in 1:Nprobe) a_pid_hat[l] <- a_ps[psid[l]]; a_pid ~ normal(a_pid_hat, sigma_a_pid); } { vector[N] y_hat; for (i in 1:N) y_hat[i] <- a_pid[pid[i]]; y_sc ~ normal(y_hat, sigma_y); } } generated quantities { real mu_removal; // calculate the mean of removal sites real mu_control; real b_trt; // treatment effect on original scale mu_control <- (mu_control_sc * scaleattr[2]) + scaleattr[1]; b_trt <- b_site * scaleattr[2]; mu_removal <- mu_control + b_trt; }