#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
Просматривая другие сообщения, казалось, что это возникло либо потому, что:
- Я подмножествую фрейм данных
- У меня были значения 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»)