Logistic回归中如何处理完美分离?


163

如果您的变量将目标变量中的零和一完美地分开,R将产生以下“完美或准完美分离”警告消息:

Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 

我们仍然可以得到模型,但是系数估计被夸大了。

您在实践中如何处理?



1
相关的正规化问题和演示在这里
杜海涛

Answers:


100

解决此问题的方法是利用惩罚回归的形式。实际上,这是一些惩罚性回归形式得以发展的最初原因(尽管事实证明它们还具有其他有趣的特性。

在R中安装并加载软件包glmnet,您就可以开始使用了。glmnet的用户友好性较差的方面之一是,您只能将其作为矩阵提供,而不能像我们过去那样使用公式。但是,您可以查看model.matrix等从data.frame和公式构造此矩阵...

现在,当你想到,这完美的分离不仅是你的样品的副产品,但可能是在人口如此,你特别希望处理这个问题:使用这个变量分离只是作为您的结果的唯一预测,不使用任何模型。


20
您还可以通过插入符号包为glmnet使用公式接口。
Zach

“现在,当您期望...”关于此的问题。我有一个病例/对照研究,研究与微生物组的关系。我们也有一种治疗方法,几乎​​只在病例之间发现。但是,我们认为这种治疗方法也可能会影响微生物组。这是您需要注意的一个例子吗?假设,如果我们尝试过,我们可能会发现更多的病例不使用该治疗方法,但我们拥有的就是这种情况。
balter

142

您有几种选择:

  1. 消除一些偏见。

    (a)根据@Nick的建议惩罚可能性。包logistf在R或FIRTH在SAS的选择PROC LOGISTIC实施弗斯(1993)提出的方法中,“偏置减少的最大似然估计”,Biometrika80,1 .; 从最大似然估计中去除一阶偏差。(在这里, @ Gavin推荐了brglm我不熟悉的程序包,但是我收集到它为非规范的链接功能(例如,probit)实现了类似的方法。)

    (b)在精确的条件逻辑回归中使用中位数无偏估计。将elrmlogistiX封装在R中,或将EXACTSAS中的语句打包PROC LOGISTIC

  2. 排除的情况下,其中的预测类别或值导致发生分离。这些可能超出您的范围;或值得进一步的重点调查。(R包safeBinaryRegression很容易找到它们。)

  3. 重新铸造模型。通常,如果您考虑过,这是您事先要做的事情,因为这对于样本量来说太复杂了。

    (a)从模型中删除预测变量。Dicey,出于给出的原因由于@Simon:“您正在删除最能解释响应的预测变量”。

    (b)通过折叠预测变量类别/对预测变量值进行合并。只有在这有意义的情况下。

    (c)将预测因子重新表达为两个(或多个)交叉因子,而没有相互作用。只有在这有意义的情况下。

  4. 根据@Manoel的建议使用贝叶斯分析。尽管您似乎不希望仅仅因为分离,但值得考虑它的其他优点。他建议的论文是Gelman等人(2008),“逻辑和其他回归模型的弱信息性默认先验分布”,Ann。应用 统计 2,4:有问题的默认是一个独立的柯西事先为每个系数,具有零均值和的比例 ; 在将所有连续预测变量标准化为均值为零且标准差为。如果您可以阐明内容丰富的先验知识,那就更好了。 15212

  5. 没做什么。(但是,由于Wald估计的标准误差会严重错误,因此请根据轮廓可能性计算置信区间。)一个经常被忽视的选择。如果该模型的目的仅仅是描述您对预测变量与响应之间的关系所学的知识,那么引述置信区间为例如2.3或更高的置信区间就不会感到羞耻。(实际上,根据不带偏见的估计值(不包括数据最好支持的比值比率)引用置信区间似乎很可疑。)当您尝试使用点估计值进行预测时,问题就来了,而发生分离的预测值淹没了其他预测值。

  6. 使用隐藏逻辑回归模型,如在Rousseeuw&Christmann(2003)所描述的,“针对逻辑回归分离和离群鲁棒性”,计算统计与数据分析43,3,和在R封装中实现HLR。(@ user603 暗示了这一点。)我还没有阅读该论文,但他们在摘要中说:“提出了一个稍微更一般的模型,在该模型下,观察到的响应与强烈相关,但不等于无法观察到的真实响应”,这表明对我来说,除非听起来合理,否则使用该方法可能不是一个好主意。

  7. “将表现出完全分离的变量中的一些随机选择的观察值从1更改为0或从0更改为1”:@RobertF的注释。该建议似乎来自于将分离本身视为问题而不是数据中缺乏信息的征兆,这可能会导致您偏向于使用其他方法而不是最大似然估计,或者将推论限制在您可以使用的方法上合理的精度-各种方法各有优点,而不仅仅是分离的“解决方案”。(除了毫无疑问地是临时性的之外,对于大多数人来说,由于投掷硬币或类似的结果,分析师对相同数据的相同问题,做出相同的假设应该给出不同的答案,这对大多数人来说是不愉快的。)


1
@Scortchi还有另一个(异端)选项。将显示完全分离的变量中的一些随机选择的观测值从1更改为0或从0更改为1怎么办?
RobertF 2015年

@RobertF:谢谢!我没有想到这一点-如果您对它的性能有任何参考,我将不胜感激。您是否遇到过在实践中使用它的人?
Scortchi

@Scortchi-不,有研究人员添加人工数据以消除完全分离的参考,但是我还没有找到有关选择性修改数据的文章。我不知道这种方法会有多有效。
RobertF

1
@tatami:并非所有(很多?)程序都会对分离本身发出警告,当分离基于多个变量的线性组合时,可能很难发现,但是会收敛失败和/或拟合值接近零或一个-我会经常检查这些。
Scortchi

2
@Scortchi:您的答案非常好。我个人赞成贝叶斯方法,但是值得一提的是,从projecteuclid.org/euclid.ejs/1239716414的频繁主义者的角度对一般现象进行了详尽的分析。作者提供了一些单方面的置信区间,即使在逻辑回归中完全分离的情况下也可以使用。
Cyan

55

这是Scortchi和Manoel的答案的扩展,但是由于您似乎使用RI认为我会提供一些代码。:)

