【獨家】手把手教線性回歸分析(附R語言實例)

2021-03-01 數據派THU

本文長度為8619,建議閱讀15分鐘

本文為你介紹線性回歸分析。

通常在現實應用中,我們需要去理解一個變量是如何被一些其他變量所決定的。

回答這樣的問題,需要我們去建立一個模型。一個模型就是一個公式之中,一個因變量(dependent variable)(需要預測的值)會隨著一個或多個數值型的自變量(independent variable)(預測變量)而改變的。我們能夠構建的最簡單的模型之一就是線性模型,我們可以假設因變量和自變量間是線性的關係。回歸分方法可用於預測數值型數據以及量化預測結果與其預測變量之間關係的大小及強度。本文將介紹如何將回歸方法應用到你自己的數據中,主要介紹學習內容:


一、理解回歸


回歸主要關注確定一個唯一的因變量(dependent variable)(需要預測的值)和一個或多個數值型的自變量(independent variable)(預測變量)之間的關係。我們首先假設因變量和自變量之間的關係遵循一條直線,即線性關係。

你可能還記得數學中是以類似於Y=aX + b的斜截式來定義直線的,其中,y是因變量,x是自變量。在這個公式中,斜率(slope)a表示每增加一個單位的x,直接會上升的高度;變量b表示X=0時y的值,它稱為截距,因為它指定了直線穿過y軸時的位置。

回歸方程使用類似於斜截式的形式對數據建立模型。該機器的工作就是確定a和b的值,從而使指定的直線最適合用來反映所提供的x值和y值之間的關係,這可能不是完美的匹配,所以該機器也需要有一些方法來量化誤差範圍,很快我們就會討論這個問題。

回歸分析通常用來對數據元素之間的複雜關係建立模型,用來估計一種處理方法對結果的影響和推斷未來。一些具體應用案例包括:

 根據種群和個體測得的特徵,研究他們之間如何不同(差異性),從而用於不同領域的科學研究,如經濟學、社會學、心理學、物理學和生態學;

 量化事件及其相應的因果關係,比如可應用於藥物臨床試驗、工程安全檢測、銷售研究等。

 給定已知的規則,確定可用來預測未來行為的模型,比如用來預測保險賠償、自然災害的損失、選舉的結果和犯罪率等。

回歸方法也可用於假設檢驗,其中包括數據是否能夠表明原假設更可能是真還是假。回歸模型對關係強度和一致性的估計提供了信息用於評估結果是否是由於偶然性造成的。回歸分析是大量方法的一個綜合體,幾乎可以應用於所有的機器學習任務。如果被限制只能選擇單一的分析方法,那麼回歸方法將是一個不錯的選擇。

本文只關注最基本的回歸模型,即那些使用直線回歸的模型,這叫做線性回歸(linearregression)。如果只有一個單一的自變量,那就是所謂的簡單線性回歸(simple linear regression),否則,稱為多元回歸(multiple regression),這兩個模型都假定因變量是連續的。對其他類型的因變量,即使是分類任務,使用回歸方法也是可能的。邏輯回歸(logistic regression)可以用來對二元分類的結果建模;泊松分布(Possion regression)可以用來對整型的計數數據建模。相同的基本原則適用於所有的回歸方法,所以一旦理解了線性情況下的回歸方法,就可以研究其他的回歸方法。

二、簡單線性回歸


讓我們從基礎開始。記得高中時學過的直線方程嗎?

Y=aX + b

a就是斜率,b就是y軸截距。簡單而言,線性回歸就是一系列技術用於找出擬合一系列數據點的直線。這也可以被認為是從數據之中反推出一個公式。我們會從最基礎的一些規則開始,慢慢增加數學複雜度,增進對這個概念了解的深入程度。但是在此之前,也許你會很好奇這裡的a和b的值分別是多少。接下來,我們通過一個例子,使用軟體R來為我們計算,我們的數據來源於一組真實的關於兒童的身高和年齡,記錄的數據。首先我們先直觀地顯示年齡與身高之間的關係,畫出一張散點圖,以年齡age為橫坐標,身高height為縱坐標,R的代碼如下:

> age=18:29    #年齡從18到29歲

> height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5)

> plot(age,height,main = "身高與年齡散點圖")

散點圖結果如圖1所示。

圖1  身高與年齡散點圖

從圖中可以觀察到,年齡與身高基本在一條直線附近,可以認為兩者具有線性關係,接下來建立回歸模型,R代碼如下:

> lm.reg <- lm(height~age)  #建立回歸方程

> lm.reg

> abline(lm.reg)    #畫出擬合的線性回歸線

產生以下的輸出:

Call:

lm(formula = height ~ age)

cients:

(Intercept)          age  

     64.928        0.635  

 

圖2  身高與年齡擬合直線

