解释R函数的输出bs()(B样条基矩阵)

时间:2016-09-12 09:09:50

标签: r matrix bspline

我经常使用B样条进行回归。到目前为止,我从未需要详细了解bs的输出:我只选择我感兴趣的模型,并将其与lm相匹配。但是,我现在需要在外部(非R)代码中重现b样条模型。那么,bs生成的矩阵的含义是什么?例如:

x <- c(0.0, 11.0, 17.9, 49.3, 77.4)
bs(x, df = 3, degree = 1) # generate degree 1 (linear) B-splines with 2 internal knots
#              1         2         3
# [1,] 0.0000000 0.0000000 0.0000000    
# [2,] 0.8270677 0.0000000 0.0000000    
# [3,] 0.8198433 0.1801567 0.0000000    
# [4,] 0.0000000 0.7286085 0.2713915    
# [5,] 0.0000000 0.0000000 1.0000000   
# attr(,"degree")
# [1] 1
# attr(,"knots")
# 33.33333% 66.66667% 
#  13.30000  38.83333 
# attr(,"Boundary.knots")
# [1]  0.0 77.4
# attr(,"intercept")
# [1] FALSE
# attr(,"class")
# [1] "bs"     "basis"  "matrix"

好的,所以degree是1,正如我在输入中指定的那样。 knots告诉我两个内部结分别为x = 13.3000和x = 38.8333。有点惊讶地看到结是固定的分位数,我希望R会找到我的数据的最佳分位数,但当然这会使模型不是线性的,并且在不知道响应的情况下也是不可能的数据。 intercept = FALSE意味着没有拦截被包含在基础中(这是一件好事吗?我总是被教导不适合没有拦截的线性模型......好吧lm只是添加一个反正)。

然而,矩阵怎么样?我真的不懂如何解释它。有三列,我认为这意味着基础功能是三个。这是有道理的:如果我有两个内部结K1K2,我将在左边界结B1K1之间有一个样条曲线,{{1}之间的另一个样条曲线}和K1,以及K2K2之间的最后一个,所以......三个基函数,好的。但究竟哪些基础功能呢?例如,这个专栏意味着什么?

B2

编辑:这与this question类似但不完全相同。这个问题询问了回归系数的解释,但我之前是一步:我想理解模型矩阵系数的含义。如果我尝试按照the first answer中的建议绘制相同的图,我会得到一个混乱的情节:

#              1
# [1,] 0.0000000
# [2,] 0.8270677
# [3,] 0.8198433
# [4,] 0.0000000
# [5,] 0.0000000

enter image description here

这些不能成为B样条基函数,因为它们有太多的结(每个函数应该只有一个)。

The second answer实际上允许我在R之外重建我的模型,所以我想我可以接受它。然而,答案也没有准确地解释b <- bs(x, df = 3, degree = 1) b1 <- b[, 1] ## basis 1 b2 <- b[, 2] ## basis 2 b3 <- b[,3] par(mfrow = c(1, 3)) plot(x, b1, type = "l", main = "basis 1: b1") plot(x, b2, type = "l", main = "basis 2: b2") plot(x, b3, type = "l", main = "basis 3: b3") 矩阵的元素是什么:它处理线性回归的系数,我还没有在这里介绍过。这是我的最终目标,但我也希望了解这个中间步骤。

2 个答案:

答案 0 :(得分:6)

矩阵b

#              1         2         3
# [1,] 0.0000000 0.0000000 0.0000000    
# [2,] 0.8270677 0.0000000 0.0000000    
# [3,] 0.8198433 0.1801567 0.0000000    
# [4,] 0.0000000 0.7286085 0.2713915    
# [5,] 0.0000000 0.0000000 1.0000000  

实际上只是x的每个点中三个基函数的值的矩阵,这对我来说应该是显而易见的,因为它与多项式线性模型的解释完全相同。事实上,由于边界结是

bknots <- attr(b,"Boundary.knots")
# [1]  0.0 77.4

并且内部结是

iknots <- attr(b,"knots")
# 33.33333% 66.66667% 
#  13.30000  38.83333 

然后,如here所示,三个基函数是:

knots <- c(bknots[1],iknots,bknots[2])
y1 <- c(0,1,0,0)
y2 <- c(0,0,1,0)
y3 <- c(0,0,0,1)
par(mfrow = c(1, 3))
plot(knots, y1, type = "l", main = "basis 1: b1")
plot(knots, y2, type = "l", main = "basis 2: b2")
plot(knots, b3, type = "l", main = "basis 3: b3")

enter image description here

现在,考虑b[,1]

#              1
# [1,] 0.0000000
# [2,] 0.8270677
# [3,] 0.8198433
# [4,] 0.0000000
# [5,] 0.0000000

这些必须是b1x <- c(0.0, 11.0, 17.9, 49.3, 77.4)的值。事实上,b1中的knots[1] = 0为0,knots[2] = 13.3000中为{1},这意味着x[2](11.0)中的值必须为11/13.3 = 0.8270677,预期。同样,由于b1的{​​{1}}为0,因此knots[3] = 38.83333(17.9)中的值必须为x[3]。由于(38.83333-13.3)/17.9 = 0.8198433x[4], x[5] > knots[3] = 38.83333为0。对于其他两列,可以给出类似的解释。

答案 1 :(得分:1)

对上述@DeltaIV的出色答案进行了小幅修正(看来我无法发表评论。)

因此在b1中,当他计算b1(x[3])时,应通过线性插值将其设为(38.83333-17.9)/(38.83333-13.3)=0.8198433。其他一切都很完美。

注意b1应该看起来像这样

\frac{t}{13.3}I(0<=t<13.3)+\frac{38.83333-t}{38.83333-13.3}I(13.3<=t<38.83333)