import superimport
import seaborn as sns
import numpy as np
from scipy.stats import beta
from scipy.optimize import fmin
import matplotlib.pyplot as plt
sns.set_style("ticks")
def HDIofICDF(dist_name, credMass=0.95, **args):
'''
Warning: This only works for unimodal distributions
Source : This was adapted from R to python from John K. Kruschke book, Doing bayesian data analysis,
by aloctavodia as part of the answer to the following stackoverflow question[1].
Reference:
1. https://stackoverflow.com/questions/22284502/highest-posterior-density-region-and-central-credible-region
'''
distri = dist_name(**args)
incredMass = 1.0 - credMass
def intervalWidth(lowTailPr):
return distri.ppf(credMass + lowTailPr) - distri.ppf(lowTailPr)
HDIlowTailPr = fmin(intervalWidth, incredMass, ftol=1e-8, disp=False)[0]
return list(distri.ppf([HDIlowTailPr, credMass + HDIlowTailPr]))
a, b = 3, 9
alpha = 0.05
l = beta.ppf(alpha/2, a, b)
u = beta.ppf(1-alpha/2, a, b)
CI = [l,u]
HPD =HDIofICDF(beta, credMass=0.95, a=a, b=b)
xs = np.linspace(0.001, 0.999, 40)
ps = beta.pdf(xs, a, b)
names = ['CI','HPD']
linestyles = ['-', '-']
ints = [CI, HPD]
fig, ax = plt.subplots(1, 2, figsize=(12, 4))
for i, inter in enumerate(ints):
l, u = inter
y1 = beta.pdf(l, a, b)
y2 = beta.pdf(u, a, b)
ax[i].set_xlim(0,1)
ax[i].set_ylim(0,3.5)
ax[i].set_title(names[i])
ax[i].plot(xs, ps,
'-', lw=2, label='beta pdf', color="black")
ax[i].plot((l, l), (0, y1), color="blue")
ax[i].plot((l, u), (y1, y2), color="blue")
ax[i].plot((u, u), (y2, 0), color="blue")
plt.show()