R語言--回歸分析2(異常值處理、全子集回歸、交叉驗證)


1 異常觀測值

states<-as.data.frame(state.x77[,c("Murder",

           "Population","Illiteracy","Income","Frost")])

fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)  #回歸分析

summary(fit)

 

1.1 離群值 (y,模型做出來之后,預測的特別不准的值)

library(car)

outlierTest(fit)

 

 

1.2 高杠桿值(只看xx值比較突出)

hat.plot<-function(fit){

  p<-length(coefficients(fit))#返回各相關系數的長度

 

 

  n<-length(fitted(fit))  #fitted是一個通用函數,用於從建模函數返回的對象中提取擬合值

  plot(hatvalues(fit),main="Index Plot of Hat Values")

  abline(h=c(2,3)*p/n,col="red",lty=3)  #畫參考線,紅色的

  identify(1:n,hatvalues(fit),names(hatvalues(fit)))  #標出幾個高杠桿點的名字

}

hat.plot(fit)  

 

結果分析:看到圖的左上角有這句話

,依次點擊高杠桿點(第一條紅線上方的點),然后按鍵盤Esc,就會出現上圖所示的5個點的名字,

 

1.3 強影響點(如果把強影響點去掉,回歸模型會發生巨大的變化,對參數估計產生強影響)

cutoff<-4/(nrow(states)-length(fit$coefficients)-2)

plot(fit,which=4,cook,levels=cutoff)

abline(h=cutoff,lty=3,col="red")

 

 

 

1.4 綜合給出離群值,高杠桿值、強影響點

library(car)

influencePlot(fit,id=list(method="identity"))  #為什么我的不是互動圖

 

結果分析:在縱軸(y軸)上超過虛線2的就認為是離群點,在橫軸(x軸)認為超過第二根虛線的就是高杠桿點,氣泡很大的點認為是強影響點

 

2 改進措施

states<-as.data.frame(state.x77[,c("Murder",

           "Population","Illiteracy","Income","Frost")])

fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)  #回歸分析

 

2.1 刪除觀測點

states2<-subset(states,row.names(states)!="Nevada")  #刪除Nevada州這個記錄

 

2.2 變量變換

方式一:y變換

library(car)

summary(powerTransform((states$Murder)))

 

結果分析:Est Power這個表明了是y的期待值,下方的 0.6055y0.6055次方;lambda = (0)這個0代表logy,做了假設檢驗,這里 pval=0.017297P值小於0.05,即不合理;lambda = (1)這里的1代表y的一次方,(如果括號里面是-1,則代表y-1次方),此時統計檢驗的結果 pval=0.14512P值大於0.05,這個時候不能拒絕,我們會繼續用y=kx做回歸,這個時候就不會考慮上方的期待值Est Power

 

方式二:對x變換

boxTidwell(Murder~Population+Illiteracy,data=states)

 

結果分析:這里給出了Murder= Population0.86939 次方 + Illiteracy1.35812次方,並且Pr(>|z|) 都大於0.05,不能拒絕,所以我們會保留y = k0 + k1x + k2x 這種形式

 

2.3 增加或刪除變量

states2<-subset(states,row.names(states)!="Nevada",select=c(-Income,-Frost))

解釋:這里刪除了州Nevada所在行的記錄,並且刪除了兩列IncomeFrost

 

 

  

3 選擇最佳的回歸模型

states<-as.data.frame(state.x77[,c("Murder",

           "Population","Illiteracy","Income","Frost")])

fit1<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)  #回歸分析

fit2<-lm(Murder~Population+Illiteracy,data=states)  #回歸分析

 

3.1 模型比較

1anova(fit1,fit2)

 

結果分析:Pr(>F)=0.9939大於0.05,所以不能拒絕原假設,即我們的兩個模型fit1fit2沒什么差別

2AIC(fit1,fit2)

 

結果分析:AIC是對模型精度和簡潔的權衡,越小越好,所以我們更傾向於選擇fit2(即兩變量PopulationIlliteracy 模型)

 

3.2 變量選擇

library(MASS)

stepAIC(fit1,direction="backward")

 

 

結果分析:首先給出AIC的值,即AIC=97.75,之后通過一個個刪除變量,每次計算AIC的值,若刪除某變量能使AIC的值變小,就給刪除,因此最后得出了最佳的模型,即lm(formula = Murder ~ Population + Illiteracy, data = states),並且給出了各變量的系數

 

 

 

 3.3  全子集回歸

上節中的輪流刪除會存在爭議,沒有排列組合,所以用此來做排列組合確定精度更佳

library(leaps)

leaps<-regsubsets(Murder~Population+Illiteracy+Income+Frost,data=states,nbest = 4)

plot(leaps,scale="adjr2")

 

結果分析:縱軸是我們需要看的,最上面的是最優擬合的

 

4 深層次分析

states<-as.data.frame(state.x77[,c("Murder",

           "Population","Illiteracy","Income","Frost")])

fit1<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)  #回歸分析

fit2<-lm(Murder~Population+Illiteracy,data=states)  #回歸分析

 

4.1 交叉驗證

install.packages("bootstrap")  #下載包

shrinkage<-function(fit,k=10){   #自定義函數,定義形參

  require(bootstrap)  #類似與library(),加載包的功能

  

  theta.fit<-function(x,y){lsfit(x,y)} #lsfit是最小二乘法擬合,theta.fit是線性模型

  theta.predict<-function(fit,x){cbind(1,x)%%fit$coef}  

  #cbind(1,x)x多增加一列,這一列全部是1fit$coef是回歸系數, theta.predict是線性模型的預測

  x<-fit$model[,2:ncol(fit$model)]  #x是所有行,並且是第2列到最后一列

  y<-fit$model[,1]   #yfit1表的第一列中的內容

  

  resules<-crossval(x,y,theta.fit,theta.predict,ngroup=k) #傳遞參數,做k重交叉驗證

  

  r2<-cor(y,fit$fitted.values)^2  #求原始的R平方

  r2cv<-cor(y,resules$cv.fit)^2  #求交叉驗證之后的R平方

  

  cat("Original R-square=",r2,"\n")  #cat()函數是把字符串連接起來的功能,把結果輸出到屏幕上

  cat(k,"Fold Cross-Validated R-square=",r2cv,"\n")

  cat("Chage=",r2-r2cv,"\n")

}

 

 結果分析:經過10重驗證之后,即設置k=10R-square改變了很多,其中改變值 Chage= 0.5635281 ,改變值比較大,說明模型不穩定

 

結果分析:經過10重驗證之后,即設置k=10R-square改變很小,其中改變值 Chage= 0.1983639  ,改變值很小,說明模型穩定

 

4.2 相對重要性

states<-as.data.frame(state.x77[,c("Murder",

                                   "Population","Illiteracy","Income","Frost")])

fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)

zstates<-as.data.frame(scale(states))  #對每列數據標准化

zfit<-lm(Murder~Population+Illiteracy+Income+Frost,data=zstates)  #做回歸分析

coef(zfit) #求回歸系數

 

結果分析:文盲率Illiteracy每增加1個點,謀殺率Murder會增加6.8


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM