Statsmodels - 负二项不会收敛,而GLM会收敛

时间:2017-06-06 19:14:17

标签: python pandas statsmodels non-linear-regression

我尝试使用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例程相同的估算方法?

1 个答案:

答案 0 :(得分:2)

discrete.NegativeBinomial在statsmodels中使用newton方法(默认)或scipy优化器。主要问题是当我们仍然远离最优时,指数均值函数很容易导致溢出问题或大梯度和粗麻布的问题。在fit方法中有一些尝试可以获得良好的起始值,但这并不总是有效。

我经常尝试的一些可能性

  • 检查没有回归量值很大,例如重新缩放以使最大值低于10
  • use method ='nm'Nelder-Mead作为初始优化器,经过一些迭代或收敛后切换到newton或bfgs。
  • 尝试提出更好的起始值(例如参见下面的GLM)

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