26-R線性回歸及回歸診斷實(shí)例

1、OLS線性回歸的基本原則

最優(yōu)擬合曲線應(yīng)該使各點(diǎn)到直線的距離的平方和(即殘差平方和,簡(jiǎn)稱RSS)最小。

2、OLS線性回歸模型假設(shè):

  1. 正態(tài)性:對(duì)于固定的自變量值,因變量值成正態(tài)分布;
  2. 獨(dú)立性:個(gè)體之間相互獨(dú)立;
  3. 線性相關(guān):因變量和自變量之間為線性相關(guān);
  4. 同方差性:因變量的方差不隨自變量的水平不同而變化,即因變量的方差是不變的。

3、lm()線性回歸函數(shù)

lm(formula, data)

formula中的符號(hào)注釋:

~分割符號(hào),左邊為因變量,右邊為自變量,例如, z~x+y,表示通過(guò)x和y來(lái)預(yù)測(cè)z

+分割預(yù)測(cè)變量

:表示預(yù)測(cè)變量的交互項(xiàng),例如,z~x+y+x:y

* 表示所有可能的交互項(xiàng),例如,z~x*y 展開(kāi)為 z~x+y+x:y

^表示交互項(xiàng)的次數(shù),例如,z ~ (x+y)^2,展開(kāi)為z~x+y+x:y

.表示包含除因變量之外的所有變量,例如,如果只有三個(gè)變量x,y和z,那么代碼 z~. 展開(kāi)為z~x+y+x:y

-1表示刪除截距項(xiàng),強(qiáng)制回歸的直線通過(guò)原點(diǎn)

I()從算術(shù)的角度來(lái)解釋括號(hào)中的表達(dá)式,例如,z~y+I(x^2) 表示的擬合公式是 z=a+by+cx2

function 可以在表達(dá)式中應(yīng)用數(shù)學(xué)函數(shù),例如,log(z) ~x+y

對(duì)于擬合后的模型(lm函數(shù)返回的對(duì)象),可以應(yīng)用下面的函數(shù),得到模型的更多額外的信息:

summary() 展示擬合模型的詳細(xì)結(jié)果

coefficients()列出模型的參數(shù)(截距項(xiàng)intercept和斜率)

confint()提供模型參數(shù)的置信區(qū)間

residuals() 列出擬合模型的殘差值

fitted() 列出擬合模型的預(yù)測(cè)值

anova() 生成一個(gè)擬合模型的方差分析表

predict() 用擬合模型對(duì)新的數(shù)據(jù)預(yù)測(cè)響應(yīng)變量

4、舉個(gè)例子

4.1 數(shù)據(jù)

library(pacman)
p_load(stargazer)

x <- c(1.5,2.8,4.5,7.5,10.5,13.5,15.1,16.5,19.5,22.5,24.5,26.5) 
y <- c(7.0,5.5,4.6,3.6,2.9,2.7,2.5,2.4,2.2,2.1,1.9,1.8)

4.2 模型選擇

4.2.1 直線回歸

lm1 <- lm(y~x)
stargazer(lm1, # 模型對(duì)象、數(shù)據(jù)框、向量、矩陣、列表
          type = "text", # 可設(shè)置為text、html、latex
          title = "y ~ x", # 表名
          style = "default",
          summary = F, # 是否做數(shù)據(jù)統(tǒng)計(jì)
          align = T, # 是否居中
          no.space = T, # 刪除空行
          single.row = T,# 使估計(jì)量和置信區(qū)間并排展示
          keep.stat = "adj.rsq", # keep.stat="n"只展示樣本量的大小,并移除其他統(tǒng)計(jì)量
          font.size = "large", 
          model.names = T,
          header = F # 避免輸出關(guān)于包作者的一些信息
          )
## y ~ x
## =======================================
##                 Dependent variable:    
##             ---------------------------
##                          y             
##                         OLS            
## ---------------------------------------
## x                -0.170*** (0.027)     
## Constant         5.603*** (0.435)      
## ---------------------------------------
## Adjusted R2            0.776           
## =======================================
## Note:       *p<0.1; **p<0.05; ***p<0.01

