網絡統合分析:間接比較與治療排名
網絡統合分析怎麼把一個從來沒有人做過的頭對頭比較估出來、league table 裡哪一格其實沒有任何試驗撐著、netmeta 預設印出的那個不一致檢定為什麼跟你配的模型不是同一個,以及排名為什麼一定要跟效果量並排看。
一張表上會出現從來沒有人比較過的兩種藥
臨床問題常常長這樣:治這個病有十種藥,但沒有任何一篇試驗把第一種跟第七種擺在一起比過。網絡統合分析(network meta-analysis, NMA)處理的就是這件事——把所有試驗接成一張圖,節點是治療,邊是「真的有人做過的頭對頭比較」,然後利用共同對照把沒有連線的那些配對推算出來。
推算靠的是一個很單純的減法。如果有 A 對 B 的試驗、也有 C 對 B 的試驗,那麼
這條式子在算術上永遠成立,但它要成為對 A 與 C 的有效比較,需要兩個假設:
- 傳遞性(transitivity):那些會修飾治療效果的因子(病情嚴重度、年齡、背景用藥、追蹤長度、結果定義)在 A 對 B 與 C 對 B 這兩群試驗裡分布得夠像,共同對照 B 在兩邊可以互換。這是一個關於臨床與方法學的判斷,不是一個檢定。
- 一致性(consistency):同一個配對的直接證據與間接證據估的是同一個量。它是傳遞性在統計上唯一看得到的那一面——而且只在同時有直接與間接兩條路的配對上看得到。
本頁用 metadat::dat.senn2013:26 篇降血糖藥的隨機試驗、10 種處置(含安慰劑)、合計 6646 名參與者,結果變項是 HbA1c 的改變量(percentage points),數值越低越好。
原始資料是 arm-based 長格式,一列一個試驗組,共 53 列;netmeta 要的是 contrast-based,所以第一步一定是 pairwise()。轉出來是 28 個對比:25 篇兩臂試驗各貢獻一個,剩下那篇三臂試驗貢獻 choose(3, 2) 個。
證據網絡:先看哪些配對真的有人試過
figures/scripts/B7-05-network-meta.R| 治療 | 試驗篇數 | 參與人數 |
|---|---|---|
| acarbose | 3 | 108 |
| benfluorex | 2 | 189 |
| metformin | 8 | 1470 |
| miglitol | 3 | 208 |
| pioglitazone | 3 | 546 |
| placebo | 19 | 2062 |
| rosiglitazone | 10 | 1312 |
| sitagliptin | 1 | 106 |
| sulfonylurea | 3 | 513 |
| vildagliptin | 1 | 132 |
三個要先確認的數字:
- 網絡是連通的。
netconnection()報 1 個子網絡——只要多於一個,就不存在「把所有治療放在同一張表上比較」這件事,該分開做。 - 設計(design)有 15 種,也就是 15 種不同的臂組合。其中
placebo:acarbose:metformin是唯一的三臂設計。 - 有直接證據的配對只有 15 個。 10 種治療兩兩相比共 45 個配對,所以有 30 個配對完全沒有頭對頭試驗。
第三點是整張網絡圖最重要的資訊,而它是網絡圖裡唯一不會被畫出來的東西:沒有邊的地方看不見。讀網絡圖時要主動去數哪些配對是空的,而不是欣賞連起來的那些。
合併之後:league table 與它的異質性
模型是隨機效應的 netmeta(廣義最小平方),效果指標是平均差(MD),參考組是 placebo,並告訴模型數值越小越好(small.values = "desirable")。
異質性的部分:τ² = 0.109、τ = 0.330、I² = 81.4%(72.0% 到 87.7%)。整體 Q = 97.0(df = 18, p < 0.001),其中屬於設計內異質性的部分是 Q = 74.4(df = 11, p < 0.001)。
一個 I² 只告訴你「離散有多少比例不是抽樣誤差」,不告訴你它住在哪裡。設計層級的分解就告訴你了——下表只列出有兩篇以上試驗、因此算得出設計內 Q 的那 5 個設計:
| 設計 | Q | df | p |
|---|---|---|---|
| metformin:rosiglitazone | 0.2 | 1 | 0.665 |
| placebo:benfluorex | 4.4 | 1 | 0.036 |
| placebo:metformin | 42.2 | 2 | < 0.001 |
| placebo:miglitol | 6.4 | 2 | 0.040 |
| placebo:rosiglitazone | 21.3 | 5 | < 0.001 |
設計內異質性有 57% 來自 placebo:metformin 一個設計(Q = 42.2,df = 2),再加上 placebo:rosiglitazone 就佔掉 85%。這比「I² 等於 81%」有用得多:它指出該去讀哪幾篇試驗的收案條件,而不是叫你對整個網絡失去信心。這一整套指標各自在講什麼,在異質性:I²、τ² 與預測區間那頁。
League table 是節錄,而且它不告訴你哪一格是空的
完整的 league table 有 45 列——全部列出來讀者只會滑過去。下面節錄與 placebo 的 9 個比較,加上前三名彼此之間的 3 個比較,共 12 列。負值代表該藥比後者更能降低 HbA1c。
| 比較 | 網絡 MD(95% CI) | 直接試驗篇數 | 證據來源 |
|---|---|---|---|
| acarbose vs placebo | -0.84(-1.32 到 -0.36) | 2 | 直接 + 間接 |
| benfluorex vs placebo | -0.73(-1.29 到 -0.17) | 2 | 直接 + 間接 |
| metformin vs placebo | -1.13(-1.43 到 -0.82) | 4 | 直接 + 間接 |
| miglitol vs placebo | -0.95(-1.40 到 -0.50) | 3 | 直接 + 間接 |
| pioglitazone vs placebo | -1.13(-1.56 到 -0.70) | 1 | 直接 + 間接 |
| rosiglitazone vs placebo | -1.23(-1.48 到 -0.98) | 6 | 直接 + 間接 |
| sitagliptin vs placebo | -0.57(-1.26 到 0.12) | 1 | 直接 + 間接 |
| sulfonylurea vs placebo | -0.42(-0.89 到 0.06) | 0 | 純間接 |
| vildagliptin vs placebo | -0.70(-1.39 到 -0.01) | 1 | 直接 + 間接 |
| metformin vs pioglitazone | 0.00(-0.44 到 0.44) | 1 | 直接 + 間接 |
| metformin vs rosiglitazone | 0.11(-0.22 到 0.43) | 2 | 直接 + 間接 |
| pioglitazone vs rosiglitazone | 0.10(-0.33 到 0.54) | 1 | 直接 + 間接 |
直接與間接對得上嗎:net-splitting
一致性是這個方法唯一能自我檢查的地方。netsplit()(也叫 SIDE,separating indirect from direct evidence)對每一個有直接證據的配對做三件事:只用直接試驗估一次、只用間接路徑估一次、把兩者的差拿去做檢定。
figures/scripts/B7-05-network-meta.R| 比較 | 直接試驗 | 直接證據佔比 | 直接 MD | 間接 MD | 差異 p |
|---|---|---|---|---|---|
| acarbose:metformin | 1 | 28% | 0.20 | 0.32 | 0.84 |
| acarbose:placebo | 2 | 65% | -0.86 | -0.81 | 0.93 |
| acarbose:sulfonylurea | 1 | 53% | -0.40 | -0.45 | 0.92 |
| benfluorex:placebo | 2 | 100% | -0.73 | 無間接路徑 | 不適用 |
| metformin:pioglitazone | 1 | 44% | -0.16 | 0.13 | 0.52 |
| metformin:placebo | 4 | 56% | -1.18 | -1.06 | 0.69 |
| metformin:rosiglitazone | 2 | 34% | 0.07 | 0.12 | 0.88 |
| metformin:sulfonylurea | 1 | 45% | -0.37 | -0.99 | 0.19 |
| miglitol:placebo | 3 | 100% | -0.95 | 無間接路徑 | 不適用 |
| pioglitazone:placebo | 1 | 39% | -1.30 | -1.02 | 0.54 |
| pioglitazone:rosiglitazone | 1 | 35% | 0.10 | 0.11 | 0.99 |
| rosiglitazone:placebo | 6 | 76% | -1.18 | -1.40 | 0.46 |
| sitagliptin:placebo | 1 | 100% | -0.57 | 無間接路徑 | 不適用 |
| vildagliptin:placebo | 1 | 100% | -0.70 | 無間接路徑 | 不適用 |
| rosiglitazone:sulfonylurea | 1 | 43% | -1.20 | -0.52 | 0.16 |
上表中差異達到統計顯著的配對有 0 個,最小的 p 值是 0.156。也就是說,在這份資料上沒有偵測到直接與間接證據的不一致。
這句話要照字面讀。SIDE 檢定的檢定力很低——本頁多數配對的直接證據只有一兩篇試驗,直接與間接兩個區間都很寬,要判定它們「不一樣」需要非常大的落差。沒有偵測到不一致,不等於一致性成立,跟 Q 檢定不顯著不等於同質是同一件事。
沒有不一致檢定的配對,不是通過了檢定
上表最後 4 列的間接欄是空的:benfluorex:placebo、miglitol:placebo、sitagliptin:placebo、vildagliptin:placebo。
原因是這四種藥只透過 placebo 掛在網絡上——它們是網絡的葉子。從 benfluorex 走到 placebo 只有一條路,就是那些直接試驗本身;沒有第二條路,就沒有東西可以拿來跟直接估計比對。netsplit() 對它們回傳 NA,不是檢定失敗,是檢定不存在。
這是前一節那個 sulfonylurea 例子的鏡像:一邊是「有估計值但沒有直接試驗」,另一邊是「有直接試驗但沒有間接路徑」。兩者在 league table 上都印成一個普通的格子,而它們的證據性質完全不同。
實務上的意思是:這四種藥的網絡點估計基本上就是它們自己的成對統合分析——下一節的表會看到,位移最大的一列也只有 0.046 個百分點。它們的點估計沒有從網絡借到任何東西,也沒有接受任何一致性檢查。
變的是區間:網絡用的 τ² 是跨所有設計估出來的,不是那一兩篇試驗自己估的,所以區間可能變寬(sitagliptin、vildagliptin)也可能變窄(benfluorex、miglitol)。把它們跟 rosiglitazone 那種有多條路互相印證的估計並排列在同一張排名表上,兩者的證據等級並不相同。
借間接證據的代價
網絡估計通常被說成「借了力,所以更精確」。在這份資料上可以直接對照:對每一種藥,把「只用安慰劑對照試驗做的成對統合分析」擺在「整個網絡的估計」旁邊。
| 藥 | 直接試驗篇數 | 只用直接證據 MD(95% CI) | 網絡 MD(95% CI) | 區間寬(直接 → 網絡) |
|---|---|---|---|---|
| acarbose | 2 | -0.82(-1.09 到 -0.55) | -0.84(-1.32 到 -0.36) | 0.54 → 0.96 |
| benfluorex | 2 | -0.69(-1.44 到 0.07) | -0.73(-1.29 到 -0.17) | 1.51 → 1.12 |
| metformin | 4 | -1.12(-1.84 到 -0.40) | -1.13(-1.43 到 -0.82) | 1.44 → 0.60 |
| miglitol | 3 | -0.95(-1.41 到 -0.49) | -0.95(-1.40 到 -0.50) | 0.92 → 0.91 |
| pioglitazone | 1 | -1.30(-1.55 到 -1.05) | -1.13(-1.56 到 -0.70) | 0.50 → 0.86 |
| rosiglitazone | 6 | -1.18(-1.40 到 -0.96) | -1.23(-1.48 到 -0.98) | 0.44 → 0.50 |
| sitagliptin | 1 | -0.57(-0.82 到 -0.32) | -0.57(-1.26 到 0.12) | 0.51 → 1.39 |
| sulfonylurea | 0 | 無直接試驗 | -0.42(-0.89 到 0.06) | — → 0.94 |
| vildagliptin | 1 | -0.70(-0.95 到 -0.45) | -0.70(-1.39 到 -0.01) | 0.50 → 1.39 |
多數列的位移很小,但 pioglitazone 這一列跟直覺相反。它的直接證據只有 1 篇試驗,估計是 MD -1.30(-1.55 到 -1.05);網絡估計是 -1.13(-1.56 到 -0.70)。間接證據把點估計往虛無方向拉了 0.17 個百分點,而且把區間變寬了(0.50 → 0.86)。
區間會變寬有兩個來源:間接路徑本身要串起好幾個對比,每一段的不確定性都會累加;而且網絡的 τ² 是跨所有設計估出來的,這一整包異質性會加到每一格上,包括原本只有一篇試驗、看起來很乾淨的那一格。借力不保證變準,只保證把整個網絡的不確定性一起借進來。
反過來說,sulfonylurea 那一列的直接欄是空的——它的網絡估計是憑空多出來的,成對統合分析根本產生不了那個數字。這是 NMA 真正的價值所在,代價則是它整格都建立在傳遞性上。
最後才是排名,而且排名必須跟效果量一起看
到這裡才輪到排名。netmeta 給的是 P-score,它是貝氏 NMA 常報的 SUCRA(surface under the cumulative ranking curve)的頻率派對應物,兩者定義上等價,數值通常很接近。意思是「這個治療平均而言優於其他治療的程度」,介於 0 與 1 之間。
figures/scripts/B7-05-network-meta.R| 名次 | 治療 | P-score | MD vs placebo(95% CI) | 區間寬 | 試驗篇數 | 人數 |
|---|---|---|---|---|---|---|
| 1 | rosiglitazone | 0.893 | -1.23(-1.48 到 -0.98) | 0.50 | 10 | 1312 |
| 2 | metformin | 0.782 | -1.13(-1.43 到 -0.82) | 0.60 | 8 | 1470 |
| 3 | pioglitazone | 0.775 | -1.13(-1.56 到 -0.70) | 0.86 | 3 | 546 |
| 4 | miglitol | 0.614 | -0.95(-1.40 到 -0.50) | 0.91 | 3 | 208 |
| 5 | acarbose | 0.520 | -0.84(-1.32 到 -0.36) | 0.96 | 3 | 108 |
| 6 | benfluorex | 0.436 | -0.73(-1.29 到 -0.17) | 1.12 | 2 | 189 |
| 7 | vildagliptin | 0.423 | -0.70(-1.39 到 -0.01) | 1.39 | 1 | 132 |
| 8 | sitagliptin | 0.333 | -0.57(-1.26 到 0.12) | 1.39 | 1 | 106 |
| 9 | sulfonylurea | 0.210 | -0.42(-0.89 到 0.06) | 0.94 | 3 | 513 |
| 10 | placebo | 0.014 | (參考組) | — | 19 | 2062 |
第一名與第二名之間,網絡並沒有偵測到差異
rosiglitazone 的 P-score 是 0.893,metformin 是 0.782。以「機率」呈現,這個差距看起來像一回事。換成效果量:MD -1.23 對上 -1.13,相差 0.11 個百分點的 HbA1c。
而這兩者的頭對頭網絡估計就在 league table 裡:metformin:rosiglitazone 是 0.11(-0.22 到 0.43)。區間包含零,也就是說網絡並沒有偵測到第一名與第二名之間有差異。排名表把其中一個印在第一列、另一個印在第二列,這件事本身不帶任何統計證據。
第二名與第三名更極端。metformin 的 MD 是 -1.127,pioglitazone 是 -1.129,相差 0.002;而且第三名的點估計其實更負,也就是在效果量上更好。它排在後面是因為 P-score 同時考慮了它跟其他每一個治療比較時的不確定性,而 pioglitazone 的區間比較寬(0.86 對 0.60)。
P-score 與 SUCRA 的三個限制
- 它不含效果大小。 P-score 只是「贏過其他治療的程度」。本頁第一名與第二名的 P-score 差 0.112,換算成 HbA1c 是 0.11 個百分點;同樣大小的 P-score 差距在另一份資料上可能對應完全不同的臨床落差。「這個差距值不值得換藥」不是排名回答得了的問題。
- 第一名可能只贏一點點。 上面已經看到了:第一名與第二名的頭對頭區間包含零。
- 排名本身的不確定性遠大於它看起來的樣子。 一個 P-score 是一個點估計,論文通常不給它的區間。真正的做法是看每個治療落在各個名次的機率分布(rankogram),或者做敏感度分析看拿掉一兩篇試驗名次會不會翻轉。
怎麼讀一篇網絡統合分析
- 網絡圖裡沒有邊的地方在哪裡。 先找出你關心的那個配對有沒有直接試驗。沒有的話,那一格完全由傳遞性撐著。
- 網絡是不是連通的。 分成兩個子網絡卻硬給一張總表,是最嚴重的錯誤之一。
- 傳遞性的論證在哪一段。 應該有一段文字(或一張附錄表)比較各設計的效果修飾因子分布。只寫「我們假設傳遞性成立」等於沒寫。
- 不一致檢定是在哪個模型下算的。 看到很顯著的 design-by-treatment Q,先確認它跟主要分析的異質性假設一不一樣。SIDE 檢定應該逐配對列出來,不是只給一個總結 p 值。
- 沒有不一致檢定的配對有幾個。 只透過共同對照掛上網絡的治療,它們的估計沒有經過任何一致性檢查。
- 主要結論是用效果量寫的,還是用名次寫的。 摘要裡出現「X 排名第一」而沒有出現「X 對 Y 的 MD 是多少」,是警訊。
- 排名有沒有跟不確定性一起呈現。 P-score / SUCRA 的點估計單獨出現時,讀者無從判斷名次是否穩固。
- 異質性住在哪個設計裡。 一個總體 I² 不夠;設計層級的分解才指得出該去讀哪幾篇試驗。
動手跑一次
library(metadat)
library(netmeta)
data(dat.senn2013, package = "metadat")
d <- dat.senn2013 # arm-based:一列一個試驗組
# ── 第一步:arm-based -> contrast-based ──
# 三臂試驗會展開成 choose(3, 2) 列,且這三列彼此相關;
# netmeta 會處理這個相關性,自己動手串資料時最容易漏掉的就是它。
pw <- pairwise(treat = treatment, n = ni, mean = mi, sd = sdi,
studlab = study, data = d, sm = "MD")
nrow(pw)
# ── 網絡連通嗎 ──
netconnection(treat1, treat2, studlab, data = pw)
# ── 隨機效應 NMA ──
net <- netmeta(TE, seTE, treat1, treat2, studlab, data = pw,
sm = "MD", common = FALSE, random = TRUE,
reference.group = "placebo",
small.values = "desirable") # HbA1c 越低越好
net
netgraph(net, thickness = "number.of.studies", number.of.studies = TRUE)
# ── League table:每一格都有數字,包括沒人做過的配對 ──
netleague(net, digits = 2)
# ── 直接 vs 間接(SIDE)──
# 直接欄是 NA -> 沒有頭對頭試驗;間接欄是 NA -> 沒有第二條路可比。
netsplit(net)
# ⚠️ print(net) 印的「Test of inconsistency (between designs)」是
# COMMON-EFFECT 分解。本頁配的是隨機效應模型,對應的檢定在這裡:
decomp.design(net)$Q.inc.random
# 異質性住在哪個設計裡(比一個總體 I^2 有用)
decomp.design(net)$Q.het.design
# ── 排名放最後,而且不要單獨呈現 ──
netrank(net, small.values = "desirable")
forest(net, reference.group = "placebo")驗證環境:R 4.6.0 + netmeta 3.6.1 + meta 8.5.0 + metadat 1.6.0
import itertools
import numpy as np
import pandas as pd
# arm-based -> contrast-based。這一步 Python 做得很順,
# 之後的模型仍然要回 R(或自己在 PyMC / Stan 寫階層模型並自行驗證)。
# metadat::dat.senn2013 的其中三篇(含唯一那篇三臂試驗),
# 帶在這裡讓這一段自己跑得動;完整的 26 篇在上面的 R 端。
arms = pd.DataFrame(
[("Willms (1999)", "metformin", 29, -2.50, 0.862),
("Willms (1999)", "acarbose", 31, -2.30, 1.782),
("Willms (1999)", "placebo", 29, -1.30, 1.831),
("Baksi (2004)", "rosiglitazone", 218, -1.20, 1.112),
("Baksi (2004)", "placebo", 233, 0.10, 1.036),
("Alex (1998)", "metformin", 291, 0.13, 1.428),
("Alex (1998)", "sulfonylurea", 300, 0.50, 1.450)],
columns=["study", "treatment", "ni", "mi", "sdi"],
)
rows = []
for study, g in arms.groupby("study"):
for a, b in itertools.combinations(g.itertuples(), 2):
rows.append({
"studlab": study,
"treat1": a.treatment,
"treat2": b.treatment,
"TE": a.mi - b.mi,
"seTE": np.sqrt(a.sdi ** 2 / a.ni + b.sdi ** 2 / b.ni),
})
contrasts = pd.DataFrame(rows)
print(contrasts.shape)
# 注意:同一篇三臂試驗展開出來的幾列不是獨立的(共用同一個試驗組)。
# 忽略這個相關性會低估標準誤。netmeta 內建處理,手寫模型必須自己補。Python 沒有 netmeta 的對應套件:statsmodels 只做成對統合分析,沒有頻率派 NMA、沒有 net-splitting、沒有 P-score。下面示範的是 Python 真正擅長的那一步——把 arm-based 表格整理成 contrast-based。
常見誤用
| 誤用 | 為什麼錯 |
|---|---|
| 把 league table 的每一格當成同等證據 | 多數格子完全沒有直接試驗,只由傳遞性撐著 |
| 用一致性檢定不顯著宣稱傳遞性成立 | 檢定力極低,而且對只有一條路的配對根本不存在 |
把 netmeta 預設印的 common-effect 不一致 Q 放在隨機效應結果旁 | 兩者對 τ² 的假設不同,會報出模型沒有主張的不一致 |
| 用排名作為主要結論 | P-score 不含效果大小,相鄰名次的差異可能完全未達統計顯著 |
| 只報 P-score / SUCRA 的點估計 | 名次本身的不確定性沒有呈現,讀者無法判斷是否穩固 |
| 把「排名第一」寫成「療效最佳」 | 第一名與第二名的頭對頭區間可能包含零 |
| 對不連通的網絡硬做一張總表 | 兩個子網絡之間不存在任何可估的比較 |
| 假設借了間接證據就會更精確 | 間接路徑會累加不確定性,網絡的 τ² 也會加到每一格上 |
| 把區間跨過零的配對寫成「兩者相當」 | 未達統計顯著不等於相當;要主張相當需要非劣性設計與事先設定的 margin |
| 只報一個總體 I² | 設計層級的分解才指得出異質性住在哪裡 |
| 納入臨床上不可互換的共同對照(不同劑量、不同給藥途徑合併成一個節點) | 直接破壞傳遞性,而模型不會抱怨 |
網絡統合分析的其餘基礎——效果量與它的變異數怎麼算、固定與隨機效應在問什麼、森林圖的每個元素在編碼什麼——分別在效果量與它的變異數、固定效應與隨機效應模型、Forest plot 與 funnel plot。整篇系統性回顧的流程在系統性回顧與統合分析那章。
重跑本頁的所有數字
/opt/homebrew/bin/Rscript figures/scripts/B7-05-network-meta.R讀讀看這張圖
答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。
這張 league table 上 sulfonylurea 對 placebo 的網絡估計是 -0.417(95% CI -0.889 到 0.056)。這一格與 metformin 對 placebo 那一格有什麼不同?
看答案與解析
正確答案: 這一格完全沒有頭對頭試驗,-0.417 是靠三條間接路徑推出來的,而 league table 印它時與有直接試驗的格子長得一模一樣
sulfonylurea 從來沒有跟安慰劑做過頭對頭試驗,它的直接試驗篇數是零。那個 -0.417 是從 metformin、acarbose 與 rosiglitazone 三條路推算出來的,而 league table 把它印成一個普通的格子,與有四篇直接試驗撐著的 metformin 那一格外觀完全相同。0.944 是它的區間寬度,寬窄不是重點——重點是那個估計背後有沒有人真的比過這兩種藥,一個窄的純間接估計仍然是純間接的。至於 -1.127,那是 metformin 對安慰劑的網絡估計,那一格有四篇直接試驗,而且它的直接與間接估計還互相對照過,證據性質與 sulfonylurea 那一格差得很遠。讀 league table 的第一件事,就是回頭看網絡圖或直接試驗篇數表,把哪些格子從來沒有人比過標出來。
netmeta 物件直接 print 出來的設計間不一致檢定,在這份資料上是 Q = 22.53、df = 7、p = 0.002,看起來網絡嚴重不一致。這個數字能直接寫進報告嗎?
看答案與解析
正確答案: 不能。那是 common-effect 分解,它假設研究間沒有異質性;改在本頁實際配的隨機效應模型下算,同一個設計間檢定的 p 是 0.948,完全沒有訊號
那一列是 common-effect 分解:它假設研究之間沒有異質性,於是把 τ² 的 0.109 這一整包離散全部推給「設計之間對不上」。同一個設計間檢定改在本頁實際配的 design-by-treatment 交互作用隨機效應模型下算,p 是 0.948,完全沒有訊號,而且與逐配對的 SIDE 檢定一致——後者最小的 p 是 0.156,離顯著還很遠,說它接近顯著是把一個「未偵測到」讀成半個訊號。把 common-effect 的那個數字放在隨機效應 league table 旁邊,等於告訴讀者這個網絡不一致,而模型並沒有這樣說;不一致的宣稱會讓整組合併結果失去可信度,而這裡的落差純粹來自兩個檢定對 τ² 的處理方式不同。報表要寫清楚不一致檢定是在哪個模型下算的;讀論文時看到設計間的 Q 很顯著,先確認它跟主要分析用的是不是同一個異質性假設。
netsplit 表上直接與間接差異達到統計顯著的配對是 0 個,最小的 p 值是 0.156。可以寫成「這個網絡的一致性已經確認」嗎?
看答案與解析
正確答案: 不行。多數配對的直接證據只有一兩篇試驗,差異的區間寬到上界可以張到 1.546,這種寬度下判不出「不一樣」,沒偵測到不等於一致成立
SIDE 檢定的檢定力很低:這個網絡多數配對的直接證據只有一兩篇試驗,直接與間接兩個區間都很寬,差異的區間因此可以張到 1.546 那麼寬——在這種寬度下,除非落差非常大,否則什麼都判不出來。所以正確的講法是「未偵測到直接與間接的不一致」,跟 Q 檢定不顯著不等於同質是同一件事。0.156 確實離顯著很遠,但那反映的是檢定力,不是印證。0.948 是設計間的隨機效應不一致檢定,它與 SIDE 用的是同一批資料、同一個異質性假設,兩者一致並不是兩個獨立的證據,把它們相加當成確認,是把同一件事數了兩次。還有四個配對根本沒有間接路徑,netsplit 對它們回傳的是不適用,不是通過。
vildagliptin 只跟安慰劑做過一篇試驗。它的網絡估計相對於安慰劑是 -0.700,而只用那一篇做的成對估計也是 -0.700。網絡對它做了什麼?
看答案與解析
正確答案: 點估計沒有借到任何東西,變的是區間:網絡用的 τ² 是跨所有設計估出來的,區間因此撐到 1.385
vildagliptin 是網絡的葉子:它只透過安慰劑掛在網絡上,從它走到安慰劑只有一條路,就是那一篇直接試驗本身。沒有第二條路就沒有東西可以借,也沒有東西可以拿來做一致性檢查——netsplit 對它回傳的是不適用,不是通過。所以點估計原封不動。變的是區間:網絡用的 τ² 是跨所有設計估出來的,不是那一篇試驗自己估的,於是區間從 0.499 撐到 1.385。0.499 正是只用那一篇算出來的寬度,把它讀成「網絡收窄之後的結果」剛好把方向講反了。0.423 是它的 P-score,那是一個排名摘要而不是新的證據;把葉子節點跟有多條路互相印證的治療並排印在同一張排名表上,兩者的證據等級並不相同,而表面上完全看不出來。
P-score 排第一的 rosiglitazone 是 0.893,第二的 metformin 是 0.782。以機率呈現這個差距看起來不小,換成效果量之後呢?
看答案與解析
正確答案: 兩者頭對頭的網絡估計區間上界到 0.430,區間包含零,網絡並沒有偵測到第一名與第二名之間有差異
P-score 說的是「這個治療平均而言優於其他治療的程度」,它不含效果大小。第一名與第二名的頭對頭網絡估計就在 league table 裡,區間上界到 0.430,包含零——網絡並沒有偵測到兩者有差異,而排名表把其中一個印在第一列、另一個印在第二列,這件事本身不帶任何統計證據。0.107 是兩者相對於安慰劑的差距,換算成 HbA1c 只有這麼多個百分點;方向一致不等於排名反映了效果大小,同樣的 P-score 落差在另一份資料上可以對應完全不同的臨床差別。0.112 是 P-score 自己的落差,它是一個無單位的相對量,回答不了「這個差距值不值得換藥」。主要結論該用效果量與它的區間來寫:某藥相對於某對照的差是多少、區間多寬、由幾篇直接試驗支撐;排名可以放附錄,或者強制與效果量畫在同一張圖上。
這張排名表上 sitagliptin 的 P-score 是 0.333,它與安慰劑的區間寬 1.388,背後只有一篇試驗;第一名 rosiglitazone 的區間寬 0.501,有 10 篇。這說明排名表的什麼問題?
看答案與解析
正確答案: 說明排名表抹平了證據強度:sitagliptin 與安慰劑的區間上界是 0.124,跨過零、未達統計顯著,卻仍與其他治療並排印成一個名次
一般教學會說「排第一的往往是證據最少、區間最寬的那個」,這份資料剛好不是那個故事:第一名有 10 篇試驗,區間寬 0.501,是活性藥物裡最窄的。問題出在另一個方向——排名表把證據強度完全抹平了。sitagliptin 只有一篇試驗,它與安慰劑的區間上界是 0.124,跨過零,在這份資料上未達統計顯著,卻仍然以一個普通的名次印在表上,跟建立在 10 篇試驗上的第一名長得一模一樣。至於 -0.570,那是它的點估計,數字本身沒錯,但它並沒有「擠進」什麼——排名表沒有門檻,每一個治療都會拿到一個名次,包括安慰劑自己。0.501 確實是最窄的區間,但第一名可信不等於整張表可信:第二名與第三名的點估計幾乎重疊而名次不同,就是同一張表上的反例。
用到這個方法的章節
延伸觀看
為什麼傳遞性假設對網絡統合分析很重要?
利用 Stata 進行網絡統合分析
使用 SUCRA 進行網絡統合分析治療排名
元件網絡統合分析簡介素材來源與授權
本頁為原創內容