10

我正在使用一组点,它们从“对称 V 形”(-5,5)到“对称 V 形”。我正在拟合一个模型以及拟合“V 形”样条的函数:(0,0)(5,5)lm()bs()

lm(formula = y ~ bs(x, degree = 1, knots = c(0)))

predict()当我预测结果并绘制预测线时,我得到了“V形” 。但是当我查看模型估计coef()时,我看到了我不期望的估计。

Coefficients:
                                 Estimate Std. Error t value Pr(>|t|)  
(Intercept)                       4.93821    0.16117  30.639 1.40e-09 ***
bs(x, degree = 1, knots = c(0))1 -5.12079    0.24026 -21.313 2.47e-08 ***
bs(x, degree = 1, knots = c(0))2 -0.05545    0.21701  -0.256    0.805 

我希望-1第一部分有一个+1系数,第二部分有一个系数。我必须以不同的方式解释估计吗?

lm()如果我手动填充函数中的结,则得到这些系数:

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.18258    0.13558  -1.347    0.215    
x           -1.02416    0.04805 -21.313 2.47e-08 ***
z            2.03723    0.08575  23.759 1.05e-08 ***

这还差不多。Z(结点)与 x 的相对变化为 ~ +1

我想了解如何解释bs()结果。我查过,手动和bs模型预测值是完全一样的。

4

2 回答 2

22

我希望-1第一部分有一个+1系数,第二部分有一个系数。

我认为您的问题实际上是关于什么是 B-spline function。如果您想了解系数的含义,您需要知道样条曲线的基函数是什么。请参阅以下内容:

library(splines)
x <- seq(-5, 5, length = 100)
b <- bs(x, degree = 1, knots = 0)  ## returns a basis matrix
str(b)  ## check structure
b1 <- b[, 1]  ## basis 1
b2 <- b[, 2]  ## basis 2
par(mfrow = c(1, 2))
plot(x, b1, type = "l", main = "basis 1: b1")
plot(x, b2, type = "l", main = "basis 2: b2")

基础

笔记:

  1. 1 次 B 样条是帐篷函数,如您所见b1
  2. 1 次 B 样条被缩放,因此它们的函数值在 之间(0, 1)
  3. 1 次 B 样条的一个结是它弯曲的地方
  4. 1 次 B 样条是紧凑的,并且仅在(不超过)三个相邻节点上是非零的。

您可以从 B-spline 的定义中获得B-splines 的(递归)表达式。0 次 B 样条是最基类,而

  • 1 次 B 样条是 0 次 B 样条的线性组合
  • 2 次 B 样条是 1 次 B 样条的线性组合
  • 3 次 B 样条是 2 次 B 样条的线性组合

(对不起,我跑题了……)

使用 B 样条的线性回归:

y ~ bs(x, degree = 1, knots = 0)

只是在做:

y ~ b1 + b2

现在,您应该能够理解您得到的系数是什么意思,这意味着样条函数是:

-5.12079 * b1 - 0.05545 * b2

在汇总表中:

Coefficients:
                                 Estimate Std. Error t value Pr(>|t|)  
(Intercept)                       4.93821    0.16117  30.639 1.40e-09 ***
bs(x, degree = 1, knots = c(0))1 -5.12079    0.24026 -21.313 2.47e-08 ***
bs(x, degree = 1, knots = c(0))2 -0.05545    0.21701  -0.256    0.805 

您可能想知道为什么系数b2不显着。好吧,比较一下你的yb1:你y对称的 V-shapeb1而是反向对称的 V-shape。如果你首先乘以-1b1然后乘以 5 重新调整它(这解释了 的系数-5b1,你会得到什么?很好的比赛,对吧?所以没有必要b2

但是,如果您y是不对称的,(-5,5)从 到(0,0),然后到(5,10),那么您会注意到b1和的系数b2都很重要。我认为另一个答案已经给了你这样的例子。


此处演示了将拟合 B 样条重新参数化为分段多项式:将拟合回归样条重新参数化为分段多项式并导出多项式系数

于 2016-05-21T14:54:55.700 回答
19

具有单结的一阶样条曲线的简单示例和估计系数的解释以计算拟合线的斜率

library(splines)
set.seed(313)
x<-seq(-5,+5,len=1000)
y<-c(seq(5,0,len=500)+rnorm(500,0,0.25),
     seq(0,10,len=500)+rnorm(500,0,0.25))
plot(x,y, xlim = c(-6,+6), ylim = c(0,+8))
fit <- lm(formula = y ~ bs(x, degree = 1, knots = c(0)))
x.predict <- seq(-2.5,+2.5,len = 100)
lines(x.predict, predict(fit, data.frame(x = x.predict)), col =2, lwd = 2)

产生情节在此处输入图像描述 因为我们正在拟合一个样条曲线degree=1(即直线)和一个结点x=0,我们有两条线用于x<=0x>0

系数是

> round(summary(fit)$coefficients,3)
                                 Estimate Std. Error  t value Pr(>|t|)
(Intercept)                         5.014      0.021  241.961        0
bs(x, degree = 1, knots = c(0))1   -5.041      0.030 -166.156        0
bs(x, degree = 1, knots = c(0))2    4.964      0.027  182.915        0

可以使用结(我们在 处指定)和边界结(解释数据的最小值/最大值)将其转换为每条直线的斜率:x=0

# two boundary knots and one specified
knot.boundary.left <- min(x)
knot <- 0
knot.boundary.right <- max(x)

slope.1 <- summary(fit)$coefficients[2,1] /(knot - knot.boundary.left)
slope.2 <- (summary(fit)$coefficients[3,1] - summary(fit)$coefficients[2,1]) / (knot.boundary.right - knot)
slope.1
slope.2
> slope.1
[1] -1.008238
> slope.2
[1] 2.000988
于 2016-05-21T14:06:40.207 回答