如何处理逻辑回归中的完美分离?

机器算法验证 r 回归 物流 分离
2022-02-05 11:42:49

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

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

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

您在实践中如何处理这个问题?

4个回答

你有几个选择:

  1. 消除一些偏见。

    (a) 根据@Nick 的建议对可能性进行惩罚。R 中的logistfFIRTHSAS 中的选项PROC LOGISTIC实施 Firth (1993),“最大似然估计的偏差减少”,Biometrika80,1中提出的方法。从最大似然估计中消除一阶偏差。这里@Gavin推荐了brglm这个我不熟悉的包,但我认为它为非规范链接函数实现了类似的方法,例如probit。)

    (b) 通过在精确条件逻辑回归中使用中值无偏估计。在 R 中打包elrmlogistiXEXACT ,或者在 SAS 的PROC LOGISTIC.

  2. 排除出现导致分离的预测变量类别或值的情况这些很可能超出了您的范围;或值得进一步的重点调查。(R 包safeBinaryRegression可以方便地找到它们。)

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

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

    (b) 通过折叠预测器类别/合并预测器值。只有当这有意义时。

    (c) 将预测变量重新表达为两个(或更多)交叉因子,没有相互作用。只有当这有意义时。

  4. 根据@Manoel 的建议使用贝叶斯分析。尽管您似乎不太可能仅仅因为分离而想要这样做,但值得考虑其其他优点。他推荐的论文是Gelman 等人(2008 年),“逻辑和其他回归模型的信息量不足的默认先验分布”,安。应用程序。统计。, 2 , 4:所讨论的默认值是每个系数的独立 Cauchy 先验,均值为零,比例为在将所有连续预测变量标准化为均值为零和标准差为后使用。如果你能阐明信息丰富的先验,那就更好了。5212

  5. 没做什么。(但要根据轮廓似然性计算置信区间,因为 Wald 对标准误差的估计会大错特错。)一个经常被忽视的选项。如果该模型的目的只是描述您对预测变量和响应之间关系的了解,那么引用 2.3 以上的优势比的置信区间并不可耻。(实际上,基于排除数据最能支持的优势比的无偏估计引用置信区间似乎有些可疑。)当您尝试使用点估计进行预测时,问题就来了,而发生分离的预测器会淹没其他预测器。

  6. 使用隐藏的逻辑回归模型,如 Rousseeuw & Christmann (2003)“逻辑回归中对分离和异常值的鲁棒性”,计算统计和数据分析43、3中所述,并在 R 包hlr中实现。(@user603建议这样做。)我没有读过这篇论文,但他们在摘要中说“提出了一个稍微更通用的模型,在该模型下,观察到的响应与不可观察的真实响应密切相关,但不等于不可观察的真实响应”,这表明除非听起来合理,否则使用该方法可能不是一个好主意。

  7. “在表现出完全分离的变量中,将一些随机选择的观察值从 1 更改为 0 或从 0 更改为 1”:@RobertF 的评论这个建议似乎源于将分离本身视为一个问题,而不是数据中信息匮乏的症状,这可能导致您更喜欢其他方法而不是最大似然估计,或者将推论限制在您可以做出的那些合理的精度——这些方法有其自身的优点,而不仅仅是分离的“修复”。(除了毫不掩饰的特设性之外,对于大多数人来说,分析师对相同的数据提出相同的问题,做出相同的假设,由于抛硬币或其他的结果而给出不同的答案,这让大多数人感到不快。)

解决这个问题的方法是利用一种惩罚回归的形式。事实上,这就是开发一些惩罚回归形式的最初原因(尽管结果证明它们具有其他有趣的特性。

在 R 中安装并加载 glmnet 包,您就可以开始使用了。glmnet 对用户不太友好的方面之一是您只能为其提供矩阵,而不是我们习惯的公式。但是,您可以查看 model.matrix 等以从 data.frame 和公式构造此矩阵...

现在,当您期望这种完美的分离不仅是您的样本的副产品,而且可能在总体中是正确的,您特别不想处理这个问题:仅使用此分离变量作为结果的唯一预测变量,而不是使用任何类型的模型。

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

我相信解决您的问题的最简单和最直接的方法是使用 Gelman 等人 (2008) 提出的具有非信息性先验假设的贝叶斯分析。正如 Scortchi 提到的,Gelman 建议在每个系数上放置 Cauchy 先验,中位数为 0.0,尺度为 2.5(标准化为均值 0.0,SD 为 0.5)。这将正则化系数并将它们稍微拉向零。在这种情况下,这正是您想要的。由于具有非常宽的尾巴,柯西仍然允许大系数(与短尾法线相反),来自 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),“逻辑和其他回归模型的信息量较弱的默认先验分布”,Ann。应用程序。统计, 2, 4 http://projecteuclid.org/euclid.aoas/1231424214

Paul Allison 的论文以最大可能性对“准完全分离”问题进行了最彻底的解释之一。他正在撰写有关 SAS 软件的文章,但他所解决的问题适用于任何软件:

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

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

Allison 讨论了许多已经提到的解决方案,包括删除问题变量、折叠类别、什么都不做、利用精确逻辑回归、贝叶斯估计和惩罚最大似然估计。

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