Как обрабатывать предупреждение 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 (ie 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 (ie 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *