codex/past-exam-of-the-statistics-course-of-the-university-of-oxford/2014-credible-intervals.py

past-exam-of-the-statistics-course-of-the-university-of-oxford/2014-credible-intervals.py
"""Python 3.14; numpy, matplotlib. Write an opaque PNG in the current directory."""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
alpha=.05
lo=-np.log(1-alpha/2); hi=-np.log(alpha/2); hpd=-np.log(alpha)
x=np.linspace(0,4.5,1000)
fig,axes=plt.subplots(1,2,figsize=(8.8,3.5),sharey=True,layout='constrained',facecolor='white')
for ax,(a,b,title) in zip(axes,[(lo,hi,'Equal tails: 2.5% in each tail'),(0,hpd,'Highest density: 5% upper tail')]):
 ax.plot(x,np.exp(-x),color='#244870',lw=2)
 mask=(x>=a)&(x<=b)
 ax.fill_between(x,np.exp(-x),where=mask,color='#82b9d8',alpha=.65)
 ax.axvline(b,color='#9b3b32',ls='--',lw=1.1)
 if a>0:ax.axvline(a,color='#9b3b32',ls='--',lw=1.1)
 ax.set(xlabel=r'$\theta$',title=title,xlim=(0,4.5),ylim=(0,1.08))
 ax.text(.48,.83,f'95% interval\n[{a:.3f}, {b:.3f}]',transform=ax.transAxes)
 ax.spines[['top','right']].set_visible(False)
axes[0].set_ylabel(r'Posterior density $e^{-\theta}$')
fig.savefig(Path.cwd()/'2014-credible-intervals.png',dpi=140,facecolor='white')