敏感度與影響分析
leave-one-out、逐研究的影響診斷量(Cook's D、DFBETAS、hat)與 Baujat plot 各自回答什麼;為什麼「有一篇研究影響很大」要求的是解釋而不是刪除;以及為什麼正式門檻一篇都沒標記的同一份資料上,仍然有一篇試驗把合併估計推動了將近一成。
兩個不同的問題:敏感度分析與影響分析
審稿人回覆裡出現頻率最高的方法學要求之一是「請補做敏感度分析」。這句話底下其實有兩個不同的問題,而它們需要的圖不一樣:
| 問題 | 做法 | 動的是什麼 |
|---|---|---|
| 換一個分析決定,結論會不會變 | 改效果量尺度、改 τ² 估計式、改固定/隨機效應、改納入條件、只留低偏誤風險的研究 | 分析方法 |
| 在同一個分析裡,是誰在主導結果 | leave-one-out、Cook’s D 與 DFBETAS、Baujat plot | 資料點(也就是研究) |
前者是敏感度分析(sensitivity analysis),它的通論在敏感度分析那一頁;後者是影響分析(influence analysis)。本頁講第二種,因為它是全站唯一會逐篇檢查納入研究的地方;leave-one-out 則同時屬於兩邊——它既是「拿掉一個資料點」,也是「換一個納入條件」。
本頁用的是 metadat::dat.bcg,13 篇 BCG 疫苗預防結核的對照試驗,與森林圖與漏斗圖是同一份資料、同一個合併分析:隨機效應(REML),合併 RR 0.489(95% CI 0.344–0.696,p < 0.001),I² 92.2%,τ² 0.3132,Q = 152.2(df = 12,p < 0.001)。產生本頁數字的腳本用一行斷言把這個合併值釘死,兩頁的 RR 不可能對不起來。
Leave-one-out:一次拿掉一篇
最直觀的一個:把 13 篇裡的每一篇輪流拿掉,各重跑一次隨機效應模型,看合併估計走到哪裡。
| 拿掉哪一篇 | 合併 RR | 95% CI | 相對變動 | I² | τ² |
|---|---|---|---|---|---|
| Aronson, 1948 | 0.493 | 0.340–0.716 | +0.7% | 93.2% | 0.336 |
| Ferguson & Simes, 1949 | 0.520 | 0.365–0.741 | +6.2% | 92.3% | 0.293 |
| Rosenthal et al, 1960 | 0.504 | 0.350–0.725 | +2.9% | 92.9% | 0.321 |
| Hart & Sutherland, 1977 | 0.533 | 0.377–0.754 | +9.0% | 90.4% | 0.263 |
| Frimodt-Moller et al, 1973 | 0.466 | 0.320–0.678 | -4.8% | 92.8% | 0.328 |
| Stein & Aronson, 1953 | 0.491 | 0.332–0.727 | +0.4% | 90.9% | 0.360 |
| Vandiviere et al, 1973 | 0.519 | 0.365–0.740 | +6.1% | 92.3% | 0.293 |
| TPT Madras, 1980 | 0.452 | 0.317–0.643 | -7.7% | 87.0% | 0.273 |
| Coetzee & Berjak, 1968 | 0.477 | 0.324–0.701 | -2.6% | 93.2% | 0.349 |
| Rosenthal et al, 1961 | 0.520 | 0.363–0.747 | +6.3% | 92.2% | 0.299 |
| Comstock et al, 1974 | 0.469 | 0.319–0.688 | -4.2% | 91.8% | 0.340 |
| Comstock & Webster, 1969 | 0.468 | 0.327–0.668 | -4.4% | 92.7% | 0.308 |
| Comstock et al, 1976 | 0.460 | 0.319–0.661 | -6.1% | 92.3% | 0.304 |
figures/scripts/B7-07-influence-diagnostics.R三件事值得讀出來:
- 合併值移動的範圍是 RR 0.4517 到 0.5334,相對於全體的 0.4894,最大的一次相對變動是 9.0%(拿掉 Hart & Sutherland, 1977)。
- 全部 13 個 leave-one-out 區間都仍然排除 1。 沒有任何單獨一篇研究撐著這個結論。
- 異質性不會因為刪掉任何一篇而消失:I² 最低是拿掉 TPT Madras, 1980 的 87.0%,最高是拿掉 Aronson, 1948 的 93.2%,全體是 92.2%。移動的幅度遠小於它本身的高度,換句話說異質性不是某一篇造成的——這是異質性那頁的重點在這裡的具體版本。
另外一個常見的技術陷阱:leave1out() 的輸出全部在 log 尺度上,沒有做任何轉換。只把點估計 exp() 回去、忘了區間上下界的話,會得到一張「區間不包含自己的點估計」的表——而那張表看起來不會怪到讓人停下來。
逐研究的影響診斷量
leave-one-out 只看合併值移動多少。迴歸診斷那一套(influence())把同一件事拆得更細,每一篇研究給一組數字:
| 統計量 | 問的問題 | 大代表什麼 |
|---|---|---|
| studentized residual | 這一篇離模型的預測值多遠? | 它與其他篇不一致——離群(outlier) |
| hat(leverage,槓桿值) | 這一篇在模型裡佔多少影響力的位置? | 它權重大;在隨機效應下 hat 基本上就是標準化後的權重 |
| Cook’s D | 拿掉它,所有配適值一起移動多少? | 離群與槓桿兩者的綜合——影響力(influence) |
| DFBETAS | 拿掉它,某一個係數移動幾個標準誤? | 這裡只有截距一個係數,所以它就是「合併值移動了幾個 SE」 |
| cov.r | 拿掉它,係數的變異數-共變異數行列式變成幾倍? | 大於 1 代表它讓估計變精確,小於 1 代表它讓估計變不精確 |
| tau2.del / QE.del | 拿掉它,τ² 與殘餘 Q 變成多少? | 對異質性的貢獻 |
離群與影響力是兩件事,這是整組診斷量最要緊的區別。 一篇又小又偏的研究可以是明顯的離群值卻幾乎不影響合併值(權重太小);一篇巨大而中規中矩的試驗可以完全不離群卻主導整個結果(權重太大)。Cook’s D 之所以是常用的總結量,就是因為它同時吃進這兩者。
| 研究 | studentized residual | Cook’s D | DFBETAS | hat | 權重 | cov.r |
|---|---|---|---|---|---|---|
| Aronson, 1948 | -0.218 | 0.002 | -0.040 | 0.051 | 5.1% | 1.116 |
| Ferguson & Simes, 1949 | -1.292 | 0.113 | -0.346 | 0.064 | 6.4% | 1.010 |
| Rosenthal et al, 1960 | -0.755 | 0.026 | -0.160 | 0.044 | 4.4% | 1.067 |
| Hart & Sutherland, 1977 | -1.451 | 0.229 | -0.514 | 0.097 | 9.7% | 0.965 |
| Frimodt-Moller et al, 1973 | 0.848 | 0.076 | 0.271 | 0.089 | 8.9% | 1.138 |
| Stein & Aronson, 1953 | -0.118 | 0.000 | -0.019 | 0.101 | 10.1% | 1.241 |
| Vandiviere et al, 1973 | -1.304 | 0.109 | -0.339 | 0.060 | 6.0% | 1.008 |
| TPT Madras, 1980 | 1.450 | 0.199 | 0.471 | 0.102 | 10.2% | 1.001 |
| Coetzee & Berjak, 1968 | 0.408 | 0.022 | 0.142 | 0.087 | 8.7% | 1.197 |
| Rosenthal et al, 1961 | -1.128 | 0.117 | -0.349 | 0.084 | 8.4% | 1.051 |
| Comstock et al, 1974 | 0.669 | 0.058 | 0.233 | 0.099 | 9.9% | 1.186 |
| Comstock & Webster, 1969 | 1.290 | 0.063 | 0.254 | 0.038 | 3.8% | 1.026 |
| Comstock et al, 1976 | 1.188 | 0.123 | 0.355 | 0.084 | 8.4% | 1.065 |
figures/scripts/B7-07-influence-diagnostics.R標記了零篇,卻有一篇讓合併值明顯移動
metafor 的 influence() 會在輸出最右邊印一欄星號,標出它認為有影響力的研究。它用的規則是四條的聯集,任一條成立就標記:
| 條件 | 本資料的門檻 | 實際最大值 | 佔門檻 |
|---|---|---|---|
abs(DFFITS) > 3*sqrt(p/(k-p)) | 0.866 | 0.520(Hart & Sutherland, 1977) | 60.1% |
pchisq(Cook’s D, df = m) > 0.5 | 0.455 | 0.229(Hart & Sutherland, 1977) | 50.4% |
hat > 3*p/k | 0.231 | 0.102(TPT Madras, 1980) | 44.2% |
任一 abs(DFBETAS) > 1 | 1.000 | 0.514(Hart & Sutherland, 1977) | 51.4% |
在這 13 篇上,被標記的研究有 0 篇——一篇都沒有。
而且這不是門檻被調鬆了才沒響:最大的 Cook’s D 只走到門檻的 50.4%,最大的絕對 DFFITS 是 60.1%,最大的 hat 是 44.2%。離最近的那條線都還有一段距離。
Baujat plot:一張圖上的兩個問題
Baujat plot 把上面那組診斷量壓成一張散布圖,兩個軸各代表一個問題:
- 橫軸 = 該研究對異質性的貢獻,也就是標準化殘差的平方
resid²/(τ² + vᵢ)。往右代表它與其他篇不一致。這 13 個橫軸值加起來是 12.1。 - 縱軸 = 拿掉它之後合併值移動的平方,除以 leave-one-out 的變異數。往上代表拿掉它,合併值會動。
figures/scripts/B7-07-influence-diagnostics.R四個象限各自的意思:
| 象限 | 讀法 | 該做什麼 |
|---|---|---|
| 右上(不一致 + 影響大) | 它與其他篇講的不一樣,而且它講的話被聽進去了 | 這一群才是要解釋的——去找它在人群、介入、時代、偏誤風險上跟別人差在哪 |
| 左上(一致 + 影響大) | 它跟大家講一樣的話,只是聲音特別大:通常是很大或很精確的試驗,不是離群值 | 通常什麼都不用做;但要在文字裡說清楚合併值主要由誰決定 |
| 右下(不一致 + 影響小) | 離群值,但合併估計幾乎感覺不到它:把 Q 撐大,改變不了什麼,典型是小而不精確的研究 | 檢查資料有沒有輸入錯誤,其餘寫進異質性討論 |
| 左下(都不突出) | 沒什麼好說的 | 無 |
在這份資料上,落在右上象限的是 6 篇:Ferguson & Simes, 1949、Hart & Sutherland, 1977、Vandiviere et al, 1973、TPT Madras, 1980、Rosenthal et al, 1961、Comstock et al, 1976。左上只有 Frimodt-Moller et al, 1973 一篇,右下只有 Comstock & Webster, 1969 一篇,其餘 5 篇落在左下。
影響最大的那一篇:它不是壞掉,是坐在 moderator 的一端
三個工具指向同一篇:Hart & Sutherland, 1977。Cook’s D 最大(0.229),leave-one-out 移動最大(9.0%),Baujat plot 上它在右上象限的最上方。
先看它是一篇什麼樣的研究——以下每一格都直接來自 dat.bcg,沒有任何額外假設:
| 項目 | 值 |
|---|---|
| 分配方式 | 隨機分配 |
| 試驗地點的絕對緯度 | 52 度(13 篇中距赤道第 2 遠;全體範圍 13–55 度) |
| 接種組 | 62 / 13,598 發病 |
| 對照組 | 248 / 12,867 發病 |
| 總人數 | 26,465(13 篇中第 4 大) |
| 該試驗自己的 RR | 0.237(95% CI 0.179–0.312) |
| 隨機效應下的權重 | 9.7% |
| studentized residual | -1.451 |
這不是一篇有問題的研究。 它是隨機分配的、規模在前段、事件數充足、區間很窄。它之所以影響大,是因為它的效果比合併值強得多(自身 RR 0.237 對上合併的 0.489),而且它有足夠的權重讓這個差別被聽見。
那它為什麼效果特別強?異質性那頁已經給了答案:緯度。BCG 在高緯度地區的效果明顯較好,一般認為與低緯度環境中非結核分枝桿菌的暴露造成部分交叉免疫有關。而 Hart & Sutherland, 1977 位在 52 度——它是全體裡距赤道第 2 遠的一篇,也是緯度四十度以上規模最大的一篇。
把緯度放進模型,這件事會立刻顯現出來:
| 項目 | 納入全部 13 篇 | 拿掉 Hart & Sutherland, 1977 |
|---|---|---|
| 緯度每增加一度,log RR 改變 | -0.0291(p < 0.001) | -0.0260(p = 0.003) |
| R²(被緯度解釋掉的研究間變異) | 75.6% | 65.8% |
| 殘餘 I² | 68.4% | 68.2% |
| 它自己的 studentized residual | -1.451(只有截距的模型) | -0.664(模型含緯度) |
最後那一列是整頁的重點。在只有截距的模型裡,Hart & Sutherland, 1977 的 studentized residual 是 -1.451——看起來偏離。把緯度放進模型之後,它縮到 -0.664。 換句話說,一旦模型知道這篇試驗是在 52 度做的,它觀察到的 log RR(-1.442)跟模型預測的(-1.262)就沒有多不一樣了。
它從來不是離群值,它只是坐在 moderator 的一端。
發現一篇影響力大之後,該做什麼
一個可以照著走的順序:
- 先確認不是資料錯誤。 事件數、樣本數、方向有沒有抄反(治療組與對照組互換是最常見的一種),效果量的尺度對不對。這一步是唯一一個「發現問題就直接改」的步驟,而且改的是資料不是納入條件。
- 看它在哪一個維度上與其他篇不同。 人群、介入強度、對照組拿什麼、追蹤長度、結果如何定義、年代、地點、偏誤風險。這一步靠的是讀原文,不是統計。
- 把那個維度放進模型。 有足夠篇數就做 meta-regression 或事先指定的亞組分析(每個共變項至少十篇,見異質性那頁);篇數不夠就寫進討論,說明異質性的可能來源。
- 只有在有獨立於結果的理由時才排除。 「它偏誤風險高」是理由,「它讓合併值移動」不是。而且排除條件要在計畫書裡事先指定;事後才決定的排除,一定要同時報出納入與排除兩個結果,並說明哪一個是主要分析。
- 報告時把過程寫出來。 「敏感度分析顯示結果穩健」這一句本身沒有資訊。要寫的是:做了哪些擾動、每一個擾動後的估計是多少、有沒有哪一個讓結論改變。
怎麼讀報表
- 有沒有做影響分析。 沒有的話,讀者無法知道那個合併值是不是由一兩篇撐起來的。森林圖上的方塊大小是一個粗略的替代品,但它只講權重,不講移動。
- leave-one-out 有沒有報區間,還是只報點估計。 只給一排點估計,看不出結論會不會翻。
- 有沒有把「被標記」當成唯一的判準。 一篇都沒被標記卻有一篇讓估計動了將近一成,就是這一頁的資料本身。
- 有沒有排除研究,以及排除的理由是不是獨立於結果。 事先指定與事後決定,在方法學上是兩件不同的事。
- 排除之後的結果是主要分析還是敏感度分析。 這兩個位置的意思差很多。
- 有沒有解釋。 找到影響最大的一篇卻只寫「排除後結論不變」,是把最有資訊量的一段觀察丟掉了。
動手跑一次
library(metafor)
library(metadat)
data(dat.bcg, package = "metadat")
d <- escalc(measure = "RR", ai = tpos, bi = tneg, ci = cpos, di = cneg,
data = dat.bcg, slab = paste(author, year, sep = ", "))
res <- rma(yi, vi, data = d, method = "REML")
# ── 1. Leave-one-out ───────────────────────────────────────────────────────
# 輸出全部在 log 尺度上:CI 上下界也要 exp(),只 exp() 點估計會得到
# 一張「區間不包含自己的點估計」的表,而那張表看起來不會怪。
l1 <- leave1out(res)
data.frame(omitted = res$slab,
rr = exp(l1$estimate),
lb = exp(l1$ci.lb), ub = exp(l1$ci.ub),
I2 = l1$I2)
# 相對於全體合併值的變動百分比 —— 值得看的就是這一欄
100 * (exp(l1$estimate) - exp(as.numeric(res$beta))) / exp(as.numeric(res$beta))
# ── 2. 逐研究影響診斷量 ────────────────────────────────────────────────────
infl <- influence(res)
infl # rstudent, dffits, cook.d, cov.r, tau2.del, QE.del, hat, weight
plot(infl) # 每個統計量一張小圖,門檻畫成虛線
infl$is.infl # 星號那一欄的邏輯向量;本例全為 FALSE
# 門檻不是魔法數字,可以自己算:p 是模型參數個數,m 是 Cook's D 的自由度
p <- infl$p; k <- res$k
3 * sqrt(p / (k - p)) # DFFITS 的門檻
qchisq(0.5, df = infl$m) # Cook's D 的門檻
3 * p / k # hat 的門檻
# ── 3. Baujat plot ─────────────────────────────────────────────────────────
# 它一定會畫圖,同時把座標 invisible 回傳。想只要座標就先 pdf(NULL)。
bj <- baujat(res)
head(bj[order(-bj$y), ]) # 縱軸最高的幾篇 = 拿掉會讓合併值動最多的幾篇
# ── 4. 影響最大那一篇,為什麼影響大 ────────────────────────────────────────
top <- which.max(infl$inf$cook.d)
dat.bcg[top, ] # 它的共變項:緯度、分配方式、四格表
# 把 moderator 放進模型,它的殘差就縮回來了
mr <- rma(yi, vi, mods = ~ ablat, data = d, method = "REML")
infl$inf$rstudent[top] # 只有截距的模型
influence(mr)$inf$rstudent[top] # 模型含緯度
# 拿掉它,緯度的斜率與 R^2 各變多少 —— 這才是「刪掉它」的真實代價
rma(yi, vi, mods = ~ ablat, data = d, method = "REML", subset = -top)驗證環境:R 4.6.0 + metafor 5.0.1 + metadat 1.6.0
import numpy as np
from statsmodels.stats.meta_analysis import combine_effects
# metadat::dat.bcg 的四格表,13 篇。帶在這裡,這一段才自己跑得動。
tpos = np.array([4, 6, 3, 62, 33, 180, 8, 505, 29, 17, 186, 5, 27])
tneg = np.array([119, 300, 228, 13536, 5036, 1361, 2537, 87886, 7470, 1699,
50448, 2493, 16886])
cpos = np.array([11, 29, 11, 248, 47, 372, 10, 499, 45, 65, 141, 3, 29])
cneg = np.array([128, 274, 209, 12619, 5761, 1079, 619, 87892, 7232, 1600,
27197, 2338, 17825])
log_rr = np.log((tpos / (tpos + tneg)) / (cpos / (cpos + cneg)))
var = 1 / tpos - 1 / (tpos + tneg) + 1 / cpos - 1 / (cpos + cneg)
# log_rr 與 var 在上面算好了(escalc 的等價步驟)
k = len(log_rr)
full = combine_effects(log_rr, var, method_re="dl")
mu_full = full.mean_effect_re
# leave-one-out 得自己寫迴圈;沒有現成函式
for i in range(k):
keep = np.arange(k) != i
r = combine_effects(log_rr[keep], var[keep], method_re="dl")
pct = 100 * (np.exp(r.mean_effect_re) - np.exp(mu_full)) / np.exp(mu_full)
print(i, np.exp(r.mean_effect_re), round(pct, 2), r.i2)
# Cook's D、DFBETAS、hat、Baujat 座標在 statsmodels 裡沒有對應物件。
# 硬要做的話得自己實作 metafor 的公式,包括每次重擬合的 tau^2;
# 這一頁的內容實務上請用 R。Python 端沒有 metafor 那組影響診斷量的等價實作:statsmodels 的統合分析模組沒有 influence()、沒有 leave1out()、沒有 baujat()。leave-one-out 可以自己寫迴圈,Cook's D 與 DFBETAS 則沒有現成物件可拿。
常見誤用
| 誤用 | 為什麼錯 |
|---|---|
| 因為某篇研究影響大就把它排除,然後重報主要結果 | 用結果決定納入條件;影響大最常見的原因是它資訊量最大 |
只看 influence() 的星號欄,沒亮就寫「無有影響力的研究」 | 門檻很鬆;本頁的資料一篇都沒亮,卻有一篇讓合併值動了將近一成 |
| 反過來,星號亮了就直接刪 | 星號的意思是「去看一眼」,不是「刪掉」 |
| 排除離群研究讓 I² 下降,並以此宣稱現在可以合併了 | 算術上必然;殘差最大的點拿掉,殘差平方和一定變小 |
| leave-one-out 只報點估計不報區間 | 看不出結論會不會翻,而那才是敏感度分析要回答的事 |
| 把 Baujat plot 的四象限當成分類結果 | 分界是兩軸的中位數,右上一定有人,而且兩軸正相關使它通常不只四分之一;靠近線的點不可當分類 |
| 把「離群」與「影響力大」當成同一件事 | 小而偏的研究是離群但影響小;大而中規中矩的試驗不離群但主導結果 |
| 敏感度分析穩健就寫成「結論是對的」 | 它只證明對「刪掉任一單篇」穩健;共同的系統性偏誤不會因為少一篇而消失 |
| 事後決定的排除沒有同時報出納入版本 | 讀者無法判斷那個排除改變了多少 |
只把 leave1out() 的點估計 exp() 回去 | 輸出全部在 log 尺度;區間上下界也要轉換,否則區間不包含自己的點估計 |
| 用影響分析代替偏誤風險評估 | 診斷量看的是槓桿,不是效度;後者要靠 RoB 2 / ROBINS-I 與 GRADE |
重跑本頁的所有數字
/opt/homebrew/bin/Rscript figures/scripts/B7-07-influence-diagnostics.R讀讀看這張圖
答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。
metafor 的 influence() 在這 13 篇上標記了 0 篇有影響力的研究,而拿掉 Hart & Sutherland, 1977 會讓合併 RR 從 0.4894 移到 0.5334。這兩件事怎麼並存?
看答案與解析
正確答案: 它們問的不是同一個問題:門檻問「這一筆在統計上算不算異常」,最大的 Cook's D 是 0.229,離門檻還有一段;leave-one-out 問「拿掉它我要報的數字會不會變」,那個問題沒有門檻
門檻用的是形式化的迴歸診斷慣例,用意是把注意力導向真正極端的觀測值;leave-one-out 問的是實質問題,而它沒有任何門檻。這裡兩件事同時成立而不衝突:最大的 Cook's D 只有 0.229,離 0.455 的門檻還有一段距離,而同一篇卻讓合併估計移動了 8.994%。推論有兩個,方向相反——沒有研究被標記不等於沒有研究有影響力,所以 leave-one-out 該預設就跑,而不是等星號亮了才跑;反過來,有研究被標記也不等於它該被排除,星號的意思只是值得去看一眼。把門檻調到剛好能標出想標的那一篇,則是先看結果再訂規則。至於那個位移是不是雜訊,它大到值得追,但它沒有改變任何一句結論——新的區間一樣完整落在無效值左側,數字會動與結論會翻是兩件要分開報的事。
拿掉影響最大的那一篇之後,合併 RR 從 0.489 移到 0.533,變動將近一成。報告時該怎麼寫這件事?
看答案與解析
正確答案: 把兩層分開寫:合併值確實動了將近一成,而十三次逐一排除的區間都排除無效值,這一次的下界是 0.377
「敏感度分析顯示結果穩健」這一句本身沒有資訊:它沒說做了哪些擾動、每一個擾動後的估計是多少、有沒有哪一個讓結論改變。這裡該寫的是兩層——合併值從 0.489 移到 0.533,將近一成;而十三次逐一排除的區間全部排除無效值,這一次的區間是 0.377 到 0.754。0.754 正是那個上界,它離無效值還有距離,但拿它當成「過程不必寫」的理由,剛好把敏感度分析唯一要交代的東西省掉了。0.452 是十三次裡最低的合併值,從它到 0.533 的跨度看起來不小,但每一次的區間都不含無效值,把點估計的擺動讀成結論的擺動是另一個方向的誤讀。
同一篇試驗的診斷量是:Cook's D 0.229、DFFITS -0.520、hat 0.097、DFBETAS -0.514。這幾個量各自在回答什麼?
看答案與解析
正確答案: hat 的 0.097 說的是這一篇在資料裡有多有份量,它完全不看這篇觀察到什麼結果,所以 hat 高不代表合併值會被它拉動
這幾個量分工不同。hat 的 0.097 是槓桿:在只有截距的隨機效應模型裡它其實就是這篇研究的權重佔比,完全不看這篇觀察到什麼結果——所以 hat 高只表示這篇有份量,不表示合併值會被它拉動。Cook's D 的 0.229 剛好相反,它把殘差與槓桿合在一起,量的是「拿掉這一篇,整組估計會被推多遠」,所以它不是純粹的殘差量;把它讀成離群程度,會漏掉一篇殘差普通但權重很大的研究。至於 -1.451,那是 studentized residual,它只回答「這篇與其他篇一不一致」;一篇高殘差但權重很小的研究在它上面很顯眼,卻推不動任何東西。四個量不是彼此的變換,正因為如此,Baujat plot 才要把不一致與影響力畫成兩個軸。
Baujat plot 的橫軸是各研究對異質性的貢獻,縱軸是它對合併估計的位移。落在「橫軸高、縱軸低」那一區的研究該怎麼讀?
看答案與解析
正確答案: 那是與其他篇不一致、但合併估計幾乎感覺不到的研究:像橫軸 1.592 這種偏右的值會把 Q 撐大,位移卻很小
Baujat plot 的兩個軸回答兩個不同的問題:往右是「這篇與其他篇不一致」,往上是「拿掉它之後合併估計會移動」。橫軸高、縱軸低那一區就是不一致但推不動的研究——它們把 Q 撐大、把 I² 推高,而合併值幾乎不動,典型是小型且不精確的試驗,像橫軸 1.592 配上很小的縱軸值那一點。1.117 是橫軸的中位數,它只是切象限用的分界線,不代表越過它就一定有大位移;兩個軸如果真的在講同一件事,這張圖就不必畫成兩維。0.067 是縱軸的中位數,而「不一致又推不動」並不是優先排除的對象——它們對結論沒有影響,排除它們只會讓 I² 好看,而那是算術上必然的結果,不是證據。真正需要解釋的是右上角那幾篇:既與其他篇不一致,又推得動合併值。
影響最大的那一篇在只有截距的模型裡 studentized residual 是 -1.451,把緯度放進模型之後縮到 -0.664。這說明它是什麼樣的研究?
看答案與解析
正確答案: 它不是壞掉的研究,是坐在 moderator 的一端:模型知道它做在高緯度之後,預測的 log RR 是 -1.262,與它實際觀察到的相差不多
殘差從 -1.451 縮到 -0.664,說的是:一旦模型知道這篇試驗做在高緯度,它觀察到的 log RR 就不再顯得偏離——模型預測的是 -1.262,兩者相差不多。所以它從來不是離群值,它只是坐在 moderator 的一端。0.237 是它自己的 RR,確實遠低於合併值,但「效果比別人強」加上「有足夠權重讓這個差別被聽見」正是影響力的來源,不是資料有問題的證據;而且多加一個共變項並不保證某一篇的殘差會縮小,殘差是可能變大的。0.097 是它的 hat 值,權重大只解釋了它為什麼推得動合併值,解釋不了殘差為什麼在加入緯度之後縮小——那件事只有共變項本身解釋得了。這正是為什麼發現一篇影響力大之後,該做的第三步是把那個維度放進模型,而不是把那一篇拿掉。
有人建議把影響最大的那一篇拿掉,讓結果乾淨一點。拿掉之後緯度的斜率從 -0.0291 變成 -0.0260,R² 從 75.6% 掉到 65.8%。該怎麼回應?
看答案與解析
正確答案: 不該拿掉:斜率被削弱了 10.583%,而拿掉的不是問題,是高緯度那一端規模最大的那份證據,緯度效應正是這份資料最重要的發現
排除的理由必須獨立於結果。「它偏誤風險高」是理由,「它讓合併值移動」不是,而這一篇是隨機分配、規模在前段、事件數充足、區間很窄的試驗。拿掉它,緯度的斜率被削弱 10.583%,R² 明顯下降——緯度的範圍並沒有變,變的是撐著高緯度那一端的最大一篇不見了,於是整條緯度效應被削弱,而那條緯度效應正是這份資料最重要的發現。90.412% 是拿掉之後的 I²,排除殘差大的研究之後 I² 下降是算術上必然的:把殘差最大的點拿掉,殘差平方和一定變小,所以「排除後 I² 降了」對「現在可以合併了」沒有任何說服力。87.031% 是逐一排除時 I² 能降到的最低值,用「哪一篇讓 I² 降最多」來決定排除誰,等於用結果決定納入條件。真要報排除後的分析,它的位置是敏感度分析的一列,不是主要結果。
用到這個方法的章節
延伸觀看
統合分析的異質性(Heterogeneity)
統合分析異質性和小樣本研究偏誤素材來源與授權
本頁為原創內容