Rare Events

Rare Events and SAS PROC LOGISTIC 稀少事件如何解?

前言

不知道大家在分析的時候,是否碰到過描述性統計中的交叉表中細格子中出現「0」的情況,導致再進一步地進行卡方分析的時候出現 warning?亦或者是在最後要使用邏輯式迴歸 (Logistic Regression) 跑模型的時候,重要變項的 95%信賴區間 (95% Confidence interval, 95%CI) 無法收斂,導致結果無法作為參考?

在2020年,SAS全球論壇釋出了一個解決以上問題的方法 ── Firth Regression

在正式介紹這個方法之前,我們先來認識一下何謂稀少事件 (rare events)。按字面上的意思很直接的解釋就是:發生比例極小的事件,但是怎樣才算極小呢?這其實是要看我們所分析的 Outcome 是什麼。

如果是以疾病作為分析目標的話,盛行率是重要的指標,而每個國家的對罕見疾病的定義都不太一樣,例如台灣的定義為「年盛行率標準萬分之一以下」,而世界衛生組織則是將罕見疾病定義為「罹病人數佔總人口 0.65 ‰ 到 1‰ 之間的疾病或病變」。

實際在分析時,我們習慣會先以 5% 的盛行率來視為稀少事件因此於這次介紹中,就會以 5% 的比例來視為稀少事件。


Firth Regression

首先,我們先來看看Firth Regression的一些背景及他主要可以解決的問題:

1993年時,英國統計學家 David Firth 提出Firth Regression 的修正方法來解決小樣本誤差 (small sample bias) 的問題。我們在使用邏輯式迴歸分析二分類結果時可能會遭遇資料量太小、或者 Outcome 為稀少事件的情況,此時便容易使邏輯式迴歸估計出的參數產生誤差 ,也就是估計的準確度會失準。

Firth 所提出的方法是在邏輯式迴歸中的最大概似估計 (Maximum likelihood estimates) 設一個「懲罰項」以降低誤差。

完全分離

而 2002 年時,Heinze & Schemper 等人則是利用此方法來改善一個稱作完全分離 (complete separation) 的現象。簡單來說,完全分離就是指某一個自變項會永遠發生或永遠不發生在某一個依變項(outcome),這個現象主要常發生在稀有事件,但仍然會發生在非稀有事件或大型資料中,例如:攝護腺癌雖不是罕見疾病,但由於只有男性會罹患,因此若是要做一個攝護腺癌與性別的交叉表,即會發生完全分離的情況。而這個現象常常會造成我們在做邏輯式迴歸的時候,造成95% CI無法收斂的情況。

其實除了Firth Regression之外,Fisher’s Exact Test和 Exact 邏輯式迴歸同樣也可以解決小樣本於分析過程中跑不出結果的問題,但是這些方法仍然存在著些許缺點:

  1. 若模型中的自變項包含著連續變項,就沒辦法使用 Exact 的方法

  2. Exact 算出來的95% CI其兩端數值會趨近於無限大或無限小

  3. 會需要較大的記憶體來做運算且運算時間也較長

以上講了一大串應該都看到昏頭了,現在我們實際來看些例子,比較Maximum Likelihood(ML) Logistic Regression、Exact Regression 和 Firth Regression的差異。


我舉個栗子

例一:完全分離

首先我們看一個只有二個變項的資料:

併發症 Complication: Yes/No
手術 Procedure: New/Old
次數 Number

data sparse;
input complication ​procedure number;
datalines;
Yes New 0
Yes Old 9
No New 30
No Old 191
;
proc freq data=sparse; 
table complication*procedure/nopercent norow chisq fisher RelRisk; weight number; 
run;

結果可知,卡方交叉表中有一格顯示為 0,因此無法使用卡方檢定,只能看 Fisher Exact Test,而OR值因為卡方交叉表有一格顯示為 0,因此無法經由 PROC FREQ 得到 OR 值。


接著,我們改使用一般的 PROC LOGISTIC 來分析。

proc logistic data=sparse; 
class complication(ref='No') procedure(ref='Old')/param=glm; 
model complication=precedure; 
run;

首先先使用傳統的 Maximum Likelihood (ML) Logistic Regression,則也會顯示很多 warning。

WARNING: There is possibly a quasi-complete separation of data points. The maximum likelihood estimate may not exist.

