Present uncertainty in parameter estimates. See Chapter 7 in Regression and Other Stories.


Load packages

library("rprojroot")
root<-has_file(".ROS-Examples-root")$make_fix_file()
library("arm")
library("rstanarm")

Load data

hibbs <- read.table(root("ElectionsEconomy/data","hibbs.dat"), header=TRUE)
head(hibbs)
  year growth  vote inc_party_candidate other_candidate
1 1952   2.40 44.60           Stevenson      Eisenhower
2 1956   2.89 57.76          Eisenhower       Stevenson
3 1960   0.85 49.91               Nixon         Kennedy
4 1964   4.21 61.34             Johnson       Goldwater
5 1968   3.02 49.60            Humphrey           Nixon
6 1972   3.62 61.79               Nixon        McGovern

Likelihood for 2 parameters

M1 <- lm(vote ~ growth, data = hibbs)
display(M1)
lm(formula = vote ~ growth, data = hibbs)
            coef.est coef.se
(Intercept) 46.25     1.62  
growth       3.06     0.70  
---
n = 16, k = 2
residual sd = 3.76, R-Squared = 0.58
summ <- summary(M1)

Plot likelihood (a, b| y)

# Contour plots etc of simple likelihoods
trans3d <- function(x,y,z, pmat) {
       tr <- cbind(x,y,z,1) %*% pmat
       list(x = tr[,1]/tr[,4], y= tr[,2]/tr[,4])
     }
dmvnorm <- function (y, mu, Sigma, log=FALSE){
  # multivariate normal density
  n <- nrow(Sigma)
  logdens <- -(n/2)*log(2*pi*det(Sigma)) - t(y-mu)%*%solve(Sigma)%*%(y-mu)/2
  return (logdens)
#  return (ifelse (log, logdens, exp(logdens)))
}
#
rng.x <- summ$coef[1,1] + summ$coef[1,2]*c(-4,4)
rng.y <- summ$coef[2,1] + summ$coef[2,2]*c(-4,4)
x <- seq(rng.x[1], rng.x[2], length=30)
y <- seq(rng.y[1], rng.y[2], length=30)
z <- array(NA, c(length(x),length(y)))
for (i.x in 1:length(x))
  for (i.y in 1:length(y))
    z[i.x,i.y] <- dmvnorm(c(x[i.x],y[i.y]), summ$coef[,1], summ$cov.unscaled*summ$sigma^2, log=TRUE)
z <- exp(z-max(z))
par(mar=c(0, 0, 0, 0))
persp(x, y, z,
  xlim=c(rng.x[1]-.15*(rng.x[2]-rng.x[1]), rng.x[2]), ylim=c(rng.y[1]-.15*(rng.y[2]-rng.y[1]), rng.y[2]),
  xlab="a", ylab="b", zlab="likelihood", d=2, box=FALSE, axes=TRUE, expand=.6) -> res
text(trans3d(mean(rng.x), rng.y[1]-.12*(rng.y[2]-rng.y[1]), 0, pm = res), expression(beta[0]))
text(trans3d(rng.x[1]-.08*(rng.x[2]-rng.x[1]), mean(rng.y), 0, pm = res), expression(beta[1]))
mtext("likelihood, p(y | a, b)", side=3, line=-1.5)

Plot maximum likelihood estimate and std errs

par(mar=c(3, 3, 3, 1), mgp=c(1.7, .5, 0), tck=-.01)
plot(rng.x, rng.y, xlab="a", ylab="b", main=expression(paste("(", hat(a) %+-% 1, " std err,  ", hat(b) %+-% 1, " std err)")), type="n")
lines(rep(summ$coef[1,1], 2), summ$coef[2,1] + c(-1,1)*summ$coef[2,2], col="gray20")
lines(summ$coef[1,1] + c(-1,1)*summ$coef[1,2], rep(summ$coef[2,1], 2), col="gray20")
points(summ$coef[1,1], summ$coef[2,1], pch=19)

Plot maximum likelihood estimate and covariance

par(mar=c(3, 3, 3, 1), mgp=c(1.7, .5, 0), tck=-.01)
plot(rng.x, rng.y, xlab="a", ylab="b", main=expression(paste("(", hat(a), ", ", hat(b), ") and covariance matrix")), type="n")
points(summ$coef[1,1], summ$coef[2,1], pch=19)
rho <- summ$cov.unscaled[1,2]/sqrt(summ$cov.unscaled[1,1]*summ$cov.unscaled[2,2])
aa <- seq(-1,1,length=500)
bb <- sqrt(1-aa^2)
xx <- summ$coef[1,1] + summ$coef[1,2]*(aa*sqrt(1+rho)-bb*sqrt(1-rho))
yy <- summ$coef[2,1] + summ$coef[2,2]*(aa*sqrt(1+rho)+bb*sqrt(1-rho))
lines (xx, yy)
xx <- summ$coef[1,1] + summ$coef[1,2]*(aa*sqrt(1+rho)+bb*sqrt(1-rho))
yy <- summ$coef[2,1] + summ$coef[2,2]*(aa*sqrt(1+rho)-bb*sqrt(1-rho))
lines (xx, yy)

