Estimating parameters of a logistic model
在小白鼠实验中,设有
n
=
5
n=5
n=5只小白鼠,每只小白鼠的死亡概率为
p
p
p,可以建立如下logit
模型
{
y
∼
B
i
n
(
n
,
p
)
l
o
g
i
t
(
p
)
=
α
+
β
x
α
∼
N
(
0
,
5
)
β
∼
N
(
0
,
10
)
\left\{ \begin{aligned} &y\sim Bin(n, p)\\ &logit(p)=\alpha+\beta x\\ &\alpha\sim\mathcal{N}(0, 5)\\ &\beta\sim\mathcal{N}(0, 10) \end{aligned} \right.
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧y∼Bin(n,p)logit(p)=α+βxα∼N(0,5)β∼N(0,10)
设置样本观测点和
α
\alpha
α和
β
\beta
β的先验分布,定义似然函数进行MCMC
推断
def invlogit(x):
return pymc.exp(x)/(1+pymc.exp(x))
# 观测点
n = 5*np.ones(4)
x = np.array([-0.896, -0.296, -0.053, 0.727])
y_obs = np.array([0, 1, 3, 5])
# 定义先验
alpha = pymc.Normal('alpha', mu=0, tau=1.0/5**2)
beta = pymc.Normal('beta', mu=0, tau=1.0/10**2)
# 定义似然
p = pymc.InvLogit('p', alpha+beta*x)
y = pymc.Binomial('y_obs', n=n, p=p, value=y_obs, observed=True)
# 推断
m = pymc.Model([alpha, beta, y])
mc = pymc.MCMC(m)
mc.sample(iter=11000, burn=10000)
# beta参数的统计结果
print(beta.stats())
xp = np.linspace(-1, 1, 100)
a = alpha.stats()['mean']
b = beta.stats()['mean']
plt.plot(xp, invlogit(a+b*xp).value, linewidth=1, color='red')
plt.scatter(x, y_obs/5, s=50)
plt.xlabel('Log does of drug')
plt.ylabel('Risk of death')
plt.show()
pymc.Matplot.plot(mc)
参数
α
\alpha
α的采样结果如下
参数
β
\beta
β的采样结果如下