進階已經雙重審閱,尚未人工抽查

非劣性與等效性

「未達統計顯著」不能反過來讀成「兩者相當」。要主張相當,得先在看到資料之前寫下一個你願意讓步的最大幅度——margin——再看信賴區間的上界落在它的哪一側。本頁把同一份 RCT 資料放在四道不同的 margin 前面,讓判定從「劣於」一路翻到「非劣」,並指出翻轉點就坐在信賴區間的上界上。

「未達統計顯著」不能反過來讀

優效性試驗(superiority trial)的虛無假設是「兩組沒有差異」。檢定沒過,意思是這份資料沒有把差異偵測出來, 不是「差異是零」。一個樣本數不足的試驗、一個追蹤太短的試驗、一個結果指標太粗的試驗, 都能給你一個跨過虛無值的信賴區間,而它們跟「兩種治療真的相當」在數字上長得一模一樣。

要主張相當,得換一個設計。你必須在看到任何資料之前寫下一個數字: 如果新療法比舊療法差,最多可以差多少,而你仍然願意用它? 這個數字叫 margin(非劣性界值)。 有了它,判定規則只剩一句話:

把「實驗組減參照組」的差值算出來,看它的 95% 信賴區間上界落在 margin 的哪一側。

本頁一律用正值代表比較差。所以 margin 是一個正數,坐在圖的右邊; 上界低於 margin,就是「就算最壞的情況也還在可接受範圍內」。

這一頁的方向是反過來的,而且是刻意的

本頁用的是設計章 隨機對照試驗已經用過的那份資料: medicaldata::indo_rct,602 位接受 ERCP 的病人,結果指標是 post-ERCP pancreatitis(ERCP 後胰臟炎)。 它是一個優效性試驗(Elmunzer BJ, et al. N Engl J Med 2012;366:1414-22,註冊編號 NCT00820612), 從頭到尾沒有宣告過任何 margin。

照試驗實際跑的方向,風險差是 indomethacin 減安慰劑: -7.8 個百分點,95% 信賴區間 -13.1 到 -2.5 個百分點。 整段落在零的左邊,也就是比較好的那一側。而非劣性的 margin 坐在比較差的那一側, 所以對這個區間而言,任何一個正的 margin 都落在它的右邊——每一道都會過,而且把 margin 移到哪裡判定都不會變。 用這個方向示範「換一個 margin 就換一個結論」,在算術上不可能。

所以本頁把同一份資料轉個方向問:這個藥可以不給嗎? 這是臨床上真的會問的問題 (去實施研究,de-implementation):預防性給藥要成本、要人力、有副作用,不給的代價夠小就值得省。 這樣一問,實驗策略變成「不預防性給藥」,參照變成 indomethacin, 風險差的大小完全一樣、符號相反:7.8 個百分點, 95% 信賴區間 2.5 到 13.1 個百分點。 現在 margin 落在區間附近,移動它就會移動判定。

一張水平的區間圖,橫軸是風險差(百分點),從 -19 到 21,中間有一條標著 no difference 的垂直灰線。上面那一條橫列是試驗實際跑的方向(indomethacin 減安慰劑),點估計 -7.8、區間 -13.1 到 -2.5,整段落在零的左邊。下面那一條橫列是轉向後的讀法(不給藥減給藥),點估計 7.8、區間 2.5 到 13.1,整段落在零的右邊。四條標著 2、5、10、15 的紅色虛線只橫跨下面那一條橫列,各自底下標著該 margin 對應的判定:前三道分別是劣於參照、未定論、未定論,最寬的那一道是非劣但未達優效。
同一份資料的兩種讀法。上:試驗實際跑的方向,結論是優效性,沒有 margin 參與。下:轉成「可以不給藥嗎」之後,四道假設性的 margin 各自給出不同的判定。產圖腳本 figures/scripts/B8-06-non-inferiority.R

一份資料、四道 margin、三種判定

下表的四道 margin 全部是本頁為了教學自己訂的,不是任何人事先指定的。 每一道的來源都取自這個試驗自己的設計數字,好讓它們至少是可辯護的候選值, 而不是隨手挑的。判定則是實際算出來的:拿轉向後那條區間的上界跟 margin 比一次。

