Statsmodels - отрицательный бином не сходится, а GLM сходится
Я пытаюсь сделать отрицательную биномиальную регрессию с помощью пакета 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 не оценивает альфа, член дисперсии. Я попытался использовать подпрограмму отрицательного бинома напрямую (которая оценивает альфа), т.е.
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. Основная проблема заключается в том, что экспоненциальная функция среднего значения может легко привести к проблемам переполнения или проблемам из-за больших градиентов и гессиана, когда мы все еще далеки от оптимума. В методе подбора есть некоторые попытки получить хорошие начальные значения, но это не всегда работает.
несколько возможностей, которые я обычно пробую
- убедитесь, что ни один регрессор не имеет больших значений, например, необходимо изменить масштаб до 10
- используйте method='nm' Nelder-Mead в качестве исходного оптимизатора и переключайтесь на ньютон или bfgs после некоторых итераций или после сходимости.
- попытаться придумать лучшие начальные значения (см., например, о GLM ниже)
GLM по умолчанию использует итеративно перевешиваемые наименьшие квадраты, IRLS, который является стандартным только для семейств с одним параметром, то есть принимает параметр дисперсии как заданный. Таким образом, тот же метод не может быть напрямую использован для полной MLE в дискретном NegativeBinomial.
GLM отрицательный бином еще указывает на полное логоподобие. Таким образом, можно выполнить поиск по сетке по параметру дисперсии, используя GLM.fit() для оценки средних параметров для каждого значения параметра дисперсии. Это должно быть эквивалентно соответствующей дискретной версии NegativeBinomial (nb2? Я не помню). Это может также использоваться в качестве start_params для дискретной версии.
В основной версии statsmodels теперь есть соединение, позволяющее использовать произвольные оптимизаторы scipy вместо тех, которые были жестко закодированы. scipy недавно получил методы ньютона в доверительной области и в будущем получит больше, что должно работать в большем количестве случаев, чем простой метод ньютона в statsmodels. (Однако, скорее всего, это не работает в настоящее время для дискретного NegativeBinomial, я только что узнал о возможной проблеме https://github.com/statsmodels/statsmodels/issues/3747)