26-R線性回歸及回歸診斷實例

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

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

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

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

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

lm(formula, data)

formula中的符號注釋:

~分割符號踱蛀,左邊為因變量,右邊為自變量芙扎,例如星岗, z~x+y,表示通過x和y來預(yù)測z

+分割預(yù)測變量

:表示預(yù)測變量的交互項戒洼,例如俏橘,z~x+y+x:y

* 表示所有可能的交互項,例如圈浇,z~x*y 展開為 z~x+y+x:y

^表示交互項的次數(shù)寥掐,例如,z ~ (x+y)^2磷蜀,展開為z~x+y+x:y

.表示包含除因變量之外的所有變量召耘,例如,如果只有三個變量x褐隆,y和z污它,那么代碼 z~. 展開為z~x+y+x:y

-1表示刪除截距項,強制回歸的直線通過原點

I()從算術(shù)的角度來解釋括號中的表達式庶弃,例如衫贬,z~y+I(x^2) 表示的擬合公式是 z=a+by+cx2

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

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

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

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

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

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

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

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

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

4缴守、舉個例子

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, # 模型對象葬毫、數(shù)據(jù)框、向量屡穗、矩陣贴捡、列表
          type = "text", # 可設(shè)置為text、html村砂、latex
          title = "y ~ x", # 表名
          style = "default",
          summary = F, # 是否做數(shù)據(jù)統(tǒng)計
          align = T, # 是否居中
          no.space = T, # 刪除空行
          single.row = T,# 使估計量和置信區(qū)間并排展示
          keep.stat = "adj.rsq", # keep.stat="n"只展示樣本量的大小烂斋,并移除其他統(tǒng)計量
          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 多項式回歸

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源祈,比直線回歸改善很多。
畫個擬合圖看看效果:

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))
多項式回歸

4.2.3 對數(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色迂,比多項式回歸又有了改善香缺。
畫個擬合圖看看效果,可以看到擬合效果更好:

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))
對數(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歇僧,比多項式回歸還差图张。

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,比對數(shù)回歸又有了改善诈悍。
畫個擬合圖看看效果祸轮,可以看到冪函數(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. 殘差是否滿足獨立性舷夺、等方差苦酱、正態(tài)分布等假設(shè)條件?
  5. 是否存在多重共線性给猾?

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

5.1 正態(tài)性檢驗

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

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

獨立性:無法判斷因變量和自變量的值是否相互獨立,只能從收集的數(shù)據(jù)中來驗證涌矢。

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

同方差性:若滿足不變方差假設(shè)励负,那么在位置尺度圖(Scale-Location)中藕溅,水平線周圍的點應(yīng)該隨機分布。

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

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

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

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

5.3 離群值(強影響點)

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)準過濾最異常值,將該過濾標(biāo)準應(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'))
離群點

5.4 誤差的獨立性

car包提供了durbinWatsonTest()函數(shù)蛇捌,用于做Durbin-Watson檢驗抚恒,檢測誤差的序列相關(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络拌,不顯著柑爸,誤差項之間獨立,不存在自相關(guān)性盒音。

5.5 線性相關(guān)性

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

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

5.6 同方差性

判斷方差是否恒定屯蹦,nvcTest()函數(shù)生成一個記分檢驗维哈,原假設(shè)為誤方差不變,備擇假設(shè)為誤差方差隨著擬合值水平的變化而變化登澜。若檢驗顯著阔挠,說明存在誤方差不恒定。

spreadLevelPlot()函數(shù)創(chuàng)建了一個添加了最佳擬合曲線的散點圖脑蠕,展示了標(biāo)準化殘差絕對值與擬合值的關(guān)系购撼。

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

記分檢驗不顯著:p=0.52481,說明滿足方差不變假設(shè)谴仙,也可以通過分布水平看到這一點迂求,點在水平的最佳擬合曲線周圍呈隨機分布。

spreadLevelPlot(lm5)
水平分布

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

在回歸分析的時候晃跺,古典模型中有一個基本的假定就是自變量之間是不相關(guān)的揩局,但是如果我們在擬合出來的回歸模型出現(xiàn)了自變量之間高度相關(guān)的話,可能對結(jié)果又產(chǎn)生影響掀虎,我們稱這個問題為多重共線性凌盯。
根據(jù)經(jīng)驗表明,多重共線性存在的一個標(biāo)志就是模型存在較大的標(biāo)準差和較小的T統(tǒng)計量涩盾,如果一個模型的可決系數(shù)R2很大十气,F(xiàn)檢驗高度限制,但偏回歸系數(shù)的T檢驗幾乎都不顯著春霍,那么模型很可能是存在多重共線性砸西。

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

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

6翁逞、回歸診斷(gvlma包)

gvlma()函數(shù)肋杖,用于對線性模型假設(shè)進行綜合驗證,同時還能驗證偏斜度挖函,峰度和異方差的評價状植。從輸出項中可以看出,假設(shè)檢驗的顯著性水平是5%怨喘。如果p<0.05津畸,說明違反了假設(shè)條件。從Global Stat 的Decision 欄中必怜,可以看到數(shù)據(jù)滿足OLS回歸模型所有統(tǒng)計假設(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)容合作請聯(lián)系作者
  • 序言:七十年代末旧烧,一起剝皮案震驚了整個濱河市裂问,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌来庭,老刑警劉巖靠益,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丧肴,死亡現(xiàn)場離奇詭異,居然都是意外死亡胧后,警方通過查閱死者的電腦和手機芋浮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壳快,“玉大人纸巷,你說我怎么就攤上這事】籼担” “怎么了瘤旨?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長竖伯。 經(jīng)常有香客問我存哲,道長因宇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任祟偷,我火速辦了婚禮察滑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘修肠。我一直安慰自己贺辰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布嵌施。 她就那樣靜靜地躺著饲化,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吗伤。 梳的紋絲不亂的頭發(fā)上滓侍,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音牲芋,去河邊找鬼。 笑死捺球,一個胖子當(dāng)著我的面吹牛缸浦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氮兵,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼裂逐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泣栈?” 一聲冷哼從身側(cè)響起卜高,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎南片,沒想到半個月后掺涛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡疼进,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年薪缆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伞广。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拣帽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嚼锄,到底是詐尸還是另有隱情减拭,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布区丑,位于F島的核電站拧粪,受9級特大地震影響修陡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜既们,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一濒析、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啥纸,春花似錦号杏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荣暮,卻和暖如春庭惜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背穗酥。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工护赊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砾跃。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓骏啰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抽高。 傳聞我的和親對象是個殘疾皇子判耕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容