Posterior Predictive Checking

Paul J. Northrop


This short vignette illustrates the use of the pp_check method pp_check.hef, which provides an interface to the posterior predictive checking graphics in the bayesplot package (Gabry and Mahr 2017). For details see the bayesplot vignette Graphical posterior predictive checks. and/or Chapter 6 of Gelman et al. (2014). bayesplot functions return a ggplot object that can be customised using the gglot2 package (Wickham 2009).

We revisit the examples presented in the vignettes Hierarchical 1-way Analysis of Variance and Conjugate Hierarchical Models. In the code below hef and hanova1 have been called with the extra argument nrep = 50. This results in 50 simulated replicates of the data, returned in object$data_rep, on which posterior predictive checking can be based. The general idea is that if the model fits well then the observed data should not appear unusual when compared to replicates from the posterior predictive distribution.

# Beta-binomial rat tumor example
rat_res <- hef(model = "beta_binom", data = rat, nrep = 50)
# Gamma-Poisson pump failure example
pump_res <- hef(model = "gamma_pois", data = pump, nrep = 50)
# 1-way Hierarchical ANOVA global warming example
RCP26_2 <- temp2[temp2$RCP == "rcp26", ]
temp_res <- hanova1(resp = RCP26_2[, 1], fac = RCP26_2[, 2], nrep = 50)

We show some examples of the graphical posterior predictive checks that are available from bayesplot, but make no comments on their content. The commented lines above the calls to pp_check describe briefly the type of plot produced.

Beta-binomial model

The aspect of the data that appears in these plots is the proportion of successful trials.

#> Warning: package 'bayesplot' was built under R version 3.4.2
#> This is bayesplot version 1.4.0
#> - Plotting theme set to bayesplot::theme_default()
#> - Online documentation at
# Overlaid density estimates
# Overlaid distribution function estimates
pp_check(rat_res, fun = "ecdf_overlay")

# Multiple histograms
pp_check(rat_res, fun = "hist", nrep = 8)
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Multiple boxplots
pp_check(rat_res, fun = "boxplot")

# Predictive medians vs observed median
pp_check(rat_res, fun = "stat", stat = "median")
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Predictive (mean, sd) vs observed (mean, sd)
pp_check(rat_res, fun = "stat_2d", stat = c("mean", "sd"))

Gamma-Poisson model

The aspect of the data that appears in these plots is the exposure-adjusted rate \(y_j / e_j\), where \(y_j\) is the observed count and \(e_j\) a measure of exposure. See the Conjugate Hierarchical Models vignette for more detail.

# Overlaid density estimates
# Predictive (mean, sd) vs observed (mean, sd)
pp_check(pump_res, fun = "stat_2d", stat = c("mean", "sd"))

One-way Hierarchical ANOVA

The raw responses appear in these plots.

# Overlaid density estimates
# Predictive (mean, sd) vs observed (mean, sd)
pp_check(temp_res, fun = "stat_2d", stat = c("mean", "sd"))


Gabry, Jonah, and Tristan Mahr. 2017. Bayesplot: Plotting for Bayesian Models.

Gelman, A., J. B. Carlin, H. S. Stern, D. B. Dunson, A. Vehtari, and D. B. Rubin. 2014. Bayesian Data Analysis. Third. Florida, USA: Chapman & Hall / CRC.

Wickham, Hadley. 2009. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York.