predict.lm 当数据帧是子集时抛出错误

predict.lm throws error when dataframe is subset

我正在尝试使用 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")

trainlm 不是 lm class 所以 predict.lm 不是正确的调用函数。

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

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

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