1. 程式人生 > >手把手教線性迴歸分析(附R語言例項)

手把手教線性迴歸分析(附R語言例項)

640?wx_fmt=png&wxfrom=5&wx_lazy=1

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

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

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

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

  •  用線性迴歸方法來擬合數據方程的基本統計原則和它們如何描述資料元素之間的關係。

  •  如何使用R準備資料進行迴歸分析,定義一個線性方程並估計迴歸模型。

理解迴歸

迴歸主要關注確定一個唯一的因變數(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所示。

640?wx_fmt=png

圖1  身高與年齡散點圖

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

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

> lm.reg

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

產生以下的輸出:

Call:

lm(formula = height ~ age)

cients:

(Intercept)          age  

     64.928        0.635 

640?wx_fmt=png

圖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

這裡的a就是截距項,a1a就是自變數XX2 的係數。 為了看看具有多個潛在的自變數的真實資料集,我們會在下一步使用具體的資料——醫療費用的資料。

多元線性迴歸優缺點

優點

缺點

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

對資料做出了很強的假設

可適用於幾乎所有的資料

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

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

不能很好地處理缺失資料

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

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

線性迴歸資料探索:醫療費用

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

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

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)

640?wx_fmt=png

圖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")])

640?wx_fmt=png

圖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")])

640?wx_fmt=png

圖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,這可能表明吸菸會加劇(惡化)與肥胖有關的疾病。

作者簡介

640?wx_fmt=jpeg

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

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

資料派研究部介紹

資料派研究部是一個建立在資料院教學資源、科研資源以及對外合作資源上的開放性學術組織。“開放”是研究部區別於資料院的其他組織的主要特點,即資料派研究部也對外校同學開放。“學術”是研究部的落腳點,即研究部為資料派,甚至資料院的對外合作及知識傳播相關部門提供學術支援,主要工作涉及:代表資料院參加大資料/人工智慧相關比賽、依託資料院校企合作資源展開專案實踐、參與系列原創分享文章等。未來研究部的目標是逐步完成學術積累並進一步孕育學術氛圍,通過開展下述不同層次的學術實踐,為資料院積累學術力量,為社會培養大資料/人工智慧相關人才。

點選文末“閱讀原文”,報名資料派研究部志願者,總有一組適合你~

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

                                作者:慕生鵬

編輯:文婧

640?wx_fmt=jpeg

點選“閱讀原文”加入組織~