最近對線性回歸很感興趣,前面用Python從底層一步一個腳印用兩種方法實現了回歸擬合。在這個高級語言層出不窮的年代,這樣做顯然不明智,所以我考慮用優秀的數據分析工具——R語言(不敢說最優秀,雖然心裡是這麼想的,我怕有人要罵我!)做回歸分析。包括簡單多變量回歸、逐步回歸、邏輯回歸!
對了,上次,用Python寫的兩篇回歸擬合分別是:
基於最小二乘法的——線性回歸擬合(一)
基於梯度下降法的——線性回歸擬合(二)
多元回歸分析,生活中用的很多,因為一個因素可能與很多其它因素有關!言歸正傳,這裡考慮用R語言裡面的相關函數做回歸分析。
需要的用到的知識儲備:
下面分別從普通多元線性回歸、逐步回歸、邏輯回歸進行介紹。前面用Python實現的只是一元回歸,由於R語言實現線性回歸很方便,所以我會著重介紹原理。
多元線性回歸
不論是單變量還是多元線性回歸分析,他們都是直接或間接(有時候需要通過變量代換)程線性的關係。我們需要找到一個通用的線性模型來描述這種關係,在我們可以接受的誤差範圍內對數據進行預測或者發現規律。
多元線性回歸理論基礎
對於一組變量數據,如果我們不管是通過畫散點圖還是其它方法,知道了一個變量與其它變量程很強線性關係。我們就需要知道,到底是什麼樣的關係,關係係數是多少。通常是用經典的最小二乘法,因為這樣算出的確實是最優的係數,可以保證殘差平方和最小的優化目標。
對於一個因變量y,有一組自變量X = (x1,x2,...,xk),x1,x2,...,xk,eps是列向量,考慮它們之間有如下線性關係:
當然了,這裡X = (x1,x2,...,xk),y都是給的一組數據,就像這樣
那麼,對每一組(比如第一行)數據,就有如下關係:
目標函數為殘差平方和的關於係數beta0,beta1,...,betak的多元二次函數,我們希望找到一組係數使得目標函數值最小,即誤差最小。目標函數如下:
學過數學分析或者高等數學的人都知道,這只要關於beta0,beta1,...,betak分別求偏導數,得到k+1方程,再求出零點即可。
我們用矩陣表示各個變量如下:
那麼,學過高等代數(數學專業)或者線性代數(工科)都知道,因變量與自變量關係可以表示為:
中間推導過程這裡不在贅述了,最終係數向量表達式為:
關於多元線性回歸的理論就到這裡,有興趣可以參考:線性回歸導論(機械工業出版社 王辰勇 譯)
多元線性回歸的R語言實現
這裡用R語言裡面的常用數據集iris來說明,這個數據集包含五個指標,我們這裡先只用前面四個:花萼長度、花萼寬度、花瓣長度、花瓣寬度,進行多元線性回歸分析。
數據預處理
大家都知道,為了消除不同變量量綱或者數量級不一致,做數據標準化的數據預處理是有必要的。用到的R語言函數是scale(),這個函數的機理具體公式如下:
R語言實現如下:
標準化後數據選擇前六行我們看一下:
> head(sl.sc)
Sepal.Length
[1,] -0.8976739
[2,] -1.1392005
[3,] -1.3807271
[4,] -1.5014904
[5,] -1.0184372
[6,] -0.5353840
下面構建多元線性回歸
我們用花萼標準化後的數據sl.sc與其它三個變量做線性回歸,先做有常數項的多元回歸。
lm.sc <- lm(sl.sc~sw.sc+pl.sc+pw.sc)
summary(lm.sc)
summary(lm.sc)給出了線性回歸的相關信息,各個係數Residuals給出了殘差的5分位數,Estimate、Std. Error、t value、Pr(>|t|)分別給出了自變量係數、標準誤、t值和p值,Multiple R-squared: 0.8586, Adjusted R-squared: 0.8557分別給出了R方與修正的R方,這裡 R-squared: 0.8557表示這個線性回歸模型可以解釋85.57的原數據,還是不錯的,後面就不再解釋這幾個指標的意思了。可以看出無論是每個係數還是總體的p-value都遠遠小於0.05,給出了三顆星***的等級,但是如圖藍色方框是常數項的值是-1.176e-16,太小了,p值是1,告訴我們常數項可以不用,這些數據是過原點的線性關係。
去掉常數項的多元回歸,不同的是,減一表示不要常數項
lm.sc <- lm(sl.sc~sw.sc+pl.sc+pw.sc-1)
summary(lm.sc)
模型詳細情況:
顯然,去掉後R方,F值沒有明顯變換,係數等級都是三顆星,表明去掉常數項確實在不影響模型情況下簡化了模型。
我們來看一下殘差圖與QQ圖:
plot(lm.sc,1,col = 'orange',main = '殘差圖')
plot(lm.sc,2,col = 'orange',main = 'QQ圖')
通過殘差圖與QQ圖也可以明顯看出這個不帶常數項的線性回歸模型是不錯的。
逐步回歸
逐步回歸的基本思想是將變量逐個引入模型,每引入一個解釋變量後都要進行F檢驗,並對已經選入的解釋變量逐個進行t檢驗,當原來引入的解釋變量由於後面解釋變量的引入變得不再顯著時,則將其刪除。以確保每次引入新的變量之前回歸方程中只包含顯著性變量。這是一個反覆的過程,直到既沒有顯著的解釋變量選入回歸方程,也沒有不顯著的解釋變量從回歸方程中剔除為止。以保證最後所得到的解釋變量集是最優、最簡單的。
逐步回歸最常用的挑選準則有修正復相關係數、預測平方和、Cp和AIC等,這裡用AIC準則,對於含有P個自變量的回歸方程,n為觀測值(樣本)個數,AIC越小越好,具體計算公式為:
使用R語言構建逐步回歸模型
知道原理後,我們試圖從三個自變量中篩選出兩個,首先看一下上述模型的AIC
step(lm.sc)
顯然,三個變量時AIC是最小的,這裡為了說明問題,實在要剔除一個變量的話,當然要剔除第一個。因為我們發現剔除pw.sc時AIC為-272.06,如果剔除pl.scAIC就為-181.26,而AIC越小越好,所以就剔除變量pw.sc吧。
lm.new <- lm(sl.sc~sw.sc+pl.sc-1)
summary(lm.new)
R方稍微減小了一點,因為三個變量AIC最小(即模型最優),提出後肯定會減小的。這裡為了說明問題才強行提出一個。
邏輯回歸
在介紹邏輯回歸前我們先介紹什麼是啞變量,其實,R語言用的多的人都知道iris這個數據集有5列,第五列是花的分類:setosa、versicolor、 virginica。那麼花萼長度是否與花的分類有關呢?一般是有的。增加三列,我們考慮引入0~1變量,那麼對於屬於setosa的,記為1,versicolor、 virginica位置記為0,同理就多了3列,這裡的0,1就是啞變量。還是為了減少變量,簡化模型,我們只增加2列versicolor和 virginica,這樣versicolor、 virginica位置都為0時,就屬於setosa這個分類,versicolor位置為1時就為versicolor這個分類。0,1是邏輯變量,線性回歸引入了邏輯變量,故稱為邏輯回歸。
下面就進行R語言實現,要不看一下iris數據集長什麼樣:
第五列變量就有三個水平,都是50條,正好。
兩個for()語句就是構造邏輯變量的,還是很好理解的,這樣就有五個變量了。構造的應該像這樣:
這裡省略了前面的,只為說明構造的邏輯變量(實際應該是s1裡面51~100為1,s2裡面101~150為1,其它為0)。看一下結果:
所有變量係數p-value都小於0.05,R-squared: 0.8627,比沒有增加邏輯變量的R-squared: 0.8557好一些,可見花的分類確實對花萼長度sl.sc有關係。最終表達式為:
關於多元線性回歸、逐步回歸、邏輯回歸的總結就到這裡,有問題可以加微信:as2601538122交流。
歡迎留言,純屬個人觀點、理解,歡迎提意見、建議,覺得不錯記得【點讚】分享哦!