折线回归模型
原文链接 https://bigborg.github.io/2016/04/02/broken-line-regression/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
对于以下这样的数据应该如何用回归模型来预测呢?
x <- -5:5
y <- c(5.12, 3.93, 2.67, 1.87, 0.52, 0.08, 0.93, 2.05, 2.54, 3.87, 4.97)
plot(x,y)
模型代码如下:
knots<-c(0)
splineTerms<-sapply(knots,function(knot) (x>knot)*(x-knot))
xmat<-cbind(1,x,splineTerms)
xmat
## x
## [1,] 1 -5 0
## [2,] 1 -4 0
## [3,] 1 -3 0
## [4,] 1 -2 0
## [5,] 1 -1 0
## [6,] 1 0 0
## [7,] 1 1 1
## [8,] 1 2 2
## [9,] 1 3 3
## [10,] 1 4 4
## [11,] 1 5 5
fit<-lm(y~xmat-1)
yhat<-predict(fit)
plot(x,y)
lines(x,yhat,col="red")
xmat-1是因为已经把costant feature放到xmat里面了,就是xmat第一列。关键在于增加xmat[,3]该列,假设没有该列,只有原本的x和1,那么回归模型就是一条直线设为 y=b+ax。加入splineTerms该列之后,由于当x<0时对原模型无影响,仍是y=b+ax,导数为a。而当x>0时就变成了y=b+ax+cx(x>=0时splineTerm等于x),对应导数也变为a+c,所以斜率改变。