0

我在使用modelr add_predictions函数时遇到以下错误。

modelr add_predictions 错误:在 model.frame.default(条款,newdata,na.action = na.action,xlev = object$xlevels)中:fe.lead.surgeon has new levels ....

据我了解,当您使用训练数据集制作预测模型并将模型应用于测试数据集时,这是一个常见问题,因为存在于训练数据集中的因子水平可能不存在于测试数据集中。但是,我使用相同的样本来创建模型并获取预测值,但仍然出现此错误。

具体来说,这是我正在使用的代码,如果您能深入了解为什么会发生此错误以及如何解决此问题,我将不胜感激。

# indep is a vector of independent variable names
# dep is a vector of dependent variable names
# id.case is the id variable
# sample is my dataset.

  eq <- 
            paste(indep, collapse = ' + ') %>%
            paste(dep, ., sep = ' ~ ') %>%
            as.formula  
          
          s <-
            lm(eq, data = sample %>% select(-id.case))
          
          pred <- 
            sample %>% 
            modelr::add_predictions(s) %>% 
            select(id.case, pred) 

根据@SimoneBianchi 的要求,我在这里提供了可重现的示例。

可重现的例子

  library(tidyverse)
  library(tibble)
  library(data.table)
  
  rename <- dplyr::rename
  select <- dplyr::select
  
  set.seed(10002)
  id <- sample(1:1000, 1000, replace=F)
  
  set.seed(10003)
  fe1 <- sample(c('A','B','C'), 1000, replace=T)
  
  set.seed(10001)
  fe2 <- sample(c('a','b','c'), 1000, replace=T)
  
  set.seed(10001)
  cont1 <- sample(1:300, 1000, replace=T)
  
  set.seed(10004)
  value <- sample(1:30, 1000, replace=T)
  
  sample <-   
    data.frame(id, fe1, fe2, cont1, value) 

  dep <- 'value'
  
  indep <- 
    c('fe1','fe2', 'cont1')
  
  
  eq <- 
    paste(indep, collapse = ' + ') %>%
    paste(dep, ., sep = ' ~ ') %>%
    as.formula  
  
  s <-
    lm(eq, data = sample %>% select(-id))
  
  pred <- 
    sample %>% 
    modelr::add_predictions(s) %>% 
    select(id, pred)

更新和解决方法

我发现的一种解决方法是您不使用建模器功能,而是使用拟合功能。但是,我仍然想了解为什么回归会自动从因子变量中删除体因子水平。如果有人知道,请发表评论。

   pred <- 
    sample %>% 
    cbind(pred = fitted(s))

结束:数据集发现问题

我发现一些观察结果new levels在相应的因子变量中是不适用的——错误。在我修复了 NA 之后,原始代码运行良好。所以,这是数据集而不是代码的问题!

谢谢大家试图帮助我。

4

0 回答 0