predict.lm выдает ошибку, когда фрейм данных является подмножеством

#r #r-caret #predict

#r #r-каретка #прогнозировать

Вопрос:

Я пытаюсь использовать caret::train() функцию для создания линейной модели с перекрестной проверкой без исключения из фрейма данных с несколькими переменными ответа. Некоторые переменные ответа, которые я хочу зарегистрировать, преобразуются. Некоторые другие переменные ответа имеют переменные NA. Я получаю следующую ошибку:

 Error in seq_len(p) : argument must be coercible to non-negative integer
In addition: Warning messages:
1: In predict.lm(trainlm, newdata = df2, type = "response") :
  calling predict.lm(<fake-lm-object>) ...
2: In seq_len(p) : first element used of 'length.out' argument
  

Просматривая другие сообщения, казалось, что это возникло либо потому, что:

  1. Я подмножествую фрейм данных
  2. У меня были значения NA

Я попытался исправить это, сначала создав новый фрейм данных с соответствующими столбцами и выбрав строки с complete.cases() , но проблема сохраняется. Ниже приведен мой воспроизводимый пример:

 library(caret) # for train() function
set.seed(52) # to make reproducible
##Creating Fake Dataset
    X1<-runif(100, 2, 21)
    X2<-runif(100, 21, 40)
    X3<-runif(100, 12, 18)
    errors1<-rnorm(100, 0, 1)
    errors2<-rnorm(100, 0, 1)

#multiple response variables
    Y1<-2.31 (0.52*X1) (0.84*X2) (2.2*X3) (1.5*X1*X2) (1.6*errors1)
    Y2<-5.31 (2.1*X1) (2.2*X3) (1.5*X1*X3) (0.4*errors2)

##Creating an NA Value
    Y2[82]<-NA

##Dataframe with all predictors and both response variables    
    df<-data.frame(Y1, Y2, X1, X2, X3)

##Subsetting to get rid of NA and other 
    df2<-subset(df[complete.cases(df),], select=-1)

##Building the model    
    TrCtrl<-trainControl(method="LOOCV")
    trainlm<-train(log(Y2 1)~X1 X2 X3 (X1 X2) (X1*X3) (X2*X3) (X1*X2*X3), method="lmStepAIC", data=df2, trControl=TrCtrl)

##Getting Prediction##
Train.Predict<-predict.lm(trainlm, newdata = df2, type = "response")
  

Ответ №1:

trainlm не является lm классом, поэтому predict.lm не является подходящей функцией для вызова.

 class(trainlm)
#> [1] "train"         "train.formula"
  

Используйте predict и позвольте S3 выбрать подходящий метод.

 Train.Predict <- predict(trainlm, newdata = df2)
  

Комментарии:

1. Большое спасибо, Пол. Это сработало отлично. Я также попытался использовать caret::predict.train(), и это тоже сработало.

2. Еще одно решение, которое я только что обнаружил, заключается в том, что атрибут finalModel из вывода train() является объектом lm. Это было бы полезно, если вы хотите получить интервал прогнозирования, например, predict.lm (trainlm $finalModel, newdata=df2, interval=»prediction»)