p <- seq(0.5, 0.95, length = 10)
prior <- c(0.005, 0.01, 0.05, 0.1, 0.22, 0.33, 0.22, 0.05, 0.014, 0.001) # given by an expert
likelihood <- dbinom(39, 60, p)
norm <- sum(prior * likelihood) # normalising constant from the law of total probability
posterior <- prior * likelihood / norm
# Prior summaries
prior_mode <- p[which.max(prior)]
prior_mean <- sum(p * prior)
# Posterior summaries
posterior_mode <- p[which.max(posterior)] # MAP estimate on this grid
posterior_mean <- sum(p * posterior)
# 98% equal-tail credible interval on the discrete grid
post_cdf <- cumsum(posterior)
lower_98 <- p[min(which(post_cdf >= 0.01))]
upper_98 <- p[min(which(post_cdf >= 0.99))]
# Plot
par(mfrow = c(3,1),
mar = c(0,4,1,1), # remove bottom margin
oma = c(4,0,0,0)) # outer margin for shared x-label
plot(p, prior, type="l", xaxt="n", ylab="Prior", col="green")
abline(v = prior_mode, lty = 2, col = "darkgreen")
plot(p, likelihood, type="l", xaxt="n", ylab="Likelihood", col="blue")
plot(p, posterior, type="l", ylab="Posterior", xlab="p", col="red")
abline(v = posterior_mode, lty = 2, col = "darkred")
abline(v = c(lower_98, upper_98), lty = 3, col = "gray40")
mtext("Free throw success probability (p)", side=1, outer=TRUE, line=3)