我們可以看到兩個數值,「截距」和「斜率」。無論我們用什麼軟體來做線性回歸(本文中的例子統一採用R語言),它都會用某種形式來報告這兩個數值。截距就是我們的公式中的b,斜率就是Y和自變量之間的傾斜程度。

總結起來,我們有一個數據集(觀測值)和一個模型(我們猜測可以擬合數據的一個公式),我們還要去找出模型的參數(我們的最佳擬合模型中的參數a和b),這樣,模型就可以「最佳」擬合數據了。我們希望用我們的數據來找出一個公式的參數,這樣,這個公式也能夠「最佳」擬合數據了。

1. 用模型來做預測


一旦你目測出最佳擬合直線並且讀出a和b,也許你大概會說大意是這樣的話:「這些數據遵循一個形式為Y = aX + b 的線性方程,其中a(斜率)= 某個數,b(y軸截距)= 另外某個數」。你也許記得,這個等式並非是確切的表述,因為很有可能你的數據並不是所有的都在一條完美的直線上,所以數據點之間可能會有不同程度的誤差。你的目測是主觀地嘗試把一些直覺上的總的誤差給降到最低。你做的事情就是直覺上的「線性回歸」。你按照「我看起來很順眼」的算法來估計a和b。我們會以這個直覺的行為為開端,並迅速帶入一些重量級的機械,使得我們能夠解決一些相當複雜的問題。

在這個節點,你的實驗室練習也許會要求你為不在你的觀測值集合以內的,某個給定數值的X,給出Y的估值。然後你就會用上面的等式,比如說a是2.1,b是0.3的等式Y = 2.1 X + 0.3作為你的模型,你把X輸入進去,就會得到一個Y。這時候你就是在用你的模型去預測一個值,換句話說,你正在陳述這樣的事實:我在實驗之中並沒有用這個X值,並且我的數據裡也沒有它,但是我想要知道這個X值是怎樣投射到Y軸上的。你也許會想要能夠說出:「我的誤差會是某個數,所以我相信實際上的值會在[Y-誤差,Y+誤差]之間」。在這樣的情況下,我們把變量X叫做「預測變量」,而Y的值是基於X的一個值來預測的,所以變量Y是「反應」。

2. 一個概念:總誤差


我們想要創造一個有關誤差,或者說我們的直線所給出的Y值與我們數據集中的真實Y值之間的差異的簡單公式。除非我們的直線正好穿過一個特定的點,否則,這個誤差是非零的。它可能是正值,也可能是負值。我們可以取這個誤差的平方(或者我們也可以取它的絕對值),然後我們把每個點的誤差項相加起來,然後得到直線和這個數據集的總誤差。在同一個實驗的不同的樣例集合中,我們會得到一個不同的數據集,很有可能一條不同的直線,並且幾乎可以肯定一個不同的總誤差。我們所用的誤差的平方值是一個非常常用的總誤差形式,它就是「方差」。它用同樣的方式來處理正值的誤差和負值的誤差,所以方差總是正值的。從現在開始我們會使用「方差」作為我們誤差的代表。總的來說,回歸是我們所使用的任意的數據,最小化方差,來估測模型係數的手段。統計軟體用多變量微積分這些專業技術來最小化誤差,並且給我們提供係數的估測值。對於回歸方程回歸係數的檢驗,檢驗一般用方差分析或t檢驗,兩者的檢驗結果是等價的。方差分析主要是針對整個模型的,而t檢驗是關於回歸係數的。

對於上例中的回歸方程,我們對模型進行檢驗,方差分析的R代碼如下:

> anova(lm.reg)    #模型方差分析

產生以下的輸出:

Analysis of Variance Table

Response: height

          Df Sum Sq Mean Sq F value    Pr(>F)    

age        1 57.655  57.655  879.99 4.428e-11 ***

Residuals 10  0.655   0.066                      

---

Signif. codes:  0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1

由於P<0.05,於是在α=0.05水平下,本例的回歸係數有統計學意義,身高和年齡存在直線回歸關係。

同理,對於上例中的回歸方程,我們對模型進行回歸係數的t檢驗,t檢驗的R代碼如下:

> summary(lm.reg)   #回歸係數的t檢驗

產生以下的輸出:

Call:

lm(formula = height ~ age)

Residuals:

     Min       1Q   Median       3Q      Max

-0.27238 -0.24248 -0.02762  0.16014  0.47238

Coefficients:

            Estimate Std. Error t value Pr(>|t|)    

(Intercept)  64.9283     0.5084  127.71  < 2e-16 ***

age           0.6350     0.0214   29.66 4.43e-11 ***

Signif. codes:  0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1

Residual standard error: 0.256 on 10 degrees of freedom

Multiple R-squared:  0.9888,Adjusted R-squared:  0.9876

F-statistic:   880 on 1 and 10 DF,  p-value: 4.428e-11

同方差分析,由於P<0.05,於是在α=0.05水平下,本例的回歸係數有統計學意義,身高和年齡存在回歸關係。

