進階報告規範: STROBE已經雙重審閱,尚未人工抽查

病例對照研究

為什麼病例對照只能算 OR 不能算發生率、配對到底買到什麼、以及一個真實的分析過程如何差點把功勞歸給錯誤的原因。

方向相反,能算的東西也不同

病例對照研究從結果出發:先找到已經發生目標事件的人(cases),再找沒有發生的人(controls), 然後回頭比較兩群人的暴露史。

這個方向讓它擅長處理世代研究做不動的情況——罕見疾病(世代要追蹤幾萬人才等到幾個事件) 與潛伏期很長的疾病。代價是它算不出發生率

理由很直接:cases 與 controls 的比例是研究者選的(常見的是 1:1、1:2、1:4)。 分母是人為決定的,所以任何以分母為基礎的量——發生率、相對風險、絕對風險下降、NNT——都算不出來。 能算的是勝算比(odds ratio, OR)。

這一章的例子

用 base R 內建的 infert:續發性不孕的配對病例對照研究, 83 位 cases、165 位 controls, 依年齡、產次與教育程度做 1:2 配對,共 83 個配對組。 研究問題是人工流產(induced abortion)與續發性不孕有沒有關聯。

先照直覺列一張 2×2 表:

CaseControl
曾有人工流產3669
未曾有4796

粗算的 OR 是 1.07(95% CI 0.63–1.82)—— 信賴區間跨過 1,未達統計顯著

看起來沒事。但這張表有兩個問題,而且它們的份量完全不同。

配對做了什麼,以及它沒做什麼

配對是在選 control 的時候,讓每一位 control 在指定的變項上與其 case 相符。 這裡配的是年齡、產次、教育程度。

配對的目的是提高效率——它讓兩組在這些變項上先天平衡,不必依賴事後校正。 但它有一個常被忽略的後果:

正確的做法是條件式邏輯迴歸(conditional logistic regression), 它在每個配對組內部做比較,再把各組的資訊合併。

一個差點寫錯的比較

到這裡,教科書式的寫法會是:「看吧,忽略配對就會出錯」,然後放一組數字證明。 我們也差點這樣寫。實際跑出來的結果是:

模型OR95% CIp
普通邏輯迴歸(忽略配對)1.070.63–1.820.815
條件式邏輯迴歸(同樣的變項)1.090.61–1.970.764
條件式邏輯迴歸 + 自發性流產次數4.151.78–9.680.001

前兩列幾乎一樣。 尊重配對結構之後,OR 從 1.07 動到 1.09, 信賴區間依然跨過 1。真正讓結論翻轉的是第三列——加入自發性流產(spontaneous abortion)次數之後, OR 跳到 4.15(1.78–9.68), 達到統計顯著。

那為什麼自發性流產這麼關鍵

因為它是最強的候選干擾因子:自發性流產與續發性不孕往往來自同一個底層的生殖系統問題。 把它放進模型後,人工流產與續發性不孕的調整後關聯就從 1.09 移到 4.15。

在這份資料裡,人工流產次數多的人自發性流產次數確實偏少。但這個負相關至少有三種來源,資料本身分不出來: 它可能反映共同原因與暴露反向連動(那會把真實關聯壓平),也可能只是配對設計的產物—— infert 依 parity 配對,而 parity 固定之後,兩種流產次數的總和被壓在很小的範圍內, 一種多就必然另一種少。第三種可能是兩者共同影響了「是否被選進這份研究」,那屬於對撞結構。 要在這三者之間下判斷,靠的是生殖生理與抽樣機制的知識,不是這張表。

這也解釋了為什麼粗算的 2×2 表看不出東西——它把所有干擾因子都丟在一邊。 病例對照研究的 2×2 表幾乎從來不是最終答案,它只是起點。

病例對照特有的偏誤

選擇偏誤:controls 從哪裡來

controls 必須來自「與 cases 相同的來源母體」——也就是,如果他們發生了這個病, 會被這個研究抓到當成 case。

醫院型 controls(找住院的其他科病人)方便,但他們是因為別的病住院的, 而那些病可能與暴露有關(例如拿肺癌 case 配 COPD control,兩者都與吸菸有關 → 效果被稀釋)。 社區型 controls 較能代表母體,但配合度低、成本高。

回憶偏誤

暴露史是回頭問出來的。病人比健康人更會努力回想(「我為什麼會得這個病」), 所以 cases 的暴露報告往往比 controls 完整——這會製造出人工的關聯。

減輕的做法:用客觀紀錄(病歷、處方、登錄檔)而不是問卷;讓訪員不知道受訪者是 case 還是 control。

反向因果

暴露真的在結果之前嗎?病例對照的時序常常是靠回憶或紀錄推斷的。 早期症狀改變了行為(例如身體不適所以減少運動),會看起來像「不運動導致疾病」。

幾種進階變形