margin這道 margin 怎麼來的上界低於 margin?判定
2 個百分點幾乎不讓步的一道,比這個試驗自己觀察到的差還小劣於參照
5 個百分點這個試驗設計時要偵測的效果(對照組 10% 降到 5%)未定論
10 個百分點這個試驗設計時假設的整個對照組風險未定論
15 個百分點刻意選得寬鬆,就是為了讓判定翻轉非劣,但未達優效

同一批人、同一個結果、同一條區間,判定從「劣於參照」一路走到「非劣」。 中間換掉的只有一個數字,而那個數字不是從資料裡算出來的

判定在 10 個百分點與 15 個百分點之間翻轉。 更精確地說,翻轉點是 13.118 個百分點—— 那就是信賴區間的上界本身。任何大於它的 margin 都會給出非劣,任何小於它的都不會。

最寬的那一道:非劣,而且統計上比參照差

15 個百分點那一橫列還有一個獨立的教學點。 它的判定是「非劣」,但轉向後那條區間的下界是 2.5 個百分點,仍然在零以上。 也就是說,在這道寬鬆的 margin 之下,「不給藥」同時是:

  • 非劣——最壞情況(上界 13.1 個百分點)還在事先講好的可接受範圍內
  • 統計上比參照差——區間完全不含零,這份資料偵測得到差異,而且方向是不利的

這兩件事不衝突,因為它們回答的是不同的問題。非劣性問的是「差得夠少嗎」, 不是「有沒有差」。stats 檔的每一橫列都帶一個 worse_than_reference 旗標, 四道 margin 全部是 true

等效性是雙尾的,而且更難

非劣性只管一邊:實驗組不可以差太多,好太多沒關係。等效性(equivalence)兩邊都管—— 整段區間必須同時落在正負 margin 之內。生體相等性試驗、兩種檢驗方法的比對問的通常是後者。

margin非劣性判定等效性成立?
正負 2 個百分點劣於參照
正負 5 個百分點未定論
正負 10 個百分點未定論
正負 15 個百分點非劣,但未達優效

同樣四道界值,等效性只有最寬的那一道成立,而它成立的方式值得注意: 下界 2.5 落在負 15 個百分點之上、 上界 13.1 落在正 15 個百分點之下, 整段被框住了——即使區間本身完全不含零。等效性框住的是幅度,不是方向。

五種可以報告的結果

下面這張圖是圖解,不是分析:五條區間是為了畫圖挑出來的示意值,不是從 medicaldata::indo_rct 或任何其他資料算出來的,不可以當成結果讀。它的用途是拿一篇非劣性論文的區間來對號入座。

一張示意的區間圖,橫軸是「實驗組減參照組」的差值(百分點),從 -27 到 30,有一條標著 no difference 的垂直灰線在零,以及一條標著 margin 的紅色虛線在 10 個百分點。由上而下五條示意區間依序是:整段落在零左邊的優效(那一橫列的 margin 線不延伸過去)、上界低於零的非劣且優效、跨過零但上界低於 margin 的非劣但未達優效、上界越過 margin 的未定論、整段都在 margin 右邊的劣於參照。
五種判定的圖解。這些區間是為了說明畫出來的示意值,不是任何資料集的分析結果。產圖腳本 figures/scripts/B8-06-non-inferiority.R
情境試驗設計margin 適用?怎麼讀
優效(優效性試驗,沒有宣告 margin)優效性整段區間落在「沒有差異」比較好的那一側。這個試驗沒有宣告 margin,所以那條 margin 線根本不是它的判定規則的一部分。
非劣,而且優效非劣性上界低於零,當然也低於 margin:兩個宣稱同時成立。
非劣,但未達優效非劣性上界低於 margin,但區間仍然涵蓋零。非劣性成立;優效性不成立,而且不可以宣稱。
未定論:區間跨過 margin非劣性上界越過了 margin。什麼都沒有建立起來——這正是論文不可以寫成「兩者相當」的那一橫列。
劣於參照:差得比 margin 還多非劣性整段區間都在 margin 之外:比參照差,而且差得比事先講好的還多。

