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

predict() gives wrong matrix for bs(); how to predict linear regression?

我遇到了关于函数 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

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

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

不同的 predict 函数可能表现不同。这里,无论你在bs()agesexheight等中使用什么变量,都只能是predict.bs()中的newx .

你的问题2

你真的不需要明确地形成 bsBasis。在回归中使用样条曲线时,lmpredict.lm 将向您隐藏样条曲线的构造和预测。

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

注意 predict.lm 中的参数是 newdata