我认为,解决您问题的最简单,最直接的方法是使用贝叶斯分析,并结合Gelman等人(2008)提出的非信息性先验假设。正如Scortchi提到的那样,Gelman建议在每个系数上将柯西置于中间值0.0和标度2.5(标准化为均值0.0和SD为0.5)。这将对系数进行正则化,并将其稍微拉向零。在这种情况下,这正是您想要的。由于尾巴非常宽,柯西(Cauchy)仍然允许较大的系数(与短尾法线相反),来自于盖尔曼(Gelman):

在此处输入图片说明

如何进行分析?使用实现此分析的arm包中的bayesglm功能!

library(arm)

set.seed(123456)
# Faking some data where x1 is unrelated to y
# while x2 perfectly separates y.
d <- data.frame(y  =  c(0,0,0,0, 0, 1,1,1,1,1),
                x1 = rnorm(10),
                x2 = sort(rnorm(10)))

fit <- glm(y ~ x1 + x2, data=d, family="binomial")

## Warning message:
## glm.fit: fitted probabilities numerically 0 or 1 occurred 

summary(fit)
## Call:
## glm(formula = y ~ x1 + x2, family = "binomial", data = d)
##
## Deviance Residuals: 
##       Min          1Q      Median          3Q         Max  
## -1.114e-05  -2.110e-08   0.000e+00   2.110e-08   1.325e-05  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)
## (Intercept)    -18.528  75938.934       0        1
## x1              -4.837  76469.100       0        1
## x2              81.689 165617.221       0        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.3863e+01  on 9  degrees of freedom
## Residual deviance: 3.3646e-10  on 7  degrees of freedom
## AIC: 6
## 
## Number of Fisher Scoring iterations: 25

效果不好...现在是贝叶斯版本:

fit <- bayesglm(y ~ x1 + x2, data=d, family="binomial")
display(fit)
## bayesglm(formula = y ~ x1 + x2, family = "binomial", data = d)
##             coef.est coef.se
## (Intercept) -1.10     1.37  
## x1          -0.05     0.79  
## x2           3.75     1.85  
## ---
## n = 10, k = 3
## residual deviance = 2.2, null deviance = 3.3 (difference = 1.1)

超级简单,不是吗?

参考文献

盖尔曼(Gelman)等人(2008),“逻辑和其他回归模型的弱信息性默认先验分布”,安。应用 Stat。,2,4 http://projecteuclid.org/euclid.aoas/1231424214


