固定效應與隨機效應
兩個模型的差別不是保守程度而是假設:一個問「這批研究的共同效應是多少」,另一個問「效應分布的平均在哪」。權重怎麼被改寫、τ² 有哪幾種估法、DerSimonian-Laird 在研究數少時錯在哪,以及 Knapp-Hartung 校正修的到底是什麼。
兩個模型問的不是同一個問題
最常聽到的說法是「隨機效應比較保守」。這句話碰巧描述了多數情況下的結果,但它把因果搞反了,而且會導出錯誤的操作(「異質性高就換模型讓區間寬一點」)。真正的差別在於兩者對世界的假設不同,因此估計的對象根本不是同一個東西。
固定效應模型(fixed-effect model) 假設所有納入的研究都在估計同一個真值 :
研究之間看起來不一樣,純粹是抽樣誤差。它回答的問題是:「這批研究共同指向的那個效應是多少?」
隨機效應模型(random-effects model) 假設每篇研究有各自的真值 ,而這些真值來自一個分布:
它回答的問題是:「這些真實效應的分布,平均落在哪裡?」 多出來的 就是研究間變異數(between-study variance)。
在同一批資料上,兩者差多少
用 metadat::dat.bcg 這 13 篇 BCG 疫苗試驗(與上一頁、B7-04 同一份資料)跑兩次:
| 模型 | 合併 RR | 95% CI | 信賴區間寬度(log 尺度) |
|---|---|---|---|
| 固定效應 | 0.650 | 0.601–0.704 | 0.159 |
| 隨機效應(REML) | 0.489 | 0.344–0.696 | 0.705 |
兩件事值得停下來看:
- 信賴區間的寬度變成原本的 4.4 倍(在 log 尺度上量)。這是 τ² = 0.313 被加進每一篇研究的變異數所致。
- 點估計本身也移動了很多,從 RR 0.650 移到 0.489。這一點常被忽略——很多人以為換模型只會改變區間寬度。它會改變點估計,而且改變的幅度取決於「大研究與小研究的結果一不一致」。
權重被改寫成什麼樣子
固定效應下權重是 ;隨機效應下是 。加上一個對所有研究都相同的常數 ,效果是把權重往平均拉平——原本很精確的研究,它的優勢被 τ² 稀釋掉了。
figures/scripts/B7-02-fixed-random.R| 研究 | 總人數 | 該研究 RR | 固定效應權重 | 隨機效應權重 | 變動 |
|---|---|---|---|---|---|
| TPT Madras, 1980 | 176782 | 1.012 | 41.4% | 10.2% | -31.2 |
| Stein & Aronson, 1953 | 2992 | 0.456 | 23.8% | 10.1% | -13.7 |
| Comstock et al, 1974 | 77972 | 0.712 | 13.2% | 9.9% | -3.3 |
| Hart & Sutherland, 1977 | 26465 | 0.237 | 8.2% | 9.7% | +1.5 |
| Frimodt-Moller et al, 1973 | 10877 | 0.804 | 3.2% | 8.9% | +5.7 |
| Coetzee & Berjak, 1968 | 14776 | 0.625 | 2.9% | 8.7% | +5.8 |
| Comstock et al, 1976 | 34767 | 0.983 | 2.3% | 8.4% | +6.1 |
| Rosenthal et al, 1961 | 3381 | 0.254 | 2.2% | 8.4% | +6.1 |
| Ferguson & Simes, 1949 | 609 | 0.205 | 0.8% | 6.4% | +5.5 |
| Vandiviere et al, 1973 | 3174 | 0.198 | 0.7% | 6.0% | +5.3 |
| Aronson, 1948 | 262 | 0.411 | 0.5% | 5.1% | +4.6 |
| Rosenthal et al, 1960 | 451 | 0.260 | 0.4% | 4.4% | +4.0 |
| Comstock & Webster, 1969 | 4839 | 1.562 | 0.3% | 3.8% | +3.5 |
現在上一節那個「點估計為什麼會移動」有答案了:最大的那篇試驗(TPT Madras, 1980,176782 人)本身的 RR 是 1.012,也就是未偵測到保護效果。 固定效應下光是它一篇就佔 41.4% 的權重,把合併值往 1 拉;隨機效應把它降到 10.2%,合併值就退回其餘研究所指的方向。
τ² 有很多種估法,而且它們不會給同一個答案
隨機效應模型多出來的 τ² 是要估的,不是資料裡直接讀得到的。常見的估計式:
| 估計式 | τ² | I² | 合併 RR | 95% CI | 說明 |
|---|---|---|---|---|---|
| DL | 0.3088 | 92.1% | 0.490 | 0.345–0.695 | DerSimonian-Laird, the historical default; closed form, no iteration |
| REML | 0.3132 | 92.2% | 0.489 | 0.344–0.696 | restricted maximum likelihood, the current default in metafor |
| PM | 0.3181 | 92.3% | 0.489 | 0.343–0.697 | Paule-Mandel, iterative moment estimator |
| SJ | 0.3455 | 92.9% | 0.488 | 0.338–0.704 | Sidik-Jonkman |
| ML | 0.2800 | 91.4% | 0.491 | 0.351–0.688 | maximum likelihood, known to be downward biased |
| HE | 0.3286 | 92.6% | 0.489 | 0.341–0.700 | Hedges (variance component) estimator |
在這份資料上(13 篇、異質性很大)差異不算大,因為研究數還算夠。研究數少的時候差異會變得很重要。
DL 在研究數少時錯在哪
用模擬把它看清楚:真實的 τ² 固定在 BCG 資料估出來的值(0.313),各研究的內部變異數從那 13 篇實際觀察到的變異數中重抽,只改變研究篇數 ,每種情境跑 1500 次。
figures/scripts/B7-02-fixed-random.R| 研究篇數 k | τ² 平均值 | τ² 中位數 | 估為 τ² = 0 的比例 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| DL | REML | PM | DL | REML | PM | DL | REML | PM | |
| 5 | 0.315 | 0.317 | 0.325 | 0.206 | 0.241 | 0.244 | 6.8% | 4.6% | 6.8% |
| 10 | 0.291 | 0.299 | 0.307 | 0.235 | 0.269 | 0.273 | 0.5% | 0.3% | 0.5% |
| 30 | 0.314 | 0.314 | 0.316 | 0.285 | 0.299 | 0.304 | 0.0% | 0.0% | 0.0% |
平均值會受少數極端估計拉動,故本段以中位數描述單一統合分析較常遇到的典型估計;零估計率則顯示三法都可能把異質性估成 0。
真值是 0.313。在 = 5 時,DL 的典型估計只有 0.206——低估了約 34%,而 REML 與 PM 各是 0.241 與 0.244。而且 DL 有 6.8% 的機率直接回報 τ² = 0,也就是說出「這幾篇研究之間沒有異質性」——在一個真實 τ² 明明不小的世界裡。
τ² 被低估的直接後果是信賴區間太窄,因為 就加在每一篇研究的變異數上。這就是下一節要修的東西。
Knapp-Hartung 校正修的是什麼
標準的隨機效應信賴區間用的是常態分位數(1.96),並且把估出來的 當成真值在用。當 小、 本身很不穩的時候,這兩件事都會讓區間太窄。
Knapp-Hartung 調整(Knapp-Hartung adjustment,也叫 Hartung-Knapp-Sidik-Jonkman,HKSJ)做兩件事:改用 分布(自由度 )取代常態,並用一個把 的不確定性納入的變異數估計式。
同一份 BCG 資料,各估計式加不加 KH 的差別:
| 估計式 | 標準 95% CI | 加 Knapp-Hartung | 區間變寬 |
|---|---|---|---|
| DL | 0.345–0.695 | 0.330–0.726 | +12.4% |
| REML | 0.344–0.696 | 0.330–0.726 | +11.8% |
| PM | 0.343–0.697 | 0.330–0.726 | +11.2% |
| SJ | 0.338–0.704 | 0.329–0.725 | +7.8% |
| ML | 0.351–0.688 | 0.332–0.727 | +16.4% |
| HE | 0.341–0.700 | 0.329–0.725 | +9.8% |
在 13 篇的情況下加寬約一成,看起來不多。研究數更少時它救的東西才明顯——同一組模擬,看信賴區間實際涵蓋真值的比例:
| 研究篇數 k | DL 標準區間的涵蓋率 | DL + Knapp-Hartung |
|---|---|---|
| 5 | 85.7% | 93.4% |
| 10 | 89.5% | 94.3% |
| 30 | 93.1% | 95.0% |
= 5 時,名目上 95% 的區間實際只涵蓋真值 85.7%;加上 Knapp-Hartung 之後回到 93.4%。換句話說,一篇只納入五篇研究、用 DL 標準區間的統合分析,它的「95% 信賴區間」實際上大約是一個 86% 區間。
那到底該選哪一個
| 情境 | 建議 | 理由 |
|---|---|---|
| 研究在臨床上高度相似(同一個藥、同一種族群、同一個結果定義) | 固定效應可以考慮 | 「共同效應」這個假設有現實基礎 |
| 多數臨床統合分析 | 隨機效應 + Knapp-Hartung,τ² 用 REML 或 PM | 族群、劑量、追蹤長度不可能完全相同 |
| 研究數很少(少於 5 篇) | 隨機效應,但τ² 幾乎估不準,要在限制裡明講 | 此時 τ² 的估計極不穩,任何模型都撐不起強結論 |
| 只有兩三篇研究 | 考慮不要合併,改做敘事性整合 | 一個估不出來的 τ² 加上一個看不出形狀的分布,合併值的意義有限 |
| 想知道「下一篇研究會落在哪」 | 兩者都不夠,要預測區間 | 見異質性那一頁 |
動手跑一次
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 = ", "))
fe <- rma(yi, vi, data = d, method = "FE") # 固定效應
re <- rma(yi, vi, data = d, method = "REML") # 隨機效應(現在的預設)
fe; re
# 權重被改寫成什麼樣子 —— 這張表是本頁第三節的來源
# slab 不會變成 d 的欄位(d$slab 是 NULL),它跟著 weights() 的 names 走。
data.frame(study = names(weights(fe)),
fixed = round(weights(fe), 1),
random = round(weights(re), 1))
# 換 tau^2 估計式,看合併值與區間跟著動
for (m in c("DL", "REML", "PM", "SJ", "ML", "HE")) {
r <- rma(yi, vi, data = d, method = m)
cat(sprintf("%-5s tau2=%.4f RR=%.3f (%.3f-%.3f)\n",
m, r$tau2, exp(r$beta), exp(r$ci.lb), exp(r$ci.ub)))
}
# Knapp-Hartung:改用 t 分布,並納入 tau^2 的不確定性
rma(yi, vi, data = d, method = "REML", test = "knha")
# 用 meta 套件也一樣(它的輸出格式更接近論文表格)
# library(meta)
# metabin(tpos, tpos + tneg, cpos, cpos + cneg, data = dat.bcg,
# sm = "RR", method.tau = "REML", hakn = TRUE)驗證環境: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 與變異數
res = combine_effects(log_rr, var, method_re="dl")
print(res.summary_frame()) # 同時給固定效應與隨機效應兩列
# 權重可以自己算 —— 這正是本頁的重點,公式很短
w_fe = 1 / var
w_re = 1 / (var + res.tau2)
print(np.round(100 * w_fe / w_fe.sum(), 1))
print(np.round(100 * w_re / w_re.sum(), 1))
# Knapp-Hartung 要自己實作:t 分布分位數 + 加權殘差平方和
k = len(log_rr)
mu = np.sum(w_re * log_rr) / np.sum(w_re)
q = np.sum(w_re * (log_rr - mu) ** 2) / (k - 1)
se = np.sqrt(q / np.sum(w_re))
from scipy.stats import t
lo, hi = mu - t.ppf(0.975, k - 1) * se, mu + t.ppf(0.975, k - 1) * se
print("KH CI:", np.exp(lo), np.exp(hi))statsmodels 的 combine_effects() 提供 DL 與 chi2 兩種 τ² 估計式,沒有 REML、PM,也沒有 Knapp-Hartung。要做本頁的東西實務上得用 R。
怎麼讀報表
論文裡與這一頁有關的通常是 Methods 的一兩句加上 forest plot 底下的那一行。要找五件事:
- 用了哪個模型,理由是什麼。 只寫「random-effects model」而沒說為什麼,是常態但不理想;完全沒寫模型,是實質缺漏。
- τ² 用哪個估計式估的。 沒寫通常是 DL。舊的 review 尤其如此。
- 有沒有 Knapp-Hartung。 寫法是 “Hartung-Knapp adjustment” 或 “HKSJ”。研究數少於十篇又沒有它,那個信賴區間要自己在心裡放寬。
- 模型是不是事後才決定的。 出現「因為 I² 高於某個值,故改採隨機效應」這種句子,就是資料驅動的模型選擇。
- 權重集中在誰身上。 forest plot 上有一個方塊特別大,就把它單獨拿掉再看一次結論——這件事讀者自己做得到,只要論文有附各研究的數據。
常見誤用
| 誤用 | 為什麼錯 |
|---|---|
| 把兩個模型的差別理解成「保守程度」 | 它們估計的對象不同;隨機效應的推論範圍其實更大 |
| 先看 I² 再決定用哪個模型 | 資料驅動的模型選擇,等於未校正的兩階段程序 |
| 認為換模型只會改變區間寬度 | 點估計也會移動,幅度取決於大小研究是否一致 |
| 異質性高就改隨機效應了事 | 該做的是找異質性的來源;換模型只是把它吸收掉 |
| 忽略隨機效應會放大小研究的影響 | 小研究品質差或有發表偏誤時,隨機效應反而更容易被帶偏 |
| 研究數很少仍宣稱估到了 τ² | k 小時 τ² 的估計極不穩,DL 甚至常回報 0 |
| 用 DL 且不加 Knapp-Hartung,研究數又少 | 名目 95% 的區間實際涵蓋率可能只有八成多 |
| 把隨機效應的合併值當成「下一個病人/下一篇研究會怎樣」 | 那是預測區間的工作,合併值只是分布的平均 |
| 只報合併值不報 τ² | 少了 τ²,讀者無法判斷這個平均代表性有多高 |
| 臨床上不可比的研究照樣合併 | 統計上跑得動不代表那個 μ 有意義 |
重跑本頁的所有數字
/opt/homebrew/bin/Rscript figures/scripts/B7-02-fixed-random.R讀讀看這張圖
答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。
同一批 13 篇 BCG 試驗,固定效應合併 RR 是 0.650,隨機效應是 0.489。點估計為什麼會移動?
看答案與解析
正確答案: 因為權重被重新分配:最大那篇試驗從四成以上掉到 10.19%,而它自己的 RR 接近 1,它把合併值往 1 拉的力道被削弱了
固定效應下最大的那篇試驗一篇就佔了四成以上的權重,而它自己的 RR 接近 1;隨機效應把它壓到 10.19%,其餘研究指向的方向於是浮出來,合併值從 0.650 移到 0.489。移動的方向是離開 1,不是靠近 1——所以「隨機效應比較保守」這句話連方向都說錯了,區間確實變成 4.44 倍寬,但那是另一件事。I² 的 92.22% 描述的是研究間變異佔總變異的比例,它說異質性有多大,不決定合併值往哪一邊走:把同一批研究的效果方向整批倒過來,I² 一樣,合併值卻會往反方向移。真正決定移動方向的是大研究與小研究的結果一不一致。
一組模擬把真實的 τ² 固定在 0.313,只改變研究篇數。k = 5 時 DerSimonian-Laird 的表現說明了什麼?
看答案與解析
正確答案: 它的典型估計只有 0.206,把研究間變異數低估了超過三分之一,而低估 τ² 會直接讓信賴區間太窄
0.206 是 k = 5 時 DL 估計的中位數,真值是 0.313,低估超過三分之一。平均值 0.315 看起來正中真值,但那是少數極端高估把平均拉回來的結果;單一一篇統合分析拿到的是這個分布裡的一次抽樣,中位數才是它典型會遇到的東西。0.285 是研究篇數最多那一列的中位數,方向剛好相反——研究數變多之後 DL 才逐漸靠回真值,所以說問題要等研究數更多才浮現,是把兩端顛倒了。低估 τ² 不是學術瑕疵:τ² 就加在每一篇研究的變異數上,估小了區間就窄,而區間正是讀者用來判斷結論穩不穩的東西。
同一組模擬裡,k = 5、名目 95% 的 DerSimonian-Laird 隨機效應區間實際只涵蓋真值 85.7%。Knapp-Hartung 校正在這裡做了什麼?
看答案與解析
正確答案: 把涵蓋率拉回 93.4%,做法是改用 t 分布分位數並把 τ² 估計本身的不確定性算進變異數——它修的是區間,不是點估計
Knapp-Hartung 換的是區間的算法:用 t 分布分位數取代常態分位數,再用一個把 τ² 估計本身的不穩定納進來的變異數估計式,於是 k = 5 的涵蓋率從 85.7% 回到 93.4%。它完全沒有動 τ² 的估計式,也沒有動點估計。93.1% 是不加校正、但研究篇數多很多那一列的涵蓋率,把它算成校正的功勞,等於把「研究變多」與「區間算法改了」兩件事混在一起。至於代價,在這份 BCG 資料上區間加寬約 12.4%,換到的是名目與實際對得上——在研究數少時這個交換很值得,在研究數多時它幾乎不改變任何結論,所以現行建議是預設就加,而不是等研究數少了才加。
隨機效應把權重往平均拉平:這批試驗裡權重最小的一篇從 0.31% 升到 3.8%,最大的一篇則從 41.4% 降下來。這個改寫的代價在哪裡?
看答案與解析
正確答案: 代價在於被提高權重的正是精確度最低的研究:這一篇的 RR 是 1.56,方向與合併值相反,而它的權重被提高了十倍以上
隨機效應的權重是 1 除以「單篇變異數加上 τ²」,對所有研究加同一個常數會把差距壓縮,於是精確度最低的那幾篇一起被提上來。權重最小那一篇的 RR 是 1.56,方向與合併值完全相反,它的權重卻被提高了十倍以上——這些低精確度的研究若系統性地誇大效果(盲性不足、分配隱蔽不當、選擇性報告,或根本是發表偏誤的倖存者),隨機效應會把那個偏誤一起放大,固定效應反而受害較輕。10.19% 是最大那篇改寫後的權重,離「一篇一票」還很遠,而且一篇一票本身就不是統合分析該做的事,那等於丟掉精確度資訊。方向上也要小心:1.01 是最大那篇自己的 RR,拉平權重是削弱它的影響力,合併值因此離開 1,不是被拉往 1。
固定效應的 95% CI 是 0.601 到 0.704,隨機效應是 0.344 到 0.696。有人說隨機效應比較保守,這個說法哪裡不精確?
看答案與解析
正確答案: 不精確在於保守只是結果不是理由:兩個模型估的不是同一個量,區間變成 4.44 倍寬是因為多估了一個效應分布的離散度
固定效應的區間回答的是「這批研究共同的那個效應在哪」,隨機效應的區間回答的是「效應分布的平均在哪」。後者多含一個 τ² = 0.31,也就是研究之間真實效應的離散度,所以區間變成 4.44 倍寬——寬是假設不同的後果,不是刻意選了保守。把它當成保守程度的旋鈕,就會導出「異質性高就換模型讓區間寬一點」這種操作,而那是先看結果再挑模型。0.16 是固定效應在 log 尺度上的區間寬度,它窄不是因為它比較準,而是因為它假設 τ² 等於零,這個假設在 Q 檢定強烈拒絕同質的時候站不住。而且隨機效應連點估計都移動了,保守這個詞連移動方向都沒說。
同一批 13 篇資料換六種 τ² 估計式,合併 RR 全落在 0.488 到 0.491 之間,I² 也都在 91% 到 93% 之間。可以據此說估計式的選擇不重要嗎?
看答案與解析
正確答案: 不行。這裡差異小是因為研究數還算夠:最高的 0.346 與最低的估計差了超過兩成,而研究數少時這個差距會直接改寫區間寬度
六種估計式在這份資料上確實靠得很近,但那是研究篇數撐出來的。SJ 給 0.346、ML 給 0.280,相差超過兩成;τ² 直接加在每一篇的變異數上,兩成的差距在研究數少、單篇變異數又大的時候會明顯改變區間寬度,而區間寬度決定結論。ML 已知會系統性低估,這正是它落在最低的原因,把「它差最遠」讀成「所以無所謂」是把偏誤當成雜訊。0.309 是 DL 的估計,它是歷史預設而不是無偏的標竿——它在研究數少時偏低得最嚴重,metafor 與 meta 兩個套件都已經換掉這個預設。報表上該寫清楚的是用了哪一種估計式,而不是預設它們可以互換。
用到這個方法的章節
延伸觀看
醫學統計 EP18 統合分析:加權整合多項研究、看懂森林圖
Systematic reviews and meta analysis
How to do your first meta-analysis from start to finish素材來源與授權
本頁為原創內容