三、多元線性回歸


很自然地,如果Y依賴於多於一個變量的時候,會發生什麼。這時候,數學上的普遍性的力量就顯現了。這個簡單的原理在多維的情況下同樣適用。不僅僅是兩個或者三個,還有更多更大的數值。如果我們想要構建現實數據的模型的話,二十個,三十個,甚至百來個自變量都毫無問題。但現在我們就看看Y,作為一個含有多個自變量的函數,例如含有來個自變量X1和X2的形式:

Y = a0 + a1X1 + a2X2

這裡的a0 就是截距項,a1,a2 就是自變量X1 ,X2 的係數。 為了看看具有多個潛在的自變量的真實數據集,我們會在下一步使用具體的數據——醫療費用的數據。

多元線性回歸優缺點

優點

缺點

迄今為止,它是數值型數據建模最常用的方法

對數據做出了很強的假設

可適用於幾乎所有的數據

該模型的形式必須由使用者事先指定

提供了特徵(變量)與結果之間關係的強度和大小的估計

不能很好地處理缺失數據

只能處理數值特徵,所以分類數據需要額外的處理

需要一些統計知識來理解模型

 

四、線性回歸數據探索:醫療費用


醫療費用很難估計,因為花費最高的情況是罕見的而且似乎是隨機的。但是有些情況對於部分特定的群體還是比較普遍存在的。例如,吸菸者比不吸菸者得肺癌的可能性更大,肥胖的人更有可能得心臟病。此分析的目的是利用病人的數據,來預測這部分群體的平均醫療費用。這些估計可以用來創建一個精算表,根據預期的治療費用來設定年度保費價格是高一點還是低一點。我們想要去探索這些數據,嘗試從中獲得一些對於建立線性回歸模型有用處的見解。

我們會依據以下步驟完成,將來,我們還會對其他數據集座同樣的事情。

1) 收集/觀察數據;

2) 探索和準備數據;

3) 基於數據訓練模型;

4) 評估模型的性能;

5) 提高模型的性能。

第1步——收集/觀察數據


為了便於分析,我們使用一個模擬數據集,該數據集包含了美國病人的醫療費用。而本文創建的這些數據使用了來自美國人口普查局(U.S. Census Bureau)的人口統計資料,因此可以大致反映現實世界的情況。

