我尝试使用Python的statsmodels包进行负二项回归。使用GLM例程时,模型估计很好,即
model = smf.glm(formula="Sales_Focus_2016 ~ Sales_Focus_2015 + A_Calls + A_Ed", data=df, family=sm.families.NegativeBinomial()).fit()
model.summary()
然而,GLM例程并不估算分散项α。我试图直接使用负二项式例程(它估计alpha),即
nb = smf.negativebinomial(formula="Sales_Focus_2016 ~ Sales_Focus_2015 + A_Calls + A_Ed", data=df).fit()
nb.summary()
但这并没有收敛。相反,我收到了消息:
Warning: Desired error not necessarily achieved due to precision loss.
Current function value: nan
Iterations: 0
Function evaluations: 1
Gradient evaluations: 1
我的问题是:
这两个例程是否使用不同的估算方法? 有没有办法让smf.NegativeBinomial例程使用与GLM例程相同的估算方法?
答案 0 :(得分:2)
discrete.NegativeBinomial
在statsmodels中使用newton方法(默认)或scipy优化器。主要问题是当我们仍然远离最优时,指数均值函数很容易导致溢出问题或大梯度和粗麻布的问题。在fit方法中有一些尝试可以获得良好的起始值,但这并不总是有效。
我经常尝试的一些可能性
GLM默认使用迭代重加权最小二乘法IRLS,它仅是一个参数族的标准,即它采用给定的色散参数。因此,相同的方法不能直接用于离散NegativeBinomial中的完整MLE。
GLM否定二项仍然指定完整的loglike。因此,可以使用GLM.fit()对色散参数进行网格搜索,以估计色散参数的每个值的平均参数。这应该相当于相应的离散NegativeBinomial版本(nb2?我不记得了)。它也可以用作离散版本的start_params。
在statsmodels主版本中,现在有一个连接允许任意scipy优化器而不是硬编码的优化器。 scipy最近获得了信任区域的牛顿方法,并且将来会得到更多,这应该比statsmodels中的简单newton方法更适用于更多的情况。 (但是,很可能目前对于离散的NegativeBinomial不起作用,我只是发现了一个可能的问题https://github.com/statsmodels/statsmodels/issues/3747)