【问题标题】:r- glm2 error "singular fit encountered"r-glm2 错误“遇到奇异拟合”
【发布时间】:2014-10-28 02:28:05
【问题描述】:

我正在尝试不同的方法来进行逻辑回归。 我使用 glm 并收到警告,但仍然得到系数。所以这个公式有效。

logit<-glm(flag_compro~.,training, family=binomial("logit"),control = list(maxit = 50))

现在,我正在测试 glm2,因为它说使用与 glm 相同的模型规范,所以我写道:

logit2<-glm2(flag_compro~., training, family=binomial("logit"))

但我收到以下错误:

> logit2<-glm2(flag_compro~., training, family=binomial("logit"))
Error in lm.fit(x = x[good, , drop = FALSE] * w, y = z * w, singular.ok = FALSE,  : 
  singular fit encountered

我认为这与我可能具有多重共线性有关。如果是这样的话,glm2这个包有解决的办法吗?

【问题讨论】:

  • 请提供可重现的示例?
  • 你能把singular.ok = TRUE传到glm2吗?
  • 没有这个选项
  • glm2 显然不适合多共线性数据集。我会使用惩罚回归作为 glmnet。在任何情况下,您都应该按照 Ben 的要求发布一个可重现的示例。

标签: r glm logistic-regression


【解决方案1】:

glm 函数会静默删除列以修正奇异拟合,而 glm2 函数不会这样做。一种解决方案是使用lmglm 函数拟合数据,查看它删除了哪些列,并在使用“glm2”之前删除这些列。下面是一个简单的可重现示例来演示。

请注意,从 glm 匹配中显式删除这些列也是一个好主意。

df <- data.frame(y = c(200, 1000, 100, 10, 10)
             ,x1 = c(0, 0, 50, 50, 0)
             ,x2 = c(0, 0, 350, 200, 0)
             ,x3 = c(100, 0, 0, 200, 100)
             ,x4 = c(200, 0, 50, 0, 200))
coef(lm(y ~ ., data = df)) # x4 dropped as predictor
coef(glm(y ~ ., data = df)) # x4 dropped as predictor

library(glm2)
glm2(y ~ ., data = df) # gives singular fit error
glm2(y ~ x1 + x2 + x3, data = df) # no singular fit error

summary(lm(x4 ~ x1 + x2 + x3, data = df))$r.squared # x4 is a linear combination of x1-x3

# If making predictions, should also remove columns before fitting with glm
glm_fit <- glm(y ~ ., data = df) 
predict(glm_fit, newdata = df[1:4,]) # gives warning about misleading predictions

glm_fit2 <- glm(y ~ x1 + x2 + x3, data = df)
predict(glm_fit2, newdata = df[1:4,]) # no warning about misleading predictions

【讨论】:

  • 非常好的例子!不知道 lm() 自动删除了预测变量。谢谢! - 但是,我尝试 glm2() 的原因是 glm() 没有收敛,因此无法切换到 glm() 来查找丢弃的预测变量。但是,在 glm() 中使用 maxit=100 可以解决这个问题。
猜你喜欢
  • 2019-01-31
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 2017-07-19
  • 2021-07-10
  • 1970-01-01
相关资源
最近更新 更多