将拟合的回归样条(由'bs'或'ns'构造)导出为分段多项式

shi*_*ide 4 regression r spline lm polynomials

比如下面的一个结,二度,样条:

library(splines)
library(ISLR)
fit.spline <- lm(wage~bs(age, knots=c(42), degree=2), data=Wage)
summary(fit.spline)
Run Code Online (Sandbox Code Playgroud)

我看到了我没想到的估计.

Coefficients:
                                  Estimate  Std. Error   t value    Pr(>|t|)   
(Intercept)                           57.349   3.950   14.518   < 2e-16 ***
bs(age, knots = c(42), degree = 2)1   59.511   5.786   10.285   < 2e-16 ***
bs(age, knots = c(42), degree = 2)2   65.722   4.076   16.122   < 2e-16 ***
bs(age, knots = c(42), degree = 2)3   37.170   9.722    3.823  0.000134 ***
Run Code Online (Sandbox Code Playgroud)

有没有办法在结之前和之后提取二次模型(及其系数)?也就是说,如何在切割点之前和之后提取两个二次模型age = 42

使用summary(fit.spline)产量系数,但(据我的理解)它们对解释没有意义.

李哲源*_*李哲源 8

我经常被要求将我的原始答案中的想法结合到一个用户友好的功能中,能够用一个bs或一个ns术语来重新构造一个拟合的线性或广义线性模型.最后我SplinesUtilshttps://github.com/ZheyuanLi/SplinesUtils推出了一个小R包(带有PDF版本包手册).你可以通过安装它

## make you have `devtools` package avaiable
devtools::install_github("ZheyuanLi/SplinesUtils")
Run Code Online (Sandbox Code Playgroud)

这里使用的功能是RegBsplineAsPiecePoly.

library(SplinesUtils)

library(splines)
library(ISLR)
fit.spline <- lm(wage ~ bs(age, knots=c(42), degree=2), data = Wage)

ans1 <- RegBsplineAsPiecePoly(fit.spline, "bs(age, knots = c(42), degree = 2)")
ans1
#2 piecewise polynomials of degree 2 are constructed!
#Use 'summary' to export all of them.
#The first 2 are printed below.
#8.2e-15 + 4.96 * (x - 18) + 0.0991 * (x - 18) ^ 2
#61.9 + 0.2 * (x - 42) + 0.0224 * (x - 42) ^ 2

## coefficients as a matrix
ans1$PiecePoly$coef
#              [,1]        [,2]
#[1,]  8.204641e-15 61.91542748
#[2,]  4.959286e+00  0.20033307
#[3,] -9.914485e-02 -0.02240887

## knots
ans1$knots
#[1] 18 42 80
Run Code Online (Sandbox Code Playgroud)

该函数默认以参数化移位形式的分段多项式(参见参考资料?PiecePoly).您可以设置shift = FALSE非移位版本.

ans2 <- RegBsplineAsPiecePoly(fit.spline, "bs(age, knots = c(42), degree = 2)",
                              shift = FALSE)
ans2
#2 piecewise polynomials of degree 2 are constructed!
#Use 'summary' to export all of them.
#The first 2 are printed below.
#-121 + 8.53 * x + 0.0991 * x ^ 2
#14 + 2.08 * x + 0.0224 * x ^ 2

## coefficients as a matrix
ans2$PiecePoly$coef
#              [,1]        [,2]
#[1,] -121.39007747 13.97219046
#[2,]    8.52850050  2.08267822
#[3,]   -0.09914485 -0.02240887
Run Code Online (Sandbox Code Playgroud)

您可以使用预测样条曲线predict.

xg <- 18:80
yg1 <- predict(ans1, xg)  ## use shifted form
yg2 <- predict(ans2, xg)  ## use non-shifted form
all.equal(yg1, yg2)
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)

但由于模型中存在截距,因此预测值与截距的模型预测不同.

yh <- predict(fit.spline, data.frame(age = xg))
intercept <- coef(fit.spline)[[1]]
all.equal(yh, yg1 + intercept, check.attributes = FALSE)
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)

包装上有summary,print,plot,predictsolve方法的"PiecePoly"级.探索包裹以获取更多信息.