lecture
website icon
羅吉斯回歸
勝算比 2x2交叉表 2x2xK交叉表 泊松回歸 羅吉斯回歸 多項羅吉斯回歸 累積羅吉斯回歸 Bradley-Terry模型 配對模型
×
website icon 資料管理 統計分析 相關資源 巨人肩膀 語法索引 關於作者

簡介

本部分介紹羅吉斯迴歸。使用到的指令包含:

Facebook Icon Twitter Icon LinkedIn Icon LINE Icon

羅吉斯回歸(Logistic regression)是社會科學應用最廣泛的模型。主要原因在於羅吉斯回歸是以二項式分配為基礎,適用於應變數是類別資料的情況,特別是分成兩類的應變數,例如成功/失敗、同意/不同意、是/否、有/無。

羅吉斯回歸是一種對數機率模型,他的迴歸係數可以用來估計模式中每一個自變數的勝算比。羅吉斯回歸模型與線性模型相似,只不過在應變數是取其勝算比的對數(log-odds):

\[logit(\pi(x))=\log\left(\frac{\pi(x)}{1-\pi(x)}\right)=\alpha x + \beta\]

經由對數-指數轉換,可改寫為:

\[\pi(x)=\frac{\exp(\alpha x + \beta)}{1 + \exp(\alpha x + \beta)}\]

鐵達尼號船難:票價與生還

羅吉斯回歸適用於應變數是分成兩類的類別資料。我們以羅吉斯回歸來驗證鐵達尼號(RMS Titanic)的悲劇其實與社會階級有關。

鐵達尼號於1912年4月10日載滿一千多名乘客,由英國南安普敦(Southampton)出發,途中經法國瑟堡(Cherbourg)及愛爾蘭皇后鎮(Queenstown),預定前往美國紐約。4月14日晚間11時不幸於航行途中撞上冰山,並於15日凌晨二時沉沒於大西洋外海,是近代最嚴重的海難之一。

通常像這種長途運輸,業者透過差別定價來賺取最大利潤是常態,航空業是如此,鐵達尼號這樣的豪華郵輪也不例外。根據歷史資料,鐵達尼號當年的票價就是採取差別訂價策略,Jack的三等艙票價比較便宜,Rose的頭等艙票價比較貴,而這樣的票價艙等,最終也和船難死亡有關。

由於鐵達尼號確切的搭乘名單及生還統計數字不一,直接採用 http://www.encyclopedia-titanica.org/ 的歷史資料,並將所有乘客姓名、年齡、船票等資訊整理成titanic.csv。在這份清單中包含鐵達尼號乘客及所有機組人員名單,我們只需分析票價與船難死亡的關聯性,因此先將機組人員排除在外,而設計師Thomas Andrews、8名隨船樂隊成員及部分船員因為有正式客房,則排除在機組人員外。首先先設定遺漏值。

> titanic<-read.csv("c:/Users/USER/downloads/titanic.csv", header=T, sep=",")
> titanic_passenger<-titanic[1:1317,]
> attach(titanic_passenger)
> titanic_passenger[fare==9999,"fare"]<-NA
> titanic_passenger[age==9999,"age"]<-NA
> str(titanic)
'data.frame':   2208 obs. of  10 variables:
 $ name    : chr  "ALLEN, Miss Elisabeth Walton" "ALLISON, Mr Hudson Joshua Creighton" "ALLISON, Mrs Bessie Waldo" "ALLISON, Miss Helen Loraine" ...
 $ gender  : int  1 0 1 1 0 0 1 0 1 0 ...
 $ age     : int  29 30 25 2 1 47 62 39 53 71 ...
 $ class   : chr  "1" "1" "1" "1" ...
 $ fare    : int  211 151 151 151 151 26 77 9999 51 49 ...
 $ group   : chr  "" "" "" "" ...
 $ joined  : chr  "Southampton" "Southampton" "Southampton" "Southampton" ...
 $ job     : chr  "" "Businessman" "" "" ...
 $ boat    : chr  "2" "" "" "" ...
 $ survival: int  1 0 0 0 1 1 1 0 1 0 ...

    

羅吉斯回歸模型

survival(1=獲救生還)當作應變數,fare(英鎊)當作自變數以glm()進行羅吉斯回歸,分布是二項式分布,連結函數為logit。根據歷史資料,船難發生的1912年英國仍使用先令(Shillin),先令於1971年才停止流通。20先令等於1英鎊,為計算方便,船票票價直接取英鎊整數。

> titanic_model<-glm(formula=survival~fare, data=titanic_passenger, family=binomial(link="logit"), na.action=na.exclude)
> summary(titanic_model)

Call:
glm(formula = survival ~ fare, family = binomial(link = "logit"), data = titanic_passenger, na.action = na.exclude)

Deviance Residuals:
    Min       1Q   Median       3Q      Max
-2.2790  -0.8817  -0.8486   1.3470   1.5703

Coefficients:
             Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.927778   0.076671 -12.101  < 2e-16 ***
fare         0.013108   0.001646   7.961  1.7e-15 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1710.1  on 1290  degrees of freedom
Residual deviance: 1617.2  on 1289  degrees of freedom
  (26 observations deleted due to missingness)
AIC: 1621.2

依據分析結果,鐵達尼號船難的票價與生還統計模型為:

\[\log\left(\frac{survive}{death}\right)= 0.013 x - 0.928\]

解釋羅吉斯迴歸模型

