上半部分:海藻!海藻绢慢!—R實(shí)戰(zhàn)案例一(上)
本案例的目的是預(yù)測140個水樣中7種海藻的出現(xiàn)頻率灿渴,這部分是用多元線性回歸模型和回歸樹模型分別進(jìn)行預(yù)測。
首先進(jìn)行多遠(yuǎn)線性回歸胰舆,該模型給出一個有關(guān)目標(biāo)變量骚露,和解釋變量關(guān)系的線性函數(shù)
#預(yù)測海藻a1出現(xiàn)的頻率,.代表數(shù)據(jù)框中除了a1外的變量缚窿。
lm.a1<-lm(a1~.,data=clean.algae[,1:12])
summary(lm.a1)
該模型解釋的方差比例(R-squared)表明模型與數(shù)據(jù)的吻合度棘幸。越接近于1越好。此處為0.322倦零,還不是很理想误续,所以需要精簡回歸模型。
首先用anova函數(shù)提供模型擬合的方差序貫分析扫茅。
anova(lm.a1)
從圖中可見女嘲,season對減少模型擬合誤差的貢獻(xiàn)最小,將其刪除诞帐。然后再做一次線性回歸模型欣尼。
lm2.a1<-update(lm.a1,.~.-season)
summary(lm2.a1)
anova(lm.a1,lm2.a1)
此處結(jié)果略,R平方是0.328停蕉,還是不理想愕鼓。所以繼續(xù)用anova對兩個模型進(jìn)行正式的比較,使用兩個模型作為參數(shù)慧起。
盡管誤差平方和減少了(-449)菇晃,但顯著性只有0.695,說明兩個模型不同的可能性為30%蚓挤,應(yīng)該再次消元磺送。使用step向后消元法驻子。
final.lm<-step(lm.a1)
summary(final.lm)
最后的R平方仍然不理想,說明在此案例估灿,應(yīng)用線性模型并不合適崇呵。
接下來運(yùn)用另一種模型算法:回歸樹來預(yù)測∠谠回歸樹是對某些解釋變量分層次的邏輯測試域慷,基于樹的模型自動篩選相關(guān)的變量。
library(rpart)
rt.a1<-rpart(a1~.,data=algae[,1:12])
rt.a1
prettyTree(rt.a1)
prettyTree主要是可視化汗销,圖形如下:
此外犹褒,可以用復(fù)雜度損失修剪的方法,估計(jì)樹節(jié)點(diǎn)的參數(shù)值cp弛针,以達(dá)到預(yù)測的準(zhǔn)確性和樹大小的折中叠骑。然后利用prune來剪枝。(這里我不是很理解削茁,先這么看著吧)
printcp(rt.a1)
rt2.a1<-prune(rt.a1,cp=0.08)
rt2.a1
rpartXse函數(shù)是可以自動運(yùn)行這個過程座云,但是得到的圖形很奇怪。(下右圖)
rt.a1<-rpartXse(a1~.,data=algae[,1:12])
snip.rpart函數(shù)是交互的對樹進(jìn)行修剪(結(jié)果上左圖)
first.tree<-rpart(a1~.,data=algae[,1:12])
snip.rpart(first.tree,c(4,7))
或者采用直接點(diǎn)擊的方式修剪付材。(不過好像點(diǎn)擊了也沒有什么變化...)
prettyTree(first.tree)
snip.rpart(first.tree)
簡而言之朦拖,這部分主要講了線性和回歸樹,回歸樹那里常用的語句還是rpart厌衔¤档郏看其他案例,大多數(shù)也只用rpart富寿。雖然語句很簡單睬隶,也幾乎不用輸入?yún)?shù),但內(nèi)中含義很復(fù)雜啊页徐。
最后一部分講模型的評價和選擇~~~
第二部分完整代碼如下苏潜,不好用的語句我直接廢掉了:
#線性模型
lm.a1<-lm(a1~.,data=clean.algae[,1:12])
summary(lm.a1)
anova(lm.a1)
lm2.a1<-update(lm.a1,.~.-season)
summary(lm2.a1)
anova(lm.a1,lm2.a1)
final.lm<-step(lm.a1)
summary(final.lm)
#回歸樹
library(rpart)
rt.a1<-rpart(a1~.,data=algae[,1:12])
rt.a1
prettyTree(rt.a1)
printcp(rt.a1)
rt2.a1<-prune(rt.a1,cp=0.08)
rt2.a1
#rt.a1<-rpartXse(a1~.,data=algae[,1:12])
first.tree<-rpart(a1~.,data=algae[,1:12])
snip.rpart(first.tree,c(4,7))
#prettyTree(first.tree)
#snip.rpart(first.tree)