当班级分开时,为什么逻辑回归变得不稳定?


Answers:


31

当存在分离时,逻辑回归本身会变得不稳定是不正确的。分离意味着某些变量是非常好的预测变量,这很好,或者,分离可能是观测值太少/变量太多的产物。如果是这样,解决方案可能是获取更多数据。但是,分离本身只是一种症状,而本身并不是问题。

因此,确实有不同的情况需要处理。首先,分析的目的是什么?如果分析的最终结果是对案例进行某种分类,那么分离根本就没有问题,这实际上意味着有非常好的变量可以提供很好的分类。但是,如果目标是风险估计,则需要参数估计,并且通过分离,通常不存在mle(最大似然)估计。因此,也许必须更改估算方法。文献中有几个建议,我将再次讨论。

然后有(如上所述)两种不同的分离原因。总体中可能存在分离,或者分离可能是由于观察到的病例很少/变量太多而引起的。

随着分离而破裂的是最大似然估计程序。mle参数估计(或至少其中一些)变为无限。我在此答案的第一个版本中说过,可以很容易地解决问题,也许可以通过引导程序解决,但是那是行不通的,因为至少在通常情况下的引导程序中,每个引导程序重采样中都会有分隔。但是逻辑回归仍然是有效的模型,但是我们还需要其他估计程序。一些建议是:

  1. 正则化(例如ridge或套索)可能与引导程序结合使用。
  2. 精确条件逻辑回归
  3. 排列测试,请参阅https://www.ncbi.nlm.nih.gov/pubmed/15515134
  4. 降低生育率偏差的估算程序,请参阅Logistic回归模型不收敛
  5. 当然其他...

如果使用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的最小均方误差和近似条件逻辑回归。在我的计算机上运行此模拟大约需要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。但是至少我们获得了有限的估计,其置信区间包含真实值(此处未显示)。因此,在没有分离的情况下,我只会显示最大似然估计的直方图:

hist(cof.mle.non, prob=TRUE)

[模拟参数估计值的直方图[1]

值得注意的是,所有估算值均小于真实值1.5。这可能与我们需要从修改后的模型中模拟出来的事实有关。



1
(+1)但是可以肯定地说,除了最大似然之外,我们还需要一个估计程序。无限的奇数比可以是明智的点估计;通常,由分离引起的问题只是获得良好的间隔估计。
Scortchi-恢复莫妮卡

@kjetilbhalvorsen道歉以恢复旧线程,但是我想知道您是否知道python中有类似的软件包?
深夜

抱歉,但是我不了解python。但是应该可以从python内部运行R。
kjetil b halvorsen

25

@ sean501和@kjetilbhalvorsen在这里有很好的答案。您要求一个例子。考虑下图。您可能会遇到某种情况,在这种情况下,数据生成过程类似于面板A所示。如果是这样,您实际收集的数据很有可能看起来像面板B中的数据。现在,当您使用数据构建统计模型时,其想法是恢复真正的数据生成过程,或者至少提出一个合理接近的近似值。因此,问题是,将逻辑回归拟合到B中的数据是否会产生一个近似于A中蓝线的模型?如果您看面板C,您会发现灰线比true函数更好地近似了数据,因此,在寻求最佳拟合时,逻辑回归将“偏爱”返回灰线而不是蓝线。但是,它并不止于此。看面板D,黑色线比灰色线更好地近似了数据-实际上,这是可能发生的最佳拟合。这就是逻辑回归模型追求的路线。它对应于负无穷大和无穷大斜率的截距。当然,这与您希望恢复的事实相去甚远。完全分离还会导致计算变量的p值时出现问题,这些变量是逻辑回归输出的标准配置(此处的解释略有不同,但更为复杂)。此外,尝试将此处的拟合度与其他尝试(例如通过荟萃分析)相结合,只会使其他发现的准确性降低。

在此处输入图片说明


1
(+1)这是问题的非常有用的例证。
mkt-恢复莫妮卡

图表显示的一个有趣的方面是,理想情况下,您希望样本来自导致50-50概率(例如,点在12 <x <15范围内)的“ x空间”。实际上,我认为您可能希望在提供此结果的现实生活场景中从该中间区域(10 <x <17)收集更多数据。
概率论

@probabilityislogic,是的。有关关系的大多数信息都位于中间区域的数据中。
gung-恢复莫妮卡

10

这意味着存在一个超平面,使得一侧上所有正点都在一侧,而另一侧上所有负点。然后,最大似然解的一侧为平面1,另一侧为平面0,这通过对数函数通过使系数为无穷大来“实现”。


6

您所说的“分离”(而不是“分离”)涉及两种不同的情况,这些情况最终会导致相同的问题–但是,我不会像您一样将其称为“不稳定”问题。

插图:在泰坦尼克号上生存

  • 令为二进制因变量,而为独立的独立变量。DV(0,1)SV

    让我们假设是《泰坦尼克号》上的乘客类别,并且表示他们是否在残骸中幸存下来,其中表示死亡,表示生存。SVDV01

  • 完全分离是预测所有值的情况。SVDV

    如果在泰坦尼克号上的所有头等舱乘客都幸免于难,而所有二等舱乘客都没有幸免。

  • 准完全分离是那里的情况预测任一的所有情况下,所有的情况下,其中,但不能同时使用。SVDV=0DV=1

    如果泰坦尼克号上的一些头等舱乘客幸免于难,而二等舱乘客都没有幸免。在那种情况下,乘客舱预测所有情况,而不是所有情况。SVDV=1DV=0

    相反,如果仅泰坦尼克号上的一些二等舱乘客在飞机残骸中丧生,则乘客舱预测所有情况,但不能预测所有情况,其中包括头等舱和二等舱乘客。SVDV=0DV=1

您所说的“分类良好的舱位”是指二进制结果变量(例如,泰坦尼克号上的生存)可以完全或准完全映射到预测变量(例如,旅客舱位成员;不需要像在我的示例中)。DVSVSV

为什么在这些情况下逻辑回归“不稳定”?

这在Rainey 2016Zorn 2005中得到了很好的解释。

  • 完全分离,你的逻辑模型是要寻找一个逻辑曲线指派,例如,所有的概率到时,所有的概率到时。DV1SV=1DV0SV=0

    这对应于上述情况,其中只有泰坦尼克号的所有头等舱乘客都可以幸存,其中表示头等舱乘客身份。SV=1

    这是有问题的,因为逻辑曲线严格位于到之间,这意味着,为了对观察到的数据建模,最大化将把其某些项推向无穷大,以便使 “无限地”变大。预测。01SVDV

  • 准完全分离下会出现相同的问题,因为在两种情况之一或,逻辑曲线仍将只需要为分配或值。1 D V S V = 0 S V = 101DVSV=0SV=1

在这两种情况下,模型的似然函数将无法找到最大似然估计:它将仅通过渐近逼近该值来找到该值的近似值。

您所说的“不稳定性”是这样的事实,即在完全分离或准完全分离的情况下,逻辑模型不可能达到有限的可能性。但是,我不会使用该术语:似然函数实际上在系数值向无穷大的分配中相当“稳定”(单调)。


注意:我的例子是虚构的。泰坦尼克号上的生存不仅仅是归结为乘客等级的成员。参见Hall(1986)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.