WARNING: The LOGISTIC procedure continues in spite of the above warning. Results shown are based on the last maximum likelihood iteration. Validity of the model fit is questionable.

Warning: The maximum likelihood estimate may not exist.

Warning: The LOGISTIC procedure continues in spite of the above warning. Results shown are based on the last maximum likelihood iteration. Validity of the model fit is questionable.


另外我們改使用 Exact Logistic

proc logistic data=sparse; 
class complication(ref='No') procedure(ref='Old') / param=glm; 
model complication=procedure; exact procedure / estimate = odds; 
run;

雖然可以估算出結果來,但是可以看到95% CI 的其中一端趨近於無限小(lower=0),顯示 log odds 事實上是負的無限大 (exp(negative infinity) =0) 。

 

最後,我們使用 Firth Logistic 來看看,最後得出的結果與 Fisher’s Exact Test一樣是沒有顯著相關,且95% CI 的兩端則都不是趨近於無限的值

proc logistic data=sparse; 
class complication(ref='No') procedure(ref='Old') / param=glm; 
model complication=procedure / firth; 
run;


例二:自變項為連續變項時

延續使用第一個例子的資料,此資料中的 outcome 為 rare event,然而由於所選用的自變項為連續變項(年齡),Exact的方法都是不可行的,因此便直接使用firth logistic來跟傳統 ML logistic regression來比較。

/* Maximum Likelihood Logistic Regression */ 
proc logistic data=sparse; 
class complication(ref='No') / param=glm; 
model complication=Age; 
run;

/* Firth Regression */ 
proc logistic data=sparse; 
class complication(ref='No') / param=glm; 
model complication=Age / Firth; 
run;

Firth Regression的結果顯示standard error較小、95% CI 也較窄,但是OR則較接近1。


例三:兩組人數差異很大的稀少事件

我們換一個新的資料,Group 為組別 (1/2),Event 則為二項式的資料(Yes/No)。雖然資料中的 Outcome  仍為 rare event,但是不是complete separation。藉由這個資料來比較ML logistic regression、exact logistic regression和firth regression的差異。

/* Maximum Likelihood Logistic Regression */ 
proc logistic data=sparse2; 
class event(ref='No') group(ref='2') / param=glm;
model event=group; 
run;

/* Exact Logistic Regression */ 
proc logistic data=sparse2; 
class event(ref='No') group(ref='2') / param=glm; 
model event=group; 
exact group / estimate=odds; 
run;

/* Firth Regression */ 
proc logistic data=sparse2; 
class event(ref='No') group(ref='2') / param=glm; 
model event=group / Firth; 
run;

Exact Logistic Regression 得出的結果與 ML 和 Firth 的差異較大,Exact 雖然有顯著差異,但 p value 較大,且其 95% 信賴區間的間隔也較寬。相對之下 Firth 和 ML 的結果則較相似。


例四:分析時間的差異

最後我們來看看分析時間的問題。(由於Exact logistic regression在樣本數為20,000便開始出現記憶體不足的問題,因此SAS論壇的文章並沒有一起討論)

由下圖顯示,隨著樣本數變大,Firth Regression 所需要的分析時間會比 ML Logistic Regression 來得長,雖然小樣本誤差的問題不會出現在100萬以上的資料中,但是還是可能會發生完全分離的情況,所以仍然可能會需要用到 Firth regression,因此雖然 Firth Regression 相對ML Logistic Regression會增加分析時間,但若能有效地解決完全分離所造成的分析問題,Firth Regression仍然是我們可以選擇使用的方法


結語

當我們所關注的 Outcome 是稀少事件或發生完全分離的情況,在分析時 Firth Regression 是良好的替代選擇。就算資料是完全分離的形態,Firth Regression 仍然可以估計出信賴區間 (而不是無限大或無限小)。當資料不大時 (例如少於數百萬筆),執行 Firth Regression 所需的執行時間和記憶體不會帶來太多負擔。最後也是最重要的,Firth Regression 對於熟悉 SAS PROC LOGISTIC 的使用者來說,是非常容易執行和解釋的。


參考文獻

Firth, D. 1993. Bias reduction of maximum likelihood estimates. Biometrika, 80: 27-38.

Patrick K. 2020. Rare Events or Non-Convergence with a Binary Outcome? The Power of Firth Regression in PROC LOGISTIC. SAS Global Forum 2020.

如有任何問題和意見歡迎提出