線性迴歸簡介
線性迴歸是利用最小二乘法對一個或多個自變量和因變量之間關係進行建模的一種迴歸分析。
變量類型
- 線性迴歸要求自變量與因變量皆是連續變量。
適用條件
- 線性趨勢。自變量與因變量之間的慣性應當是線性的。通過散點圖來判斷。
- 獨立性。因變量y的取值相互獨立,之間沒有聯繫。在線性模型中,實際上就是要求殘差()獨立。
- 正態性。因變量y服從正態分佈,實質就是要求殘差()正態分佈
- 方差齊性。因變量y的方差相等,在模型中即要求殘差()方差齊性。
分類
迴歸模型的分類非常多,針對線性迴歸的建模條件不滿足情況下,衍生出多種迴歸模型。常見模型有:
模型 | 描述 |
---|---|
OLS迴歸 | 最小二乘法迴歸,包括簡單線性迴歸、多項式迴歸、多元線性迴歸 |
含啞變量線性迴歸 | 自變量爲分類變量時,將分類變量進行虛擬化 |
加權最小二乘法 | OLS迴歸方差齊性要求不滿足時使用的迴歸模型 |
嶺迴歸 | 應對變量之間存在嚴重多重共線性的情況 |
非線性迴歸 | 應對變量之間的非線性關係 |
Logistic迴歸簇 | 應對因變量爲二分類變量、有序分類變量情況 |
自迴歸模型 | 應對變量獨立性不滿足情況,多用於時間序列分析 |
線性迴歸模型繁多,實際應用中最常見的三種爲OLS迴歸、二分類logistic迴歸、專門針對時間序列數據類型的時間序列分析。其他模型大致瞭解即可。
用途
- 預測
- 分類(logistic迴歸簇)
- 因果關係判斷
R語言實現
我們使用一個多元線性迴歸的例子貫穿這個建模過程。
線性建模的一般步驟如下:
- 模型建構
- 模型評估
- 模型檢驗
- 模型修正
模型建構
- 建立線性迴歸模型前通常檢驗變量之間的相關性,通過cov()或散點圖來判斷。兩個變量通過plot()生成散點圖,多個變量通過car包scatterplotMatrix()生成散點圖矩陣。
- 使用lm()擬合迴歸模型。
lm()函數基本形式如下:
myfit <- lm(formula,data)
其中,formula指要擬合的模型形式,data是擬合模型所需要的數據框。
表達式formula形式如下:
y~x1+x2+…+xk
~左邊爲因變量,右邊爲自變量。自變量之間用+號分割。
也可以用.表示納入除因變量之外所有自變量。
使用R基礎包state.x77數據集,探討一個州的犯罪和其他因素的關係,包括人口、文盲、平均收入和結霜天數(自然因素)
lm()需要數據框格式數據,使用as.data.frame()函數轉化爲數據框。
#生出數據框
states <- as.data.frame(state.x77[,c('Murder','Population','Illiteracy','Income','Frost')])
#相關性(結果佔據空間大,不展示)
cor(states)
#lm()
fit <- lm(Murder~.,data = states)
模型評估
模型評估就是通過各種指標來判斷模型擬合情況。
常見函數如下:
函數 | 用途 |
---|---|
summary() | 展示擬合模型的詳細結果 |
coeffictients() | 展示擬合模型的模型參數 |
confint() | 展示模型參數置信區間(默認95%) |
fitted() | 列出擬合模型預測值 |
residuals() | 列出擬合模型殘差值 |
anova() | 生成一個擬合模型的方差分析表或比較多個模型的方差分析表 |
vcov() | 列出模型參數的協方差矩陣 |
AIC() | 輸出赤池信息統計量 |
plot() | 生成評價擬合模型的診斷圖 |
predict() | 用擬合模型對新的數據集因變量進行預測 |
#使用summary函數查看擬合結果
summary(fit)
Call:
lm(formula = Murder ~ ., data = states)
Residuals:
Min 1Q Median 3Q Max
-4.7960 -1.6495 -0.0811 1.4815 7.6210
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.235e+00 3.866e+00 0.319 0.7510
Population 2.237e-04 9.052e-05 2.471 0.0173 *
Illiteracy 4.143e+00 8.744e-01 4.738 2.19e-05 ***
Income 6.442e-05 6.837e-04 0.094 0.9253
Frost 5.813e-04 1.005e-02 0.058 0.9541
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.535 on 45 degrees of freedom
Multiple R-squared: 0.567, Adjusted R-squared: 0.5285
F-statistic: 14.73 on 4 and 45 DF, p-value: 9.133e-08
#結果顯示(帶*號爲顯著變量),文盲率、人口與謀殺率存在顯著關係。
#決定係數R2表示,這些自變量可以解釋謀殺率57%的變化原因。
#confint(fit)
confint(fit)
2.5 % 97.5 %
(Intercept) -6.552191e+00 9.0213182149
Population 4.136397e-05 0.0004059867
Illiteracy 2.381799e+00 5.9038743192
Income -1.312611e-03 0.0014414600
Frost -1.966781e-02 0.0208304170
#置信區間方面。文盲率改變1%,謀殺率字95%置信區間[2.38-5.90]中變化。
#Frost置信區間包含0,所以該變量與謀殺率無關。
模型檢驗
模型檢驗就是檢驗線性迴歸模型的各種先決條件。
可以使用R基礎功能檢驗, 也可以使用car包進行檢驗。
R基礎功能:
函數 | 功能 |
---|---|
plot(fit) | 用plot函數檢驗擬合模型,結果返回包含正態性、線性趨勢、方差齊性情況的圖 |
- 正態性的數據在QQ圖中是落在45%度角直線上。
- 獨立性。通過經驗得出,無法通過這些圖辨別。
- 線性趨勢,通過‘殘差圖與擬合圖’(Residuals vs Fitted)。如果圖爲曲線,則需要對迴歸模型加上一個二次項。
- 方差齊性。位置尺度圖(scale-Location Graph),方差齊性的數據應該圍繞紅色水平線隨機分佈。
- 殘差與槓桿圖(Residuals vs Leverage)顯示離羣點、高槓杆值點、強影響點。
#生成一個2x2的畫布,將4幅圖合一
par(mfrow=c(2,2))
plot(fit)
如圖
car包:
函數 | 用途 | 指標 |
---|---|---|
qqplot() | 正態性檢驗 | 數據點離參照直線很近,且都落在置信區間。說明正態分佈情況好 |
durbinwatsonTest() | 德賓沃森誤差獨立性檢驗 | P>0.05,說明無自相關性,誤差項之間相互獨立 |
crPlot() | 成分與殘差圖 | 檢驗線性趨勢圖 |
ncvTest() | 對非恆定的殘差方差做得分檢驗 | 檢驗顯著,則說明存在異方差 |
apreadLevelplot() | 分散水平檢驗 | 以圖形式展示標準化殘差絕對值與擬合值的關係 |
outlierTest() | Bonferroni離羣點檢驗 | P<0.05,說明存在離羣點 |
avPolts() | 強影響點的變量圖形 | 圖 |
inluencePlot() | 迴歸影響圖 | 略 |
sactterplot() | 增強的散點圖 | 略 |
scatterplotMatrix() | 增強的散點圖矩陣 | 略 |
vif() | 方差膨脹因子 | 社科中,vif>5,存在多重共線性。vif>10,說明存在嚴重共線性 |
#限於篇幅,這裏只展示durbinwatsonTest和VIf函數
#載入包
library(car)
#德賓沃森獨立性診斷
durbinWatsonTest(fit)
lag Autocorrelation D-W Statistic p-value
1 -0.2006929 2.317691 0.264
Alternative hypothesis: rho != 0
#方差膨脹因子
vif(fit)
Population Illiteracy Income Frost
1.245282 2.165848 1.345822 2.082547
模型修正
模型修正就是改進模型、模型最優。
- 改進模型
情況 | 方法 |
---|---|
存在離羣點、強影響點 | 1刪除觀測點2做加權最小二乘法3增加樣本量 |
不符合正態分佈、線性、方差齊性 | 變量變換(常見方法取對數log(x),如果變量過0點,log(x+1)) |
存在嚴重多重共線性 | 1逐步迴歸2嶺迴歸3主成分迴歸4增加變量 |
其他 | 可以採用其他迴歸模型 |
- 模型比較
- 使用anova(fit1,fit2)比較模型,P>0.05,說明兩個模型沒有區別。
- 選擇AIC最小模型
- 選擇變量(從大量變量中選擇最終變量)
- 逐步迴歸(MASS包stepAIC())
- 全子集迴歸(leaps包regsubsets()函數)