predict()为bs()提供了错误的矩阵;如何预测线性回归?

时间:2017-06-21 16:02:34

标签: r regression linear-regression lm spline

我遇到了有关功能bs()的问题。

      library(ISLR)    
      library(ggplot2)    
      library(caret)    
      data(Wage)    
      #summary(Wage)        

      set.seed(123)    
      inTrain <- createDataPartition(Wage$wage, p = 0.7, list = F)    
      training <- Wage[inTrain,]    
      testing <- Wage[-inTrain,]    

      library(splines)     
      bsBasis <- bs(training$age, df=3)      
      bsBasis[1:12,] 

      lm1 <- lm(wage ~ bsBasis, data=training)    
      lm1$coefficients    
      ## (Intercept)    bsBasis1    bsBasis2    bsBasis3     
      ##       60.22       93.39       51.05       47.28    

      plot(training$age, training$wage, pch=19, cex=0.5)    
      points(training$age, predict(lm1, newdata=training), col="red", pch=19, cex=0.5)    

      predict(bsBasis, age=testing$age)

predict(bsBasis, age=testing$age)的尺寸为 2012x3 ,而testing$age只有988行。 predict(bsBasis, age=testing$age)的结果与bsBasis相同。

我的问题是:

  1. predict(bsBasis, age=testing$age)实际上在做什么?
  2. 如何使用此bsBasis正确预测TEST数据中的wage

1 个答案:

答案 0 :(得分:1)

您的问题1

使用newx。检查?predict.bs的参数。

x <- runif(100)
b <- bs(x, df = 3)
predict(b, newx = c(0.2, 0.5))

不同的predict函数可能表现不同。在这里,无论您在bs()agesexheight等中使用哪种变量,它都只能newx predict.bs()

您的问题2

您实际上不需要明确表达bsBasis。在回归中使用样条曲线时,lmpredict.lm将隐藏样条的构造和预测。

lm1 <- lm(wage ~ bs(age, df = 3), data=training)
predict(lm1, newdata = test)

请注意predict.lm中的参数为newdata