变量我没有使用的“因子有新的水平”错误

时间:2014-03-11 02:39:04

标签: r

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

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训练逻辑回归模型预测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~.语法训练模型,但我希望有一种方法可以使用原始数据集而无需删除列。

2 个答案:

答案 0 :(得分:36)

您可以尝试更新模型对象中的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 

答案 1 :(得分:0)

我对此问题很困惑。但是,对此有一个简单的解决方案。变量“流量类型”之一具有20个因子,而对于一个因子(即17个),只有一行。因此,该行可以出现在列车数据或测试数据中。在我的情况下,它出现在测试数据中,因此出现错误-因子“流量类型”具有新的级别17,因为在火车数据中没有行具有级别17。我从数据集中删除了这一行,模型运行得很好

相关问题