第四橫列是最需要小心的一條。上界越過 margin,代表什麼都沒有建立起來: 既沒建立相當,也沒建立比較差。正確的寫法是「未定論」,不是「兩組相當」, 也不是「未顯示差異,故可互換」。

margin 是臨床判斷,不是統計選擇

margin 的大小決定結論,所以它的來源必須是可辯護的。慣例上要求:

  1. 寫進計畫書,並在收案前定案。 看過區間再訂 margin,等於自己畫靶。
  2. 從參照治療相對於安慰劑的歷史效果推出來。 常見做法是只允許新療法失去舊療法效果的一部分 (例如一半),確保新療法至少還是勝過不治療。
  3. 檢查恆定性假設(constancy assumption)。 那個歷史效果是在別的年代、族群、照護水準底下 量到的;今天的病人風險低很多的話,舊療法的效果也縮水,等於那道 margin 自己變寬了。
  4. 提防界值漂移(biocreep)。 每一代新藥都「不劣於」上一代,一路傳下去可能已經不劣於一個沒效的東西。
  5. 樣本數通常比優效性試驗大,因為 margin 常比預期差異還小,要把區間壓進去需要更窄的區間。 細節見 樣本數與檢定力

兩種區間:Wald 與 Newcombe

本頁主要用 Wald 區間(兩個獨立比例的差,常態近似),因為那是非劣性報告實際上會印的那一個。 腳本同時算了 Newcombe 的混合分數區間(hybrid-score,把兩個 Wilson 區間組合起來, 不假設差值本身服從常態),單位都是百分點:

算法下界上界
Wald(本頁主要使用)2.4513.12
Newcombe hybrid-score2.4013.16

兩者相差不到十分之一個百分點,在這個事件數之下選哪一個都不會改變任何一道 margin 的判定。 這句話的範圍就到這裡為止,它不是通則:當某一組的風險很靠近 0 或 1、或者事件數少很多時, 常態近似會失準,兩種區間就會分開——而那時候差的可能剛好就是跨不跨過 margin。 非劣性設計特別容易撞到這件事,因為兩組的風險常常都很低(參照治療有效), 「事件數少 + 風險接近 0」同時成立。區間算法要事先指定,理由跟 margin 一樣: 事後兩種都算、報比較窄的那個,是在挑結果。

ITT 與 per-protocol:這個設計的方向也是反的

做不成的分析仍然可以把概念量出來。下面是建立在這個試驗自己的數字上的思想實驗: 假設實驗策略那一組裡有一定比例的人其實沒照分派的策略走、行為跟參照組一樣, 點估計就會按那個比例往零縮。標準誤固定不動,好讓唯一在動的東西是稀釋。

不遵從比例風險差(百分點)95% CImargin 10 個百分點margin 15 個百分點
0%7.82.5 到 13.1未定論非劣,但未達優效
10%7.01.7 到 12.3未定論非劣,但未達優效
20%6.20.9 到 11.6未定論非劣,但未達優效
30%5.40.1 到 10.8未定論非劣,但未達優效
40%4.7-0.7 到 10.0未定論非劣,但未達優效
50%3.9-1.4 到 9.2非劣,但未達優效非劣,但未達優效

看倒數第二欄。在 10 個百分點這道 margin 之下, 判定一路撐到 40% 不遵從都還是「未定論」, 到 50% 才翻成「非劣」。 稀釋把區間推向 margin 的安全側。

本頁能給的 ITT 那一套是完整的:307 位分到不預防性給藥、 295 位分到 indomethacin, 全部 602 筆都有觀察到的結果,沒有人因為追蹤不到而被排除。 缺的是另外一半,而那一半在這份檔案裡補不起來。

讀論文時看哪裡

  1. margin 是多少,寫在哪裡。 計畫書或註冊資料裡找得到嗎?如果只出現在結果段落,當作事後的。
  2. margin 憑什麼訂成那樣。 有沒有引用參照治療相對於安慰劑的歷史效果?保留了多少比例?
  3. 信賴區間的上界。 判定就是它跟 margin 比一次;把上界跟 margin 一起看,比看結論那句話有用。
  4. ITT 與 per-protocol 有沒有都報,結論一不一致。 只報一套的非劣性試驗要打折扣。
  5. 有沒有從非劣掉頭宣稱優效。 這條路徑要事先寫進檢定順序;反方向(優效沒過改宣稱非劣)不成立。
  6. 摘要的用字。 「未達統計顯著」「未偵測到差異」「非劣」「相當」是四個不同的宣稱, 而摘要最常見的失誤是把第一個寫成第四個。

