Answers:
解决此问题的方法是利用惩罚回归的形式。实际上,这是一些惩罚性回归形式得以发展的最初原因(尽管事实证明它们还具有其他有趣的特性。
在R中安装并加载软件包glmnet,您就可以开始使用了。glmnet的用户友好性较差的方面之一是,您只能将其作为矩阵提供,而不能像我们过去那样使用公式。但是,您可以查看model.matrix等从data.frame和公式构造此矩阵...
现在,当你想到,这完美的分离不仅是你的样品的副产品,但可能是在人口如此,你特别不希望处理这个问题:使用这个变量分离只是作为您的结果的唯一预测,不使用任何模型。
您有几种选择:
消除一些偏见。
(a)根据@Nick的建议惩罚可能性。包logistf在R或FIRTH
在SAS的选择PROC LOGISTIC
实施弗斯(1993)提出的方法中,“偏置减少的最大似然估计”,Biometrika,80,1 .; 从最大似然估计中去除一阶偏差。(在这里, @ Gavin推荐了brglm
我不熟悉的程序包,但是我收集到它为非规范的链接功能(例如,probit)实现了类似的方法。)
(b)在精确的条件逻辑回归中使用中位数无偏估计。将elrm或logistiX封装在R中,或将EXACT
SAS中的语句打包PROC LOGISTIC
。
排除的情况下,其中的预测类别或值导致发生分离。这些可能超出您的范围;或值得进一步的重点调查。(R包safeBinaryRegression很容易找到它们。)
重新铸造模型。通常,如果您考虑过,这是您事先要做的事情,因为这对于样本量来说太复杂了。
(a)从模型中删除预测变量。Dicey,出于给出的原因由于@Simon:“您正在删除最能解释响应的预测变量”。
(b)通过折叠预测变量类别/对预测变量值进行合并。只有在这有意义的情况下。
(c)将预测因子重新表达为两个(或多个)交叉因子,而没有相互作用。只有在这有意义的情况下。
根据@Manoel的建议使用贝叶斯分析。尽管您似乎不希望仅仅因为分离,但值得考虑它的其他优点。他建议的论文是Gelman等人(2008),“逻辑和其他回归模型的弱信息性默认先验分布”,Ann。应用 统计 ,2,4:有问题的默认是一个独立的柯西事先为每个系数,具有零均值和的比例 ; 在将所有连续预测变量标准化为均值为零且标准差为。如果您可以阐明内容丰富的先验知识,那就更好了。 1
没做什么。(但是,由于Wald估计的标准误差会严重错误,因此请根据轮廓可能性计算置信区间。)一个经常被忽视的选择。如果该模型的目的仅仅是描述您对预测变量与响应之间的关系所学的知识,那么引述置信区间为例如2.3或更高的置信区间就不会感到羞耻。(实际上,根据不带偏见的估计值(不包括数据最好支持的比值比率)引用置信区间似乎很可疑。)当您尝试使用点估计值进行预测时,问题就来了,而发生分离的预测值淹没了其他预测值。
使用隐藏逻辑回归模型,如在Rousseeuw&Christmann(2003)所描述的,“针对逻辑回归分离和离群鲁棒性”,计算统计与数据分析,43,3,和在R封装中实现HLR。(@ user603 暗示了这一点。)我还没有阅读该论文,但他们在摘要中说:“提出了一个稍微更一般的模型,在该模型下,观察到的响应与强烈相关,但不等于无法观察到的真实响应”,这表明对我来说,除非听起来合理,否则使用该方法可能不是一个好主意。
“将表现出完全分离的变量中的一些随机选择的观察值从1更改为0或从0更改为1”:@RobertF的注释。该建议似乎来自于将分离本身视为问题,而不是数据中缺乏信息的征兆,这可能会导致您偏向于使用其他方法而不是最大似然估计,或者将推论限制在您可以使用的方法上合理的精度-各种方法各有优点,而不仅仅是分离的“解决方案”。(除了毫无疑问地是临时性的之外,对于大多数人来说,由于投掷硬币或类似的结果,分析师对相同数据的相同问题,做出相同的假设应该给出不同的答案,这对大多数人来说是不愉快的。)
这是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
bayesglm
使用的先验是什么?如果ML估计等同于具有平坦先验的贝叶斯估计,那么非信息先验在这里有什么帮助?
prior.df
将默认值增加1.0
和/或减少prior.scale
默认值来稍微强一些的正则化2.5
,或者开始尝试:m=bayesglm(match ~. , family = binomial(link = 'logit'), data = df, prior.df=5)
Paul Allison的论文对“准完全分离”问题的最彻底的解释之一。他正在撰写有关SAS软件的文章,但是他解决的问题可以推广到任何软件:
只要x的线性函数可以生成y的完美预测,就会发生完全分离
当(a)存在一些系数矢量发生准完全分离b使得BXI≥0时YI = 1,和BXI≤0 * **每当义= 0和这个平等的每个类别适用于至少一种情况下因变量。换句话说,在最简单的情况下,对于逻辑回归中的任何二分式自变量,如果在该变量和因变量形成的2×2表中为零,则不存在回归系数的ML估计。
艾莉森讨论了已经提到的许多解决方案,包括删除问题变量,折叠类别,不采取任何措施,利用精确的逻辑回归,贝叶斯估计和惩罚最大似然估计。
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
或与waldtest
在lmtest
包。似然比测试在包装中anova
或包装中进行。在这两种情况下,信息矩阵都是无穷大的,并且没有推断可用。相反,R 确实会产生输出,但是您不能信任它。在这些情况下,R通常产生的推论的p值非常接近1。这是因为“或”中的精度损失要比方差-协方差矩阵中的精度损失小几个数量级。lrtest
lmtest
这里概述了一些解决方案:
有很多理论支持一步估计器的低偏差,效率和通用性。在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)
> pchisq(scstat, df=1, lower.tail=F)
[,1]
[1,] 1.343494e-11
在这两种情况下,您都可以推断出无穷大的OR。
通过使用中值无偏估计,您可以为无穷比产生一个中值无偏,非奇异95%CI。epitools
R中的程序包可以做到这一点。我在这里给出一个实现此估计量的示例:贝努利抽样的置信区间
test="Rao"
来执行得分测试anova
。(好吧,最后两个是音符,而不是
请仔细阅读R发出的警告消息。看看安德鲁·盖尔曼(Andrew Gelman)的这篇博客文章,您会发现它并不总是完美分离的问题,而是有时会出现的错误glm
。似乎如果起始值与最大似然估计值相差太远,则会爆炸。因此,请先使用Stata等其他软件进行检查。
如果确实存在此问题,则可以尝试使用具有先验知识的贝叶斯建模。
但是实际上,我只是摆脱了造成麻烦的预测因素,因为我不知道该如何选择信息丰富的先验。但是我想,当您遇到完美分离问题时,Gelman会发表一篇有关使用先验信息的论文。只是谷歌它。也许您应该尝试一下。
glm2
程序包将进行检查,以确保在每个计分步骤中可能性实际上都在增加,如果没有,则将步长减半。
safeBinaryRegression
,用于诊断和解决此类问题,并使用优化方法进行修正以确保是否存在分离或准分离。试试吧!
我知道这是一篇过时的文章,但是由于我一直在努力工作,因此我仍将继续对其进行回答,它可以为他人提供帮助。
当您选择的适合模型的变量可以非常准确地区分0和1或是和否时,就会发生完全分离。我们整个数据科学方法都基于概率估计,但是在这种情况下却失败了。
整改步骤:
如果变量之间的差异较小,请使用bayesglm()而不是glm()
有时将(maxit =“某些数值”)与bayesglm()一起使用会有所帮助
3,第三次也是最重要的检查您选择的变量以进行模型拟合,必须有一个变量,其与Y(outout)变量的多重共线性很高,请从模型中删除该变量。
就我而言,我有一个电信客户流失数据来预测验证数据的流失。我的训练数据中有一个变量,可以非常区分是和否。删除后,我可以获得正确的模型。此外,您可以使用逐步(拟合)来使模型更准确。