詳解R語(yǔ)言中的多項(xiàng)式回歸、局部回歸、核平滑和平滑樣條回歸模型
在標(biāo)準(zhǔn)線性模型中,我們假設(shè) 。當(dāng)線性假設(shè)無(wú)法滿足時(shí),可以考慮使用其他方法。
多項(xiàng)式回歸
擴(kuò)展可能是假設(shè)某些多項(xiàng)式函數(shù),
同樣,在標(biāo)準(zhǔn)線性模型方法(使用GLM的條件正態(tài)分布)中,參數(shù) 可以使用最小二乘法獲得,其中
在
。
即使此多項(xiàng)式模型不是真正的多項(xiàng)式模型,也可能仍然是一個(gè)很好的近似值 。實(shí)際上,根據(jù) Stone-Weierstrass定理,如果
在某個(gè)區(qū)間上是連續(xù)的,則有一個(gè)統(tǒng)一的近似值
,通過(guò)多項(xiàng)式函數(shù)。
僅作說(shuō)明,請(qǐng)考慮以下數(shù)據(jù)集
db = data.frame(x=xr,y=yr) plot(db)
與標(biāo)準(zhǔn)回歸線
reg = lm(y ~ x,data=db) abline(reg,col="red")
考慮一些多項(xiàng)式回歸。如果多項(xiàng)式函數(shù)的次數(shù)足夠大,則可以獲得任何一種模型,
reg=lm(y~poly(x,5),data=db)
但是,如果次數(shù)太大,那么會(huì)獲得太多的“波動(dòng)”,
reg=lm(y~poly(x,25),data=db)
并且估計(jì)值可能不可靠:如果我們更改一個(gè)點(diǎn),則可能會(huì)發(fā)生(局部)更改
yrm=yr;yrm[31]=yr[31]-2 lines(xr,predict(regm),col="red")
局部回歸
實(shí)際上,如果我們的興趣是局部有一個(gè)很好的近似值 ,為什么不使用局部回歸?
使用加權(quán)回歸可以很容易地做到這一點(diǎn),在最小二乘公式中,我們考慮
在這里,我考慮了線性模型,但是可以考慮任何多項(xiàng)式模型。在這種情況下,優(yōu)化問(wèn)題是
可以解決,因?yàn)?/p>
例如,如果我們想在某個(gè)時(shí)候進(jìn)行預(yù)測(cè) , 考慮 。使用此模型,我們可以刪除太遠(yuǎn)的觀測(cè)值,
更一般的想法是考慮一些核函數(shù) 給出權(quán)重函數(shù),以及給出鄰域長(zhǎng)度的一些帶寬(通常表示為h),
這實(shí)際上就是所謂的 Nadaraya-Watson 函數(shù)估計(jì)器 。
在前面的案例中,我們考慮了統(tǒng)一核 ,
但是使用這種權(quán)重函數(shù)具有很強(qiáng)的不連續(xù)性不是最好的選擇,嘗試高斯核,
這可以使用
w=dnorm((xr-x0)) reg=lm(y~1,data=db,weights=w)
在我們的數(shù)據(jù)集上,我們可以繪制
w=dnorm((xr-x0)) plot(db,cex=abs(w)*4) lines(ul,vl0,col="red") axis(3) axis(2) reg=lm(y~1,data=db,weights=w) u=seq(0,10,by=.02) v=predict(reg,newdata=data.frame(x=u)) lines(u,v,col="red",lwd=2)
在這里,我們需要在點(diǎn)2進(jìn)行局部回歸。下面的水平線是回歸(點(diǎn)的大小與寬度成比例)。紅色曲線是局部回歸的演變
讓我們使用動(dòng)畫(huà)來(lái)可視化曲線。
但是由于某些原因,我無(wú)法在Linux上輕松安裝該軟件包。我們可以使用循環(huán)來(lái)生成一些圖形
name=paste("local-reg-",100+i,".png",sep="") png(name,600,400) for(i in 1:length(vx0)) graph (i)
然后,我使用
當(dāng)然,可以考慮局部線性模型,
return(predict(reg,newdata=data.frame(x=x0)))}
甚至是二次(局部)回歸,
lm(y~poly(x,degree=2), weights=w)
當(dāng)然,我們可以更改帶寬
請(qǐng)注意,實(shí)際上,我們必須選擇權(quán)重函數(shù)(所謂的核)。但是,有(簡(jiǎn)單)方法來(lái)選擇“最佳”帶寬h。交叉驗(yàn)證的想法是考慮
是使用局部回歸獲得的預(yù)測(cè)。
我們可以嘗試一些真實(shí)的數(shù)據(jù)。
library(XML) data = readHTMLTable(html)
整理數(shù)據(jù)集,
plot(data$no,data$mu,ylim=c(6,10)) segments(data$no,data$mu-1.96*data$se,
我們計(jì)算標(biāo)準(zhǔn)誤差,反映不確定性。
for(s in 1:8){reg=lm(mu~no,data=db, lines((s predict(reg)[1:12]
所有季節(jié)都應(yīng)該被認(rèn)為是完全獨(dú)立的,這不是一個(gè)很好的假設(shè)。
smooth(db$no,db$mu,kernel = "normal",band=5)
我們可以嘗試查看帶寬較大的曲線。
db$mu[95]=7 plot(data$no,data$mu lines(NW,col="red")
樣條平滑
接下來(lái),討論回歸中的平滑方法。假設(shè) ,
是一些未知函數(shù),但假定足夠平滑。例如,假設(shè)
是連續(xù)的,
存在,并且是連續(xù)的,
存在并且也是連續(xù)的等等。如果
足夠平滑, 可以使用泰勒展開(kāi)式。 因此,對(duì)于
也可以寫成
第一部分只是一個(gè)多項(xiàng)式。
使用 黎曼積分,觀察到
因此,
我們有線性回歸模型。一個(gè)自然的想法是考慮回歸 ,對(duì)于
給一些節(jié)點(diǎn) 。
plot(db)
如果我們考慮一個(gè)節(jié)點(diǎn),并擴(kuò)展階數(shù)1,
B=bs(xr,knots=c(3),Boundary.knots=c(0,10),degre=1) lines(xr[xr<=3],predict(reg)[xr<=3],col="red") lines(xr[xr>=3],predict(reg)[xr>=3],col="blue")
可以將用該樣條獲得的預(yù)測(cè)與子集(虛線)上的回歸進(jìn)行比較。
lines(xr[xr<=3],predict(reg)[xr<=3 lm(yr~xr,subset=xr>=3)
這是不同的,因?yàn)檫@里我們有三個(gè)參數(shù)(關(guān)于兩個(gè)子集的回歸)。當(dāng)要求連續(xù)模型時(shí),失去了一個(gè)自由度。觀察到可以等效地寫
lm(yr~bs(xr,knots=c(3),Boundary.knots=c(0,10)
回歸中出現(xiàn)的函數(shù)如下
現(xiàn)在,如果我們對(duì)這兩個(gè)分量進(jìn)行回歸,我們得到
matplot(xr,B abline(v=c(0,2,5,10),lty=2)
如果加一個(gè)節(jié)點(diǎn),我們得到
預(yù)測(cè)是
lines(xr,predict(reg),col="red")
我們可以選擇更多的節(jié)點(diǎn)
lines(xr,predict(reg),col="red")
我們可以得到一個(gè)置信區(qū)間
polygon(c(xr,rev(xr)),c(P[,2],rev(P[,3])) points(db)
如果我們保持先前選擇的兩個(gè)節(jié)點(diǎn),但考慮泰勒的2階的展開(kāi),我們得到
matplot(xr,B,type="l") abline(v=c(0,2,5,10),lty=2)
如果我們考慮常數(shù)和基于樣條的第一部分,我們得到
B=cbind(1,B) lines(xr,B[,1:k]%*%coefficients(reg)[1:k],col=k-1,lty=k-1)
如果我們將常數(shù)項(xiàng),第一項(xiàng)和第二項(xiàng)相加,則我們得到的部分在第一個(gè)節(jié)點(diǎn)之前位于左側(cè),
k=3 lines(xr,B[,1:k]%*%coefficients(reg)[1:k]
通過(guò)基于樣條的矩陣中的三個(gè)項(xiàng),我們可以得到兩個(gè)節(jié)點(diǎn)之間的部分,
lines(xr,B[,1:k]%*%coefficients(reg)[1:k]
最后,當(dāng)我們對(duì)它們求和時(shí),這次是最后一個(gè)節(jié)點(diǎn)之后的右側(cè)部分,
k=5
這是我們使用帶有兩個(gè)(固定)節(jié)點(diǎn)的二次樣條回歸得到的結(jié)果??梢韵褚郧耙粯荧@得置信區(qū)間
polygon(c(xr,rev(xr)),c(P[,2],rev(P[,3])) points(db) lines(xr,P[,1],col="red")
使用函數(shù) ,可以確保點(diǎn)的連續(xù)性
。
再一次,使用線性樣條函數(shù),可以增加連續(xù)性約束,
lm(mu~bs(no,knots=c(12*(1:7)+.5),Boundary.knots=c(0,97), lines(c(1:94,96),predict(reg),col="red")
但是我們也可以考慮二次樣條,
abline(v=12*(0:8)+.5,lty=2) lm(mu~bs(no,knots=c(12*(1:7)+.5),Boundary.knots=c(0,97),
到此這篇關(guān)于詳解R語(yǔ)言中的多項(xiàng)式回歸、局部回歸、核平滑和平滑樣條回歸模型的文章就介紹到這了,更多相關(guān)R語(yǔ)言多項(xiàng)式回歸、局部回歸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
R語(yǔ)言求一行(列表、list)數(shù)據(jù)的平均數(shù)操作
這篇文章主要介紹了R語(yǔ)言求一行(列表、list)數(shù)據(jù)的平均數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03R語(yǔ)言 實(shí)現(xiàn)data.frame 分組計(jì)數(shù)、求和等
這篇文章主要介紹了R語(yǔ)言 實(shí)現(xiàn)data.frame 分組計(jì)數(shù)、求和等操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03R語(yǔ)言對(duì)Web數(shù)據(jù)操作實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于R語(yǔ)言對(duì)Web數(shù)據(jù)操作實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05使用R語(yǔ)言繪制散點(diǎn)圖結(jié)合邊際分布圖教程
這篇文章主要介紹了使用R語(yǔ)言利用ggplot繪制散點(diǎn)圖,并且在圖像的兩邊繪制邊際分布圖(包括邊際直方圖與邊際密度函數(shù))我們這里介紹兩種方法進(jìn)行繪制2021-11-11