PyMC代码给出了不寻常的结果

时间:2014-09-01 06:50:33

标签: bayesian pymc mcmc

我尝试使用PyMC解决逻辑回归模型。然而,诊断图显示非常高的自相关性,并且在从后验分布重复采样后,我有时会得到非常不同的结果,因此我可能没有正确使用PyMC。

该模型如下:

Y_i = Bernoulli(p_i)
logit(p_i) = b0 + b1*x1 + b2*x2

实施是这样的:

import pymc as pm
import numpy as np

b0 =  pm.Normal('b0',  0., 1e-6, value=0.)
b1 =  pm.Normal('b1',  0., 1e-6, value=0.)
b2 =  pm.Normal('b2',  0., 1e-6, value=0.)

x1 = np.array([31, 31, 36, 30, 32, 33, 31, 33, 32])
x2 = np.array([31, 16, 35, 42, 19, 37, 29, 23, 15])
value = np.array([1, 1, 1, 1, 0, 1, 1, 1, 0])

@pm.deterministic
def p(b0=b0, b1=b1, b2=b2, x1=x1, x2=x2):
    return np.exp(b0 + b1*x1 + b2*x2)/(1.0 + np.exp(b0 + b1*x1 + b2*x2))

obs = pm.Bernoulli('obs', p=p, value=value, observed=True)

m = pm.MCMC([obs, b0, b1, b2])

当我用m.sample(500000, 200000, 50)进行采样并绘制得到的后验分布时,我得到了这个:

enter image description here enter image description here enter image description here

为了获得更好的结果,我使用了@ pm.observed:

import pymc as pm
import numpy as np

b0 =  pm.Normal('b0',  0., 1e-6, value=0.)
b1 =  pm.Normal('b1',  0., 1e-6, value=0.)
b2 =  pm.Normal('b2',  0., 1e-6, value=0.)

x1 = np.array([31, 31, 36, 30, 32, 33, 31, 33, 32])
x2 = np.array([31, 16, 35, 42, 19, 37, 29, 23, 15])
value = np.array([1, 1, 1, 1, 0, 1, 1, 1, 0])

p = b0 + b1*x1 + b2*x2

@pm.observed
def obs(p=p, value=value):
    return pm.bernoulli_like(value, pm.invlogit(p))

m = pm.MCMC([obs, p, b0, b1, b2])

但它也会产生很高的自相关性。

我增加了样本量而没有太大成功。我错过了什么?

1 个答案:

答案 0 :(得分:2)

你肯定有一些收敛问题。部分问题在于您的样本量非常小(n = 9),但正在尝试拟合3个参数。我通过阻止更新参数得到了更好的里程,但截距仍然很差:

beta =  pm.Normal('beta',  0., 0.001, value=[0.]*3)

x1 = np.array([31, 31, 36, 30, 32, 33, 31, 33, 32])
x2 = np.array([31, 16, 35, 42, 19, 37, 29, 23, 15])
value = np.array([1, 1, 1, 1, 0, 1, 1, 1, 0])

p = pm.Lambda('p', lambda b=beta: pm.invlogit(b[0] + b[1]*x1 + b[2]*x2))

obs = pm.Bernoulli('obs', p=p, value=value, observed=True)

(顺便说一下,当你对你的参数进行logit转换时,你的beta版不需要超漫射先验 - 小于0.001就没那么没用了)。通过在测试版上使用自适应Metropolis采样器,事情得到进一步改善:

M.use_step_method(AdaptiveMetropolis, M.beta)

这会导致收敛,但正如您所看到的,没有信息可以通知先前的信息:

summary