Bayesian model with flat prior

M3 <- stan_glm(vote ~ growth, data = hibbs, 
               prior_intercept=NULL, prior=NULL, prior_aux=NULL,
               refresh = 0)
sims <- as.data.frame(M3)
a <- sims[,1]
b <- sims[,2]

Plot posterior draws

par(mar=c(3, 3, 3, 1), mgp=c(1.7, .5, 0), tck=-.01)
plot(c(39.8, 52.5), c(.3, 5.8), xlab="a", ylab="b", main="4000 posterior draws of (a, b)", type="n", cex.main=1.5, cex.lab=1.5, cex.axis=1.5)
points(a, b, pch=20, cex=.2)

LS0tCnRpdGxlOiAiUmVncmVzc2lvbiBhbmQgT3RoZXIgU3RvcmllczogRWxlY3Rpb25zIEVjb25vbXkiCmF1dGhvcjogIkFuZHJldyBHZWxtYW4sIEplbm5pZmVyIEhpbGwsIEFraSBWZWh0YXJpIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCkpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tClByZXNlbnQgdW5jZXJ0YWludHkgaW4gcGFyYW1ldGVyIGVzdGltYXRlcy4gU2VlIENoYXB0ZXIgNyBpbgpSZWdyZXNzaW9uIGFuZCBPdGhlciBTdG9yaWVzLgoKLS0tLS0tLS0tLS0tLQoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNvbW1lbnQ9TkEpCiMgc3dpdGNoIHRoaXMgdG8gVFJVRSB0byBzYXZlIGZpZ3VyZXMgaW4gc2VwYXJhdGUgZmlsZXMKc2F2ZWZpZ3MgPC0gRkFMU0UKYGBgCgojIyMjIExvYWQgcGFja2FnZXMKCmBgYHtyIH0KbGlicmFyeSgicnByb2pyb290IikKcm9vdDwtaGFzX2ZpbGUoIi5ST1MtRXhhbXBsZXMtcm9vdCIpJG1ha2VfZml4X2ZpbGUoKQpsaWJyYXJ5KCJhcm0iKQpsaWJyYXJ5KCJyc3RhbmFybSIpCmBgYAoKIyMjIyBMb2FkIGRhdGEKCmBgYHtyIH0KaGliYnMgPC0gcmVhZC50YWJsZShyb290KCJFbGVjdGlvbnNFY29ub215L2RhdGEiLCJoaWJicy5kYXQiKSwgaGVhZGVyPVRSVUUpCmhlYWQoaGliYnMpCmBgYAoKIyMgTGlrZWxpaG9vZCBmb3IgMiBwYXJhbWV0ZXJzCgpgYGB7ciB9Ck0xIDwtIGxtKHZvdGUgfiBncm93dGgsIGRhdGEgPSBoaWJicykKZGlzcGxheShNMSkKc3VtbSA8LSBzdW1tYXJ5KE0xKQpgYGAKCiMjIyMgUGxvdCBsaWtlbGlob29kIChhLCBifCB5KQoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KaWYgKHNhdmVmaWdzKSBwZGYocm9vdCgiRWxlY3Rpb25zRWNvbm9teS9maWdzIiwiaGlsbF8yYS5wZGYiKSwgaGVpZ2h0PTQsIHdpZHRoPTUpCmBgYApgYGB7ciB9CiMgQ29udG91ciBwbG90cyBldGMgb2Ygc2ltcGxlIGxpa2VsaWhvb2RzCnRyYW5zM2QgPC0gZnVuY3Rpb24oeCx5LHosIHBtYXQpIHsKICAgICAgIHRyIDwtIGNiaW5kKHgseSx6LDEpICUqJSBwbWF0CiAgICAgICBsaXN0KHggPSB0clssMV0vdHJbLDRdLCB5PSB0clssMl0vdHJbLDRdKQogICAgIH0KZG12bm9ybSA8LSBmdW5jdGlvbiAoeSwgbXUsIFNpZ21hLCBsb2c9RkFMU0UpewogICMgbXVsdGl2YXJpYXRlIG5vcm1hbCBkZW5zaXR5CiAgbiA8LSBucm93KFNpZ21hKQogIGxvZ2RlbnMgPC0gLShuLzIpKmxvZygyKnBpKmRldChTaWdtYSkpIC0gdCh5LW11KSUqJXNvbHZlKFNpZ21hKSUqJSh5LW11KS8yCiAgcmV0dXJuIChsb2dkZW5zKQojICByZXR1cm4gKGlmZWxzZSAobG9nLCBsb2dkZW5zLCBleHAobG9nZGVucykpKQp9CiMKcm5nLnggPC0gc3VtbSRjb2VmWzEsMV0gKyBzdW1tJGNvZWZbMSwyXSpjKC00LDQpCnJuZy55IDwtIHN1bW0kY29lZlsyLDFdICsgc3VtbSRjb2VmWzIsMl0qYygtNCw0KQp4IDwtIHNlcShybmcueFsxXSwgcm5nLnhbMl0sIGxlbmd0aD0zMCkKeSA8LSBzZXEocm5nLnlbMV0sIHJuZy55WzJdLCBsZW5ndGg9MzApCnogPC0gYXJyYXkoTkEsIGMobGVuZ3RoKHgpLGxlbmd0aCh5KSkpCmZvciAoaS54IGluIDE6bGVuZ3RoKHgpKQogIGZvciAoaS55IGluIDE6bGVuZ3RoKHkpKQogICAgeltpLngsaS55XSA8LSBkbXZub3JtKGMoeFtpLnhdLHlbaS55XSksIHN1bW0kY29lZlssMV0sIHN1bW0kY292LnVuc2NhbGVkKnN1bW0kc2lnbWFeMiwgbG9nPVRSVUUpCnogPC0gZXhwKHotbWF4KHopKQpwYXIobWFyPWMoMCwgMCwgMCwgMCkpCnBlcnNwKHgsIHksIHosCiAgeGxpbT1jKHJuZy54WzFdLS4xNSoocm5nLnhbMl0tcm5nLnhbMV0pLCBybmcueFsyXSksIHlsaW09YyhybmcueVsxXS0uMTUqKHJuZy55WzJdLXJuZy55WzFdKSwgcm5nLnlbMl0pLAogIHhsYWI9ImEiLCB5bGFiPSJiIiwgemxhYj0ibGlrZWxpaG9vZCIsIGQ9MiwgYm94PUZBTFNFLCBheGVzPVRSVUUsIGV4cGFuZD0uNikgLT4gcmVzCnRleHQodHJhbnMzZChtZWFuKHJuZy54KSwgcm5nLnlbMV0tLjEyKihybmcueVsyXS1ybmcueVsxXSksIDAsIHBtID0gcmVzKSwgZXhwcmVzc2lvbihiZXRhWzBdKSkKdGV4dCh0cmFuczNkKHJuZy54WzFdLS4wOCoocm5nLnhbMl0tcm5nLnhbMV0pLCBtZWFuKHJuZy55KSwgMCwgcG0gPSByZXMpLCBleHByZXNzaW9uKGJldGFbMV0pKQptdGV4dCgibGlrZWxpaG9vZCwgcCh5IHwgYSwgYikiLCBzaWRlPTMsIGxpbmU9LTEuNSkKYGBgCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmlmIChzYXZlZmlncykgZGV2Lm9mZigpCmBgYAoKIyMjIyBQbG90IG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0ZSBhbmQgc3RkIGVycnMKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmlmIChzYXZlZmlncykgcGRmKHJvb3QoIkVsZWN0aW9uc0Vjb25vbXkvZmlncyIsImhpbGxfMmIucGRmIiksIGhlaWdodD01LCB3aWR0aD01KQpgYGAKYGBge3IgfQpwYXIobWFyPWMoMywgMywgMywgMSksIG1ncD1jKDEuNywgLjUsIDApLCB0Y2s9LS4wMSkKcGxvdChybmcueCwgcm5nLnksIHhsYWI9ImEiLCB5bGFiPSJiIiwgbWFpbj1leHByZXNzaW9uKHBhc3RlKCIoIiwgaGF0KGEpICUrLSUgMSwgIiBzdGQgZXJyLCAgIiwgaGF0KGIpICUrLSUgMSwgIiBzdGQgZXJyKSIpKSwgdHlwZT0ibiIpCmxpbmVzKHJlcChzdW1tJGNvZWZbMSwxXSwgMiksIHN1bW0kY29lZlsyLDFdICsgYygtMSwxKSpzdW1tJGNvZWZbMiwyXSwgY29sPSJncmF5MjAiKQpsaW5lcyhzdW1tJGNvZWZbMSwxXSArIGMoLTEsMSkqc3VtbSRjb2VmWzEsMl0sIHJlcChzdW1tJGNvZWZbMiwxXSwgMiksIGNvbD0iZ3JheTIwIikKcG9pbnRzKHN1bW0kY29lZlsxLDFdLCBzdW1tJGNvZWZbMiwxXSwgcGNoPTE5KQpgYGAKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KaWYgKHNhdmVmaWdzKSBkZXYub2ZmKCkKYGBgCgojIyMjIFBsb3QgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRlIGFuZCBjb3ZhcmlhbmNlCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQppZiAoc2F2ZWZpZ3MpIHBkZihyb290KCJFbGVjdGlvbnNFY29ub215L2ZpZ3MiLCJoaWxsXzJjLnBkZiIpLCBoZWlnaHQ9NSwgd2lkdGg9NSkKYGBgCmBgYHtyIH0KcGFyKG1hcj1jKDMsIDMsIDMsIDEpLCBtZ3A9YygxLjcsIC41LCAwKSwgdGNrPS0uMDEpCnBsb3Qocm5nLngsIHJuZy55LCB4bGFiPSJhIiwgeWxhYj0iYiIsIG1haW49ZXhwcmVzc2lvbihwYXN0ZSgiKCIsIGhhdChhKSwgIiwgIiwgaGF0KGIpLCAiKSBhbmQgY292YXJpYW5jZSBtYXRyaXgiKSksIHR5cGU9Im4iKQpwb2ludHMoc3VtbSRjb2VmWzEsMV0sIHN1bW0kY29lZlsyLDFdLCBwY2g9MTkpCnJobyA8LSBzdW1tJGNvdi51bnNjYWxlZFsxLDJdL3NxcnQoc3VtbSRjb3YudW5zY2FsZWRbMSwxXSpzdW1tJGNvdi51bnNjYWxlZFsyLDJdKQphYSA8LSBzZXEoLTEsMSxsZW5ndGg9NTAwKQpiYiA8LSBzcXJ0KDEtYWFeMikKeHggPC0gc3VtbSRjb2VmWzEsMV0gKyBzdW1tJGNvZWZbMSwyXSooYWEqc3FydCgxK3JobyktYmIqc3FydCgxLXJobykpCnl5IDwtIHN1bW0kY29lZlsyLDFdICsgc3VtbSRjb2VmWzIsMl0qKGFhKnNxcnQoMStyaG8pK2JiKnNxcnQoMS1yaG8pKQpsaW5lcyAoeHgsIHl5KQp4eCA8LSBzdW1tJGNvZWZbMSwxXSArIHN1bW0kY29lZlsxLDJdKihhYSpzcXJ0KDErcmhvKStiYipzcXJ0KDEtcmhvKSkKeXkgPC0gc3VtbSRjb2VmWzIsMV0gKyBzdW1tJGNvZWZbMiwyXSooYWEqc3FydCgxK3JobyktYmIqc3FydCgxLXJobykpCmxpbmVzICh4eCwgeXkpCmBgYApgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQppZiAoc2F2ZWZpZ3MpIGRldi5vZmYoKQpgYGAKCiMjIEJheWVzaWFuIG1vZGVsIHdpdGggZmxhdCBwcmlvcgoKYGBge3IgfQpNMyA8LSBzdGFuX2dsbSh2b3RlIH4gZ3Jvd3RoLCBkYXRhID0gaGliYnMsIAogICAgICAgICAgICAgICBwcmlvcl9pbnRlcmNlcHQ9TlVMTCwgcHJpb3I9TlVMTCwgcHJpb3JfYXV4PU5VTEwsCiAgICAgICAgICAgICAgIHJlZnJlc2ggPSAwKQpzaW1zIDwtIGFzLmRhdGEuZnJhbWUoTTMpCmEgPC0gc2ltc1ssMV0KYiA8LSBzaW1zWywyXQpgYGAKCiMjIyMgUGxvdCBwb3N0ZXJpb3IgZHJhd3MKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmlmIChzYXZlZmlncykgcGRmKHJvb3QoIkVsZWN0aW9uc0Vjb25vbXkvZmlncyIsImhpbGxfM2MucGRmIiksIGhlaWdodD01LCB3aWR0aD01KQpgYGAKYGBge3IgfQpwYXIobWFyPWMoMywgMywgMywgMSksIG1ncD1jKDEuNywgLjUsIDApLCB0Y2s9LS4wMSkKcGxvdChjKDM5LjgsIDUyLjUpLCBjKC4zLCA1LjgpLCB4bGFiPSJhIiwgeWxhYj0iYiIsIG1haW49IjQwMDAgcG9zdGVyaW9yIGRyYXdzIG9mIChhLCBiKSIsIHR5cGU9Im4iLCBjZXgubWFpbj0xLjUsIGNleC5sYWI9MS41LCBjZXguYXhpcz0xLjUpCnBvaW50cyhhLCBiLCBwY2g9MjAsIGNleD0uMikKYGBgCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmlmIChzYXZlZmlncykgZGV2Lm9mZigpCmBgYAoK