Statsmodels - 负二项式不收敛,而 GLM 确实收敛
Statsmodels - Negative Binomial doesn't converge while GLM does converge
我正在尝试使用 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,即色散项。我尝试直接使用负二项式例程(它估计 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 例程相同的估计方法?
discrete.NegativeBinomial
使用 statsmodels 中的牛顿法(默认)或 scipy 优化器。主要问题是当我们距离最优值还很远时,指数均值函数很容易导致溢出问题或大梯度和 hessian 的问题。在 fit 方法中有一些尝试以获得良好的起始值,但这并不总是有效。
我经常尝试的几种可能性
- 检查没有回归变量具有大值,例如重新缩放以使其最大值低于 10
- 使用 method='nm' Nelder-Mead 作为初始优化器,并在一些迭代或收敛后切换到 newton 或 bfgs。
- 尝试提出更好的起始值(参见下面关于 GLM 的示例)
GLM 默认使用迭代重新加权最小二乘法 IRLS,它仅适用于一个参数族,即它采用给定的色散参数。所以同样的方法不能直接用于离散 NegativeBinomial 中的完整 MLE。
GLM 负二项式仍然指定完整的对数。因此,可以使用 GLM.fit() 对色散参数进行网格搜索,以估计色散参数的每个值的平均参数。这应该等同于相应的离散 NegativeBinomial 版本(nb2?我不记得了)。它也可以用作离散版本的 start_params。
在 statsmodels 主版本中,现在有一个连接允许任意 scipy 优化器,而不是硬编码的优化器。 scipy 最近得到了信赖域牛顿法,以后会得到更多,应该比statsmodels中的简单牛顿法适用于更多的情况。
(但是,很可能目前对于离散 NegativeBinomial 不起作用,我刚刚发现了一个可能的问题 https://github.com/statsmodels/statsmodels/issues/3747 )
我正在尝试使用 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,即色散项。我尝试直接使用负二项式例程(它估计 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 例程相同的估计方法?
discrete.NegativeBinomial
使用 statsmodels 中的牛顿法(默认)或 scipy 优化器。主要问题是当我们距离最优值还很远时,指数均值函数很容易导致溢出问题或大梯度和 hessian 的问题。在 fit 方法中有一些尝试以获得良好的起始值,但这并不总是有效。
我经常尝试的几种可能性
- 检查没有回归变量具有大值,例如重新缩放以使其最大值低于 10
- 使用 method='nm' Nelder-Mead 作为初始优化器,并在一些迭代或收敛后切换到 newton 或 bfgs。
- 尝试提出更好的起始值(参见下面关于 GLM 的示例)
GLM 默认使用迭代重新加权最小二乘法 IRLS,它仅适用于一个参数族,即它采用给定的色散参数。所以同样的方法不能直接用于离散 NegativeBinomial 中的完整 MLE。
GLM 负二项式仍然指定完整的对数。因此,可以使用 GLM.fit() 对色散参数进行网格搜索,以估计色散参数的每个值的平均参数。这应该等同于相应的离散 NegativeBinomial 版本(nb2?我不记得了)。它也可以用作离散版本的 start_params。
在 statsmodels 主版本中,现在有一个连接允许任意 scipy 优化器,而不是硬编码的优化器。 scipy 最近得到了信赖域牛顿法,以后会得到更多,应该比statsmodels中的简单牛顿法适用于更多的情况。 (但是,很可能目前对于离散 NegativeBinomial 不起作用,我刚刚发现了一个可能的问题 https://github.com/statsmodels/statsmodels/issues/3747 )