動手跑一次

library(medicaldata)
data(indo_rct, package = "medicaldata")
d <- indo_rct

# Experimental strategy = omitting the drug; reference = indomethacin.
# A positive difference therefore means "omitting it is worse".
n1 <- sum(d$rx == "0_placebo")
e1 <- sum(d$rx == "0_placebo" & d$outcome == "1_yes")
n0 <- sum(d$rx == "1_indomethacin")
e0 <- sum(d$rx == "1_indomethacin" & d$outcome == "1_yes")

p1 <- e1 / n1
p0 <- e0 / n0
rd <- p1 - p0
se <- sqrt(p1 * (1 - p1) / n1 + p0 * (1 - p0) / n0)
ci <- rd + c(-1, 1) * qnorm(0.975) * se
round(100 * c(rd, ci), 2)          # 7.79   2.45   13.12

# The entire decision rule, for a margin sitting on the worse side.
verdict <- function(lcl, ucl, margin) {
  if (ucl < 0) "non-inferior and superior"
  else if (ucl < margin) "non-inferior, not superior"
  else if (lcl > margin) "inferior"
  else "inconclusive"
}
for (m in c(0.02, 0.05, 0.10, 0.15)) {
  cat(sprintf("margin %4.0f pp -> %s\n", 100 * m, verdict(ci[1], ci[2], m)))
}

# The margin at which the verdict changes IS the upper confidence limit.
100 * ci[2]

# Flip the sign and you have the trial as it was run: the interval then lies
# entirely below zero, so every positive margin is cleared and none can bite.
round(100 * (-rd + c(-1, 1) * qnorm(0.975) * se), 2)

驗證環境:R 4.6.0、medicaldata 0.2.0。

常見誤用

誤用為什麼錯
優效性檢定未達顯著,改宣稱「兩者相當」那是另一個設計,需要事先指定的 margin;未偵測到差異不是相當的證據
看到區間之後才訂 marginmargin 決定結論,事後訂等於自己畫靶
把「已達成非劣性」寫成「兩種做法一樣好」非劣是帶界線的宣稱;刪掉界線就刪掉了這個設計唯一多出來的東西
非劣性試驗只報 ITTITT 的稀釋在這個方向上是反保守的,兩套分析都要報而且要一致
沿用優效性試驗的樣本數margin 常比預期差異小,要把區間壓進 margin 需要更窄的區間
拿非劣性結果宣稱優效,但沒有事先寫進檢定順序這條路徑要事先指定;反方向(優效沒過改宣稱非劣)不成立
上界越過 margin 卻寫成「未顯示差異,故可互換」那是未定論:既沒建立相當,也沒建立比較差
事後兩種區間算法都試,報比較窄的那個跟事後挑 margin 是同一類問題,區間算法要事先指定
一路「不劣於上一代」傳下去界值漂移;可能已經不劣於一個實際上沒效的東西

這一頁是那句一行守衛的指向目標

本站有許多地方用一句話擋住同一個誤讀——「未達統計顯著」被讀成「兩者相同」—— 並且都補上同樣的提醒:要主張相當,需要事先設定 margin 的非劣性或等效性設計 (各頁依它擋的是單邊還是雙邊誤讀而措辭不同,例如 t 檢定那頁寫的是等效性設計)。 它們橫跨基礎檢定、存活分析、預測模型、因果推論與統合分析五族: t 檢定與變異數分析Cox 比例風險模型Brier score、NRI 與 IDI因果中介分析網絡統合分析

一句話只能否認錯誤的讀法。這一頁補的是正確的讀法長什麼樣子:一條信賴區間、一條事先畫好的線, 以及一個只有在兩者比較過之後才成立的宣稱。它在設計層面的位置在 隨機對照試驗——那一章的 ITT 段落已經指出非劣性設計的方向是反的,本頁把它量了出來。

重跑本頁的所有數字