修正后的R2=0.776,不是很理想。

4.2.2 多項(xiàng)式回歸

x1=x
x2=x2

x1 <- x
x2 <- x^2
lm2 <- lm(y~x1+x2)
stargazer(lm2, 
          type = "text", 
          title = "y ~ x1 + x2",
          style = "default",
          summary = F, 
          align = T, 
          no.space = T, 
          single.row = T,
          keep.stat = "adj.rsq", 
          font.size = "large", 
          model.names = T,
          header = F 
          )
## 
## y ~ x1 + x2
## =======================================
##                 Dependent variable:    
##             ---------------------------
##                          y             
##                         OLS            
## ---------------------------------------
## x1               -0.466*** (0.057)     
## x2               0.011*** (0.002)      
## Constant         6.915*** (0.332)      
## ---------------------------------------
## Adjusted R2            0.941           
## =======================================
## Note:       *p<0.1; **p<0.05; ***p<0.01

修正后的R2=0.941,比直線回歸改善很多。
畫(huà)個(gè)擬合圖看看效果:

library(tidyverse)
df1 <- cbind(y=y,x=x) %>% as.data.frame()
df2 <- cbind(y=fitted(lm2),x=x) %>% as.data.frame()
ggplot() +
  geom_point(data=df1,aes(x,y)) +
  geom_line(data=df2,aes(x,y))
多項(xiàng)式回歸

4.2.3 對(duì)數(shù)回歸

x=log(x)

lm3 <- lm(y ~ log(x))
stargazer(lm3, 
          type = "text", 
          title = "y ~ log(x)",
          style = "default",
          summary = F, 
          align = T, 
          no.space = T, 
          single.row = T,
          keep.stat = "adj.rsq", 
          font.size = "large", 
          model.names = T,
          header = F 
          )
## 
## y ~ log(x)
## =======================================
##                 Dependent variable:    
##             ---------------------------
##                          y             
##                         OLS            
## ---------------------------------------
## log(x)           -1.757*** (0.068)     
## Constant         7.364*** (0.169)      
## ---------------------------------------
## Adjusted R2            0.984           
## =======================================
## Note:       *p<0.1; **p<0.05; ***p<0.01

修正后的R2=0.984,比多項(xiàng)式回歸又有了改善。
畫(huà)個(gè)擬合圖看看效果,可以看到擬合效果更好:

df3 <- cbind(y=fitted(lm3),x=x) %>% as.data.frame()
ggplot() +
  geom_point(data=df1,aes(x,y)) +
  geom_line(data=df3,aes(x,y))
對(duì)數(shù)回歸

4.2.4 指數(shù)回歸

y=log(y)

lm4 <- lm(log(y) ~ x)
stargazer(lm4, 
          type = "text", 
          title = "log(y) ~ x",
          style = "default",
          summary = F, 
          align = T, 
          no.space = T, 
          single.row = T,
          keep.stat = "adj.rsq", 
          font.size = "large", 
          model.names = T,
          header = F 
          )
## 
## log(y) ~ x
## =======================================
##                 Dependent variable:    
##             ---------------------------
##                       log(y)           
##                         OLS            
## ---------------------------------------
## x                -0.049*** (0.005)     
## Constant         1.760*** (0.075)      
## ---------------------------------------
## Adjusted R2            0.907           
## =======================================
## Note:       *p<0.1; **p<0.05; ***p<0.01

修正后的R2=0.907,比多項(xiàng)式回歸還差。

4.2.5 冪函數(shù)回歸

y=log(y)
x=log(x)

lm5 <- lm(log(y) ~ log(x))
stargazer(lm5, 
          type = "text", 
          title = "log(y) ~ log(x)",
          style = "default",
          summary = F, 
          align = T, 
          no.space = T, 
          single.row = T,
          keep.stat = "adj.rsq", 
          font.size = "large", 
          model.names = T,
          header = F 
          )
## 
## log(y) ~ log(x)
## =======================================
##                 Dependent variable:    
##             ---------------------------
##                       log(y)           
##                         OLS            
## ---------------------------------------
## log(x)           -0.472*** (0.012)     
## Constant         2.191*** (0.030)      
## ---------------------------------------
## Adjusted R2            0.993           
## =======================================
## Note:       *p<0.1; **p<0.05; ***p<0.01