6
不,简单了。你能解释一下你刚刚做了什么吗?bayesglm使用的先验是什么?如果ML估计等同于具有平坦先验的贝叶斯估计,那么非信息先验在这里有什么帮助?
StasK

5
添加了更多信息!先验是模糊的,但并非平坦。它会产生一定的影响,因为它可以使估算值正规化并将其略微拉至0.0,这是我认为在这种情况下想要的。
RasmusBååth2014年

> m = bayesglm(match〜。,family = binomial(link ='logit'),data = df)警告消息:出现数字为0或1的拟合概率 不好!
克里斯

首先,尝试通过prior.df将默认值增加1.0和/或减少prior.scale默认值来稍微强一些的正则化2.5,或者开始尝试:m=bayesglm(match ~. , family = binomial(link = 'logit'), data = df, prior.df=5)
RasmusBååth16年

1
当我们增加模型中的priority.df时,我们到底在做什么。我们想走多高有极限吗?我的理解是,它会约束模型以允许以准确的误差估计进行收敛吗?
hamilthj

7

Paul Allison的论文对“准完全分离”问题的最彻底的解释之一。他正在撰写有关SAS软件的文章,但是他解决的问题可以推广到任何软件:

  • 只要x的线性函数可以生成y的完美预测,就会发生完全分离

  • 当(a)存在一些系数矢量发生准完全分离b使得BXI≥0YI = 1,和BXI≤0 * **每当义= 0和这个平等的每个类别适用于至少一种情况下因变量。换句话说,在最简单的情况下,对于逻辑回归中的任何二分式自变量,如果在该变量和因变量形成的2×2表中为零,则不存在回归系数的ML估计。

艾莉森讨论了已经提到的许多解决方案,包括删除问题变量,折叠类别,不采取任何措施,利用精确的逻辑回归,贝叶斯估计和惩罚最大似然估计。

http://www2.sas.com/proceedings/forum2008/360-2008.pdf


3

warning

随着数据的产生

x <- seq(-3, 3, by=0.1)
y <- x > 0
summary(glm(y ~ x, family=binomial))

发出警告:

Warning messages:
1: glm.fit: algorithm did not converge 
2: glm.fit: fitted probabilities numerically 0 or 1 occurred 

这非常明显地反映了这些数据中内置的依赖性。

R中的Wald检验被发现与summary.glm或与waldtestlmtest包。似然比测试在包装中anova或包装中进行。在这两种情况下,信息矩阵都是无穷大的,并且没有推断可用。相反,R 确实会产生输出,但是您不能信任它。在这些情况下,R通常产生的推论的p值非常接近1。这是因为“或”中的精度损失要比方差-协方差矩阵中的精度损失小几个数量级。lrtestlmtest

这里概述了一些解决方案:

使用单步估算器

有很多理论支持一步估计器的低偏差,效率和通用性。在R中指定一个单步估计器很容易,并且结果通常对于预测和推断非常有利。这个模型永远不会发散,因为迭代器(Newton-Raphson)根本没有机会发散!

fit.1s <- glm(y ~ x, family=binomial, control=glm.control(maxit=1))
summary(fit.1s)

给出:

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.03987    0.29569  -0.135    0.893    
x            1.19604    0.16794   7.122 1.07e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

因此,您可以看到预测反映了趋势的方向。这种推论高度暗示了我们认为是正确的趋势。

在此处输入图片说明

进行分数测试

得分(或饶)统计量从似然比的不同和沃尔德的统计信息。它不需要评估替代假设下的方差。我们将模型拟合为null:

mm <- model.matrix( ~ x)
fit0 <- glm(y ~ 1, family=binomial)
pred0 <- predict(fit0, type='response')
inf.null <- t(mm) %*% diag(binomial()$variance(mu=pred0)) %*% mm
sc.null <- t(mm) %*% c(y - pred0)
score.stat <- t(sc.null) %*% solve(inf.null) %*% sc.null ## compare to chisq
pchisq(score.stat, 1, lower.tail=F)

χ2

> pchisq(scstat, df=1, lower.tail=F)
             [,1]
[1,] 1.343494e-11

在这两种情况下,您都可以推断出无穷大的OR。

,并对置信区间使用中位数的无偏估计。

