在流行病學與大數據分析領域,我們常面臨一個挑戰:如何從非隨機的觀察性資料中,準確地評估一個暴露因素(如:某種治療、生活習慣)對結果(如:疾病發生)的真實影響?
這時,傾向分數分析(Propensity Score Analysis, PSA)就像一根魔杖,能幫助我們在混亂的資料中,為研究個案找到一群「天生我才、與你相似」的對照組。
但找到對照組或調整好資料後,下一步該怎麼做?這篇文章將為你解鎖三種最常見的傾向分數後續分析方法,並附上簡單的 R 程式碼,讓你一步步掌握這個強大的工具。
方法一:傾向分數配對法(Propensity Score Matching)
概念:為每個個案尋找「雙胞胎」,後續分析:使用「條件式」迴歸
配對法是最直觀的方式。它為你的每個研究個案,從龐大的資料庫中尋找一個或多個傾向分數最接近的對照組。這個過程就像為你的個案找到一個「雙胞胎」,兩者除了暴露狀態不同外,在其他重要特徵上幾乎一樣。
由於配對後的資料,個案組與對照組不再是完全獨立的,而是以「配對組」(matched sets)的形式存在,因此我們需要使用能夠處理這種相依性的模型:條件式羅吉斯迴歸或條件式 Cox 迴歸。
R 程式碼範例
# 假設你已使用 matchit() 完成配對,並創建了 matched_df 資料框
# matched_df 包含一個由 matchit 自動生成的 "subclass" 變數,用來識別配對組別
# 羅吉斯回歸 (針對二元結果)
# outcome 為你的二元結果變數,exposed_status 為暴露變數
# strata(subclass) 告訴模型將每個配對組視為一個獨立層次
library(survival)
clogit_model <- clogit(outcome ~ exposed_status + strata(subclass), data = matched_df)
summary(clogit_model)
# Cox 回歸 (針對時間至事件結果)
# time_to_event 和 event_status 為你的時間與事件變數
ccox_model <- coxph(Surv(time_to_event, event_status) ~ exposed_status + strata(subclass), data = matched_df)
summary(ccox_model)
方法二:傾向分數加權法(IPTW Weighting)
概念:用權重創造「理想世界」,後續分析:使用「加權」迴歸
加權法(最常見的是 IPTW, Inverse Probability of Treatment Weighting)則採取另一種思路。它不配對,而是為每個觀察對象賦予一個權重。這個權重會調整資料的分布,讓暴露組和對照組在所有共變量上都達到完美的平衡。想像一下,這就像在一個假想的世界中,兩組的基線特徵完全一樣。
在這種方法下,你只需在一般的迴歸模型中加入一個 weights
參數即可。但為了得到更可靠的結果,一般建議使用強健標準誤(Robust Standard Errors)來處理權重所引起的變異。
R 程式碼範例
# 假設你已計算好 iptw_weight 變數,並存放在你的資料框 df 中
# 加權羅吉斯回歸 (針對二元結果)
weighted_logit_model <- glm(outcome ~ exposed_status,
data = df,
weights = iptw_weight,
family = "binomial")
# 使用 coeftest 取得強健標準誤
library(lmtest)
library(sandwich)
coeftest(weighted_logit_model, vcov = vcovHC(weighted_logit_model, type = "HC1"))
# 加權 Cox 回歸 (針對時間至事件結果)
weighted_cox_model <- coxph(Surv(time_to_event, event_status) ~ exposed_status,
data = df,
weights = iptw_weight)
# 同樣使用強健標準誤
coeftest(weighted_cox_model, vcov = vcovHC(weighted_cox_model, type = "HC1"))
方法三:傾向分數分層法(Stratification)
概念:將相似者分組,後續分析:使用「分層」迴歸
分層法是另一種簡單直觀的方式。它將所有研究對象根據其傾向分數的高低,分成數個子群(通常是 5 等分或 10 等分)。在每個子群內部,個案組與對照組的特徵會非常相似。
在最終的迴歸模型中,你需要將分層變數作為一個調整項納入,以控制分層內的差異。
R 程式碼範例
# 假設你已計算好傾向分數,並根據它將資料分層,創建了 `ps_strata` 變數
# 分層羅吉斯回歸 (針對二元結果)
# 將 ps_strata 作為類別變數納入模型
stratified_logit_model <- glm(outcome ~ exposed_status + as.factor(ps_strata),
data = df,
family = "binomial")
summary(stratified_logit_model)
# 分層 Cox 回歸 (針對時間至事件結果)
# 使用 strata() 函數將分層變數納入模型
stratified_cox_model <- coxph(Surv(time_to_event, event_status) ~ exposed_status + strata(ps_strata),
data = df)
summary(stratified_cox_model)
三種方法比較

結語
這三種方法各有優缺點,但它們共同的目標都是為了得到一個無偏(Unbiased)的因果效應估計。研究中,可以根據資料特性和研究目的來選擇最合適的方法。
下次當你面對一個大型觀察性資料集時,別再只用傳統的迴歸分析了。試試傾向分數分析,它會讓你的研究結果更具說服力!