在statsmodels中拟合泊松分布数据
我正在尝试用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 个回答
泊松模型和其他一些广义线性模型一样,假设我们有一种转换方法,可以把预测结果限制在合适的范围内。
泊松模型适用于非负数,而这种转换方法就是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中,这个功能可能还需要一段时间才能实现,除非有人对此进行贡献。