在Predict()的model.frame.default中出错 - “因子具有新的级别” - 对于Char变量

时间:2015-04-26 02:55:41

标签: r predict

我有一个数据集,我将其拆分为测试/训练数据集。紧接着那次分裂后,我制作了一个逻辑模型:

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

如果我使用该模型在同一列车上进行预测,我没有得到任何错误(当然,对我的模型来说,这不是一个非常有用的测试)。所以我使用下面的代码来预测我的测试集:

predictLog1 <- predict(logModel1, type="response", newdata=test)

但是我收到以下错误:

  

model.frame.default中的错误(条款,newdata,na.action = na.action,   xlev = object $ xlevels):因子myCharVar有新的级别   是对myCharVar的观察,这是另一个......

这让我特别困惑:

  • myCharVar是我的火车和测试集中的一个字符变量。我已通过str(test$myCharVar)str(train$myCharVar)
  • 确认了这一点
  • 我的模型甚至不使用myCharVar作为预测的一部分。

我在这个SO链接上找到了子弹2的解释: "Factor has new levels" error for variable I'm not using

那里有从我的火车和测试装置中完全删除角色变量的建议为我提供了一个解决方法,所以至少我没有被阻止。但这似乎相当不优雅,而不是仅仅使用“-myCharVar”从模型中删除它们。如果有人理解为什么我的测试集中的字符变量会抛出“因子有新级别”错误,我肯定会感兴趣。

1 个答案:

答案 0 :(得分:5)

在您关联的帖子中回答问题的人已经说明了为什么myCharVar仍在模型中考虑。使用z~.-y时,公式基本上会扩展为z~(x+y)-y

现在,回答您的另一个问题:请考虑predict()文档中的以下引用:“对于具有数字级别的因子变量,您可以在newdata中指定数值,而无需先将变量转换为因子。检查这些数值以确保它们匹配级别,然后将变量内部转换为因子“。

我认为我们可以假设myCharVar出现了同样的行为。首先根据模型中相应的现有级别检查myCharVar值,这是出错的地方。测试集包含在模型训练期间从未遇到的myCharVar值(请注意,glm函数本身也执行因子转换。当需要进行转换时会抛出警告)。总之,该错误基本上意味着模型无法对模型训练期间从未遇到过的测试数据中的未知级别进行预测。

this帖子中,对此问题进行了另一次澄清。