【问题标题】:Why am I getting "algorithm did not converge" and "fitted prob numerically 0 or 1" warnings with glm?为什么我会收到带有 glm 的“算法不收敛”和“数字拟合概率为 0 或 1”的警告?
【发布时间】:2012-01-25 15:20:24
【问题描述】:

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

我正在使用 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" ...

【问题讨论】:

  • 如果没有关于您的数据的一些详细信息,这将无法回答。 str(dat) 例如。此外,这些是警告,而不是错误。有很大的不同。
  • 我只想指出,有一个 glm2 包声称可以实现收敛,而 glm 没有。我不知道这是否与这里的问题有关。见journal.r-project.org/archive/2011-2/…
  • 您似乎正在处理分类数据,我会考虑将您的整数变量转换为因子。 dat$home
  • 添加了一些可能的解决方案,参考您可以尝试的具体包...

标签: r statistics r-zelig


【解决方案1】:

如果您查看 ?glm(或者甚至在 Google 上搜索您的第二条警告消息),您可能会从文档中偶然发现:

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

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

有一种相当普遍的情况,在这种情况下,两者都收敛 问题和 Hauck-Donner 现象可能发生。这是当 拟合概率非常接近于零或一。考虑一个 数千个病例和大约 50 个二进制的医疗诊断问题 解释变量(可能来自编码较少的分类 变量);这些指标之一很少是真的,但总是 表明疾病存在。然后拟合概率 具有该指标的案例应该是一个,这只能实现 通过取 βi = ∞。 glm 的结果将是 警告和大约 +/- 10 的估计系数。 在统计文献中对此进行了相当广泛的讨论, 通常声称不存在最大似然估计;看 Sautner 和 Duffy(1989,第 234 页)。

本书的一位作者对here 进行了更详细的评论。因此,这里的教训是仔细查看您的预测器的一个级别。 (以及谷歌警告信息!)

【讨论】:

  • +1 好答案。只是补充一点:看看模型、模型诊断,有时还有不同的模型是很好的。例如,尝试分类树。这可能会告诉您(a)您有一个出色的预测器(好事),或者(b)您有一些抽样问题(坏事)。
  • 此答案是否仅解决 OP 问题的第二个警告?我在discuss.analyticsvidhya.com/t/… 找到了调整参数maxit 的建议(未在glm 的文档中列出,但作为control 参数的一部分传递给glm.fit,然后传递给glm.control) ,这似乎为我解决了第一个警告1: glm.fit: algorithm did not converge
  • 我发现你的回答非常有用joran,但我仍然不明白如何根据你的回答解决问题。我的理解(基于您回答中的引用)是:我的一个预测变量的水平之一很少是真的,但总是表明结果变量是 0 或 1。首先,任何体面的统计方法都应该能够处理这个吗?其次,我如何找到预测变量,一旦找到它,我该怎么处理它?
  • @par “解决”这个问题的算法方法通常是采用某种形式的正则化。但是,在模型的上下文中重新考虑协变量的选择以及它们的意义也是明智的。正如引用所示,您通常可以通过查找 +/- 10 的系数来发现问题变量。
【解决方案2】:

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

【讨论】:

  • 这是可能的,但是 glm 在 25 次迭代中未能收敛但在 100 次迭代中成功......(并且没有解释第二条警告消息)是相当不寻常的(至少在我的经验中)跨度>
【解决方案3】:

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

有几种方法可以解决这个问题:

(a) 使用 Firth 的惩罚似然法,在 R 中的 logistfbrglm 包中实现。这使用 Firth (1993),“最大似然估计的偏差减少”中提出的方法, Biometrika, 80,1.;从最大似然估计中消除一阶偏差。

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

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

(d) 去贝叶斯,参见。 arm包中的论文Gelman et al (2008), "A weakly informative default prior distribution for logistic & other regression models", Ann. Appl. Stat., 2, 4和函数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

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2016-02-09
    相关资源
    最近更新 更多