如何处理 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()函数的更多信息: