在使用Predict()函数时,model.frame.default出现错误 - "Factor has new levels" - 针对一个字符变量。

4

我有一个数据集,将其分为测试和训练数据集。在这个切分之后,我使用以下内容生成了一个逻辑回归模型:

logModel1 = glm(Y ~ . -var1 -var2 -var3, data=train, family=binomial)

如果我使用该模型在同一训练集上进行预测,则不会出现错误(当然这并不是一个非常有用的模型测试)。因此,我使用以下代码对我的测试集进行预测:
predictLog1 <- predict(logModel1, type="response", newdata=test)

但我遇到了以下错误:

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : factor myCharVar has new levels This is an observation of myCharVar, This is another...

这里是让我特别困惑的地方:
  • myCharVar 是我的训练集和测试集中的字符变量。我已经通过 str(test$myCharVar)str(train$myCharVar) 确认过。
  • 我的模型甚至没有使用 myCharVar 来进行预测。
我在这个 SO 链接中找到了关于项目2的解释:"Factor has new levels" error for variable I'm not using
那里的建议是完全从我的训练集和测试集中删除字符变量,这为我提供了一个解决方法,所以至少我没有卡住。但这似乎相当不优雅,与仅使用“-myCharVar”将它们从模型中删除相比。如果有人理解为什么测试集中的字符变量会引发“因子具有新级别”错误,我肯定很感兴趣。
1个回答

6
你链接中的帖子中回答这个问题的人已经表明了 myCharVar 为什么仍然被视为模型的一部分。当你使用 z~.-y 时,公式基本上会扩展为 z~(x+y)-y
现在,回答你的另一个问题:考虑下面这段引用来自 predict() 文档:“对于具有数字级别的因子变量,您可以在不首先将变量转换为因子的情况下在 newdata 中指定数字值。这些数字值会进行检查以确保它们与级别相匹配,然后变量会在内部转换为因子”。
我认为我们可以假设同样的行为发生在 myCharVar 上。首先对 myCharVar 的值进行检查,以确定是否与模型中的现有级别相匹配,这就是出错的地方。测试集包含 myCharVar 的值,这些值在模型训练期间从未遇到过(请注意,glm 函数本身也执行因子转换。当需要转换时,它会发出警告)。总之,错误基本上意味着模型无法为在模型训练期间从未遇到过的测试数据中的未知级别进行预测。
帖子中,对这个问题给出了另一个解释。

嗨,Jellen,我试图传达我已经找到了关于“为什么myCharVar仍然被考虑”的答案,使用了“我在这个SO链接中找到了第二个要点的解释”。如果不清楚,对不起。非常感谢您对变量内部转换为因子的解释,这非常有帮助,并完全回答了我的问题。 - Max Power

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接