Одним из распространенных предупреждений, с которыми вы можете столкнуться в R, является:
glm.fit: algorithm did not converge
Это предупреждение часто появляется, когда вы пытаетесь подобрать модель логистической регрессии в R и получаете идеальное разделение , то есть переменная-предиктор способна идеально разделить переменную ответа на 0 и 1.
В следующем примере показано, как обрабатывать это предупреждение на практике.
Как воспроизвести предупреждение
Предположим, мы пытаемся подогнать в R следующую модель логистической регрессии:
#create data frame
df <- data.frame(x=c(.1, .2, .3, .4, .5, .6, .7, .8, .9, 1, 1, 1.1, 1.3, 1.5, 1.7),
y=c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1))
#attempt to fit logistic regression model
glm(y~x, data=df, family=" binomial ")
Call: glm(formula = y ~ x, family = "binomial", data = df)
Coefficients:
(Intercept) x
-409.1 431.1
Degrees of Freedom: 14 Total (i.e. Null); 13 Residual
Null Deviance: 20.19
Residual Deviance: 2.468e-09 AIC: 4
Warning messages:
1: glm.fit: algorithm did not converge
2: glm.fit: fitted probabilities numerically 0 or 1 occurred
Обратите внимание, что мы получаем предупреждающее сообщение: glm.fit: алгоритм не сошелся .
Мы получаем это сообщение, потому что предикторная переменная x способна идеально разделить переменную ответа y на 0 и 1.
Обратите внимание, что для каждого значения x, меньшего 1, y равно 0. И для каждого значения x, равного или большего 1, y равно 1.
В следующем коде показан сценарий, в котором переменная-предиктор не может идеально разделить переменную ответа на 0 и 1:
#create data frame
df <- data.frame(x=c(.1, .2, .3, .4, .5, .6, .7, .8, .9, 1, 1, 1.1, 1.3, 1.5, 1.7),
y=c(0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1))
#fit logistic regression model
glm(y~x, data=df, family=" binomial ")
Call: glm(formula = y ~ x, family = "binomial", data = df)
Coefficients:
(Intercept) x
-2.112 2.886
Degrees of Freedom: 14 Total (i.e. Null); 13 Residual
Null Deviance: 20.73
Residual Deviance: 16.31 AIC: 20.31
Мы не получаем никакого предупреждающего сообщения, потому что переменная-предиктор не может точно разделить переменную ответа на 0 и 1.
Как справиться с предупреждением
Если мы сталкиваемся со сценарием с идеальным разделением, есть два способа справиться с этим:
Метод 1: используйте штрафную регрессию.
Одним из вариантов является использование какой-либо формы штрафной логистической регрессии, такой как логистическая регрессия лассо или регуляризация эластичной сети.
Обратитесь к пакету glmnet за вариантами реализации штрафной логистической регрессии в R.
Метод 2: Используйте переменную-предиктор, чтобы точно предсказать переменную ответа.
Если вы подозреваете, что это идеальное разделение может существовать в популяции, вы можете просто использовать эту предикторную переменную, чтобы точно предсказать значение переменной ответа.
Например, в приведенном выше сценарии мы видели, что переменная ответа y всегда была равна 0, когда переменная-предиктор x была меньше 1.
Если мы подозреваем, что эта связь сохраняется для всей совокупности, мы всегда можем просто предсказать, что значение y будет равно 0, когда x меньше 1, и не беспокоиться о подгонке какой-либо модели логистической регрессии со штрафом.
Дополнительные ресурсы
В следующих руководствах представлена дополнительная информация о работе с функцией glm() в R:
Разница между glm и lm в R
Как использовать функцию прогнозирования с glm в R
Как справиться: glm.fit: подогнанные вероятности численно 0 или 1 произошли