1. 程式人生 > 其它 >R語言--迴歸(迴歸分析、迴歸診斷、模型綜合驗證)

R語言--迴歸(迴歸分析、迴歸診斷、模型綜合驗證)

1 OLS迴歸(最小二乘法迴歸)

1.1 lm()擬合迴歸模型

R中,擬合線性模型最基本的函式是lm(),格式為:myfit<-lm(formula,data)

1.2 簡單線性迴歸

dat<-women

fit<-lm(weight~height,data=dat)

summarize(fit)

結果分析:迴歸方程weight = 3.45 height - 87.51667,這兩個估計值是否可靠呢,需要看Pr(>|t|)值,p值小於0.05,我們就認為它在95%的置信區間上是不為0的,它的統計是顯著的,簡單一點,只要有星星,結果就可以認為是可靠的,看擬合優度Adjusted R-squared

0.9903,結果是非常好的,p-value是對整個方程的估計, p-value: 1.091e-14<0.05可以認為結果是可靠的

plot(dat$height,dat$weight)#檢視height和weight的散點圖(實際散點圖)

abline(fit)#畫迴歸線,檢視擬合結果(估計出來的線)

結果分析:散點圖是實際的資料,迴歸線基本在散點圖附近,說明擬合效果比較好

1.3 多項式迴歸(身高和體重的平方)

fit1<-lm(weight~height+I(height^2),data=dat)

解釋:為了防止錯誤識別^,加了一個I()函式,指出^是一個常規得符號

> summary(fit1)

結果分析:迴歸方程weight = -7.34832height + 0.08306height^2 + 261.87818,這兩個估計值是否可靠,需要看Pr(>|t|)值,p值小於0.05,我們就認為它在95%的置信區間上是不為0的,它的統計是顯著的,簡單一點,只要有星星,結果就可以認為是可靠的,看擬合優度Adjusted R-squared0.9994,結果是非常好的,p-value是對整個方程的估計, p-value: 2.2e-16<0.05可以認為結果是可靠的,對比上一個可以看出這個擬合優度更高

plot(dat$height,dat$weight)#畫散點圖

lines(dat$height,fitted(fit1))

解釋:使用函式lines()畫線,abline()只適用於一元,要給出橫座標dat$height,縱座標fitted(fit1)

1.4 多元線性迴歸(預測變數不止一個)

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

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

cor(states)#列出是所有列變數兩兩之間的相關係數

畫出全部兩兩變數之間的關係:

library(car)

scatterplotMatrix(states,spead=F,smooth.args=list(lty=2)

結果分析:對角線是單變數自己的分佈情況,其他情況雖然點很複雜,但上面清晰的描述了一條實線,大致說明了變數之間的關係

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

解釋:Murder是預測變數,Population+Illiteracy+Income+Frost是解釋變數

summary(fit2)

結果分析:Murder與Population和Illiteracy的關係後面的Pr(>|t|)小於0.05,後面有星星,說明他們之間的關係是顯著的,Murder與Income和Frost的關係後面的Pr(>|t|)大於0.05,後面也沒有星星,說明其關係不顯著,並且Income和Frost前面的係數 Estimate是正的,說明其與Murder是正相關,但是從上面的散點圖可以看出,估計出來的直線是向下的,即呈現負相關性,所以可以認為Murder與Income和Frost沒什麼關係

錯誤:下標出界

修正:檢查列名是否寫正確

1.1有互動項的多元線性迴歸

互動項:響應變數與其中一個預測變數的關係還依賴另外一個預測變數的水平

fit3<-lm(mpg~hp+wt+hp:wt,data=mtcars)#迴歸分析,互動項用冒號 :連線

summary(fit3)

結果分析:可以看出mpg與hp和wt以及它們的互動項hp:wt都是有關係的,後面有星星,三顆星表示關係是最好的

2 迴歸診斷

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

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

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

解釋:Murder是預測變數,Population+Illiteracy+Income+Frost是解釋變數

summary(fit2)

confint(fit2) #給出區間估計,95%的可能

2.1 標準方法

dat<-women#確定資料集

fit<-lm(height~weight,data=dat)#做迴歸分析

summary(fit)

opar<-par(no.readonly = T)

par(mfrow=c(2,2))#畫圖

plot(fit)

結果分析:右上角是Q-Q圖,反應樣本的正態性,樣本散點圖呈一條直線,基本認定是服從正太假設的;左上圖是觀察樣本的線性問題的,很明顯這個呈現是二次曲線,不滿足線性;左下角圖是觀察樣本的同方差性,如果是同方差性,這個線會在散點圖的上下兩側波動,這個圖是符合的;右下角圖是獨立性,觀察離群值

dat<-women

fit1<-lm(weight~height+I(height^2),data=dat)

opar<-par(no.readonly = T)

par(mfrow=c(2,2))

plot(fit1)

結果分析:右上角是Q-Q圖,反應樣本的正態性,樣本散點圖呈一條直線,基本認定是服從正太假設的;左上圖是觀察樣本的線性問題的,這次是擬合weightheight平方之間的關係,可以看出基本滿足線性;左下角圖是觀察樣本的同方差性,如果是同方差性,這個線會在散點圖的上下兩側波動,這個圖是符合的;右下角圖是獨立性,觀察離群值

2.2 改進方法

library(car)

1)正態性

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

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

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

解釋:Murder是預測變數,Population+Illiteracy+Income+Frost是解釋變數

summary(fit2)

par(mfrow=c(1,1))#把繪圖區域恢復

qqplot(fit2,labels=row.names(states),id.mentod="identify",

simulate=T,main="QQ plot")

結果分析:大多數點置信區間(兩條虛線之間)範圍內,點基本在一條直線上,我們可以認為此樣本基本符合正太分佈

這個州 Nevada 的估計值:

這個州 Nevada 的實際值:

結論:這個州的估計和實際差別很大,在實際應用中可以當離群點刪掉

錯誤:種類'list'目前沒有在'greater'裡實現

修正:這裡是為什麼呢??

後來仔細檢查了語句,單詞大小寫錯了

2)獨立性

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

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

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

解釋:Murder是預測變數,Population+Illiteracy+Income+Frost是解釋變數

durbinWatsonTest(fit2)

結論分析:我們希望p-value的值越大越好,如何很大,就說明不相關,即互相獨立,基本上我們可以認為這些變數是互相獨立的

(3)線性

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

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

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

par(mfrow=c(2,2))

crPlots(fit2)#畫成分殘差圖

結果分析:虛線是直線,是最小二乘法估計,我們需要看實線是否與虛線基本重合,若基本重合,我們認為是呈線性關係的

(4)同方差性

ncvTest(fit2)

結果分析:跟上面一樣,P值越大越好,P越大說明其是同方差性的,滿足假設

2.3 線性模型假設的綜合驗證

install.packages("gvlma")

library(gvlma)

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

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

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

解釋:Murder是預測變數,Population+Illiteracy+Income+Frost是解釋變數

gvmodel<-gvlma(fit2)

summary(gvmodel)

結果分析:這裡後面都是acceptable,若是不接受,要一個個檢查上面四個圖

2.3.1 多重共線性

vif(fit2)

結果分析:計算出這四個方差膨脹因子,書本上認為小於4就可以,實際上我們還是會計算一下相關係數

cor(states) #做兩兩變數之間的相關性係數的比較

結果分析:一般對角線上的值越大越好,除對角線以外的矩陣數字最好不要大於0.7

本文來自部落格園,作者:zhang-X,轉載請註明原文連結:https://www.cnblogs.com/YY-zhang/p/14978845.html