在statsmodels中将泊松分布拟合到数据

13

我正在尝试使用statsmodels将泊松分布拟合到我的数据中,但是我对得到的结果以及如何使用该库感到困惑。

我的真实数据将会是一系列数字,我认为应该能够将其描述为具有泊松分布加上一些异常值,因此最终我想对数据进行稳健拟合。

然而,为了测试目的,我只是使用scipy.stats.poisson创建了一个数据集

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

所以我认为,要使用statsmodels来适配这个模型,只需要将一个常数“endog”加入即可。

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

打印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(这是这个测试样本的平均值)。所以基本上,首先我非常困惑如何解释statsmodel给出的结果,其次如果我对分布的鲁棒参数估计感兴趣而不是拟合趋势,那么我应该做完全不同的事情,但我应该如何去做呢? 编辑 我真的应该提供更多细节来回答我的第二个问题。
我有一个事件,在开始时间之后在随机时间发生。当我为许多事件绘制延迟时间的直方图时,我发现分布看起来像是一个缩放后的泊松分布加上几个异常值点,通常是由于底层系统中的问题导致的。因此,我只想找到数据集的预期时间延迟,不包括异常值。如果没有异常值,我可以简单地找到平均时间。我想我可以手动排除它们,但我认为我可以找到更精确的方法。 编辑 经过进一步思考,我将考虑其他分布,而不是坚持使用泊松分布,并且我的问题的细节可能会分散注意力,但我仍然将它们留在这里。

1
“Robust”是什么意思?鲁棒性强,对异常值、误差规范不准确和数值问题有很好的容错能力吗? - Josef
我指的是对异常值具有鲁棒性。 - robochat
我在回复中添加了一些关于异常值鲁棒估计的注释。我之前开始研究了一段时间,但是在statsmodels中要实现这个功能还有很长的路要走。 - Josef
1个回答

8

泊松模型和广义线性模型家族中的大多数其他模型以及其他离散数据模型一样,假设我们有一个变换,将预测范围限制在适当的范围内。

泊松模型适用于非负数,变换是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)

异常值鲁棒估计

对于问题的最后一部分的答案是,据我所知,目前没有针对Poisson或其他计数模型的Python中的异常值鲁棒估计。

对于方差大于均值的过度离散数据,我们可以使用负二项式回归。对于Poisson中的异常值,我们需要使用R / Rpy或手动剪辑异常值。 异常值的识别可以基于标准化残差之一。

除非有人贡献这部分功能,否则它在较长一段时间内将不会在statsmodels中提供。


谢谢,这回答了我的第一个问题。显然,在我熟悉statsmodels术语之前,我需要做更多的统计工作。 - robochat
endog/exog 只是需要记忆的一个概念(带有 exog 是 ex 的提示)。到目前为止,我拒绝在 statsmodels 代码中引入单个字母名称。 - Josef
作为一个新用户,endog/exog 的含义并没有让我感到困惑,而是如何指定 exog,以及在执行回归和参数拟合分布之间的区别让我感到困惑。非常感谢您的答案,也感谢 statsmodels。 - robochat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接