如何处理 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。

请注意,对于每个小于 1 的 x 值,y 等于 0。对于每个等于或大于 1 的 x 值,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:使用惩罚回归。

一种选择是使用惩罚逻辑回归的形式,例如套索逻辑回归或弹性网络正则化。

有关如何在 R 中实现惩罚逻辑回归的选项,请参阅glmnet包。

方法2:使用预测变量完美预测响应变量。

如果您怀疑总体中可能存在这种完美分离,则可以简单地使用此预测变量来完美预测响应变量的值。

例如,在上面的场景中,我们看到当预测变量x小于 1 时,响应变量y始终等于 0。

如果我们怀疑这种关系在总体中成立,我们总是可以预测当x小于 1 时y的值为 0,并且不用担心拟合惩罚逻辑回归模型。

其他资源

以下教程提供了有关在 R 中使用glm()函数的更多信息:

R中glm和lm的区别
如何在 R 中使用 glm 的预测函数
如何处理:glm.fit:数值调整概率为0或1发生

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注