羅吉斯回歸是一種對數機率模型,係數必須以勝算取對數(log-odds)也就是logit的形式來解釋。在鐵達尼號船難的模型中,票價的係數0.013,代表票價每增加一英鎊,生還與死亡的log odds會改變0.013。把對數還原成指數後,去掉對數後可以計算原本的勝算:

> cbind(Estimate=coef(titanic_model), OR=exp(coef(titanic_model)))
               Estimate        OR
(Intercept) -0.92777802 0.3954314
fare         0.01310774 1.0131940

票價的勝算比為1.013,代表票價每增加一英鎊的時候,生還的勝算是1.013倍,也就是增加\((1.013-1)\times 100=1.3\%\)的可能性。而生還的機率會是:

\[survive \pi(x)=\frac{exp(0.013x-0.928)}{1+exp(0.013x-0.928)}\]

鐵達尼號票價最便宜的是3英鎊,最貴的是512英鎊。根據模型,付出3英鎊的乘客生還機率為:

\[survive \pi(x)=\frac{exp(0.013 \times 3 -0.928)}{1+exp(0.013 \times 3 -0.928)}=29.1\%\]

令人驚訝的是,根據這個模型付出512英鎊乘客的生還機率是:

\[survive \pi(x)=\frac{exp(0.013 \times 512 -0.928)}{1+exp(0.013 \times 512 -0.928)}=99.7\%\]

可以利用predict.glm()快速計算上述結果:

> predict.glm(titanic_model, type="response", newdata=data.frame(fare=3))
        1
0.2914288
> predict.glm(titanic_model, type="response", newdata=data.frame(fare=512))
        1
0.9969312

鐵達尼號船難:艙等與生還

羅吉斯回歸與一般回歸模型一樣,也可以包含虛變數。以鐵達尼號船難為例,羅吉斯回歸可以建立生還者與艙等、性別之間的模型。

titanic.csv檔中乘客艙等共分為頭等艙、二等艙與三等艙,分別以1、2、3來表示;性別則有男性與女性,分別以0、1來表示。以乘客所搭乘的艙等與性別為自變數,獲救與否當作應變數,建立多元羅吉斯迴歸模型。分析之前先設定三等艙及男性為虛變數參考點。

> class_f<-factor(class) #將class轉換為類別變數
> gender_f<-factor(gender) #將gender轉換為類別變數
> contrasts(class_f)<-contr.treatment(3, base=3) #設定虛變數參考點為三等艙。

gender_f編碼為0、1,無須再額外設定虛變數,可逕行以glm()進行羅吉斯迴歸分析:

> titanic_model2<-glm(formula=survival~class_f+gender_f, data=titanic_passenger, family=binomial(link="logit"), na.action=na.exclude)
> summary(titanic_mode2)

Call:
glm(formula = survival ~ class_f + gender_f, family = binomial(link = "logit"), data = titanic_passenger, na.action = na.exclude)

Deviance Residuals:
    Min       1Q   Median       3Q      Max
-2.0728  -0.6706  -0.4861   0.8247   2.0949

Coefficients:
             Estimate Std. Error z value Pr(>|z|)
(Intercept)  -2.0761     0.1240  -16.75  < 2e-16 ***
class_f1      1.8188     0.1677   10.84  < 2e-16 ***
class_f2      0.6984     0.1724    4.05 5.12e-05 ***
gender_f1     2.2815     0.1433   15.92  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1736.4  on 1316  degrees of freedom
Residual deviance: 1301.3  on 1313  degrees of freedom
AIC: 1309.3

Number of Fisher Scoring iterations: 4

模型的艙等與性別兩個自變數都達到顯著水準。分別計算頭等艙、二等艙與三等艙乘客相比較的生還勝算:

> exp(1.8188) #頭等艙乘客與三等艙乘客相較的生還勝算
[1] 6.164457
> exp(0.6984) #二等艙乘客與下等艙乘客相較的生還勝算
[1] 2.010533

女性與男性相比之下的生還勝算:

> exp(2.2815) #女性乘客與男性乘客相較的生還勝算
[1] 9.791356

指數換算後可發現,頭等艙乘客的活下來的勝算遠高於三等艙乘客,二等艙乘客也是如此,女性獲救的勝算則遠高出男性。這與船難發生時,船長Edward Smith下令讓婦幼先登上救生艇(women and children first)有關。由於登船順序以頭等艙乘客優先,最終造成三等艙乘客多數被困在船艙內無法獲救的悲劇。

而船長Smith下的women and children first的指令,也讓兩位大副Charles Lightoller與William Murdoch有不同解讀。位於左舷指揮逃難的Lightoller認為「women and children only」,右舷的Murdoch的自由心證則明顯寬鬆許多「women and children first, then others」。因此Murdoch在婦幼登艇後,開放讓男性登艇,Lightoller則嚴格遵守只讓婦幼登艇。這個決定性的差異,也導致最終獲救乘客多半集中在鐵達尼號的右舷。

艙等與性別對於船難最終結果的影響,從交叉表來看更為明顯,這場世紀船難存活下來的多數都是貴族及女性:

> survival<-factor(survival, levels=c(0,1), labels=c("Death", "Survive"))
> classtab<-table(class, survival)
> round(prop.table(classtab,1),2)
     survival
class Death Survive
    1  0.37    0.63
    2  0.61    0.39
    3  0.76    0.24
> gender<-factor(gender, levels=c(0,1), labels=c("Male", "Female"))
> gendertab<-table(gender, survival)
> round(prop.table(gendertab,1),2)
     survival
gender   Death Survive
  Male    0.80    0.20
  Female  0.31    0.69