首页 > 其他分享 >拓端数据tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型

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

时间:2022-11-28 11:33:44浏览次数:74  
标签:样条回归 lines 平滑 lm db reg xr data 回归

 

在标准线性模型中,我们假设 

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

。当线性假设无法满足时,可以考虑使用其他方法。

多项式回归

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

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

同样,在标准线性模型方法(使用GLM的条件正态分布)中,参数 

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

 可以使用最小二乘法获得,其中 拓端数据tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型_多项式_04 在 

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

 。即使此多项式模型不是真正的多项式模型,也可能仍然是一个很好的近似值 

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

。实际上,根据 ​​Stone-Weierstrass定理​​,如果 

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

 在某个区间上是连续的,则有一个统一的近似值 

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

 ,通过多项式函数。

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

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

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

与标准回归线

  1.  reg = lm(y ~ x,data=db)
  2.  abline(reg,col="red")

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

 

考虑一些多项式回归。如果多项式函数的次数足够大,则可以获得任何一种模型,

reg=lm(y~poly(x,5),data=db)

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

 

但是,如果次数太大,那么会获得太多的“波动”,

reg=lm(y~poly(x,25),data=db)

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

 

并且估计值可能不可靠:如果我们更改一个点,则可能会发生(局部)更改

  1.   
  2.  yrm=yr;yrm[31]=yr[31]-2
  3.  lines(xr,predict(regm),col="red")

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

局部回归

实际上,如果我们的兴趣是局部有一个很好的近似值  

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

,为什么不使用局部回归?

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

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

 

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

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

可以解决,因为

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

例如,如果我们想在某个时候进行预测 , 考虑 

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

。使用此模型,我们可以删除太远的观测值,

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

 

更一般的想法是考虑一些核函数 

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

 给出权重函数,以及给出邻域长度的一些带宽(通常表示为h),

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

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

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


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

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


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

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

这可以使用

  1.   
  2.  w=dnorm((xr-x0))
  3.  reg=lm(y~1,data=db,weights=w)

在我们的数据集上,我们可以绘制

  1.   
  2.  w=dnorm((xr-x0))
  3.  plot(db,cex=abs(w)*4)
  4.  lines(ul,vl0,col="red")
  5.  axis(3)
  6.  axis(2)
  7.  reg=lm(y~1,data=db,weights=w)
  8.  u=seq(0,10,by=.02)
  9.  v=predict(reg,newdata=data.frame(x=u))
  10.  lines(u,v,col="red",lwd=2)

在这里,我们需要在点2进行局部回归。下面的水平线是回归(点的大小与宽度成比例)。红色曲线是局部回归的演变

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

 

让我们使用动画来可视化曲线。

但是由于某些原因,我无法在Linux上轻松安装该软件包。我们可以使用循环来生成一些图形

  1.   
  2.  name=paste("local-reg-",100+i,".png",sep="")
  3.  png(name,600,400)
  4.   
  5.   
  6.  for(i in 1:length(vx0)) graph (i)

然后,我使用

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

 

当然,可以考虑局部线性模型,

  1.   
  2.  return(predict(reg,newdata=data.frame(x=x0)))}

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

 

甚至是二次(局部)回归,

  1.   
  2.   lm(y~poly(x,degree=2), weights=w)

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

 

当然,我们可以更改带宽

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

 

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

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

 

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

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

我们可以尝试一些真实的数据。

  1.  library(XML)
  2.   
  3.  data = readHTMLTable(html)