:如果你想一起學習這個例子,那麼你需要從Packt出版社的網站(https://github.com/stedy/Machine-Learning-with-R-datasets/find/master)下載insurance.csv文件,並將該文件保存到R的工作文件夾中。

該文件(insurance.csv)包含1338個案例,即目前已經登記過的保險計劃受益者以及表示病人特點和歷年計劃計入的總的醫療費用的特徵。這些特徵是:

age: 這是一個整數,表示主要受益者的年齡(不包括超過64歲的人,因為他們一般由政府支付)。

 sex: 這是保單持有人的性別,要麼是male,要麼是female。

bmi: 這是身體質量指數(Body Mass Index,BMI),它提供了一個判斷人的體重相對於身高是過重還是偏輕的方法,BMI指數等於體重(公斤)除以身高(米)的平方。一個理想的BMI指數在18.5~24.9的範圍內。

children: 這是一個整數,表示保險計劃中所包括的孩子/受撫養者的數量。

 smoker: 根據被保險人是否吸菸判斷yes或者no。

region: 根據受益人在美國的居住地,分為4個地理區域:northeast、southeast、southwest和northwest。

如何將這些變量與已結算的醫療費用聯繫在一起是非常重要的。例如,我們可能認為老年人和吸菸者在大額醫療費用上是有較高的風險。與許多其他的方法不同,在回歸分析中,特徵之間的關係通常由使用者指定而不是自動檢測出來。

第2步——探索和準備數據


在R中,我們將使用read.csv()函數來加載用於分析的數據。我們可以使用stringAsFactors = TRUE,因為將名義變量轉換成因子變量是恰當的:

> insurance <- read.csv("insurance.csv",stringsAsFactors = TRUE)

函數str()確認該數據轉換了我們之前所期望的形式:

> str(insurance)

產生以下的輸出:

'data.frame':1338 obs. of  7 variables:

 $ age     : int  19 18 28 33 32 31 46 37 37 60 ...

 $ sex     : Factor w/ 2 levels "female","male": 1 2 2 2 2 1 1 1 2 1 ...

 $ bmi     : num  27.9 33.8 33 22.7 28.9 ...

 $ children: int  0 1 3 0 0 0 1 3 2 0 ...

 $ smoker  : Factor w/ 2 levels "no","yes": 2 1 1 1 1 1 1 1 1 1 ...

 $ region  : Factor w/ 4 levels "northeast","northwest",..: 4 3 3 2 2 3 3 2 1 2 ...

 $ charges : num  16885 1726 4449 21984 3867 ...

既然因變量是changes,那麼讓我們一起來看一下它是如何分布的:

> summary(insurance$charges)

產生以下的輸出:

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.

   1122    4740    9382   13270   16640   63770

因為平均數遠大於中位數,表明保險費用的分布是右偏的,我們可以用直方圖證實這一點。

> hist(insurance$charges)

圖3  charges直方圖

在我們的數據中,絕大多數的個人每年的費用都在0~15000美元,儘管分布的尾部經過直方圖的峰部後延伸得很遠。即將面臨的另一個問題就是回歸模型需要每一個特徵都是數值型的,而在我們的數據框中,我們有3個因子類型的特徵。很快,我們會看到R中的線性回歸函數如何處理我們的變量。

1.探索特徵之間的關係——相關係數矩陣


在使用回歸模型擬合數據之前,有必要確定自變量與因變量之間以及自變量之間是如何相關的。相關係數矩陣(correlation matrix)提供了這些關係的快速概覽。給定一組變量,它可以為每一對變量之間的關係提供一個相關係數。

為insurance數據框中的4個數值型變量創建一個相關係數矩陣,可以使用cor()命令:

> cor(insurance[c("age","bmi","children","charges")])

產生以下的輸出:

               age       bmi   children    charges

age      1.0000000 0.1092719 0.04246900 0.29900819

bmi      0.1092719 1.0000000 0.01275890 0.19834097

children  0.0424690 0.0127589 1.00000000 0.06799823

charges   0.2990082 0.1983410 0.06799823 1.00000000

該矩陣中中的相關係數不是強相關的,但還是存在一些顯著的關聯。例如,age和bmi顯示出中度相關,這意味著隨著年齡(age)的增長,身體質量指數(bmi)也會增加。此外,age和charges,bmi和charges,以及children和charges也都呈現處中度相關。當我們建立最終的回歸模型時,我們會儘量更加清晰地梳理出這些關係。


2.可視化特徵之間的關係——散點圖矩陣

或許通過使用散點圖,可視化特徵之間的關係更有幫助。雖然我們可以為每個可能的關係創建一個散點圖,但對於大量的特徵,這樣做可能會變得比較繁瑣。

另一種方法就是創建一個散點圖矩陣(scatterplot matrix),就是簡單地將一個散點圖集合排列在網格中,裡邊包含著相互緊鄰在一起的多種因素的圖表。它顯示了每個因素相互之間的關係。斜對角線上的圖並不符合這個形式。為何不符合呢?在這個語境下,這意味著找到某個事物和自身的關係,而我們正在嘗試確定某些變量對於另一個變量的影響。默認的R中提供了函數pairs(),該函數產生散點圖矩陣提供了基本的功能。對醫療費用數據之中的四個變量的散點圖矩陣如下圖所示。R代碼如下:

pairs(insurance[c("age","bmi","children","charges")])

圖4  散點圖矩陣

與相關係數矩陣一樣,每個行與列的交叉點所在的散點圖表示其所在的行與列的兩個變量的相關關係。由於對角線上方和下方的x軸和y軸是交換的,所以對角線上方的圖和下方的圖是互為轉置的。

你注意到這些散點圖中的一些圖案了嗎?儘管有一些看上去像是隨機密布的點,但還是有一些似乎呈現了某種趨勢。age和charges之間的關係呈現出幾條相對的直線,而bmi和charges的散點圖構成了兩個不同的群體。

如果我們對散點圖添加更多的信息,那麼它就會更加有用。一個改進後的散點圖矩陣可以用psych包中的pairs.panels()函數來創建。R中如果你還沒有安裝這個包,那麼可以輸入install.packages("psych")命令將其安裝到你的系統中,並使用library(psych)命令加載它。R代碼及散點圖矩陣如下:

pairs.panels(insurance[c("age","bmi","children","charges")])

圖5  散點圖矩陣

在對角線的上方,散點圖被相關係數矩陣所取代。在對角線上,直方圖描繪了每個特徵的數值分布。最後,對角線下方的散點圖帶有額外的可視化信息。

每個散點圖中呈橢圓形的對象稱為相關橢圓(correlation ellipse),它提供了一種變量之間是如何密切相關的可視化信息。位於橢圓中心的點表示x軸變量的均值和y軸變量的均值所確定的點。兩個變量的相關性由橢圓的形狀所表示,橢圓越被拉伸,其相關性越強。一個幾乎類似於圓的完美的橢圓形,如bmi和children,表示一種非常弱的相關性。

散點圖中繪製的曲線稱為局部回歸平滑(loess smooth),它表示x軸和y軸變量之間的一般關係。最好通過例子來理解。散點圖中age和childr的曲線是一個倒置的U,峰值在中年附近,這意味著案例中年齡最大的人和年齡最小的人比年齡大約在中年附近的人擁有的孩子更少。因為這種趨勢是非線性的,所以這一發現已經不能單獨從相關性推斷出來。另一方面,對於age和bmi,局部回歸光滑是一條傾斜的逐步上升的線,這表明BMI會隨著年齡(age)的增長而增加,從相關係數矩陣中我們也可推斷出該結論。

第3步——基於數據訓練模型


  用R對數據擬合一個線性回歸模型時,可以使用lm()函數。該函數包含在stats添加包中,當安裝R時,該包已經被默認安裝並在R啟動時自動加載好。使用R擬合稱為ins_model的線性回歸模型,該模型將6個自變量與總的醫療費用聯繫在一起。代碼如下:

ins_model <- lm(charges~age+children+bmi+sex+smoker+region,data=insurance)

建立模型後,只需輸入該模型對象的名稱,就可以看到估計的a係數:

> ins_model   

產生以下的輸出:

Call:

lm(formula = charges ~ ., data = insurance)

Coefficients:

    (Intercept)              age          sexmale  

       -11938.5            256.9           -131.3  

            bmi         children        smokeryes  

          339.2            475.5          23848.5  

regionnorthwest  regionsoutheast  regionsouthwest  

         -353.0          -1035.0           -960.1

你可能注意到,在我們的模型公式中,我們僅指定了6個變量,但是輸出時,除了截距項外,卻輸出了8個係數。之所以發生這種情況,是因為lm()函數自動將一種稱為虛擬編碼(dummy coding)的技術應用於模型所包含的每一個因子類型的變量中。當添加一個虛擬編碼的變量到回歸模型中時,一個類別總是被排除在外作為參照類別。然後,估計的係數就是相對於參照類別解釋的。在我們的模型中,R自動保留sexfemale、smokerno和regionnortheast變量,使東北地區的女性非吸菸者作為參照組。因此,相對於女性來說,男性每年的醫療費用要少$131.30;吸菸者平均多花費$23848.50,遠超過非吸菸者。此外,模型中另外3個地區的係數是負的,這意味著東北地區傾向於具有最高的平均醫療費用。

線性回歸模型的結果是合乎邏輯的。高齡、吸菸和肥胖往往與其他健康問題聯繫在一起,而額外的家庭成員或者受撫養者可能會導致就診次數增加和預防保健(比如接種疫苗、每年體檢)費用的增加。然而,我們目前並不知道該模型對數據的擬合有多好?我們將在下一部分回答這個問題。

第4步——評估模型的性能

通過在R命令行輸入ins_model,可以獲得參數的估計值,它們告訴我們關於自變量是如何與因變量相關聯的。但是它們根本沒有告訴我們用該模型來擬合數據有多好。為了評估模型的性能,可以使用summary()命令來分析所存儲的回歸模型:

> summary(ins_model)

產生以下的輸出:

Call:

lm(formula = charges ~ ., data = insurance)

 

Residuals:

     Min       1Q   Median       3Q      Max

-11304.9  -2848.1   -982.1   1393.9  29992.8

 

Coefficients:

                Estimate Std. Error t value Pr(>|t|)    

(Intercept)     -11938.5      987.8 -12.086  < 2e-16 ***

age                256.9       11.9  21.587  < 2e-16 ***

sexmale           -131.3      332.9  -0.394 0.693348    

bmi                339.2       28.6  11.860  < 2e-16 ***

children           475.5      137.8   3.451 0.000577 ***

smokeryes        23848.5      413.1  57.723  < 2e-16 ***

regionnorthwest   -353.0      476.3  -0.741 0.458769    

regionsoutheast  -1035.0      478.7  -2.162 0.030782 *  

regionsouthwest   -960.0      477.9  -2.009 0.044765 *  

---

Signif. codes:  0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1

 

Residual standard error: 6062 on 1329 degrees of freedom

Multiple R-squared:  0.7509,Adjusted R-squared:  0.7494

F-statistic: 500.8 on 8 and 1329 DF,  p-value: < 2.2e-16

開始時,summary()的輸出可能看起來令人費解,但基本原理是很容易掌握的。與上述輸出中用標籤編號所表示的一樣,該輸出為評估模型的性能提供了3個關鍵的方面:

1) Residuals(殘差)部分提供了預測誤差的主要統計量;

