我未使用的变量出现“因子具有新级别”错误

2024-03-01

考虑一个简单的数据集,分为训练集和测试集:

dat <- data.frame(x=1:5, y=c("a", "b", "c", "d", "e"), z=c(0, 0, 1, 0, 1))
train <- dat[1:4,]
train
#   x y z
# 1 1 a 0
# 2 2 b 0
# 3 3 c 1
# 4 4 d 0
test <- dat[5,]
test
#   x y z
# 5 5 e 1

当我训练逻辑回归模型来预测时z using x并获得测试集预测,一切都很好:

mod <- glm(z~x, data=train, family="binomial")
predict(mod, newdata=test, type="response")
#         5 
# 0.5546394 

但是,这在看起来等效的逻辑回归模型上失败,并出现“因子有新级别”错误:

mod2 <- glm(z~.-y, data=train, family="binomial")
predict(mod2, newdata=test, type="response")
# Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
#   factor y has new level e

自从我删除了y从我的模型方程中,我很惊讶地看到这个错误消息。在我的应用程序中,dat很宽,所以z~.-y是最方便的型号规格。我能想到的最简单的解决方法是删除y来自我的数据帧的变量,然后使用z~.语法,但我希望有一种方法可以使用原始数据集而不需要删除列。


你可以尝试更新一下mod2$xlevels[["y"]]在模型对象中

mod2 <- glm(z~.-y, data=train, family="binomial")
mod2$xlevels[["y"]] <- union(mod2$xlevels[["y"]], levels(test$y))

predict(mod2, newdata=test, type="response")
#        5 
#0.5546394 

另一种选择是从训练数据中排除(但不删除)“y”

mod2 <- glm(z~., data=train[,!colnames(train) %in% c("y")], family="binomial")
predict(mod2, newdata=test, type="response")
#        5 
#0.5546394 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我未使用的变量出现“因子具有新级别”错误 的相关文章

随机推荐