修正后的R2=0.993,比對(duì)數(shù)回歸又有了改善。
畫(huà)個(gè)擬合圖看看效果,可以看到冪函數(shù)法擬合效果最好:

df4 <- cbind(y=exp(fitted(lm5)),x=x) %>%  as.data.frame()
ggplot() +
  geom_point(data=df1,aes(x,y)) +
  geom_line(data=df4,aes(x,y))
冪函數(shù)回歸

5、回歸診斷內(nèi)容

  1. 樣本是否符合正態(tài)分布假設(shè)?
  2. 是否存在離群值導(dǎo)致模型產(chǎn)生較大誤差?
  3. 線性模型是否合理?
  4. 殘差是否滿足獨(dú)立性、等方差、正態(tài)分布等假設(shè)條件?
  5. 是否存在多重共線性?

回歸診斷的總結(jié)的函數(shù)為:influence.measures()

5.1 正態(tài)性檢驗(yàn)

  1. 函數(shù)shapiro.test()
  2. 直方圖或散點(diǎn)圖目測(cè)檢驗(yàn)
  3. 殘差計(jì)算函數(shù)residuals(),對(duì)殘差作正態(tài)性檢驗(yàn)(殘差散點(diǎn)圖)
# 殘差正態(tài)性檢驗(yàn),P值>0.05,W接近1說(shuō)明符合正態(tài)分布
shapiro.test(lm5$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  lm5$residuals
## W = 0.93033, p-value = 0.3837
# 回歸診斷的標(biāo)準(zhǔn)方法
par(mfrow=c(2,2))
plot(lm5)
回歸診斷

正態(tài)性:當(dāng)預(yù)測(cè)變量值固定時(shí),因變量成正態(tài)分布,則殘差值也應(yīng)該是一個(gè)均值為0的正態(tài)分布。正態(tài)QQ圖(Normal Q-Q)是在正態(tài)分布對(duì)應(yīng)的值下,標(biāo)準(zhǔn)化殘差的概率圖。圖中的數(shù)據(jù)點(diǎn)按對(duì)角直線排列,趨于一條直線,并被對(duì)角直接穿過(guò),直觀上符合正態(tài)分布。對(duì)于近似服從正態(tài)分布的標(biāo)準(zhǔn)化殘差,應(yīng)該有 95% 的樣本點(diǎn)落在 [-2,2] 區(qū)間內(nèi);若不是如此,就違反了正態(tài)假設(shè)。

獨(dú)立性:無(wú)法判斷因變量和自變量的值是否相互獨(dú)立,只能從收集的數(shù)據(jù)中來(lái)驗(yàn)證。

線性相關(guān)性:若因變量與自變量線性相關(guān),那么殘差值與預(yù)測(cè)(擬合)值除了系統(tǒng)誤差之外,就沒(méi)有任何關(guān)聯(lián)。在殘差和擬合圖(Residuals VS Fitted)中,可以看到一條曲線,這暗示著可能需要對(duì)擬合模型加上一個(gè)二次項(xiàng)。(所以我們最后選擇冪函數(shù)回歸)

同方差性:若滿足不變方差假設(shè),那么在位置尺度圖(Scale-Location)中,水平線周?chē)狞c(diǎn)應(yīng)該隨機(jī)分布。

