关于R中ns()函数生成自然样条基的技术疑问咨询
嘿,我来帮你拆解这个自然样条基的问题,刚好对这部分挺熟的~
为什么返回3个基多项式?
这得从自然样条的自由度计算说起:
- 自然样条的自由度 = 内部节点数 + 2(两个边界节点带来的约束)
- 当你设置
intercept=T时,R的ns()函数会把截距项直接包含在基函数里,不会额外增加维度(默认intercept=F时,基函数数量是自由度-1,因为截距单独拿出来了)
你的例子里:内部节点1个(9),边界节点2个(1和15),所以自由度是1+2=3,对应返回3个基多项式。
简单说:自然样条在边界外要求是线性的(二阶导数为0),这减少了两个自由度,再加上内部节点带来的分段,最终基的数量就是内部节点数+2。
3个基多项式的表达式是什么?
R的splines::ns()里的自然样条基是基于截断幂函数结合自然边界条件(边界处二阶导数为0)构造的,结合你的节点t0=1(左边界)、t1=9(内部)、t2=15(右边界),三个基的分段表达式如下:
基1:截距项(B₀(x))
这个很简单,所有x的取值下,B₀(x)=1,对应线性模型里的截距。
基2:B₁(x)
分四个区间:
- 当
x ≤ 1时:B₁(x) = x - 1(左边界外是线性函数,二阶导数为0) - 当
1 < x ≤ 9时:B₁(x) = x - 1(中间区间保持线性,直到第一个内部节点) - 当
9 < x ≤ 15时:B₁(x) = (-4/3)x + 20(内部节点到右边界之间的三次多项式简化后的形式) - 当
x > 15时:B₁(x) = 0(右边界外线性,这里退化为常数0)
基3:B₂(x)
同样分四个区间:
- 当
x ≤ 1时:B₂(x) = 0(左边界外线性,满足二阶导数为0) - 当
1 < x ≤ 9时:B₂(x) = (x-1)(x-15)/112(分母是(1-9)*(1-15)=(-8)*(-14)=112) - 当
9 < x ≤ 15时:B₂(x) = (x-1)(x-15)/(-48)(分母是(9-1)*(9-15)=8*(-6)=-48) - 当
x > 15时:B₂(x) = 0(右边界外线性,退化为常数0)
你可以用R代码验证一下,比如取x=5,代入基2的表达式得到5-1=4,运行ns(5, knots=9, Boundary.knots=c(1,15), intercept=T)看第二列的值,确实是4~
自然样条的核心要求
自然样条之所以叫“自然”,核心约束是:
- 在边界节点以外的区域(也就是你的例子中x<1或x>15的部分),样条函数必须是线性的(二阶导数为0),这样可以避免样条在数据范围外出现不合理的弯曲或波动。
- 在节点之间的区间内,样条是三次多项式,并且满足:
- 在节点处函数值连续
- 在节点处一阶导数连续
- 在节点处二阶导数连续(边界节点处的二阶导数强制为0)
这样的约束既保证了样条的灵活性(能拟合数据的非线性趋势),又避免了过拟合问题。
内容的提问来源于stack exchange,提问作者LZG
相关产品推荐
相关产品推荐

