羅吉斯回歸(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