在statsmodels中拟合泊松分布数据

13 投票
1 回答
12928 浏览
提问于 2025-04-18 11:19

我正在尝试用statsmodels这个库来给我的数据拟合一个泊松分布,但我对得到的结果感到困惑,也不太清楚该如何使用这个库。

我的真实数据是一系列数字,我认为这些数字应该可以用泊松分布来描述,加上一些异常值,所以最终我想对数据进行一个稳健的拟合。

不过为了测试,我只是用scipy.stats.poisson创建了一个数据集。

samp = scipy.stats.poisson.rvs(4,size=200)

所以为了用statsmodels进行拟合,我想我只需要一个常量的'endog'。

res = sm.Poisson(samp,np.ones_like(samp)).fit()

print res.summary()

                          Poisson Regression Results
==============================================================================
Dep. Variable:                      y   No. Observations:                  200
Model:                        Poisson   Df Residuals:                      199
Method:                           MLE   Df Model:                            0
Date:                Fri, 27 Jun 2014   Pseudo R-squ.:                   0.000
Time:                        14:28:29   Log-Likelihood:                -404.37
converged:                       True   LL-Null:                       -404.37
                                        LLR p-value:                       nan
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const          1.3938      0.035     39.569      0.000         1.325     1.463
==============================================================================

好吧,这看起来不太对,但如果我这样做:

res.predict()

我得到了一个4.03的数组(这是这个测试样本的均值)。所以基本上,我首先对如何解读statsmodels的这个结果感到非常困惑,其次,如果我对分布的稳健参数估计感兴趣,我可能应该做一些完全不同的事情,而不是拟合趋势,但我该怎么做呢?

编辑 我应该提供更多细节,以便回答我问题的第二部分。

我有一个事件,它在一个开始时间之后随机发生。当我为许多事件绘制延迟时间的直方图时,我发现分布看起来像是一个缩放的泊松分布,加上几个异常值,这些异常值通常是由于我系统中的问题造成的。所以我只是想找到数据集中期望的时间延迟,排除异常值。如果没有异常值,我可以简单地找到平均时间。我想我可以手动排除它们,但我觉得我可以找到更精确的方法。

编辑 经过进一步思考,我会考虑其他分布,而不是坚持使用泊松分布,我的问题细节可能会分散对原始问题的注意力,但我还是把它们留在这里了。

1 个回答

9

泊松模型和其他一些广义线性模型一样,假设我们有一种转换方法,可以把预测结果限制在合适的范围内。

泊松模型适用于非负数,而这种转换方法就是exp(指数函数)。所以,这个模型的估计假设在给定解释变量的情况下,观察值的期望值是

 E(y | x) = exp(X dot params)

要得到泊松分布的lambda参数,我们需要使用指数函数,也就是exp,即:

>>> np.exp(1.3938)
4.0301355071650118

predict 默认会这样做,但你可以通过一个关键字参数请求只获取线性部分(X dot params)

顺便提一下,statsmodels中的一些术语可能会让人困惑:endog指的是y,exog指的是x(里面有x)。(http://statsmodels.sourceforge.net/devel/endog_exog.html)

对异常值的稳健估计

关于问题的最后一部分,按照我所知,目前在Python中没有针对泊松或其他计数模型的异常值稳健估计。

对于过度离散的数据,也就是方差大于均值的情况,我们可以使用负二项回归。对于泊松模型中的异常值,我们需要使用R/Rpy,或者手动处理异常值。异常值的识别可以基于标准化残差之一。

在statsmodels中,这个功能可能还需要一段时间才能实现,除非有人对此进行贡献。

撰写回答