殘差和杠桿圖(Residuals VS Leverage)提供了特殊的單個(gè)觀測(cè)點(diǎn)(離群點(diǎn)、高杠桿點(diǎn)、強(qiáng)影響點(diǎn))的信息,本圖中出現(xiàn)了紅色的等高線,說(shuō)明數(shù)據(jù)中存在特別影響回歸結(jié)果的異常點(diǎn)。殘差和杠桿圖的可讀性差,不夠?qū)嵱谩?/strong>

  • 離群點(diǎn):表明擬合回歸模型對(duì)其預(yù)測(cè)效果不佳(產(chǎn)生巨大的殘差)
  • 高杠桿點(diǎn):指自變量因子空間中的離群點(diǎn)(異常值),是由許多異常的自變量值組合起來(lái)的,與因變量沒(méi)有關(guān)系。
  • 強(qiáng)影響點(diǎn):表明它對(duì)模型參數(shù)的估計(jì)產(chǎn)生的影響過(guò)大,非常不成比例。強(qiáng)影響點(diǎn)可以通過(guò)Cook距離(Cook distance)統(tǒng)計(jì)量來(lái)鑒別。看到上面4幅中,每幅圖上都有一些點(diǎn)被特別的標(biāo)記出來(lái)了,這些點(diǎn)是可能存在的異常值點(diǎn),如果要對(duì)模型進(jìn)行優(yōu)化,我們可以從這些來(lái)入手,從圖中發(fā)現(xiàn),索引編號(hào)為1、3和12的3個(gè)點(diǎn)在多幅圖中出現(xiàn)。這3個(gè)點(diǎn)可能為異常點(diǎn),可以從數(shù)據(jù)中去掉這3個(gè)點(diǎn),再進(jìn)行顯著性檢驗(yàn)和殘差分析。但本次殘差分析的結(jié)果已經(jīng)很好了,所以對(duì)于異常點(diǎn)的優(yōu)化,可能并不能明顯的提升模型的效果。

5.2 殘差正態(tài)性檢驗(yàn)(qqplot)

car包qqplot()函數(shù)提供了精確的正態(tài)假設(shè)檢驗(yàn)方法,置信區(qū)間通過(guò)虛線劃定,當(dāng)絕大多數(shù)點(diǎn)都落在置信區(qū)間時(shí),說(shuō)明正態(tài)性假設(shè)符合得很好。

5.3 離群值(強(qiáng)影響點(diǎn))

hv <- hatvalues(lm5);hv
##          1          2          3          4          5          6          7          8          9 
## 0.48254231 0.26578892 0.15707660 0.09415762 0.08337304 0.09120380 0.09907002 0.10721053 0.12714202 
##         10         11         12 
## 0.14898865 0.16407973 0.17936679
# 如何找到最重要或最有影響的觀察結(jié)果?將hat值切分為四分位數(shù),應(yīng)用95%標(biāo)準(zhǔn)過(guò)濾最異常值,將該過(guò)濾標(biāo)準(zhǔn)應(yīng)用于觀察結(jié)果
hv.vip <- df4$hv[df4$hv > quantile(hv,0.95)];hv.vip

# 具象化
df5 <- cbind(df1,hv=hv)
plot(df5$x,df5$y,col=ifelse(df5$hv > quantile(hv,0.95),'red','blue'))
離群點(diǎn)

5.4 誤差的獨(dú)立性

car包提供了durbinWatsonTest()函數(shù),用于做Durbin-Watson檢驗(yàn),檢測(cè)誤差的序列相關(guān)性。

durbinWatsonTest(lm5)
lag Autocorrelation D-W Statistic p-value
   1       0.1840413      1.184471   0.048
 Alternative hypothesis: rho != 0

p值<0.05,不顯著,誤差項(xiàng)之間獨(dú)立,不存在自相關(guān)性。

5.5 線性相關(guān)性

通過(guò)成分殘差圖(component + residual plots)檢查因變量和自變量之間是否呈線性關(guān)系。若圖形存在非線性,則說(shuō)明可能對(duì)預(yù)測(cè)變量的函數(shù)形式建模不夠充分,那么需要添加一些曲線成分,比如多項(xiàng)式,對(duì)一個(gè)或多個(gè)變量進(jìn)行變換(log(x)代替x),或用其他回歸變體形式而不是線性回歸。

crPlots(lm5)
線性相關(guān)性

5.6 同方差性

判斷方差是否恒定,nvcTest()函數(shù)生成一個(gè)記分檢驗(yàn),原假設(shè)為誤方差不變,備擇假設(shè)為誤差方差隨著擬合值水平的變化而變化。若檢驗(yàn)顯著,說(shuō)明存在誤方差不恒定。

