【问题标题】:PyMC code gives unusual resultsPyMC 代码给出不寻常的结果
【发布时间】:2014-10-25 08:30:10
【问题描述】:

我尝试使用 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) 采样并绘制结果后验分布时,我得到了:

在第二次尝试获得更好的结果时,我使用了@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])

但它也会产生高自相关。

我增加了样本量但没有取得多大成功。我错过了什么?

【问题讨论】:

    标签: bayesian pymc mcmc


    【解决方案1】:

    你肯定有一些收敛问题。部分问题是您的样本量非常小(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)
    

    这会导致收敛,但如您所见,没有信息可以告知先验:

    【讨论】:

    • 感谢您的回答。你是对的,现在结果看起来好多了。在这种情况下,我是否应该得出结论,变量 x1x2 对变量 value 没有预测能力?(假设这是可用数据的最佳模型)顺便说一句,当我尝试要使用您的代码,我收到一条错误消息,指出 M 没有“beta”属性。我改用这个:M.use_step_method(pm.AdaptiveMetropolis, beta)
    • 另一个问题:我注意到当我运行M = pm.MCMC([obs, beta]) 并使用pm.Matplot.plot(M) 绘图时,我获得了每个参数的后验分布。但是,如果我将其更改为 M = pm.MCMC([obs, p, beta]),绘图会产生许多名为 p_1、p_2 等的额外参数。那是什么?确定性变量不需要包含在 MCMC 中吗?如果我没记错的话,使用 @pm.observed 并没有生成那些额外的图。
    • 确定性变量不受 MCMC 抽样的影响,但我们经常对它们的后验分布感兴趣,因此我们将它们保存为迹线。但是,如果您真的不想要它们,可以使用 trace=False 标志将其关闭。观察到的变量的值不会在每次迭代中发生变化,因此这些变量没有踪迹。
    • 知道了。你会评论我上面描述的预测能力问题吗?顺便说一句,我很喜欢你在 github 上的 Bios366 课程。
    • 谢谢。关于“预测能力”,您无法仅通过查看后验估计来判断,尽管 beta2 的可信区间完全是正的,这表明它在一定程度上影响了事件。我会使用 AIC 之类的东西正式比较模型,看看模型在有或没有一个或多个预测变量的情况下是否表现更好。仅仅因为分析能力不足,并不意味着变量本身没有用。
    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 2011-03-02
    • 2017-08-05
    • 2014-11-22
    • 1970-01-01
    • 2011-06-22
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多