/opt/homebrew/bin/Rscript figures/scripts/B8-06-non-inferiority.R

讀讀看這張圖

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

同一條信賴區間配上四道 margin,判定從「劣於參照」一路走到「非劣」。翻轉恰好發生在哪一個數字上?

看答案與解析

正確答案: 13.118 個百分點——它不是表上任何一道 margin,而是資料自己算出來的那條區間的上界,比它寬的 margin 都會過、比它窄的都不會

13.118 就是轉向後那條信賴區間的上界。非劣性檢定的結論等價於「margin 有沒有大於上界」,所以翻轉點不是表上四道 margin 裡的任何一道,而是資料自己給的那個數字。10.000 與 15.000 是把翻轉夾在中間的那兩道,表格只能告訴你翻轉落在它們之間;把 15.000 說成翻轉點,只是因為它是被試出來的第一道,換一組更密的 margin 就會發現更早的位置。這件事的實務意義是:論文最後那句「達成非劣性」,一半的資訊在資料裡,另一半在計畫書裡——你必須回頭看那個 margin 是誰訂的、什麼時候訂的。所以非劣性論文的審閱重點是計畫書與註冊資料,不是統計方法段落。

思想實驗:假設實驗策略那一組有一定比例的人其實沒照分派的策略走、行為跟參照組一樣。在 10 個百分點那道 margin 之下,要多高的不遵從比例判定才翻成「非劣」?

看答案與解析

正確答案: 0.5。稀釋把點估計往零縮、把區間推向 margin 的安全側,所以執行得越差越容易宣稱非劣——意向治療分析在這個設計裡是反保守的

表上那一欄一路撐到 0.4 都還是未定論,到 0.5 才翻成非劣。方向才是重點:稀釋讓兩組看起來更像,而「看起來更像」正是非劣性試驗想要的結論,所以執行得越差越容易宣稱非劣。優效性試驗剛好相反,同樣的稀釋讓顯著結果更難拿到,所以意向治療分析在那裡是保守的選擇。0.1 那一列的判定並沒有翻,說「一點不遵從就會翻」把敏感度誇大了。0.4 是翻轉前的最後一列,稀釋在這一段是讓區間往 margin 的安全側靠,不是離它更遠。所以 per-protocol 在非劣性設計裡不是次要分析:兩套都要報而且要一致,只報意向治療等於用一個偏向自己結論的分析下結論。

這一頁把試驗實際跑的方向轉過來問「這個藥可以不給嗎」。為什麼不直接用試驗原本的方向示範 margin?(以下數值是絕對風險差的比例,乘一百就是頁面上的百分點。)

看答案與解析

正確答案: 因為原方向那條區間的上界是 -0.0245,整段落在零比較好的那一側,而 margin 坐在比較差的那一側——任何一個正的 margin 都會過,移到哪裡判定都不變

原方向的區間上界 -0.0245 整段都在零的左邊,也就是比較好的那一側;而非劣性的 margin 坐在比較差的那一側,所以任何一個正的 margin 都落在區間右邊,每一道都會過,移動它判定也不會變——用那個方向示範「換一個 margin 就換一個結論」,在算術上不可能。0.1312 是轉向後那條區間的上界,兩者大小一樣、符號相反,因為它們是同一件事的兩種說法。0.0272 是差值的標準誤,區間寬度確實由它決定,但問題從來不是區間夠不夠寬,是 margin 落在區間的哪一側。轉向不動資料、不動人群、不動結果定義,只換問句——這一點很重要,因為另一條路(去找一個區間比較寬的亞組)會變成在教事後亞組分析。

四道界值之下,非劣性判定從「劣於參照」走到「非劣」。等效性判定呢?

看答案與解析

正確答案: 只有正負 15 個百分點那一道成立。等效性要整段區間同時落在正負界值之內,是雙尾的,嚴格得多

只有最寬的那一道成立:下界要落在負 15 個百分點之上、上界要落在正 15 個百分點之下,整段才被框住。非劣性只管一邊——實驗組不可以差太多,好太多沒關係——所以它成立的地方等效性未必成立,這就是「非劣性成立等效性一定也成立」錯在哪裡。至於最嚴的那一道,區間完全不含零說的是「這份資料偵測得到差異」,那與「差得夠少」是兩個不同的問題;事實上在最寬的那道界值底下,不給藥同時是非劣、而且統計上比參照差。這兩件事不衝突,因為非劣性問的是差得夠少嗎,不是有沒有差。生體相等性試驗與兩種檢驗方法的比對,問的通常是雙尾的那一個。