2) 星號(例如,***)表示模型中每個特徵的預測能力;

3) 多元R方值(也稱為判定係數)提供度量模型性能的方式,即從整體上,模型能多大程度解釋因變量的值。

給定前面3個性能指標,我們的模型表現得相當好。對於現實世界數據的回歸模型,R方值相當低的情況並不少見,因此0.75的R方值實際上是相當不錯的。考慮到醫療費用的性質,其中有些誤差的大小是需要關注的,但並不令人吃驚。如下節所述,我們會以略微不同的方式來指定模型,從而提高模型的性能。

第5步——提高模型的性能


正如前面所提到的,回歸模型通常會讓使用者來選擇特徵和設定模型。因此,如果我們有關於一個特徵是如何與結果相關的學科知識,我們就可以使用該信息來對模型進行設定,並可能提高模型的性能。

1. 模型的設定——添加非線性關係


在線性回歸中,自變量和因變量之間的關係被假定為是線性的,然而這不一定是正確的。例如,對於所有的年齡值來講,年齡對醫療費用的影響可能不是恆定的;對於最老的人群,治療可能會過於昂貴。

2. 轉換——將一個數值型變量轉換為一個二進位指標


假設我們有一種預感,一個特徵的影響不是累積的,而是當特徵的取值達到一個給定的閾值後才產生影響。例如,對於在正常體重範圍內的個人來說,BMI對醫療費用的影響可能為0,但是對於肥胖者(即BMI不低於30)來說,它可能與較高的費用密切相關。我們可以通過創建一個二進位指標變量來建立這種關係,即如果BMI大於等於30,那麼設定為1,否則設定為0。