設計做法什麼時候用
巢式病例對照(nested case-control)在一個既有世代裡,事件發生時從仍在風險中的人抽 control世代已存在,但某些檢驗太貴不能全做
病例世代(case-cohort)一開始就隨機抽一個次世代當共同對照,供多個 outcome 使用要同時研究多個結果
自我對照(self-controlled case series)每個人自己當自己的對照,比較暴露期與非暴露期消除所有不隨時間變的個人特徵(基因、體質、社經)

前兩者因為 control 是從已定義的世代中抽出的,選擇偏誤與回憶偏誤都大幅降低, 而且母世代的分母是知道的,所以可以估計發生率

control 怎麼抽,還決定了勝算比在估什麼——這一步最常被跳過。 用風險集合抽樣(risk-set/density sampling,也就是上面那個巢式設計: 每個 case 的 control 從「該 case 發生當下仍在風險中的人」裡抽)時, OR 直接估的是發生率比(incidence rate ratio),完全不需要罕見疾病假設。 用病例世代抽樣時,估的是相對風險(risk ratio)。 只有累積抽樣——control 從「追蹤結束時仍未發病的人」裡抽,也就是本章前面一路在講的古典設計—— 產生的 OR 才需要第一節那個罕見疾病假設來救。 所以「疾病罕見,所以 OR 可以當 RR 讀」講的是某一種選 control 的方式, 不是病例對照研究的通性。

動手跑一次

library(survival)
data(infert)

infert$abortion <- factor(
  ifelse(infert$induced > 0, "Induced abortion", "None"),
  levels = c("None", "Induced abortion")
)

# ❌ 忽略配對
glm(case ~ abortion, data = infert, family = binomial)

# ✅ 尊重配對,變項與上面完全相同——這樣比較才只差一件事
clogit(case ~ abortion + strata(stratum), data = infert)

# ✅ 再控制自發性流產(真正讓結論改變的那一步)
clogit(case ~ abortion + spontaneous + strata(stratum), data = infert)

驗證環境:R 4.6.0 + survival 3.8.6。infert 是 base R 內建,不需安裝任何套件。

常見誤用

誤用為什麼錯
從病例對照研究報發生率或 RR分母是研究者選的,只能報 OR
疾病不罕見還把 OR 當 RR 解讀OR 會系統性放大效果
配對資料用普通邏輯迴歸分析配對結構被打散,標準誤失準且配對造成的關聯沒被還原;應用條件式邏輯迴歸
宣稱忽略配對「一定會低估效果」偏誤方向取決於配對變項與暴露、與結果的關聯方向,不具必然性
想估計配對變項本身的效應它在每個配對組內依定義相同,會從 conditional likelihood 裡消掉
看到校正後 OR 變大就斷定是干擾邏輯迴歸的非塌縮性即使完全沒有干擾也會讓條件 OR 更遠離 1
醫院型 control 未考慮其住院原因與暴露的關聯選擇偏誤,常見的方向是稀釋效果
用問卷回憶暴露卻不設盲回憶偏誤會製造人工關聯
兩個模型同時差多件事還宣稱是某一件造成的比較必須只差一件事,否則歸因錯誤
粗 2×2 表未達顯著就結案病例對照的 2×2 是起點不是終點,干擾因子未處理

重跑本頁的所有數字

/opt/homebrew/bin/Rscript figures/scripts/D2-case-control-infert.R

讀讀看這張圖

答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。

把「忽略配對的普通邏輯迴歸」直接拿來跟「條件式迴歸再加上自發性流產次數」對照,會得出「忽略配對讓你錯過真實關聯」。這個結論錯在哪?

看答案與解析

正確答案: 錯在跳過了中間那一列。同樣的變項、只多還原配對結構之後,勝算比是 1.09,跟忽略配對時幾乎一樣

那兩個模型同時差了兩件事:有沒有還原配對結構、有沒有控制自發性流產次數。要把差異歸給其中一件,比較就必須只差另一件——中間那一列存在的理由正是這個。實跑的結果是 1.07 動到 1.09,配對結構幾乎沒有動到點估計;真正讓結論翻轉的是加入自發性流產之後的 4.15。這不代表忽略配對無所謂:它讓標準誤與信賴區間失準,而且偏誤方向要看配對變項與暴露、與結果各自的關聯方向,並不必然指向虛無。它代表的只是「在這份資料上,那個差異不是配對造成的」。

這份研究收了 83 位 case 與 165 位 control,比例是研究者依 1 比 2 訂的。這對「能算出什麼」有什麼影響?

看答案與解析

正確答案: 有影響。248 這個總數是研究者拼出來的,不對應任何母體,所以只剩勝算比算得出來

病例對照從結果出發,case 與 control 的比例由研究者決定,所以 248 這個總數不對應任何母體。分母是人為的,任何以分母為基礎的量——發生率、相對風險、絕對風險下降、益一需治數——就都失去意義,能估的是勝算比。83 位 case 確實決定精確度,但那是另一個問題:能不能算,與算得準不準,是兩件事。165 位 control 也一樣真實,只是他們被選進來的機率不是由自然發生率決定的。順帶一提,古典設計的勝算比要當相對風險讀還得靠罕見疾病假設;換成風險集合抽樣,勝算比直接估的就是發生率比。

