Drawing a Joint Distribution of a Binomial
Distribution
A Python script
The basic model in Bayesian statistics is given by the following equation (Gelman, Carlin, Stern, Dunson, Vehtari, and Rubin (2014). Bayesian Data Analysis, third edition. CRC Press).
From model (1), we have the conditional distribution of parameter given data D.
Now, consider a binomial distribution given by this
where data D and parameter are denoted by the frequency X and the probability p, respectively.
Set the prior distribution as a uniform one. That is,
From (1), we have
A 3-D graphic image of the above joint distribution is shown in Figure 1.
Figure 1
The image in Figure 1 can be rotated by dragging on it by the mouse (Figure 2).
Figure 2
The red line in Figure 2 indicates the intercept, which corresponds to the posterior distribution .
The Python script, which produced the graph in Figure 1 is as follows.
==========================================
from
mpl_toolkits.mplot3d import Axes3D
import
matplotlib.pyplot as plt
import numpy as np
import math
def combi(N, k):
v = 1
if (0 < k) and (k <
N):
for
i in range(1, k+1):
v *= (N - i +1) / i
return v
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(0,
10.1, 1)
P = np.arange(0.0,
1.001, 0.01)
Xg, Pg =
np.meshgrid(X, P)
def f(x, p):
return combi(10, x) * (p**x) * ((1-p)**(10-x))
Z = []
pos = -1
for p in P:
Z.append([])
pos += 1
for x in X:
Z[pos].append(f(int(x), p))
Z = np.array(Z)
ax.plot_surface(Xg,
Pg, Z, rstride = 1, cstride = 1, cmap = plt.cm.coolwarm)
plt.show()
===========================================
The points of grids of X and p are stored in the following lists:
X = |
[X1, X2, ・・・, Xm] |
|||
P = |
[P1, P2, ・・・, Pn] |
The corresponding values of the function are set as the following list:
Z = |
[ |
||||
[f(X1, P1), |
f(X2, P1), |
・・・ |
f(Xm, P1)], |
||
[f(X1, P2), |
f(X2, P2), |
・・・ |
f(Xm, P2)], |
||
︙ |
︙ |
︙ |
︙ |
||
[f(X1, Pn), |
f(X2, Pn), |
・・・ |
f(Xm, Pn)] |
||
] |
The script file is archived in the file Prg.zip, which can be downloaded by clicking the file name Prg.zip.
In the above script, the third argument Z of the function plot_surface is constructed by explicitly calculating each item value in the list. But, if the function accepts a list as an argument, we need not calculate the values by calling the function for each item. For a sample script using a function, which accepts a list, visit this website.