函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型


原文链接:http://tecdat.cn/?p=20531
在标准线性模型中 , 我们假设。 当线性假设无法满足时 , 可以考虑使用其他方法 。

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

多项式回归 扩展可能是假设某些多项式函数 ,

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

同样 , 在标准线性模型方法(使用GLM的条件正态分布)中 , 参数 可以使用最小二乘法获得 , 其中 在。

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

即使此多项式模型不是真正的多项式模型 , 也可能仍然是一个很好的近似值。 实际上 , 根据 Stone-Weierstrass定理 , 如果 在某个区间上是连续的 , 则有一个统一的近似值, 通过多项式函数 。

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

仅作说明 , 请考虑以下数据集

  1. db = data.frame(x=xr,y=yr)
  2. plot(db)

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

与标准回归线
  1. reg = lm(y ~ x,data=https://www.sohu.com/a/db)
  2. abline(reg,col="red")

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

考虑一些多项式回归 。 如果多项式函数的次数足够大 , 则可以获得任何一种模型 ,
reg=lm(y~poly(x,5),data=https://www.sohu.com/a/db)

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

但是 , 如果次数太大 , 那么会获得太多的“波动” ,
reg=lm(y~poly(x,25),data=https://www.sohu.com/a/db)

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

并且估计值可能不可靠:如果我们更改一个点 , 则可能会发生(局部)更改
  1. yrm=yr;yrm[31]=yr[31]-2
  2. lines(xr,predict(regm),col="red")

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

局部回归 实际上 , 如果我们的兴趣是局部有一个很好的近似值, 为什么不使用局部回归?

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

使用加权回归可以很容易地做到这一点 , 在最小二乘公式中 , 我们考虑

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

  • 在这里 , 我考虑了线性模型 , 但是可以考虑任何多项式模型 。 在这种情况下 , 优化问题是
可以解决 , 因为

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

【函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型】例如 , 如果我们想在某个时候进行预测,考虑。 使用此模型 , 我们可以删除太远的观测值 ,

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

更一般的想法是考虑一些核函数 给出权重函数 , 以及给出邻域长度的一些带宽(通常表示为h) ,

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

这实际上就是所谓的 Nadaraya-Watson 函数估计器。

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

在前面的案例中 , 我们考虑了统一核,

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

但是使用这种权重函数具有很强的不连续性不是最好的选择 , 尝试高斯核 ,

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

这可以使用
  1. w=dnorm((xr-x0))
  2. reg=lm(y~1,data=https://www.sohu.com/a/db,weights=w)
在我们的数据集上 , 我们可以绘制
  1. w=dnorm((xr-x0))
  2. plot(db,cex=abs(w)*4)
  3. lines(ul,vl0,col="red")
  4. axis(3)
  5. axis(2)
  6. reg=lm(y~1,data=https://www.sohu.com/a/db,weights=w)
  7. u=seq(0,10,by=.02)
  8. v=predict(reg,newdata=https://www.sohu.com/a/data.frame(x=u))
  9. lines(u,v,col="red",lwd=2)
在这里 , 我们需要在点2进行局部回归 。 下面的水平线是回归(点的大小与宽度成比例) 。 红色曲线是局部回归的演变

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

让我们使用动画来可视化曲线 。
但是由于某些原因 , 我无法在Linux上轻松安装该软件包 。 我们可以使用循环来生成一些图形
  1. name=paste("local-reg-",100+i,".png",sep="")
  2. png(name,600,400)
  3. for(i in 1:length(vx0)) graph (i)
然后 , 我使用

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

当然 , 可以考虑局部线性模型 ,
  1. return(predict(reg,newdata=https://www.sohu.com/a/data.frame(x=x0)))}

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

甚至是二次(局部)回归 ,
  1. lm(y~poly(x,degree=2), weights=w)

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

当然 , 我们可以更改带宽

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

请注意 , 实际上 , 我们必须选择权重函数(所谓的核) 。 但是 , 有(简单)方法来选择“最佳”带宽h 。 交叉验证的想法是考虑

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

是使用局部回归获得的预测 。

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

我们可以尝试一些真实的数据 。
  1. library(XML)
  2. data = https://www.sohu.com/a/readHTMLTable(html)
整理数据集 ,
  1. plot(data$no,data$mu,ylim=c(6,10))
  2. segments(data$no,data$mu-1.96*data$se,

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

我们计算标准误差 , 反映不确定性 。
  1. for(s in 1:8){reg=lm(mu~no,data=https://www.sohu.com/a/db,
  2. lines((s predict(reg)[1:12]

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

所有季节都应该被认为是完全独立的 , 这不是一个很好的假设 。
smooth(db$no,db$mu,kernel = "normal",band=5)

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

我们可以尝试查看带宽较大的曲线 。
  1. db$mu[95]=7
  2. plot(data$no,data$mu
  3. lines(NW,col="red")

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

样条平滑 接下来 , 讨论回归中的平滑方法 。 假设,是一些未知函数 , 但假定足够平滑 。 例如 , 假设 是连续的 ,存在 , 并且是连续的 ,存在并且也是连续的等等 。 如果 足够平滑 ,可以使用泰勒展开式 。因此 , 对于

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

也可以写成

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

第一部分只是一个多项式 。
使用 黎曼积分 , 观察到

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

因此 ,

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

我们有线性回归模型 。 一个自然的想法是考虑回归, 对于

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

给一些节点。
plot(db)

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

如果我们考虑一个节点 , 并扩展阶数1 ,
  1. B=bs(xr,knots=c(3),Boundary.knots=c(0,10),degre=1)
  2. lines(xr[xr<=3],predict(reg)[xr<=3],col="red")
  3. lines(xr[xr>=3],predict(reg)[xr>=3],col="blue")
可以将用该样条获得的预测与子集(虚线)上的回归进行比较 。
  1. lines(xr[xr<=3],predict(reg)[xr<=3
  2. lm(yr~xr,subset=xr>=3)

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

这是不同的 , 因为这里我们有三个参数(关于两个子集的回归) 。 当要求连续模型时 , 失去了一个自由度 。 观察到可以等效地写
  1. lm(yr~bs(xr,knots=c(3),Boundary.knots=c(0,10)
回归中出现的函数如下

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

现在 , 如果我们对这两个分量进行回归 , 我们得到
  1. matplot(xr,B
  2. abline(v=c(0,2,5,10),lty=2)
如果加一个节点 , 我们得到

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

预测是
  1. lines(xr,predict(reg),col="red")

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

我们可以选择更多的节点
  1. lines(xr,predict(reg),col="red")

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

我们可以得到一个置信区间
  1. polygon(c(xr,rev(xr)),c(P[,2],rev(P[,3]))
  2. points(db)

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

如果我们保持先前选择的两个节点 , 但考虑泰勒的2阶的展开 , 我们得到
  1. matplot(xr,B,type="l")
  2. abline(v=c(0,2,5,10),lty=2)

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

如果我们考虑常数和基于样条的第一部分 , 我们得到
  1. B=cbind(1,B)
  2. lines(xr,B[,1:k]%*%coefficients(reg)[1:k],col=k-1,lty=k-1)

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

如果我们将常数项 , 第一项和第二项相加 , 则我们得到的部分在第一个节点之前位于左侧 ,
  1. k=3
  2. lines(xr,B[,1:k]%*%coefficients(reg)[1:k]

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

通过基于样条的矩阵中的三个项 , 我们可以得到两个节点之间的部分 ,
  1. lines(xr,B[,1:k]%*%coefficients(reg)[1:k]

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

最后 , 当我们对它们求和时 , 这次是最后一个节点之后的右侧部分 ,
  1. k=5

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

这是我们使用带有两个(固定)节点的二次样条回归得到的结果 。 可以像以前一样获得置信区间
  1. polygon(c(xr,rev(xr)),c(P[,2],rev(P[,3]))
  2. points(db)
  3. lines(xr,P[,1],col="red")

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

使用函数, 可以确保点的连续性。

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

再一次 , 使用线性样条函数 , 可以增加连续性约束 ,
  1. lm(mu~bs(no,knots=c(12*(1:7)+.5),Boundary.knots=c(0,97),
  2. lines(c(1:94,96),predict(reg),col="red")

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

但是我们也可以考虑二次样条 ,
  1. abline(v=12*(0:8)+.5,lty=2)
  2. lm(mu~bs(no,knots=c(12*(1:7)+.5),Boundary.knots=c(0,97),

函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片


函数|拓端tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
文章图片

最受欢迎的见解
1.R语言多元Logistic逻辑回归 应用案例
2.面板平滑转移回归(PSTR)分析案例实现
3.matlab中的偏最小二乘回归(PLSR)和主成分回归(PCR)
4.R语言泊松Poisson回归模型分析案例
5.R语言回归中的Hosmer-Lemeshow拟合优度检验
6.r语言中对LASSO回归 , Ridge岭回归和Elastic Net模型实现
7.在R语言中实现Logistic逻辑回归
8.python用线性回归预测股票价格
9.R语言如何在生存分析与Cox回归中计算IDI , NRI指标

    推荐阅读