Как обращаться с предупреждением R: glm.fit: алгоритм не сошелся


Одним из распространенных предупреждений, с которыми вы можете столкнуться в 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 произошли

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.