R:当我用测试数据预测时,因子为新水平

时间:2017-12-04 02:00:26

标签: r categorical-data

我的数据集与我在下面发布的代码类似的逻辑中收到错误。我曾尝试增加训练数据的数量,但没有解决。我已经排除了所有NA值。

  

model.frame.default中的错误(条款,newdata,na.action = na.action,xlev = object $ xlevels):     因子y具有新的水平L,X

set.seed(234)
d <- data.frame(w=abs(rnorm(50)*1000),
            x=rnorm(50), 
            y=sample(LETTERS[1:26], 50, replace=TRUE))



train_idx <- sample(1:nrow(d), floor(0.8*nrow(d)))
train <- d[train_idx,]
test  <- d[-train_idx,]



fit  <- lm(w ~x + y, data=train)
predict(fit, test)

3 个答案:

答案 0 :(得分:3)

由于@jdobres已经解释了为什么会出现这个错误的原因,我会直接跳到解决方案的方法:

让我们在predict语句

之前尝试下面的代码行
#add all levels of 'y' in 'test' dataset to fit$xlevels[["y"]] in the fit object
fit$xlevels[["y"]] <- union(fit$xlevels[["y"]], levels(test[["y"]]))

希望这可以解决您的问题!

答案 1 :(得分:2)

因子和字符数据被视为分类变量。因此,模型无法形成他们以前从未见过的类别标签的预测。如果你建立了一个模型来预测关于&#34; poodle&#34;如果你给它&#34;金毛猎犬&#34;那么模型就会失败。&#34; pit bull&#34;

更具体到您的示例,错误告诉您标签&#34; L&#34;和测试集中的&#34; X&#34;不会出现在您的训练集中。由于他们不在训练集中,因此模型在测试中遇到这些时不知道该怎么做。

答案 2 :(得分:0)

感谢Prem,如果您有很多变量,您可以像这样循环代码行:

for(k in vars){
  if(is.factor(shop_data[,k])){
    ols_fit$xlevels[[k]] <- union(ols_fit$xlevels[[k]],levels(shop_data[[k]]))
   }
}

vars是模型中使用的变量,shop_data是主要数据集,分为训练和测试