先照直覺列的 2×2 表算出一個粗勝算比,信賴區間跨過無效值。可以就此結案嗎?

看答案與解析

正確答案: 不行。粗勝算比 1.07 把每一個干擾因子都丟在一邊,它是起點不是終點

粗表沒有處理任何干擾因子,而這份資料裡最強的候選干擾因子——自發性流產次數——一放進模型,勝算比就從 1.07 附近跳到四倍以上。所以 1.07 不是「沒有關聯」的證據,只是「還沒開始分析」。上界 1.82 也不能拿來宣告排除:那是這份資料容得下的上限,而將近兩倍的關聯不是可以忽略的效果。下界 0.63 同理,區間橫跨無效值代表的是資料還分不出方向,不是效果很小。病例對照研究的 2×2 表幾乎從來不是最終答案。

把自發性流產次數放進條件式邏輯迴歸之後,人工流產的勝算比大幅移動。這足以證明自發性流產是干擾因子嗎?

看答案與解析

正確答案: 不足夠。4.150 這個移動幅度不容易只用非塌縮性解釋,但要稱它為干擾靠的是因果結構的假設

至少有兩件事會讓勝算比在加入變項後移動。一是真的有干擾被控制住;二是非塌縮性——邏輯迴歸的條件勝算比即使完全沒有干擾,只要新變項與結果有關,也會比邊際勝算比更遠離無效值。從 1.094 移到 4.150 幅度確實很大,單靠非塌縮性不容易解釋,但那是一個判斷,不是這張表自己說出來的。p 值 0.001 更不能當證據:它回答的是「這個估計離無效值多遠」,跟「前一個估計偏了沒有」是兩個問題。中間那個說法把顯著性當成估計值能不能用的前提,那是另一個獨立的誤讀。這裡比的是兩個點估計之間的移動,與其中任何一個有沒有達到顯著無關;1.094 未達顯著只代表它的區間涵蓋無效值,不代表這個數字不能當比較基準。真照那個標準走,所有以「加入變項前後係數移動了多少」為基礎的干擾診斷都會失效——那類診斷刻意不看顯著性,正是因為調整前的估計常常本來就未達顯著。要把一個變項稱為因果意義上的干擾因子,需要的是時序、DAG、有沒有未測量的干擾,以及選樣機制這些模型外的假設。

這份研究依年齡、產次與教育程度做 1 比 2 配對,共 83 個配對組。條件式邏輯迴歸能不能順便告訴我們年齡與續發性不孕有沒有關聯?

看答案與解析

正確答案: 不能。年齡在這 83 個配對組的每一組內部依定義相同,它會直接從條件概似裡消掉

配對把年齡固定在每一個配對組內部,而條件式邏輯迴歸做的正是組內比較,所以年齡在 83 個組裡沒有變異,會從條件概似裡消掉。這不是模型的缺陷,是配對的代價。248 人的年齡分布確實還在資料裡,但那個分布是配對造出來的,不是來源母體的;165 位 control 的年齡是研究者依 case 挑出來的,拿它當母體分布會直接把配對的人為結構讀成自然分布。所以這份資料回答不了「年齡與續發性不孕有沒有關聯」——這是這個設計加這個分析的限制,不是說年齡的作用在任何框架下都不能討論。

2×2 表裡「曾有人工流產」那一列,case 欄與 control 欄各有一個數字。橫著把這兩格相比代表什麼?

看答案與解析

正確答案: 什麼都不代表。case 有 36 位、control 有 69 位,兩者的比值是收案比例的產物

橫著比 case 欄與 control 欄,比的是研究者決定的收案比例,不是任何自然發生的量。要算的是每一欄內部的勝算——case 裡 36 比 47,control 裡 69 比 96——再把兩個勝算相除。47 與 96 都是真實的格子,但它們的分母是被挑出來的那一群人,所以任何以它們為分母的「風險」或「發生率」都不存在於真實世界。這也正是病例對照研究只報勝算比的原因:格子是真的,分母不是。

延伸觀看

Case-Control Studies: A Brief Overview
ENTerry Shaneyfelt· 5 min五分鐘的總覽,先建立方向感再讀本章。
Case-control study explained
ENHenrik's Lab· 3 min三分半,圖解為主。
Principles of Epidemiology 08. Case-Control Study 1: Principles
繁中臺大開放式課程 NTU OCW· 54 min繁中完整課程。本章第一、二節的內容在這裡有更完整的推導。
Principles of Epidemiology 09. Case-Control Study 2: M-H Methods & Selection Bias
繁中臺大開放式課程 NTU OCW· 68 min繁中。Mantel-Haenszel 方法與選擇偏誤,正是本章第四、五節談的東西。

素材來源與授權

回報內容問題

這個站的統計內容由 AI 撰寫、AI 互審,人工只做抽查。你看得出來的錯,我們不一定看得出來。

寫得越具體越修得動,例如哪一句話跟哪本教科書/哪篇論文的說法不一致。

留了才回得了信;不留也會看。

一併送出的資訊

這些是自動帶上的,每一項都可以取消。