为什么当类分离良好时逻辑回归变得不稳定?良好分隔的类是什么意思?如果有人可以举例说明,我将不胜感激。
当类分离良好时,为什么逻辑回归变得不稳定?
当存在分离时,逻辑回归本身变得不稳定是不正确的。分离意味着有一些变量是非常好的预测变量,这很好,或者,分离可能是观察太少/变量太多的产物。如果是这种情况,解决方案可能是获取更多数据。但是,分离本身只是一种症状,本身并不是问题。
所以确实有不同的情况需要处理。首先,分析的目的是什么?如果分析的最终结果是一些案例的分类,那么分离是完全没有问题的,这确实意味着有很好的变量给出了很好的分类。但是如果目标是风险估计,我们需要参数估计,并且通过分离,通常的 mle(最大似然)估计不存在。所以我们必须改变估计方法,也许。文献中有几个建议,我会回到那个。
然后(如上所述)有两种不同的可能导致分离的原因。整个人群中可能存在分离,或者分离可能是由于观察到的病例太少/变量太多。
与分离不同的是最大似然估计过程。mle 参数估计(或至少其中一些)变得无限。我在这个答案的第一个版本中说过,这可以很容易地解决,也许可以通过引导来解决,但这不起作用,因为在每个引导重新采样中都会有分离,至少在通常的引导过程中是这样。但是逻辑回归仍然是一个有效的模型,但我们需要一些其他的估计过程。一些提议是:
- 正则化,如 ridge 或 lasso,可能与 bootstrap 结合使用。
- 精确条件逻辑回归
- 置换测试,见https://www.ncbi.nlm.nih.gov/pubmed/15515134
- Firths 减少偏差的估计过程,请参阅Logistic 回归模型不收敛
- 肯定是其他人...
如果你使用 R,CRAN 上有一个包SafeBinaryRegression
,它有助于诊断分离问题,使用数学优化方法来检查是否存在分离或准分离!下面我将给出一个使用这个包的模拟示例,以及elrm
用于近似条件逻辑回归的包。
首先,一个带有safeBinaryRegression
包的简单示例。这个包只是重新定义了glm
函数,通过分离测试重载它,使用线性编程方法。如果它检测到分离,它会以错误条件退出,声明 mle 不存在。否则它只是glm
从stats
. 该示例来自其帮助页面:
library(safeBinaryRegression) # Some testing of that
# package,
# based on its examples
# complete separation:
x <- c(-2, -1, 1, 2)
y <- c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x, family=binomial, separation="test")
stats::glm(y ~ x, family=binomial)
# Quasicomplete separation:
x <- c(-2, 0, 0, 2)
y <- c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x, family=binomial, separation="test")
stats::glm(y ~ x, family=binomial)
运行它的输出:
> # complete separation:
> x <- c(-2, -1, 1, 2)
> y <- c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) :
The following terms are causing separation among the sample points: (Intercept), x
> glm(y ~ x, family=binomial, separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") :
Separation exists among the sample points.
This model cannot be fit by maximum likelihood.
> stats::glm(y ~ x, family=binomial)
Call: stats::glm(formula = y ~ x, family = binomial)
Coefficients:
(Intercept) x
-9.031e-08 2.314e+01
Degrees of Freedom: 3 Total (i.e. Null); 2 Residual
Null Deviance: 5.545
Residual Deviance: 3.567e-10 AIC: 4
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred
> # Quasicomplete separation:
> x <- c(-2, 0, 0, 2)
> y <- c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) :
The following terms are causing separation among the sample points: x
> glm(y ~ x, family=binomial, separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") :
Separation exists among the sample points.
This model cannot be fit by maximum likelihood.
> stats::glm(y ~ x, family=binomial)
Call: stats::glm(formula = y ~ x, family = binomial)
Coefficients:
(Intercept) x
5.009e-17 9.783e+00
Degrees of Freedom: 3 Total (i.e. Null); 2 Residual
Null Deviance: 5.545
Residual Deviance: 2.773 AIC: 6.773
现在我们从一个可以用逻辑模型非常近似的模型进行模拟,除了在某个截止值以上,事件概率正好是 1.0。考虑一个生物测定问题,但在临界值之上,毒药总是会杀死:
pl <- function(a, b, x) 1/(1+exp(-a-b*x))
a <- 0
b <- 1.5
x_cutoff <- uniroot(function(x) pl(0,1.5,x) -
0.98,lower=1,upper=3.5)$root
### circa 2.6
pltrue <- function(a, b, x) ifelse(x < x_cutoff, pl(a, b,
x), 1.0)
x <- -3:3
### Let us simulate many times from this model, and try to
# estimate it
### with safeBinaryRegression::glm That way we can estimate
#the probability
### of separation from this model
set.seed(31415926) ### May I have a large container of
# coffee
replications <- 1000
p <- pltrue(a, b, x)
err <- 0
good <- 0
for (i in 1:replications) {
y <- rbinom(length(x), 1, p)
res <- try(glm(y~x, family=binomial), silent=TRUE)
if (inherits(res,"try-error")) err <- err+1 else
good <- good+1
}
P_separation <- err/replications
P_separation
运行此代码时,我们估计分离概率为 0.759。自己运行代码,速度很快!
然后我们扩展此代码以尝试来自 elrm 的不同估计程序、mle 和近似条件逻辑回归。在我的电脑上运行这个模拟大约需要 40 分钟。
library(elrm) # from CRAN
set.seed(31415926) ### May I have a large container of
# coffee
replications <- 1000
GOOD <- numeric(length=replications) ### will be set to one
# when MLE exists!
COEFS <- matrix(as.numeric(NA), replications, 2)
COEFS.elrm <- matrix(as.numeric(NA), replications, 2) # But
# we'll only use second col for x
p <- pltrue(a, b, x)
err <- 0
good <- 0
for (i in 1:replications) {
y <- rbinom(length(x), 1, p)
res <- try(glm(y~x, family=binomial), silent=TRUE)
if (inherits(res,"try-error")) err <- err+1 else{
good <- good+1
GOOD[i] <- 1 }
# Using stats::glm
mod <- stats::glm(y~x, family=binomial)
COEFS[i, ] <- coef(mod)
# Using elrm:
DATASET <- data.frame(x=x, y=y, n=1)
mod.elrm <- elrm(y/n ~ x, interest= ~ x -1, r=4,
iter=10000, burnIn=1000,
dataset=DATASET)
COEFS.elrm[i, 2 ] <- mod.erlm$coeffs
}
### Now we can compare coefficient estimates of x,
### when there are separation, and when not:
non <- which(GOOD==1)
cof.mle.non <- COEFS[non, 2, drop=TRUE]
cof.mle.sep <- COEFS[-non, 2, drop=TRUE]
cof.elrm.non <- COEFS.elrm[non, 2, drop=TRUE]
cof.elrm.sep <- COEFS.elrm[-non, 2, drop=TRUE]
现在我们要绘制结果,但在此之前,请注意所有条件估计都是相等的!这真的很奇怪,应该需要解释......常见的值是0.9523975。但至少我们获得了有限的估计,其置信区间包含真实值(此处未显示)。所以我只会在没有分离的情况下显示 mle 估计的直方图:
hist(cof.mle.non, prob=TRUE)
[
值得注意的是,所有估计值都小于真实值 1.5。这可能与我们从修改后的模型中模拟的事实有关,需要调查。
@sean501 和 @kjetilbhalvorsen 提供了很好的答案。你问了一个例子。考虑下图。您可能会遇到一些情况,其中数据生成过程类似于面板A中描述的过程。如果是这样,您实际收集的数据很可能看起来像面板B中的数据。现在,当您使用数据构建统计模型时,想法是恢复真实的数据生成过程,或者至少提出一个相当接近的近似值。因此,问题是,将逻辑回归拟合到B中的数据会产生一个近似于A中的蓝线的模型吗?如果你看面板C,您可以看到灰线比真实函数更接近数据,因此在寻求最佳拟合时,逻辑回归将“更喜欢”返回灰线而不是蓝色线。然而,它并不止于此。看面板D,黑线比灰色线更接近数据——事实上,它是可能出现的最佳拟合。这就是逻辑回归模型所追求的路线。它对应于负无穷大的截距和无穷大的斜率。当然,这与您希望恢复的事实相去甚远。完全分离也可能导致计算逻辑回归输出标准变量的 p 值出现问题(那里的解释略有不同且更复杂)。此外,尝试将此处的拟合与其他尝试(例如与元分析)结合起来,只会降低其他发现的准确性。
这意味着存在一个超平面,使得一侧有所有正点,另一侧有所有负点。然后,最大似然解在一侧是平坦的 1,在另一侧是平坦的 0,这是通过使系数处于无穷大的逻辑函数“实现”的。
你所说的“分离”(不是“分离”)涵盖了两种不同的情况,它们最终导致了同样的问题——然而,我不会像你那样称之为“不稳定”的问题。
插图:泰坦尼克号上的生存
让是一个二元因变量,并且一个分离的自变量。
让我们假设是泰坦尼克号上乘客的等级,那表明他们是否在残骸中幸存下来,表示死亡和表示生存。
完全分离是这样的情况预测所有值.
如果泰坦尼克号上的所有头等舱乘客都从残骸中幸存,而没有一个二等舱乘客幸存,情况就会如此。
准完全分离是这样的情况预测所有情况,或所有情况,但不是两者兼而有之。
如果泰坦尼克号上的一些头等舱乘客在残骸中幸存下来,而二等舱乘客都没有幸存,情况就会如此。在这种情况下,乘客舱预测所有情况,但并非所有情况下.
反过来,如果泰坦尼克号上只有一些二等舱乘客在残骸中丧生,那么乘客舱预测所有情况,但并非所有情况下,其中包括头等舱和二等舱乘客。
您所说的“分离良好的类”是二进制结果变量的情况(例如泰坦尼克号上的生存)可以完全或准完全映射到预测器(例如乘客舱会员;不必像我的示例中那样是二进制的)。
为什么在这些情况下逻辑回归“不稳定”?
这在Rainey 2016和Zorn 2005中得到了很好的解释。
在完全分离的情况下,您的逻辑模型将寻找一条逻辑曲线,该曲线分配例如,所有概率到什么时候, 和所有概率到什么时候.
这对应于上述情况,即只有泰坦尼克号的所有头等舱乘客幸存,表示头等舱乘客的会员资格。
这是有问题的,因为逻辑曲线严格位于和,这意味着,为了对观察到的数据进行建模,最大化将把它的一些项推向无穷大,以便,如果你愿意,使“无限”地预测.
在准完全分离下也会出现同样的问题,因为逻辑曲线仍然需要仅分配任一值或者到在两种情况之一,或者.
在这两种情况下,您的模型的似然函数都无法找到最大似然估计:它只能通过渐近逼近来找到该值的近似值。
您所说的“不稳定性”是这样一个事实,即在完全或准完全分离的情况下,逻辑模型达到的可能性并不有限。但是,我不会使用该术语:事实上,似然函数在将系数值分配给无穷大时非常“稳定”(单调)。
注意:我的例子是虚构的。泰坦尼克号上的生存并不仅仅归结为乘客舱的会员资格。见霍尔(1986 年)。