:如果你在決定是否要包含一個變量時遇到困難,一種常見的做法就是包含它並檢驗其顯著性水平。然後,如果該變量在統計上不顯著,那麼就有證據支持在將來排除該變量。

3. 模型的設定——加入相互作用的影響


到目前為止,我們只考慮了每個特徵對結果的單獨影響(貢獻)。如果某些特徵對因變量有綜合影響,那麼該怎麼辦呢?例如,吸菸和肥胖可能分別都有有害的影響,但是假設它們的共同影響可能會比它們每一個單獨影響之和更糟糕是合理的。

當兩個特徵存在共同的影響時,這稱為相互作用(interaction)。如果懷疑兩個變量相互作用,那麼可以通過在模型中添加它們的相互作用來檢驗這一假設,可以使用R中的公式語法來指定相互作用的影響。為了體現肥胖指標(bmi30)和吸菸指標(smoker)的相互作用,可以這樣的形式寫一個公式:charge~bmi30*smoker。

4. 全部放在一起——一個改進的回歸模型


基於醫療費用如何與患者特點聯繫在一起的一點學科知識,我們採用一個我們認為更加精確的專用的回歸公式。下面就總結一下我們的改進:

 增加一個非線性年齡項

為肥胖創建一個指標

 指定肥胖與吸菸之間的相互作用

我們將像之前一樣使用lm()函數來訓練模型,但是這一次,我們將添加新構造的變量和相互作用項:

> ins_model2 <-lm(charges~age+age2+children+bmi+sex+bmi30*smoker+region,data=insurance)

接下來,我們概述結果:

> summary(ins_model2)

產生以下的輸出:

Call:

lm(formula = charges ~ age + age2 + children + bmi + sex + bmi30 *

    smoker + region, data = insurance)

 

Residuals:

     Min       1Q   Median       3Q      Max

-17296.4  -1656.0  -1263.3   -722.1  24160.2

 

Coefficients:

                  Estimate Std. Error t value Pr(>|t|)    

(Intercept)       134.2509  1362.7511   0.099 0.921539    

age               -32.6851    59.8242  -0.546 0.584915    

age2                3.7316     0.7463   5.000 6.50e-07 ***

children          678.5612   105.8831   6.409 2.04e-10 ***

bmi               120.0196    34.2660   3.503 0.000476 ***

sexmale          -496.8245   244.3659  -2.033 0.042240 *  

bmi30           -1000.1403   422.8402  -2.365 0.018159 *  

smokeryes       13404.6866   439.9491  30.469  < 2e-16 ***

regionnorthwest  -279.2038   349.2746  -0.799 0.424212    

regionsoutheast  -828.5467   351.6352  -2.356 0.018604 *  

regionsouthwest -1222.6437   350.5285  -3.488 0.000503 ***

bmi30:smokeryes 19810.7533   604.6567  32.764  < 2e-16 ***

---

Signif. codes:  0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1

 

Residual standard error: 4445 on 1326 degrees of freedom

Multiple R-squared:  0.8664,Adjusted R-squared:  0.8653

F-statistic: 781.7 on 11 and 1326 DF,  p-value: < 2.2e-16

分析該模型的擬合統計量有助於確定我們的改變是否提高了回歸模型的性能。相對於我們的第一個模型,R方值從0.75提高到約0.87,我們的模型現在能解釋醫療費用變化的87%。此外,我們關於模型函數形式的理論似乎得到了驗證,高階項age2在在統計上是顯著的,肥胖指標bmi30也是顯著的。肥胖和吸菸之間的相互作用表明了一個巨大的影響,除了單獨吸菸增加的超過$13404的費用外,肥胖的吸菸者每年要另外花費$19810,這可能表明吸菸會加劇(惡化)與肥胖有關的疾病。

作者簡介

慕生鵬,數據派研究部志願者。北京林業大學計算數學專業碩士在讀學生。

