我正在尝试不同的方法来进行逻辑回归。 我使用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包有什么可以解决的吗?
答案 0 :(得分:2)
glm
函数正在静默删除列以补救单数拟合,而glm2
函数不会执行此操作。一种解决方案是使用lm
或glm
函数拟合数据,查看它丢弃的列,并在使用`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