## ----synthetic-conjugate-prior------------------------------------------------ set.seed(20261022) y <- stats::rnorm(18, mean = 0.35, sd = 1) prior_sd <- c(0.10, 0.25, 0.50, 1, 2.5, 5) posterior_sd <- sqrt(1 / (length(y) + 1 / prior_sd^2)) posterior_mean <- sum(y) / (length(y) + 1 / prior_sd^2) q <- stats::qnorm(0.975) tab <- data.frame(prior_sd = prior_sd, posterior_mean = posterior_mean, lower = posterior_mean - q * posterior_sd, upper = posterior_mean + q * posterior_sd) stopifnot(all(tab$lower <= tab$posterior_mean), all(tab$posterior_mean <= tab$upper)) tab ## ----prior-sensitivity-forest, fig.width=8, fig.height=4, fig.cap="Synthetic normal-normal analytical posterior means and 95% equal-tailed credible intervals at declared prior scales. Not a posterior computation for the gp3bayes multilevel mediation API."---- graphics::plot(tab$posterior_mean, seq_along(tab$prior_sd), xlim = range(c(tab$lower, tab$upper)), ylim = c(0.5, nrow(tab) + 0.5), pch = 19, col = "#24577B", yaxt = "n", xlab = "Conditional posterior location", ylab = "Prior SD", main = "Declared prior sensitivity") graphics::axis(2, at = seq_along(tab$prior_sd), labels = format(tab$prior_sd), las = 1) graphics::segments(tab$lower, seq_along(tab$prior_sd), tab$upper, seq_along(tab$prior_sd), lwd = 2, col = "#567B97") graphics::abline(v = 0, lty = 3, col = "#8E8E8E") ## ----prior-precision-figure, fig.width=8, fig.height=4, fig.cap="Exact posterior precision decomposition for the deliberately simple normal model; no uncertainty about the residual variance is propagated."---- prior_precision <- 1 / prior_sd^2 posterior_precision <- length(y) + prior_precision graphics::plot(log10(prior_sd), prior_precision / posterior_precision, type = "b", pch = 19, col = "#B05E43", xaxt = "n", ylim = c(0, 1), xlab = "Prior standard deviation", ylab = "Prior fraction of total precision", main = "Independent information versus prior concentration") graphics::axis(1, at = log10(prior_sd), labels = prior_sd)