当数据帧是子集时,predict.lm引发错误

问题描述

我正在尝试使用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,1)
    errors2<-rnorm(100,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,type = "response")

解决方法

trainlm不是lm类,因此predict.lm不是正确的调用函数。

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

使用predict并让S3选择适当的方法。

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