首页 > 解决方案 > statsmodel:ZeroInflatedPoisson 给出 nan,ZeroInflatedGeneralizedPoisson 参数不一致

问题描述

我有一个一维数据,这是一个零膨胀计数数据。因此,我尝试拟合一个零膨胀的 possion 模型来获得估计的分布。我尝试在不同模型上使用我的真实数据和合成数据statsmodels。然而,它给出了奇怪的结果。

Statsmodels 没有很好的文档,这里是statsmodels.discrete.count_model 的官方指南

问题一,ZeroInlatedPossion 给出nanpmf

我想拟合一个零膨胀的 possion 模型,然后在数据和拟合分布之间执行 KS 检验。但是,在合成数据集上,frozen_dist.pmf(1)给出nan.

import numpy as np
import scipy.stats as stats
from statsmodels.discrete.count_model import ZeroInflatedPoisson,ZeroInflatedGeneralizedPoisson,ZeroInflatedNegativeBinomialP

data = stats.bernoulli.rvs(p = 0.4, size = 2000, random_state = 42)*\
stats.poisson.rvs(mu = 5, size = 2000, random_state = 42)
# data1 = np.array([ 0.,  0.,  0.,  0.,  0.,  0.,  0., 15.,  0.,  0.,  0.,  0.,  0.,
#         0.,  0.,  1.,  0.,  1.,  0.,  0.,  0.,  0.,  2.,  1.,  0.,  1.,
#         0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.,  1.,  0.,  0.,  0.,  0.,
#         0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

zip_model = ZeroInflatedPoisson(endog = data, exog= np.ones_like(data)) # clarify a model
zip_res = zip_model.fit() # fit model with data to estimate distribution parameters
frozen_dist = zip_model.distribution(*zip_res.params) # frozen a distribution
frozen_dist.pmf(1) # fitted with data, it gives nan; fitted with data1, it gives real values
# stats.kstest(data1, frozen_dist.cdf)

输出:

问题 2,ZeroInflatedGeneralizedPoisson 无法冻结具有拟合参数的分布

# zigp model params did not consistent with zigp_model.distribution
data = stats.bernoulli.rvs(p = 0.4, size = 2000, random_state = 42)*\
stats.poisson.rvs(mu = 5, size = 2000, random_state = 42)
# data1 = np.array([ 0.,  0.,  0.,  0.,  0.,  0.,  0., 15.,  0.,  0.,  0.,  0.,  0.,
#         0.,  0.,  1.,  0.,  1.,  0.,  0.,  0.,  0.,  2.,  1.,  0.,  1.,
#         0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.,  1.,  0.,  0.,  0.,  0.,
#         0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

zigp_model = ZeroInflatedGeneralizedPoisson(endog = data, exog= np.ones_like(data))
zigp_res = zigp_model.fit()
frozen_dist = zigp_model.distribution(*zip_res.params) # Error in this step
stats.kstest(data, frozen_dist.cdf)

输出:

类型错误:_parse_args() 缺少 2 个必需的位置参数:“p”和“w”

标签: pythonstatisticsstatsmodelspoisson

解决方案


零膨胀泊松分布的参数应该是均值 (mu),后跟零的比例 (w)。分发方法来自 statsmodels.distributions ,您可以查看源代码。是的 没有很好的记录

所以使用像你这样的例子:

import numpy as np
import scipy.stats as stats
from statsmodels.discrete.count_model import ZeroInflatedPoisson

data = stats.bernoulli.rvs(p = 0.4, size = 2000, random_state = 42)*\
stats.poisson.rvs(mu = 30, size = 2000, random_state = 42)

zip_model = ZeroInflatedPoisson(endog = data, exog= np.ones_like(data)) 
zip_res = zip_model.fit()

params 的第一项是零通胀部分,第二项是你的 poisson mu :

zip_res.summary()

                    coef    std err          z      P>|z|      [0.025      0.975]
---------------------------------------------------------------------------------
inflate_const     0.3702      0.045      8.137      0.000       0.281       0.459
const             3.3944      0.006    529.596      0.000       3.382       3.407

zip_res.params
array([0.37017071, 3.39436043])

现在我们进行分配,您可以看到它是正确的。

frozen_dist = zip_model.distribution(mu = zip_res.params[1], w= zip_res.params[0]) 
frozen_dist.pmf(1)

0.07175113976309205

同样,您只需翻转您的第二次合身。


推荐阅读