整理数据集,

  1.   
  2.  plot(data$no,data$mu,ylim=c(6,10))
  3.  segments(data$no,data$mu-1.96*data$se,

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

 

我们计算标准误差,反映不确定性。

  1.   
  2.  for(s in 1:8){reg=lm(mu~no,data=db,
  3.  lines((s predict(reg)[1:12]

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

所有季节都应该被认为是完全独立的,这不是一个很好的假设。

smooth(db$no,db$mu,kernel = "normal",band=5)

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

我们可以尝试查看带宽较大的曲线。

  1.  db$mu[95]=7
  2.   
  3.  plot(data$no,data$mu
  4.   
  5.  lines(NW,col="red")

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

样条平滑

接下来,讨论回归中的平滑方法。假设

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

 , 

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

 是一些未知函数,但假定足够平滑。例如,假设 

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

 是连续的, 

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

 存在,并且是连续的,  

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

 存在并且也是连续的等等。如果 

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

 足够平滑,  可以使用​​泰勒展开式。 ​​因此,对于 

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

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

也可以写成

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

第一部分只是一个多项式。

使用 ​​黎曼积分​​,观察到

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

 

因此,

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

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

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

,对于 

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

 

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

给一些节点 

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


plot(db)

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

 

如果我们考虑一个节点,并扩展阶数1,

  1.   
  2.   
  3.  B=bs(xr,knots=c(3),Boundary.knots=c(0,10),degre=1)
  4.   
  5.  lines(xr[xr<=3],predict(reg)[xr<=3],col="red")
  6.  lines(xr[xr>=3],predict(reg)[xr>=3],col="blue")

可以将用该样条获得的预测与子集(虚线)上的回归进行比较。

  1.   
  2.   
  3.  lines(xr[xr<=3],predict(reg)[xr<=3
  4.   
  5.   
  6.  lm(yr~xr,subset=xr>=3)
  7.   

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

 

这是不同的,因为这里我们有三个参数(关于两个子集的回归)。当要求连续模型时,失去了一个自由度。观察到可以等效地写

  1.   
  2.  lm(yr~bs(xr,knots=c(3),Boundary.knots=c(0,10)

 

回归中出现的函数如下

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

 

现在,如果我们对这两个分量进行回归,我们得到

  1.   
  2.  matplot(xr,B
  3.   
  4.  abline(v=c(0,2,5,10),lty=2)

如果加一个节点,我们得到

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

 

预测是

  1.   
  2.   
  3.  lines(xr,predict(reg),col="red")

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

我们可以选择更多的节点

  1.   
  2.   
  3.  lines(xr,predict(reg),col="red")

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

 

我们可以得到一个置信区间

  1.   
  2.   
  3.  polygon(c(xr,rev(xr)),c(P[,2],rev(P[,3]))
  4.   
  5.  points(db)
  6.   

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

 

如果我们保持先前选择的两个节点,但考虑泰勒的2阶的展开,我们得到

  1.   
  2.   
  3.  matplot(xr,B,type="l")
  4.  abline(v=c(0,2,5,10),lty=2)

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

 

如果我们考虑常数和基于样条的第一部分,我们得到

  1.   
  2.   
  3.  B=cbind(1,B)
  4.  lines(xr,B[,1:k]%*%coefficients(reg)[1:k],col=k-1,lty=k-1)

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

 

如果我们将常数项,第一项和第二项相加,则我们得到的部分在第一个节点之前位于左侧,

  1.  k=3
  2.  lines(xr,B[,1:k]%*%coefficients(reg)[1:k]

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

通过基于样条的矩阵中的三个项,我们可以得到两个节点之间的部分,

  1.   
  2.  lines(xr,B[,1:k]%*%coefficients(reg)[1:k]

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

 

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

  1.  k=5
  2.   

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

 

这是我们使用带有两个(固定)节点的二次样条回归得到的结果。可以像以前一样获得置信区间

  1.   
  2.   
  3.  polygon(c(xr,rev(xr)),c(P[,2],rev(P[,3]))
  4.   
  5.  points(db)
  6.  lines(xr,P[,1],col="red")
  7.   

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

 

使用函数 

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

,可以确保点的连续性 

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


 

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

再一次,使用线性样条函数,可以增加连续性约束,

  1.   
  2.  lm(mu~bs(no,knots=c(12*(1:7)+.5),Boundary.knots=c(0,97),
  3.   
  4.   
  5.  lines(c(1:94,96),predict(reg),col="red")

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

 

但是我们也可以考虑二次样条,

  1.   
  2.   
  3.  abline(v=12*(0:8)+.5,lty=2)
  4.   
  5.  lm(mu~bs(no,knots=c(12*(1:7)+.5),Boundary.knots=c(0,97),

 

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


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


标签:样条回归,lines,平滑,lm,db,reg,xr,data,回归
From: https://blog.51cto.com/u_14293657/5890778

相关文章