通过使用中值无偏估计,您可以为无穷比产生一个中值无偏,非奇异95%CI。epitoolsR中的程序包可以做到这一点。我在这里给出一个实现此估计量的示例:贝努利抽样的置信区间


2
这很好,但我当然有一些疑问:(1)似然比检验不使用信息矩阵;它只是Wald测试,在存在分离的情况下灾难性地失败。(2)我一点都不熟悉单步估计器,但是这里的斜率估计值似乎很低。(3)置信区间不是中值无偏的。您在该部分链接到的是中间置信区间。(4)您可以通过反转LR或得分测试来获得置信区间。...
Scortchi

...(5)您可以在R中通过向函数提供参数test="Rao"来执行得分测试anova。(好吧,最后两个是音符,而不是
经文

@scortchi要知道方差分析具有默认分数测试!也许手动实施很有用。CI并非中位数无偏,但中位数无偏估计量的CI为边界参数提供了一致的推论。中间p就是这样一个估计量。可以将p转换为比值比b / c,它对于一对一转换是不变的。LR测试的边界参数是否一致?
AdamO '18年

尽管得分和LR检验在有限样本中是近似的,但只有原假设不能在Wilks定理适用的边界上包含参数。
Scortchi

2

请仔细阅读R发出的警告消息。看看安德鲁·盖尔曼(Andrew Gelman)的这篇博客文章,您会发现它并不总是完美分离的问题,而是有时会出现的错误glm。似乎如果起始值与最大似然估计值相差太远,则会爆炸。因此,请先使用Stata等其他软件进行检查。

如果确实存在此问题,则可以尝试使用具有先验知识的贝叶斯建模。

但是实际上,我只是摆脱了造成麻烦的预测因素,因为我不知道该如何选择信息丰富的先验。但是我想,当您遇到完美分离问题时,Gelman会发表一篇有关使用先验信息的论文。只是谷歌它。也许您应该尝试一下。


8
删除预测变量的问题在于,您正在删除最能解释响应的预测变量,这通常是您要达到的目的!我认为这仅在您过度拟合模型时才有意义,例如,通过拟合太多复杂的交互。
西蒙·伯恩

4
这不是错误,而是初始估计值与MLE相距太远的问题,如果您不尝试自己选择它们,则不会发生。
Scortchi

我理解这一点,但我确实认为这是算法中的错误。
Manoel Galdino 2013年

5
好吧,我不想质疑“ bug”的定义。但是,该行为在基本R中既不可思议也不可修复-您无需“与其他软件一起检查”。如果您想自动处理许多不收敛的问题,该glm2程序包将进行检查,以确保在每个计分步骤中可能性实际上都在增加,如果没有,则将步长减半。
Scortchi

3
(在CRAN上)有一个R包safeBinaryRegression ,用于诊断和解决此类问题,并使用优化方法进行修正以确保是否存在分离或准分离。试试吧!
kjetil b halvorsen

2

我不确定我是否同意你的问题。

我认为,对于您在数据中观察到的某些X级别,警告消息意味着拟合的概率在数值上为0或1。换句话说,在分辨率上,它显示为0或1。

您可以运行predict(yourmodel,yourdata,type='response'),您会在其中找到0或/和1作为预测的概率。

结果,我认为只使用结果就可以了。


-1

我知道这是一篇过时的文章,但是由于我一直在努力工作,因此我仍将继续对其进行回答,它可以为他人提供帮助。

当您选择的适合模型的变量可以非常准确地区分0和1或是和否时,就会发生完全分离。我们整个数据科学方法都基于概率估计,但是在这种情况下却失败了。

整改步骤:

  1. 如果变量之间的差异较小,请使用bayesglm()而不是glm()

  2. 有时将(maxit =“某些数值”)与bayesglm()一起使用会有所帮助

3,第三次也是最重要的检查您选择的变量以进行模型拟合,必须有一个变量,其与Y(outout)变量的多重共线性很高,请从模型中删除该变量。

就我而言,我有一个电信客户流失数据来预测验证数据的流失。我的训练数据中有一个变量,可以非常区分是和否。删除后,我可以获得正确的模型。此外,您可以使用逐步(拟合)来使模型更准确。


2
我认为这个答案不会增加讨论的余地。贝叶斯方法已在先前的答案中彻底涵盖,也已经提到(不鼓励使用)“有问题的”预测变量。据我所知,逐步选择变量很少是一个好主意。
einar
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.