日常喜歡長跑,健身等活動。對數據的分析、學習很感興趣。日常會藉助網絡等資源,自助學習各類數據的分析方法。希望在數據的分析算法方面,不斷地加強功底。

數據派研究部成立於2017年初,志於打造一流的結構化知識分享平臺、活躍的數據科學愛好者社群,致力於傳播數據思維、提升數據能力、探索數據價值、實現產學研結合!

研究部的邏輯在於知識結構化、實踐出真知:梳理打造結構化基礎知識網絡;原創手把手教以及實踐經驗等文章;形成專業興趣社群,交流學習、組隊實踐、追蹤前沿
興趣組是研究部的核心,各組既遵循研究部整體的知識分享和實踐項目規劃,又會各具特色:
算法模型組:積極組隊參加kaggle等比賽,原創手把手教系列文章;
調研分析組:通過專訪等方式調研大數據的應用,探索數據產品之美;
系統平臺組:追蹤大數據&人工智慧系統平臺技術前沿,對話專家;
自然語言處理組:重於實踐,積極參加比賽及策劃各類文本分析項目;
製造業大數據組:秉工業強國之夢,產學研政結合,挖掘數據價值;
數據可視化組:將信息與藝術融合,探索數據之美,學用可視化講故事;
網絡爬蟲組:爬取網絡信息,配合其他各組開發創意項目。


點擊文末「閱讀原文」,報名數據派研究部志願者,總有一組適合你~

【一文讀懂】系列往期回顧:

【獨家】一文讀懂聚類算法

【獨家】一文讀懂關聯分析

【獨家】一文讀懂大數據計算框架與平臺

                                作者:慕生鵬

編輯:文婧

為保證發文質量、樹立口碑,數據派現設立「錯別字基金」,鼓勵讀者積極糾錯

若您在閱讀文章過程中發現任何錯誤,請在文末留言,或到後臺反饋,經小編確認後,數據派將向檢舉讀者發8.8元紅包

同一位讀者指出同一篇文章多處錯誤,獎金不變。不同讀者指出同一處錯誤,獎勵第一位讀者。

感謝一直以來您的關注和支持,希望您能夠監督數據派產出更加高質的內容。

轉載須知

如需轉載文章,請做到 1、正文前標示:轉自數據派THU(ID:DatapiTHU);2、文章結尾處附上數據派二維碼。

申請轉載,請發送郵件至datapi@tsingdata.com

公眾號底部菜單有驚喜哦!

企業,個人加入組織請查看「聯合會」

往期精彩內容請查看「號內搜」

加入志願者或聯繫我們請查看「關於我們」