spreadLevelPlot()函數(shù)創(chuàng)建了一個(gè)添加了最佳擬合曲線的散點(diǎn)圖,展示了標(biāo)準(zhǔn)化殘差絕對(duì)值與擬合值的關(guān)系。

ncvTest(lm5)
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 0.4044358, Df = 1, p = 0.52481

記分檢驗(yàn)不顯著:p=0.52481,說(shuō)明滿足方差不變假設(shè),也可以通過(guò)分布水平看到這一點(diǎn),點(diǎn)在水平的最佳擬合曲線周?chē)孰S機(jī)分布。

spreadLevelPlot(lm5)
水平分布

5.7 多重共線性(一個(gè)自變量不存在)

在回歸分析的時(shí)候,古典模型中有一個(gè)基本的假定就是自變量之間是不相關(guān)的,但是如果我們?cè)跀M合出來(lái)的回歸模型出現(xiàn)了自變量之間高度相關(guān)的話,可能對(duì)結(jié)果又產(chǎn)生影響,我們稱這個(gè)問(wèn)題為多重共線性。
根據(jù)經(jīng)驗(yàn)表明,多重共線性存在的一個(gè)標(biāo)志就是模型存在較大的標(biāo)準(zhǔn)差和較小的T統(tǒng)計(jì)量,如果一個(gè)模型的可決系數(shù)R2很大,F(xiàn)檢驗(yàn)高度限制,但偏回歸系數(shù)的T檢驗(yàn)幾乎都不顯著,那么模型很可能是存在多重共線性。

  1. 利用自變量之間的簡(jiǎn)單相關(guān)系數(shù)檢驗(yàn),一般而言,如果兩個(gè)解釋變量的簡(jiǎn)單相關(guān)系數(shù)較高,則可以認(rèn)為是存在著嚴(yán)重的多重共線性。
  2. 隨著多重共線性的嚴(yán)重程度增強(qiáng),方差膨脹因子會(huì)逐漸的變大,在回歸中我們用VIF表示方差膨脹因子,VIF=1/(1-R2)。一般當(dāng)VIF>=10的時(shí)候,我們就可以認(rèn)為存在嚴(yán)重多重共線性。
    car包中的vif()函數(shù)可以幫我們算出這個(gè)方差膨脹:
library(car)
vif(lm5) 

存在多重共線性的解決方法之一:利用MASS包中的函數(shù)lm.ridge()來(lái)建立嶺回歸模型。

6、回歸診斷(gvlma包)

gvlma()函數(shù),用于對(duì)線性模型假設(shè)進(jìn)行綜合驗(yàn)證,同時(shí)還能驗(yàn)證偏斜度,峰度和異方差的評(píng)價(jià)。從輸出項(xiàng)中可以看出,假設(shè)檢驗(yàn)的顯著性水平是5%。如果p<0.05,說(shuō)明違反了假設(shè)條件。從Global Stat 的Decision 欄中,可以看到數(shù)據(jù)滿足OLS回歸模型所有統(tǒng)計(jì)假設(shè)的P值(Assumptions acceptable)。

library(gvlma)
gvmodel <- gvlma(lm5)
summary(gvmodel)
## 
## Call:
## lm(formula = log(y) ~ log(x))
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.054727 -0.020805  0.004548  0.024617  0.045896 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  2.19073    0.02951   74.23 4.81e-15 ***
## log(x)      -0.47243    0.01184  -39.90 2.34e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.0361 on 10 degrees of freedom
## Multiple R-squared:  0.9938, Adjusted R-squared:  0.9931 
## F-statistic:  1592 on 1 and 10 DF,  p-value: 2.337e-12
## 
## 
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance =  0.05 
## 
## Call:
##  gvlma(x = lm5) 
## 
##                      Value  p-value                   Decision
## Global Stat        8.46263 0.076028    Assumptions acceptable.
## Skewness           0.26282 0.608186    Assumptions acceptable.
## Kurtosis           0.52317 0.469492    Assumptions acceptable.
## Link Function      7.63997 0.005709 Assumptions NOT satisfied!
## Heteroscedasticity 0.03666 0.848150    Assumptions acceptable.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容