原文链接:http:///?p=20531
db = data.frame(x=xr,y=yr) 与标准回归线 reg = lm(y ~ x,data=db) 考虑一些多项式回归。如果多项式函数的次数足够大,则可以获得任何一种模型, reg=lm(y~poly(x,5),data=db) 但是,如果次数太大,那么会获得太多的“波动”, reg=lm(y~poly(x,25),data=db) 并且估计值可能不可靠:如果我们更改一个点,则可能会发生(局部)更改 yrm=yr;yrm[31]=yr[31]-2
实际上,如果我们的兴趣是局部有一个很好的近似值 ,为什么不使用局部回归? 使用加权回归可以很容易地做到这一点,在最小二乘公式中,我们考虑
可以解决,因为 例如,如果我们想在某个时候进行预测 , 考虑 。使用此模型,我们可以删除太远的观测值, 更一般的想法是考虑一些核函数 给出权重函数,以及给出邻域长度的一些带宽(通常表示为h), 这实际上就是所谓的 Nadaraya-Watson 函数估计器 。 但是使用这种权重函数具有很强的不连续性不是最好的选择,尝试高斯核, 这可以使用 w=dnorm((xr-x0)) 在我们的数据集上,我们可以绘制 w=dnorm((xr-x0)) 在这里,我们需要在点2进行局部回归。下面的水平线是回归(点的大小与宽度成比例)。红色曲线是局部回归的演变 让我们使用动画来可视化曲线。 但是由于某些原因,我无法在Linux上轻松安装该软件包。我们可以使用循环来生成一些图形 name=paste("local-reg-",100+i,".png",sep="") 当然,可以考虑局部线性模型, return(predict(reg,newdata=data.frame(x=x0)))} 甚至是二次(局部)回归, lm(y~poly(x,degree=2), weights=w) 当然,我们可以更改带宽 我们可以尝试一些真实的数据。 library(XML) 整理数据集, plot(data$no,data$mu,ylim=c(6,10)) 我们计算标准误差,反映不确定性。 for(s in 1:8){reg=lm(mu~no,data=db, 所有季节都应该被认为是完全独立的,这不是一个很好的假设。 smooth(db$no,db$mu,kernel = "normal",band=5) 我们可以尝试查看带宽较大的曲线。 db$mu[95]=7 样条平滑plot(db) 如果我们考虑一个节点,并扩展阶数1, B=bs(xr,knots=c(3),Boundary.knots=c(0,10),degre=1) 可以将用该样条获得的预测与子集(虚线)上的回归进行比较。 lines(xr[xr<=3],predict(reg)[xr<=3 这是不同的,因为这里我们有三个参数(关于两个子集的回归)。当要求连续模型时,失去了一个自由度。观察到可以等效地写 lm(yr~bs(xr,knots=c(3),Boundary.knots=c(0,10) 回归中出现的函数如下 现在,如果我们对这两个分量进行回归,我们得到 matplot(xr,B 如果加一个节点,我们得到 预测是 lines(xr,predict(reg),col="red") 我们可以选择更多的节点 lines(xr,predict(reg),col="red") 我们可以得到一个置信区间 polygon(c(xr,rev(xr)),c(P[,2],rev(P[,3])) 如果我们保持先前选择的两个节点,但考虑泰勒的2阶的展开,我们得到 matplot(xr,B,type="l") 如果我们考虑常数和基于样条的第一部分,我们得到 B=cbind(1,B) 如果我们将常数项,第一项和第二项相加,则我们得到的部分在第一个节点之前位于左侧, k=3 通过基于样条的矩阵中的三个项,我们可以得到两个节点之间的部分, lines(xr,B[,1:k]%*%coefficients(reg)[1:k] 最后,当我们对它们求和时,这次是最后一个节点之后的右侧部分, k=5 这是我们使用带有两个(固定)节点的二次样条回归得到的结果。可以像以前一样获得置信区间 polygon(c(xr,rev(xr)),c(P[,2],rev(P[,3])) 再一次,使用线性样条函数,可以增加连续性约束, lm(mu~bs(no,knots=c(12*(1:7)+.5),Boundary.knots=c(0,97), 但是我们也可以考虑二次样条, abline(v=12*(0:8)+.5,lty=2) |
|