腳本同時算了 Wald 與 Newcombe 兩種區間。轉向後 Wald 的上界是 0.1312,Newcombe 的上界是多少,這對判定有什麼影響?(數值是絕對風險差的比例。)

看答案與解析

正確答案: 0.1316。兩者差不到十分之一個百分點,在這個事件數之下選哪一個都不改變任何一道 margin 的判定——但這句話的範圍就到這裡,事件數少很多時兩種區間會分開

0.1316 與 Wald 的 0.1312 差不到十分之一個百分點,所以在這個事件數之下兩種算法給出同樣的判定。但這不是通則:某一組的風險很靠近零或一、或者事件數少很多時,常態近似會失準,兩種區間就會分開——而那時候差的可能剛好就是跨不跨過 margin。非劣性設計特別容易撞到這件事,因為參照治療有效時兩組的風險常常都很低。0.0240 是 Newcombe 的下界不是上界,把下界讀成上界會得出「Newcombe 明顯比較窄」這種相反的結論。至於 -0.0240,那是試驗原方向那條區間的上界,符號相反是因為問句被轉過來了,不是因為換了算法。實務上的規矩是區間算法要事先指定,理由跟 margin 一樣:事後兩種都算、報比較窄的那一個,是在挑結果。

非劣性試驗被要求同時報意向治療與 per-protocol 兩套分析,而這一頁只給得出前者。哪一個說法對?

看答案與解析

正確答案: 意向治療那一套是完整的:307 位分到不預防性給藥、其餘分到 indomethacin,全部都有觀察到的結果;缺的是另一半,因為這份檔案沒有記錄遵從性

307 是分到不預防性給藥那一組的人數,而這份資料的 602 列全部都有觀察到的結果,所以意向治療這一套沒有缺口。缺的是 per-protocol:這份檔案裡只有基線與術式特徵、隨機分派的組別與結果,沒有任何欄位記錄遵從性、是否真的收到試驗用藥、或有沒有計畫書偏離。用 52 這個事件數去重建遵從性是把結果當成暴露,那會直接破壞隨機化,而且沒發生事件與有遵從是兩回事。至於「沒有人失訪所以兩套會一樣」,失訪與不遵從是兩個不同的缺口——一個人可以全程被追蹤到,卻沒有照分派的策略走。產圖腳本因此沒有捏造代理變項,反而斷言這份資料沒有那類欄位:未來套件補上了,腳本會失敗,而不是繼續謊稱缺口還在。

這一頁的四道 margin 各自取自這個試驗自己的設計數字。作者說一道都不能當成「這個問題的合理 margin」。為什麼?

看答案與解析

正確答案: 因為它們是在區間算出來之後才挑的,最寬的那道 15 個百分點還是刻意挑來讓判定翻轉的——margin 必須寫進計畫書並在收案前定案,看過區間再訂等於自己畫靶

問題出在時序,不是數值:這四道都是在區間算出來之後才挑的,而 15 個百分點那道還是刻意挑來讓判定翻轉的。慣例要求 margin 寫進計畫書並在收案前定案,看過區間再訂等於自己畫靶——而事後挑的 margin 跟事先指定的,在論文裡長得一模一樣。說「margin 一律要大於觀察到的差」是把規則反過來:最嚴的那一道之所以不能用,不是因為它太嚴,是因為它是事後挑的,一道嚴格但事先寫下的 margin 完全合法。說「只能取自歷史效果」也太絕對:從參照治療相對於安慰劑的歷史效果推出來是慣例做法,只允許新療法失去舊療法效果的一部分,好確保它至少還勝過不治療,但那一道不合格同樣是因為時序。另外還要檢查恆定性假設,並提防界值漂移——每一代新藥都不劣於上一代,一路傳下去可能已經不劣於一個沒效的東西。

素材來源與授權

本頁為原創內容

回報內容問題

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

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

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

一併送出的資訊

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