Predict() 的 model.frame.default 错误 - "Factor has new levels" - 对于 Char 变量

Error in model.frame.default for Predict() - "Factor has new levels" - For a Char Variable

我有一个数据集,我将其拆分为 test/train 个数据集。在拆分之后,我立即生成了一个逻辑模型:

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...

这是让我特别困惑的地方:

我在这个 SO link 找到了对项目符号 2 的解释: "Factor has new levels" error for variable I'm not using

那里关于从我的训练和测试集中完全删除字符变量的建议为我提供了一个解决方法,所以至少我没有被阻止。但这似乎很不优雅,而不是仅仅使用“-myCharVar”将它们从模型中删除。如果有人理解为什么我的测试集中的字符变量会抛出 "factor has new levels" 错误,我肯定会感兴趣。

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

现在,回答您的另一个问题:考虑 predict() 文档中的以下引用:"For factor variables having numeric levels, you can specify the numeric values in newdata without first converting the variables to factors. These numeric values are checked to make sure they match a level, then the variable is converted internally to a factor"。

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

thispost中对这个问题给出了另一个说明。