样条回归 Ruppert, D., Wand, M.P., and Carroll, R.J. (2003), Semiparametric regression, Cambridge University Press, New York.
介绍 非参数回归 多项式回归
分段线性回归 Knots(change points)
样条(Splines): 在结点(knots)光滑的分段回归 惩罚样条:对结点个数和光滑程度进行惩罚。
例子
模型
拟合图,k=11
估计方法 最小二乘 解释变量
q 个结点 模型
5个结点
样条一般定义 样条基 样条回归
惩罚样条 参数估计对结点 个数的选择很敏感
普通最小二乘
限制条件 令 最小化
Lagrange乘数法 解 光滑参数
其他的惩罚 选择 最小化
令 则
最小化 这里 解
基的选择 二次样条 三次样条
即
P阶样条基 p阶样条回归
B 样条 所有的B样条的全体组成一个线性空间,线性空间有基函数,这就是B样条基函数。de Boor-Cox递推定义(约定0/0=0)
性质 局部支撑 在 j-1 到j+p结点 之间 大于零, 其他等于零。 权性 对所有j求和等于1
1阶具体计算
高阶
例 4段5个结点16个参数
15个连续条件 1个归一条件
结果 即
曲线方程
三次样条曲线是使用最广泛的样条曲线 给定n个数据点,共有n-1个区间,需要确定4(n-1)个未知系数。
边界条件(一般有如下3种) 自然边界:两个端点处的二阶导数为0 固定边界:指定第一个和最后一个节点处的一阶导数值 非节点边界:要求第二个和倒数第二个节点处的三阶导数连续,即要求前两个和最后两个相邻区域使用相同的三次函数,让前四个点确定一个三次多项式,最后四个点确定一个三次多项式。这个时候由于第二个和倒数第二个节点已经不是两个不同三次曲线的连接点了,所以被称为非节点条件。
结点的选择 经济现象突变时刻(例如金融危机) 相同样本点个数 区间长度相同 逐步回归模型选择方法
光滑参数的选择 交叉验证方法(Cross-Validation) 定义 为在x点估计值 残差平方和定义
交叉验证准则 这里 为去掉 的估计值 选择 最小化
广义交叉验证法Generalized Cross-Validation (GCV) 这里
The data give the speed of cars and the distances taken to stop. require(graphics) attach(cars) plot(speed, dist, main = "data(cars) & smoothing splines") cars.spl <- smooth.spline(speed, dist) (cars.spl) ## This example has duplicate points, so avoid cv = TRUE lines(cars.spl, col = "blue") lines(spline(speed, dist, method="natural"), lty = 2, col = "red") legend(5,120,c(paste("default [C.V.] => df =",round(cars.spl$df,1)), "nature cubic spline "), col = c("blue","red"), lty = 1:2, bg = 'bisque')
source('http://www-stat. stanford source('http://www-stat.stanford.edu/~jtaylo/courses/stats203/R/inference+polynomial/Ftest.R') # Read in the data voltage <- read.table('http://www-stat.stanford.edu/~jtaylo/courses/stats203/data/voltagedrop.table', header=T, sep=',') attach(voltage) # Use the splines library library(splines) # Voltage drop vs. time plot(time, drop, bg='red', pch=23, cex=2) # Fit a cubic spline model spline.lm <- lm(drop ~ bs(time, knots=c(6.5,13))) lines(time, predict(spline.lm), lwd=2, col='yellow') # Fit a reduced cubic model: important: this model is contained # in the spline model. cubic.lm <- lm(drop ~ poly(time, 3)) lines(time, predict(cubic.lm), lwd=2, lty=2, col='green') print(Ftest(spline.lm, cubic.lm)) # Piecewise linear spline pl.lm <- lm(drop ~ bs(time, degree=1, knots=seq(1,19,6))) lines(time, predict(pl.lm), lwd=4, col='black', lty=3)