2017-06-06 82 views
2

我正在尝试使用Python的statsmodels包进行负二项回归。使用GLM例程即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例程不估计α,色散项当模型估计细。我试图直接使用Negative Binomial例程(估计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

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

几种可能性,我通常会尽量

  • 检查没有回归有较大的值,例如重新调整以使其最大值低于10
  • 使用method ='nm'作为初始优化器的Nelder-Mead,并且在一些迭代或收敛后切换到newton或bfgs。
  • 尝试拿出更好的初始值(例如参见下面关于GLM)

GLM默认迭代重加权最小二乘使用,IRLS,这是唯一的标准为一个参数的家庭,即它需要分散参数给定。所以同样的方法不能直接用于离散NegativeBinomial中的完整MLE。

GLM负二项式仍指定完整的类似log。因此,可以使用GLM.fit()对散布参数进行网格搜索,以估计散布参数每个值的平均参数。这应该相当于相应的离散NegativeBinomial版本(nb2?我不记得)。它也可以用作离散版本的start_params。

在statsmodels主版本中,现在有一个连接允许任意scipy优化器而不是硬编码的优化器。最近scipy获得了信任域牛顿方法,将来会得到更多的信息,这应该比statsmodels中的简单牛顿方法更适用于更多的情况。 (但是,最有可能目前不适用于离散NegativeBinomial,我刚刚发现了一个可能的问题https://github.com/statsmodels/statsmodels/issues/3747

+0

太棒了!我将进一步调查 –

+0

看起来好像'discrete.NegativeBimonial'例程没有'method'参数 –

+0

这是'fit'方法中的一个选项,fit(start_params = None,method ='bfgs')。 ..)'。它缺少文档字符串,但这与泊松和其他离散模型相同。 – user333700