python - statsmodel:ZeroInflatedPoisson 给出 nan,ZeroInflatedGeneralizedPoisson 参数不一致
问题描述
我有一个一维数据,这是一个零膨胀计数数据。因此,我尝试拟合一个零膨胀的 possion 模型来获得估计的分布。我尝试在不同模型上使用我的真实数据和合成数据statsmodels
。然而,它给出了奇怪的结果。
Statsmodels 没有很好的文档,这里是statsmodels.discrete.count_model 的官方指南
问题一,ZeroInlatedPossion 给出nan
pmf
我想拟合一个零膨胀的 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”
解决方案
零膨胀泊松分布的参数应该是均值 (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
同样,您只需翻转您的第二次合身。
推荐阅读
- android - 对 qualcomm profiler 的质疑
- javascript - HTML5 Filereader 总是返回空字符串?
- github - GitHub Markdown 渲染 SVG 文件不正确,旁边有 []
- python - Discord.py 冷却装饰器未触发
- flutter - 如何在 Flutter 中更新复杂模型中的值?
- r - r中闪亮的应用程序的颜色代码不一致
- rust - 我可以解开宏中的文字吗?
- python - 正则表达式 .search 函数忽略名称后缀
- parquet - 如何使用 Pyarrow 更改镶木地板文件中列的名称?
- python - 使用 Sanic 和 Redis 时遇到问题