我们对逻辑回归中的完美分离主题进行了全面介绍。当它发生在 R 中时,我们通常会看到两个警告:
警告消息:
1:glm.fit:算法未收敛
2:glm.fit:拟合概率为 0 或 1
算法是否有可能确实收敛并在数字上拟合了 0 或 1 的概率?
我们对逻辑回归中的完美分离主题进行了全面介绍。当它发生在 R 中时,我们通常会看到两个警告:
警告消息:
1:glm.fit:算法未收敛
2:glm.fit:拟合概率为 0 或 1
算法是否有可能确实收敛并在数字上拟合了 0 或 1 的概率?
R 给你两个不同的警告,因为这确实是两个不同的问题。
非常松散地,适合逻辑回归模型(通常是 Newton-Raphson 的某个版本)的算法会四处寻找将使对数似然最大化的系数估计。它将在参数空间中的给定点估计模型,查看哪个方向是“上坡”,然后在该方向上移动一段距离。这样做的潜在问题是,当存在完美分离时,对数似然的最大值是斜率无限的地方。因为必须将搜索算法设计为在某个点停止,所以它不会收敛。
另一方面,无论它在哪里停止,无论它是否收敛,(理论上)都可以计算模型对数据的预测值。然而,由于计算机使用有限精度算术,当它们执行计算时,它们最终需要四舍五入或丢弃极低的十进制值。因此,如果算术上正确的值足够接近 0 或 1,那么当它被四舍五入时,它最终可能正好是 0 或 1。由于完全分离导致的斜率估计非常大(绝对值),值可以具有该属性并且在数据的正常范围内,或者它们可能在 X 上太远以至于即使是很小的斜率也会导致同样的现象。
# I'll use this function to convert log odds to probabilities
lo2p = function(lo){ exp(lo) / (1+exp(lo)) }
set.seed(163) # this makes the example exactly reproducible
x = c(-500, runif(100, min=-3, max=3), 500) # the x-values; 2 are extreme
lo = 0 + 1*x
p = lo2p(lo)
y = rbinom(102, size=1, prob=p)
m = glm(y~x, family=binomial)
# Warning message:
# glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(m)
# ...
# Coefficients:
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 0.3532 0.3304 1.069 0.285
# x 1.3686 0.2372 5.770 7.95e-09 ***
# ...
#
# Null deviance: 140.420 on 101 degrees of freedom
# Residual deviance: 63.017 on 100 degrees of freedom
# AIC: 67.017
#
# Number of Fisher Scoring iterations: 9
在这里,我们看到我们得到了第二个警告,但算法收敛了。贝塔相当接近真实值,标准误差不大,Fisher 评分迭代次数适中。尽管如此,极值 x 值产生的预测对数几率是完全可计算的,但当转换为概率时,基本上变成 0 和 1。
predict(m, type="link")[c(1, 102)] # these are the predicted log odds
# 1 102
# -683.9379 684.6444
predict(m, type="response")[c(1, 102)] # these are the predicted probabilities
# 1 102
# 2.220446e-16 1.000000e+00