相關焦點

  • 一元(多元)線性回歸分析之R語言實現
    上篇介紹了《一元(多元)線性回歸分析之Excel實現》,本篇來探討一下回歸分析在R語言中的實現,我們將從更專業的角度對模型進行一些解讀。
  • 獨家 | 手把手教你用R語言做回歸後的殘差分析(附代碼)
    本文介紹了做殘差分析的方法及其重要性,以及利用R語言實現殘差分析。在這篇文章中,我們通過探索殘差分析和用R可視化結果,深入研究了R語言。殘差本質上是當一個給定的模型(在文中是線性回歸)不完全符合給定的觀測值時留下的gap。醫學中的病理學發現的殘留分析是一個形象的比喻。人們通常用代謝殘留水平來作為衡量藥物吸收的指標。
  • R語言 | 回歸分析(一)
    根據預測結果的類型,我們將回歸分析主要分為線性回歸(linear regression)、非線性回歸(non-linear regressin)、logistic回歸(logistic regression)等等。
  • R語言 | 回歸分析(四)
    邏輯回歸中,預測變量可以是連續型變量或分類變量,得到的結果是分類變量。根據結果的分類個數,邏輯回歸可以被分為二元邏輯回歸和多元邏輯回歸。glm( )是邏輯回歸所用函數。為了將非線性的結果轉變為線性內容,我們可以採用優勢比進行轉化。
  • R數據分析:一般線性回歸的做法和解釋
    發現大家做分析做的最多的還是線性回歸,很多人諮詢的都是線性回歸的問題,今天專門出一個線性回歸的文章。
  • 機器學習:回歸分析——多元線性回歸分析
    從前面的學習中我們知道:社會經濟現象的變化往往受到多個因素的影響,因此一般要進行多元回歸分析。我們把包括兩個或兩個以上自變量的回歸稱為多元線性回歸。所以相比一元線性回歸,多元線性回歸的實際意義更大。本節我們將使用來自UIC數據集中的能效數據集(ENB2012_data.xlsx)進行演示,探索如何使用Python對數據集進行多元回歸分析。
  • 對比R語言和Python,教你實現回歸分析
    r的取值範圍是[-1,1],r=1表示完全正相關!r=-1表示完全負相關!r=0表示完全不相關。為什麼要對相關係數進行顯著性檢驗?一元回歸不存在多重共線性的問題;而多元線性回歸要摒棄多重共線性的影響;所以要先對所有的變量進行相關係數分析,初步判定是否滿足前提---多重共線性時間序列數據會自發呈現完全共線性問題,所以我們用自回歸分析方法;出現多重共線性如何改善:1. 刪除變量對去除多重共線性最為顯著。2.
  • 多重線性回歸實例 - CSDN
    在上一期SPSS的推文中我們講了一些關於線性回歸的基本知識,還利用一個簡單的實例進行了簡單線性回歸的分析,今天我們就來講講多重線性回歸(也叫多元線性回歸),有關多元線性回歸的概念我在上一期的推文中也已經講過,這裡就不提了。可瀏覽上一篇SPSS的推文:SPSS第二期——線性回歸(上),兩篇對照起來看,或許能學到更多知識。
  • R語言和Python實現回歸分析
    r的取值範圍是[-1,1],r=1表示完全正相關!r=-1表示完全負相關!r=0表示完全不相關。為什麼要對相關係數進行顯著性檢驗?一元回歸不存在多重共線性的問題;而多元線性回歸要摒棄多重共線性的影響;所以要先對所有的變量進行相關係數分析,初步判定是否滿足前提---多重共線性時間序列數據會自發呈現完全共線性問題,所以我們用自回歸分析方法;出現多重共線性如何改善:1. 刪除變量對去除多重共線性最為顯著。2.
  • 獨家 | 手把手教你學習R語言(附資源連結)
    另一種學習方法是在線版本swirl(https://www.datacamp.com/swirl-r-tutorial),它能讓您在類似RStudio環境中學習R語言。除了上述在線資源,您還可以考慮以下優秀資源:CRAN免費教學R語言(https://cran.r-project.org/doc/manuals/R-intro.pdf)。
  • 線性回歸分析淺談
    這種方法常用於校準(calibration),常見的例子如製備一系列已知不同濃度的標準品溶液並測試其響應值(如吸光度),然後用線性回歸分析求得校準曲線方程(等一等1012吸光度2.15.09.012.617.321.024.7既然是採用線性回歸分析過程,首先需要判斷這兩組數據之間是否存在線性關係。
  • python數據分析--回歸函數及線性回歸分析
    2.工具數據分析有很多成熟的工具可以使用,如R、python、spss等。此處我們選用python進行分析。首先,我們需要安裝並導入python數據分析常用的庫。__version__)3.線性回歸分析Y= aX + b + e ,e表示殘差。
  • R語言從入門到精通:Day12--R語言統計--回歸分析
    回歸作為一個廣義的概念,涵蓋了許多變種,R語言中也為其提供了強大而豐富的函數和選項(但顯然選項越多,對初學者越不友好),早在2005年,R中就有200多種關於回歸分析的函數 (https://cran.r-project.org/doc/contrib/Ricci-refcard-regression.pdf,這個文檔提供了部分回歸分析函數列表,供大家參考)。
  • R語言邏輯回歸分析
    如何進行邏輯回歸分析邏輯回歸是當y=f(x),而y為分類變量的時候的邏輯曲線擬合的方法。
  • (案例)線性/非線性回歸分析Matlab算例
    1762 1960 1902 2013 2446 2736 2825];%因變量時間序列數據%生成一個17*2 矩陣,其中第1 列元素均為1,作為常數項的自變量X=[ones(size(x')),x'];%調用一元回歸分析函數,自變量X 包含常數項和因變量,b 是回歸參數估計值,%bint是置信區間,r 和rint 分別表示殘差及殘差對應的置信區間。
  • Python數據分析|線性回歸
    Python數據分析學習筆記,今天分享下利用Python對業務進行數據預處理,並利用線性回歸進行數據預測。④先以我們後續需要用來做線性回歸的列「內容閱讀量」為標準,將不含該值的數據行去除:調用dropna函數,並執行info函數看數據情況。
  • 基於R軟體實現多元線性回歸
    一個多元線性回歸在R中的實現示例在一元回歸中,只包含一個預測變量和響應變量間的關係。與此相比,當存在兩個或以上的預測變量時,稱為多元回歸(Multiple Regression)。如果只考慮變量間的線性關係時,就是多元線性回歸(Multiple Linear Regression)。
  • R與生物專題 | 第三十五講 R-多元線性回歸
    在「R與生物統計專題」中,我們會從介紹R的基本知識展開到生物統計原理及其在R中的實現。
  • 【Pytorch】PyTorch的4分鐘教程,手把手教你完成線性回歸
    (與矩陣乘法類似,不明白運行結果的讀者,可以看下矩陣的乘法運算)除此外,PyTorch也支持張量結構的重構reshape,下面是將張量x重構成1*6的一維張量的實例,與numpy中的reshape功能類似。
  • R語言統計篇:簡單線性回歸
    簡單線性回歸(Simple linear regression)也稱為一元線性回歸,是分析一個自變量