为什么我用 glm 收到“算法未收敛”和“拟合概率数值为 0 或 1”警告?

问题描述 投票:0回答:3

所以这是一个非常简单的问题,只是似乎无法弄清楚。

我正在使用 glm 函数运行 logit,但不断收到与自变量相关的警告消息。它们存储为因子,我已将它们更改为数字,但没有运气。我还将它们编码为 0/1,但这也不起作用。

请帮忙!

> mod2 <- glm(winorlose1 ~ bid1, family="binomial")
Warning messages:
1: glm.fit: algorithm did not converge 
2: glm.fit: fitted probabilities numerically 0 or 1 occurred 

我也在Zelig中尝试过,但类似的错误:

> mod2 = zelig(factor(winorlose1) ~ bid1, data=dat, model="logit")
How to cite this model in Zelig:
Kosuke Imai, Gary King, and Oliva Lau. 2008. "logit: Logistic Regression for Dichotomous Dependent Variables" in Kosuke Imai, Gary King, and Olivia Lau, "Zelig: Everyone's Statistical Software," http://gking.harvard.edu/zelig
Warning messages:
1: glm.fit: algorithm did not converge 
2: glm.fit: fitted probabilities numerically 0 or 1 occurred 

编辑:

> str(dat)
'data.frame':   3493 obs. of  3 variables:
 $ winorlose1: int  2 2 2 2 2 2 2 2 2 2 ...
 $ bid1      : int  700 300 700 300 500 300 300 700 300 300 ...
 $ home      : int  1 0 1 0 0 0 0 1 0 0 ...
 - attr(*, "na.action")=Class 'omit'  Named int [1:63021] 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 ...
  .. ..- attr(*, "names")= chr [1:63021] "3494" "3495" "3496" "3497" ...
r statistics r-zelig
3个回答
47
投票

如果您查看

?glm
(甚至在 Google 中搜索第二条警告消息),您可能会从文档中偶然发现这一点:

有关二项式 GLM 的“出现数字 0 或 1 的拟合概率”的警告消息的背景,请参阅 Venables 和 Ripley(2002 年,第 197-8 页)。

现在,并不是每个人都拥有那本书。但假设我这样做是符合犹太教规的,以下是相关段落:

有一种相当常见的情况,其中两种收敛 问题和 Hauck-Donner 现象可能会发生。这是当 拟合概率极其接近于零或一。考虑一个 包含数千个病例和大约 50 个二进制文件的医疗诊断问题 解释变量(可能是由于编码较少的分类变量而产生的) 变量);这些指标之一很少是真实的,但总是 表明该疾病的存在。然后拟合概率 具有该指标的案例应该是 1 个,这只能实现 取 βi = ∞。

glm
的结果将是 警告和估计系数约为 +/- 10。 统计文献中对此进行了相当广泛的讨论, 通常声称不存在最大似然估计;看 索特纳和达菲(1989,第 234 页)。

本书的一位作者在这里进行了更详细的评论。所以这里的教训是仔细观察你的预测因子的一个水平。 (并谷歌警告消息!)


10
投票

这可能是由于完全分离,即一组完全由 0 或 1 组成。

有几种选择可以解决这个问题:

(a) 使用 Firth 的惩罚似然方法,如 R 中的 loggerfbrglmbrglm2 包中所实现。这使用 Firth (1993)“最大似然估计的偏差减少”中提出的方法,生物计量学80,1.;这消除了最大似然估计中的一阶偏差。

(b) 通过在精确条件逻辑回归中使用中值无偏估计。 R 中的包 elrmlogisticiX 可以做到这一点。

(c) 使用 LASSO 或弹性网络正则化逻辑回归,例如在 R 中使用 glmnet 包。

(d) 采用贝叶斯,参见。论文 Gelman 等人 (2008),“逻辑和其他回归模型的弱信息默认先验分布”,Ann。应用。统计2、4,例如使用 brms 包或使用 arm 包中的函数 bayesglm

(e) 使用隐藏的逻辑回归模型,如 Rousseeuw & Christmann (2003)、“逻辑回归中分离和异常值的稳健性”、计算统计与数据分析43、3 中所述,并在R 包hlr.

您需要首先使用

dat$bid1 = as.factor(dat$bid1)
)

将您的因子重新编码为因子

这里也讨论了这个问题的解决方案:

https://stats.stackexchange.com/questions/11109/how-to-deal-with-perfect-separation-in-logistic-regression

https://stats.stackexchange.com/questions/45803/logistic-regression-in-r-resulted-in-perfect-separation-hauck-donner-phenomenon

https://stats.stackexchange.com/questions/239928/is-there-any-intuitive-explanation-of-why-logistic-regression-will-not-work-for

https://stats.stackexchange.com/questions/5354/logistic-regression-model-does-not-converge?rq=1


2
投票

如果您已正确指定 GLM 公式和相应的输入(即设计矩阵、链接函数等)。由于迭代重新加权最小二乘 (IRLS) 算法中使用的迭代次数不足,glm 算法可能无法收敛。在 R 中将 maxit=25(默认)更改为 maxit=100。

© www.soinside.com 2019 - 2024. All rights reserved.