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

时间:2017-06-24 17:40:26

标签: r regression lm spline polynomials

例如以下一个结,二级,样条:

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

我看到了我不期望的估计。

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 ***

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

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

1 个答案:

答案 0 :(得分:8)

我经常被要求将我的原始答案中的想法结合到用户友好的函数中,能够使用bsns项来重新拟合拟合的线性或广义线性模型。最后我在https://github.com/ZheyuanLi/SplinesUtils推出了一个小R包[{1}}(带有PDF版本包手册)。您可以通过

安装它
SplinesUtils

此处使用的功能是## make you have `devtools` package avaiable devtools::install_github("ZheyuanLi/SplinesUtils")

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 )。您可以为非移位版本设置?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 预测样条曲线。

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

该软件包包含yh <- predict(fit.spline, data.frame(age = xg)) intercept <- coef(fit.spline)[[1]] all.equal(yh, yg1 + intercept, check.attributes = FALSE) #[1] TRUE summaryprintplotpredict方法,用于&#34; PiecePoly&#34;类。探索更多包。