工具變數
當關鍵的干擾因子根本沒被測量時唯一還有機會的方法、它的三個假設裡有兩個永遠無法用資料驗證、弱工具變數的偏誤會把你拉回原本那個有偏誤的估計,以及孟德爾隨機化為什麼是醫學上最常見的工具變數。
這一頁在解決什麼問題
前三頁——DAG、配對、加權——全部建立在同一個前提上:干擾因子有被測量到。 DAG 上那些灰色節點,配對與加權完全處理不了;它們只是換一種方式使用你手上已有的變項。
但臨床研究裡最重要的干擾因子往往正是沒被測量的那些:疾病嚴重度的細微差別、醫師對這個病人「感覺不太對」的臨床直覺、病人的健康行為傾向、社經地位。健保資料庫裡有處方、有診斷碼、有檢驗值,沒有醫師為什麼開這個藥。
工具變數(instrumental variable, IV)是唯一在這種情況下還有機會的觀察性方法。它的作法不是把干擾因子校正掉,而是繞過去:找一個只影響「有沒有接受治療」、但不透過任何其他路徑影響結果的外在因素,然後只用它造成的那部分變異來估效果。
代價非常高,而且要先講清楚:它的三個關鍵假設裡有兩個永遠無法用資料驗證。 這一頁有一半篇幅在講這件事。
一個臨床場景
模擬的設定是這樣,每一個角色都對應到臨床上真的會遇到的東西:
- U — 疾病嚴重度,沒有被記錄在任何資料欄位裡。病得比較重的人比較容易被開這個新藥(confounding by indication,適應症干擾),而且結果本來就比較差。
- Z — 病人剛好去了哪一家醫院。各家醫院對這個新藥的積極程度不同(有的科部很早就換上去,有的還在觀望)。這是工具變數。
- A — 有沒有開始用這個新藥(是/否)
- Y — 十二週後的症狀分數,越低越好。這個藥的真實效果是把分數降低 2.00 分。
figures/scripts/B6-04-iv.R模擬出來的資料確實長成這樣:接受治療與未接受治療的人,嚴重度差了 0.99 個標準差(這就是適應症干擾);而兩家醫院的病人,嚴重度只差 0.022 個標準差(工具變數把嚴重度打平了)。這一組對照就是工具變數的全部希望所在。
三個假設,其中兩個無法驗證
| 假設 | 白話說法 | 資料檢查得到嗎 |
|---|---|---|
| 1. 相關性(relevance) | 工具變數真的會影響接不接受治療 | 可以,看第一階段迴歸的 F 統計量 |
| 2. 排除限制(exclusion restriction) | 工具變數只透過治療影響結果,沒有別的路 | 不行 |
| 3. 獨立性(independence/exchangeability) | 工具變數與結果沒有共同原因,也就是工具變數本身不被干擾 | 不行 |
第一條是唯一可以檢查的。這個模擬裡,去了積極用藥那家醫院的病人有 72.1% 開始用藥,另一家是 37.2%,差距 34.9 個百分點。主案例以 n = 5000 的單次模擬估得第一階段 F = 701。這是一個很強的工具變數。
第二與第三條在任何資料集裡都不可能被證實,因為它們談的是「不存在的路徑」與「未測量的共同原因」——你手上沒有那些變項,所以寫不出一個「通過就代表假設成立」的檢定。
但不能被證實不等於無事可做:這兩條可以被反駁。 資料可以拿出與假設不相容的證據,只是拿不出支持假設的證據。最常做的兩種:(1) 按工具變數的值分層,比較已測量共變項的平衡——等於一張 by-instrument 的 Table 1,如果兩層的病人在年齡、共病、疾病嚴重度上就已經不一樣,獨立性當場就有麻煩;(2) negative control outcome——挑一個理論上絕不可能被這個治療影響的結果,如果工具變數對它也「有效果」,那條「只透過治療」的路徑就站不住。這一頁的模擬其實就做了第 (1) 種:上一節「兩家醫院的病人,嚴重度只差 0.022 個標準差」正是這張平衡表的結論。
負對照不只有一種
上面第 (2) 種檢查用的是負對照結果(negative control outcome):一個理論上絕不可能被這個暴露影響的結果。 它還有一個對稱的版本,負對照暴露(negative control exposure):一個理論上絕不可能影響這個結果的暴露。 兩者回答的是同一個問題的兩個方向——「如果我的分析是乾淨的,這裡不該看到東西,那我看到了嗎?」
Lipsitch 等人把它整理成三個要件,缺一個就不算負對照:
- 它與真正的結果/暴露共享同一批干擾因子(否則它查不出你在意的那種偏誤)
- 它與待測的因果關係之間沒有真正的因果路徑(否則看到關聯是應該的)
- 它的測量與選擇機制跟主分析一樣(否則它查不出選擇偏誤與測量誤差)
第 1 條是最容易被忽略也最關鍵的:一個跟主分析毫無共同干擾因子的負對照,通過了也不代表什麼。
一批負對照可以拿來校正
單一個負對照只能給是非題。一批負對照可以做更多事:把數十個真值已知為零的關聯全部估出來, 畫成一個分布,那個分布理應以虛無值為中心。如果它不是,那段偏移量就是殘餘偏誤的估計—— 可以拿它回頭把主分析的 p 值與信賴區間校正得保守一些。這叫 empirical calibration, 是 OHDSI 與 FDA Sentinel 這類大型資料庫藥物安全性研究的標準配備。 ITS 與 DiD 那一頁用模擬把這件事做了一遍,包括校正後信賴區間變寬多少。
還有一個常被略過的第四條,只在治療是二元的時候需要:單調性(monotonicity)——不存在「因為去了積極用藥的醫院,反而不用藥」的人。滿足它的時候,工具變數估到的是 LATE(local average treatment effect,局部平均治療效果),也就是只針對那群「醫院決定了他用不用藥」的病人的效果,不是全體的 ATE。這群人是誰?資料裡認不出來。這是工具變數的估計量最難跟臨床同事解釋的一點。
動手跑一次
只有一個二元工具變數、一個治療時,兩階段最小平方法(2SLS)等同於一個更好懂的東西——Wald 比值:
分子是「換一家醫院,結果差多少」,分母是「換一家醫院,用藥比例差多少」。用結果的差除以用藥的差——如果換醫院只讓用藥比例差三分之一左右,那結果的差就要放大大約三倍,才是「全部都用藥」的效果。
寫成比值有一個好處:分母小的時候會發生什麼事,一眼就看得到。 那正是弱工具變數問題。
set.seed(20260822)
simulate_cohort <- function(n, alpha_z, direct_z = 0) {
U <- rnorm(n) # 嚴重度:未測量
Z <- rbinom(n, 1, 0.5) # 醫院:工具變數
A <- as.integer(-0.4 + alpha_z * Z + 0.9 * U + rnorm(n) > 0) # 用不用藥
Y <- -2 * A + 2 * U + direct_z * Z + rnorm(n) # 真實效果 = -2
data.frame(U, Z, A, Y)
}
d <- simulate_cohort(5000, alpha_z = 1.2)
# ── 天真的做法:直接比較用藥與不用藥 ────────────────────────────────
summary(lm(Y ~ A, data = d))$coefficients["A", ]
# ── Wald 比值 = 只有一個二元工具時的 2SLS ───────────────────────────
wald <- function(d) {
(mean(d$Y[d$Z == 1]) - mean(d$Y[d$Z == 0])) /
(mean(d$A[d$Z == 1]) - mean(d$A[d$Z == 0]))
}
wald(d)
# 完全等價的兩階段寫法(注意:第二階段的標準誤是錯的,要用 bootstrap 或
# 專門套件如 AER::ivreg / ivreg::ivreg 來修)
stage1 <- lm(A ~ Z, data = d)
coef(lm(Y ~ fitted(stage1), data = d))[2]
# ── 第一階段強度:唯一檢查得到的假設 ────────────────────────────────
summary(stage1)$fstatistic[1] # 慣例:大於 10 才算不弱
# ── 信賴區間:bootstrap 整個流程 ────────────────────────────────────
boot <- replicate(1000, wald(d[sample.int(nrow(d), replace = TRUE), ]))
quantile(boot, c(0.025, 0.975))
# ── 只有模擬做得到的事:把未測量的干擾因子放進模型 ──────────────────
summary(lm(Y ~ A + U, data = d))$coefficients["A", ]驗證環境:R 4.6.0,base R 即可;2SLS 與 bootstrap 都用內建函式
import numpy as np, statsmodels.api as sm
rng = np.random.default_rng(20260822)
def simulate_cohort(n, alpha_z, direct_z=0.0):
U = rng.normal(size=n)
Z = rng.binomial(1, 0.5, size=n)
A = (-0.4 + alpha_z * Z + 0.9 * U + rng.normal(size=n) > 0).astype(int)
Y = -2 * A + 2 * U + direct_z * Z + rng.normal(size=n)
return U, Z, A, Y
U, Z, A, Y = simulate_cohort(5000, alpha_z=1.2)
ols = sm.OLS(Y, sm.add_constant(A)).fit()
print(ols.params[1]) # 偏誤的估計
wald = (Y[Z == 1].mean() - Y[Z == 0].mean()) / (A[Z == 1].mean() - A[Z == 0].mean())
print(wald)
stage1 = sm.OLS(A, sm.add_constant(Z)).fit()
print(stage1.fvalue) # 第一階段 F
oracle = sm.OLS(Y, sm.add_constant(np.column_stack([A, U]))).fit()
print(oracle.params[1]) # 只有模擬拿得到Python 側同樣不需要專門套件;linearmodels 的 IV2SLS 會多給你 Sargan、Wu-Hausman 等檢定。
四個估計,同一份模擬資料(真實效果是 -2.00):
| 做法 | 估計值 | 95% CI | 離真值多遠 |
|---|---|---|---|
| 真實效果(模擬設定值) | -2.00 | — | — |
| 直接比較用藥 vs 不用藥 | -0.03 | -0.14 到 0.09 | 1.97 |
| 工具變數(Wald 比值) | -1.77 | -2.15 到 -1.45 | 0.23 |
| 把未測量的嚴重度放進模型(只有模擬做得到) | -1.99 | -2.05 到 -1.93 | 0.01 |
第二列是災難:這個藥真的能把症狀分數降低 2.00 分,但直接比較用藥與不用藥的人,估出來的效果是 -0.03——整個效果被適應症干擾抹平了,信賴區間還跨過 0。「這份分析未偵測到這個藥的效果」本身是誠實的陳述;但任何只看這一列的人都會再往前一步、得出「這個藥沒有效果」的結論,而那一步才是錯的。
第三列的工具變數估計把它救回來了。第四列是只有模擬才拿得到的答案,用來確認確實是那個未測量的嚴重度在作怪。
弱工具變數
第一個假設是唯一可檢查的,而檢查不通過的後果比想像中嚴重。把工具變數的強度從很弱調到很強,每種強度重複模擬 400 次:
figures/scripts/B6-04-iv.R下表的 F 是另一組重複模擬的中位數,不是主案例那一次的 F。
| 第一階段 F(中位數;每次 n = 2000,400 次模擬) | 估計值中位數 | 90% 的模擬落在 | 方向估反的比例 |
|---|---|---|---|
| 0.6 | -0.20 | -24.84 到 19.40 | 49% |
| 1.0 | -0.75 | -11.91 到 11.93 | 41% |
| 2.4 | -1.82 | -12.43 到 6.22 | 26% |
| 15.7 | -1.98 | -4.75 到 -0.17 | 4% |
| 85.8 | -2.01 | -2.97 到 -1.29 | 0% |
| 265.1 | -2.01 | -2.56 到 -1.55 | 0% |
兩件事要看:
第一,弱工具變數的偏誤有方向,而且是往壞的方向。 最弱的那一列,估計值中位數是 -0.20——那不是隨機亂跑,那是往天真估計(模擬裡是 -0.06)靠攏。直覺上原因是:工具變數幾乎不影響治療時,Wald 比值的分母趨近 0,而分子裡任何一點點的殘餘關聯(包括工具變數自己的抽樣雜訊)都會被放大成任意大的數。弱工具變數不會給你一個沒有訊息的答案,它會給你原本那個有偏誤的答案,外加一個看起來很寬容的信賴區間。
第二,「方向估反」在弱的時候是常態。 最弱的那一列有將近一半的模擬把效果的方向估反了。
慣例的門檻是第一階段 F 統計量大於 10。這個數字來自模擬研究,是經驗法則不是定理——上表可以看到 F 在 15 附近時估計已經接近無偏,但 90% 的區間仍然寬得驚人。近年的方法學文獻認為在弱工具變數的情境下 10 太寬鬆,也有專門的弱工具穩健推論方法(例如 Anderson-Rubin 檢定)。該報的是 F 統計量本身,不是「通過了門檻」。
排除限制被破壞的時候
上圖右邊的那張是這一頁最重要的一張。它讓工具變數對結果有一點點直接效果(也就是破壞第二個假設),其他都不變:
| Z 對 Y 的直接效果 | 工具變數估計 | 偏誤 |
|---|---|---|
| 0.00 | -2.01 | -0.01 |
| 0.10 | -1.67 | 0.33 |
| 0.25 | -1.29 | 0.71 |
| 0.50 | -0.55 | 1.45 |
一個只有 0.50 的直接效果(相對於治療本身的 2.00,只有四分之一),就把估計從 -2.01 推到 -0.55——效果幾乎消失了。
而在這整個過程中,第一階段的 F 統計量一路維持在幾百的水準。沒有任何診斷會亮紅燈。
孟德爾隨機化
醫學上最常見的工具變數是基因型,這種設計叫做孟德爾隨機化(Mendelian randomisation, MR)。
它的邏輯是:一個人從父母那裡拿到哪一個等位基因,在受精那一刻就決定了,而且是隨機的(減數分裂的分離定律)。所以如果某個基因變異會影響你想研究的暴露(比方說 LDL 濃度、BMI、飲酒量),它就滿足第一個假設;而因為它在出生前就固定了,它不可能被後天的生活習慣、社經地位、疾病狀態所影響——第三個假設(獨立性)在這裡有生物學上的理由支撐,而不只是一廂情願。這是 MR 相對於其他工具變數最大的優勢。
三個假設在 MR 語言裡的樣子,以及它們各自的失效模式:
| 假設 | MR 的說法 | 這裡的具體威脅 |
|---|---|---|
| 相關性 | 基因變異真的影響暴露 | 單一 SNP 的效果通常很小 → 弱工具變數 |
| 排除限制 | 基因只透過這個暴露影響結果 | 多效性(pleiotropy):同一個基因影響好幾種表徵 |
| 獨立性 | 基因與結果沒有共同原因 | 族群分層(population stratification):族裔同時決定基因頻率與疾病風險 |
多效性是 MR 最核心的問題,因為它就是排除限制被破壞——而排除限制無法驗證這件事在這裡一樣成立。實務上的處理是用很多個 SNP 一起做,然後用一系列對多效性較不敏感的估計式(MR-Egger、weighted median、MR-PRESSO)互相對照:如果不同方法給出一致的答案,多效性同時騙過所有方法的機率比較低。但這是三角驗證,不是驗證。
什麼時候該想到工具變數
工具變數不是「更高級的校正」,它是一個在特定條件下才成立的交換。適合它的情境有三個共同特徵:
- 最重要的干擾因子確定沒被測量,而且你講得出它是什麼——如果只是「可能還有殘餘干擾」,那用加權加上敏感度分析(E-value 之類)通常更務實
- 存在一個講得出物理/制度理由的外在變異來源,而不是在資料裡挑一個「跟治療有關、跟結果無關」的變項——後者是用資料選工具變數,等於用資料驗證一個無法驗證的假設
- 樣本夠大,撐得起那個寬三倍的信賴區間
不符合的時候,誠實的作法是把未測量干擾寫進 limitation,而不是硬做一個工具變數分析。目標試驗模擬那一頁的角度也值得一起考慮:很多看起來像「未測量干擾」的問題,其實是設計錯誤(時間零點沒定義、對照組選錯)造成的,那些用設計就能修好。
常見誤用
| 誤用 | 為什麼錯 |
|---|---|
| 說「我們的工具變數通過了所有檢定」 | 只有第一個假設檢查得到,另外兩個邏輯上無法驗證 |
| 只報「F 大於 10」不報 F 本身 | 10 是經驗法則不是定理,讀者需要知道實際強度 |
| 用弱工具變數還照樣解讀點估計 | 弱工具的偏誤方向是往原本那個有偏的估計靠 |
| 在資料裡挑「跟治療相關、跟結果無關」的變項當工具 | 那是用資料驗證一個無法用資料驗證的假設 |
| 把工具變數同時當共變項放進迴歸 | 那會抵消掉它唯一的用處,並放大殘餘偏誤 |
| 把 IV 估計說成全體母體的 ATE | 二元治療下它是 LATE,只針對「被工具變數改變決定的人」 |
| 手寫兩階段迴歸後直接讀第二階段的標準誤 | 第二階段沒有把第一階段的不確定性算進去,會低估 |
| 把 MR 的效果量當成藥物能達到的效果 | MR 估的是一輩子的暴露差異 |
| MR 只用一種估計式、不做多效性敏感度分析 | 多效性就是排除限制被破壞,而它無法直接驗證 |
| 因為 IV 的信賴區間跨過 0 就說治療無效 | 只能說未偵測到差異;IV 的區間本來就寬 |
重跑本頁的所有數字
/opt/homebrew/bin/Rscript figures/scripts/B6-04-iv.R讀讀看這張圖
答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。
模擬設定的真實效果是 -2.00。直接比較用藥與不用藥的人,估出來的是 -0.03,信賴區間跨過零。這一列該怎麼讀?
看答案與解析
正確答案: 工具變數在同一份資料上估到 -1.77,天真估計貼著零是因為適應症干擾把效果抹平了
同一份模擬資料上四個估計並排:真值 -2.00,天真估計 -0.03,工具變數 -1.77,把未測量的嚴重度放進模型(只有模擬做得到)是 -1.99。天真估計的區間確實窄,上界只到 0.09——但那個精確度建立在一個有偏誤的比較上,區間窄不代表答案對,「又窄又跨過零」正是最危險的組合,因為它讓人從「這份分析未偵測到效果」再往前走一步、講成「這個藥沒有效果」。偏掉的原因也不是樣本不夠大:樣本再加下去,只會讓那個錯的答案更精確。真正在作怪的是那個沒被測量的嚴重度,它同時決定誰會被治療與誰會惡化。
工具變數把天真估計救了回來,代價寫在信賴區間的寬度上——而這已經是一個第一階段 F 統計量高達 701 的強工具變數。為什麼還是這麼寬?
看答案與解析
正確答案: 因為兩家醫院的用藥率只差 0.349,Wald 比值要除以它,只有這一小段差異在提供訊息
Wald 比值的分母是「換一家醫院,用藥比例差多少」,這份模擬是 0.349。分子要除以它,所以結果的差被放大將近三倍,而放大的同時雜訊也一起被放大,區間因此變寬。0.721 是分派到那一家醫院那一組的用藥比例,它本身不決定精確度,兩組的差才決定——把它推得更靠近一而另一組不動,差反而變大、估計會更精確,所以「順從得不夠徹底」指錯了地方。0.022 是工具變數與嚴重度之間的標準化差,那麼接近零正是這個工具變數合格的證據,不是它不精確的原因。工具變數用精確度換無偏;樣本數不夠大的時候,它會誠實地告訴你不知道,而那往往比一個精確但有偏的數字有用。
把工具變數調到最弱的那一組,估計值的中位數是 -0.20,而真實效果是 -2.00。這個偏誤往哪個方向去?
看答案與解析
正確答案: 往天真估計去。同一批模擬的天真估計是 -0.06,弱工具變數的估計會往它靠攏
弱工具變數的偏誤有方向,而且是往壞的方向:最弱那一組的估計中位數是 -0.20,而同一批模擬的天真估計是 -0.06——估計被拉回它本來要逃離的那一個。直覺上的原因是 Wald 比值的分母趨近零,分子裡任何一點殘餘關聯(包括工具變數自己的抽樣雜訊)都會被放大成任意大的數。散布確實也很誇張,90% 的模擬落在 -24.84 到很大的正值之間,將近一半把效果的方向估反了;但「散得開」與「有方向」是兩件事,這裡兩件都成立。至於 -1.98,那是工具變數已經相當強的那一組的中位數,估計收斂到真值附近,不是弱的那一組,也沒有比真值更負。
讓工具變數對結果有一點點直接效果,其他都不變。直接效果只有 0.5,相對於治療本身只有四分之一。第一階段 F 統計量會怎麼動?
看答案與解析
正確答案: F 完全不動。直接效果為零時估計是 -2.01,打開直接效果之後估計偏掉,而 F 一路維持在幾百
第一階段 F 衡量的是工具變數與治療的關聯有多強,它跟「工具變數有沒有繞過治療、直接影響結果」毫無關係——排除限制被破壞的整個過程裡,F 一路維持在幾百的水準。直接效果為零時估計是 -2.01,貼著真值;直接效果打開到 0.5 之後估計被推到 -0.55,效果幾乎消失,而這段路上沒有任何一個算得出來的診斷變過臉色。1.45 是那一列的偏誤欄,也就是估計與真值的差,不是任何一個 F 統計量。這就是為什麼「兩個假設無法驗證」不是一句免責聲明:唯一有效的檢查是拿臨床知識去質疑那條不該存在的箭頭,例如那位醫師是不是也在其他方面照顧得比較好、住得遠的人是不是社經地位也不同。
上表裡 F 中位數 15.7 的那一組已經越過了慣例門檻,估計中位數是 -1.98,很接近真值。這一組該報什麼?
看答案與解析
正確答案: 報 F 本身。那一組 90% 的模擬散在 -4.75 到接近零之間,點估計無偏但區間仍然寬得驚人
F 中位數 15.7 那一組的點估計 -1.98 確實已經接近真值,但同一組有 90% 的模擬散在 -4.75 到 -0.17 之間——點估計無偏與估計精確是兩件事,只看上界落在負的那一側,會把「方向大致穩定」讀成「數值可以引用」。慣例門檻來自模擬研究,是經驗法則不是定理,近年的方法學文獻認為它在弱工具變數的情境下太寬鬆,也有專門的弱工具穩健推論方法。最強那一組的 F 中位數 265.06 對應的區間就窄得多,可見門檻之上仍然有實質的差別,「過了就一樣」在同一張表上就被推翻了。所以該報的是 F 統計量本身,不是「通過了門檻」這句話。
模擬印出三個數字:0.990、0.349、0.022。要判斷這個工具變數合不合格,該看哪一個?
看答案與解析
正確答案: 是 0.022 這一個,它量的是工具變數兩組的嚴重度差,接近零才表示工具變數沒有沾到那個干擾
0.022 是工具變數兩組之間的嚴重度差,接近零,而工具變數要合格靠的就是這件事:它與未測量的干擾之間沒有關聯,所以繞得過那個干擾。0.990 不是工具變數兩組的差,它是治療與不治療兩組的差,那正是天真比較會失敗的原因;工具變數如果也長成那樣,它就一點用都沒有,而「抓得住干擾才能校正它」講的是迴歸校正在做的事,不是工具變數在做的事。0.349 也不是嚴重度的差,它是兩組的用藥率差,那是第一階段強度——一個決定精確度,一個決定有沒有偏誤,兩件事不能混成一個「中等最好」的直覺。而這裡有一件事只有模擬做得到:真實研究裡那個干擾因子是未測量的,你根本算不出這張表,只能拿臨床知識去質疑那條不該存在的箭頭。
用到這個方法的章節
延伸觀看
INSTRUMENTAL VARIABLE ANALYSES EXPLAINED
The Logic of Instrumental Variables
The 3 Instrumental Variables Assumptions
Introduction to Instrumental Variables (IV)
工具變數 (instrumental variables)素材來源與授權
本頁為原創內容