樣本數與檢定力
樣本數計算的每個輸入各自把答案推向哪裡、為什麼罕見結果需要大到不合理的樣本,以及一個用大量模擬證明的事:事後檢定力與 p 值是完全確定的關係,算它等於把 p 值換個尺度再講一次。
四個輸入決定一個數字
樣本數計算需要四樣東西,缺一不可:
| 輸入 | 意思 | 誰決定 |
|---|---|---|
| α(型一錯誤) | 沒有效果卻宣稱有的機率 | 慣例 0.05;期中分析會吃掉一部分 |
| 檢定力(1 − β) | 有效果時偵測得到的機率 | 慣例 0.80 或 0.90 |
| 要偵測的效果大小 | 小到這個程度就不打算偵測 | 臨床判斷,不是統計問題 |
| 變異數或基準風險 | 結果的離散程度 | 先導研究、文獻、登錄資料 |
效果越小,代價爆炸得越快
固定對照組風險 10%、α 0.05、檢定力 80%,看要偵測的效果縮小時樣本數怎麼變:
| 對照組風險 | 治療組風險 | 絕對下降 | 每組人數 | 總人數 |
|---|---|---|---|---|
| 10% | 5.0% | 5.0 個百分點 | 435 | 870 |
| 10% | 6.0% | 4.0 個百分點 | 721 | 1,442 |
| 10% | 7.0% | 3.0 個百分點 | 1,356 | 2,712 |
| 10% | 8.0% | 2.0 個百分點 | 3,213 | 6,426 |
| 10% | 8.5% | 1.5 個百分點 | 5,856 | 11,712 |
| 10% | 9.0% | 1.0 個百分點 | 13,495 | 26,990 |
從偵測 5.0 個百分點的下降到偵測 1.0 個百分點, 每組人數從 435 變成 13,495—— 大約 31 倍。
樣本數大致與效果大小的平方成反比。效果減半,樣本數變四倍。
罕見的結果需要不合理的樣本
換個角度看:固定「相對風險減半」這個效果,改變基準風險。
| 對照組風險 | 治療組風險 | 總人數 |
|---|---|---|
| 30% | 15.0% | 242 |
| 20% | 10.0% | 398 |
| 10% | 5.0% | 870 |
| 5% | 2.5% | 1,812 |
| 2% | 1.0% | 4,638 |
| 1% | 0.5% | 9,346 |
同樣是「風險減半」這個聽起來一樣大的效果,基準風險 30% 時需要 242 人,降到 1% 時需要 9,346 人。
事後檢定力:一個沒有資訊的數字
論文的討論段落常見這種句子:「本研究未達統計顯著,事後檢定力僅 20%, 顯示樣本數不足。」
這句話是循環的。 用 4,000 次模擬試驗畫出來—— 每次模擬每組 40 人、真實效果固定為 0.35 個標準差 (這是一個檢定力不足的設計,所以多數模擬會落在未達顯著那一側):
figures/scripts/B8-02-sample-size.R兩者的 Spearman 相關係數是 -1.0000——不是「高度相關」, 是完全確定的單調關係。事後檢定力是 p 值的函數,反過來也是。
在 2,609 個未達顯著的模擬試驗裡, 事後檢定力的中位數是 0.195, 最大值只有 0.503。 中位數 0.195 是「每組 40 人、真實效果 0.35 SD」這組設定的產物,換一組參數會是別的數字; 最大值 0.503 才是普適的——p 恰好落在 0.05 上時, 觀察到的檢定力必然在 0.5 附近,與樣本數和真實效果無關。
該報什麼:信賴區間的寬度
同樣是「沒有偵測到差異」,不同樣本數的意義完全不同。模擬真實效果為零的研究, 看 95% 信賴區間的上界(用標準差為單位):
| 每組人數 | 信賴區間上界(中位數) | 能排除的效果 |
|---|---|---|
| 40 | 0.451 SD | 大於 0.45 個標準差的效果 |
| 100 | 0.278 SD | 大於 0.28 個標準差的效果 |
| 400 | 0.138 SD | 大於 0.14 個標準差的效果 |
一個真實效果為零、每組 40 人的研究,只能排除大於 0.45 個標準差的效果——依 Cohen 的慣例(0.2 小、0.5 中、0.8 大) 那大約是中等效果量,所以這個 null 幾乎沒有排除任何臨床上重要的東西。 同樣真實效果為零、但每組 400 人的研究,排除掉的範圍就小得多,資訊量高得多。
(上表的三列都是真實效果為零的模擬,不是「未達顯著的研究」的子集—— 真實效果為零時本來就有約 95% 的模擬未達顯著,兩者的中位數很接近,但它們是兩個不同的量。)
這才是「這個 null 結果有多大意義」的正確問法。
動手算一次
# 兩組比例的樣本數(每組)
n_per_arm <- function(p1, p2, alpha = 0.05, power = 0.80) {
z_a <- qnorm(1 - alpha / 2)
z_b <- qnorm(power)
pbar <- (p1 + p2) / 2
num <- (z_a * sqrt(2 * pbar * (1 - pbar)) +
z_b * sqrt(p1 * (1 - p1) + p2 * (1 - p2)))^2
ceiling(num / (p1 - p2)^2)
}
n_per_arm(0.10, 0.05) # 對照 10%,治療 5%
# 實務上用套件,它們涵蓋更多設計
# install.packages("pwr")
# pwr::pwr.2p.test(h = pwr::ES.h(0.10, 0.05), power = 0.80)驗證環境:R 4.6.0。本頁的所有數字都是模擬產生的,seed 固定為 20260822。
import numpy as np
from scipy.stats import norm
def n_per_arm(p1, p2, alpha=0.05, power=0.80):
z_a, z_b = norm.ppf(1 - alpha / 2), norm.ppf(power)
pbar = (p1 + p2) / 2
num = (z_a * np.sqrt(2 * pbar * (1 - pbar)) +
z_b * np.sqrt(p1 * (1 - p1) + p2 * (1 - p2))) ** 2
return int(np.ceil(num / (p1 - p2) ** 2))
print(n_per_arm(0.10, 0.05))
# statsmodels 也有現成的
# from statsmodels.stats.power import NormalIndPowerstatsmodels 的 power 模組涵蓋常見設計;複雜設計(存活、集群、非劣性)建議用 R 的 pwr / powerSurvEpi。
幾種設計的額外考量
| 設計 | 額外要處理的 |
|---|---|
| 非劣性試驗 | 需要事先訂 margin,而且樣本數通常比優效性試驗大;ITT 與 PP 都要報 |
| 集群隨機 | 要乘上設計效應 1 + (m − 1) × ICC,m 是每個集群的人數 |
| 存活分析 | 決定檢定力的是事件數不是人數;追蹤更久與收更多人可以互換 |
| 診斷準確度 | 分母是病例數與對照數,總人數不是重點 |
| 預測模型 | EPV ≥ 10 已被取代,該用 Riley 的樣本數計算 |
| 期中分析 | α 要分配給每次分析,最終門檻小於 0.05 |
常見誤用
| 誤用 | 為什麼錯 |
|---|---|
| null 結果後算事後檢定力當作「樣本不足」的證據 | 它是 p 值的函數,不提供新資訊;該報信賴區間 |
| 用先導研究的點估計當要偵測的效果 | 贏家詛咒;先導研究的效果估計偏大且不穩 |
| 把「要偵測的效果」訂成「預期的效果」 | 該訂的是臨床上有意義的最小差異 |
| 樣本數算完不調整流失率 | 收案數要除以 (1 − 預期流失率) |
| 存活分析用人數而非事件數計算 | 檢定力由事件數決定 |
| 集群隨機不乘設計效應 | 集群內相關會讓有效樣本數遠小於名目人數 |
| 非劣性試驗沿用優效性的樣本數 | margin 通常比預期差異小,需要更大的樣本 |
| 期中分析用 0.05 當最終門檻 | 多次查看會膨脹型一錯誤,需要 alpha 消耗函數 |
重跑本頁的所有數字
/opt/homebrew/bin/Rscript figures/scripts/B8-02-sample-size.R讀讀看這張圖
答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。
一份計畫書原本要偵測對照組 10% 降到 5%,算出每組 435。臨床端說「降到 7% 就很有價值了」,於是把要偵測的效果改小。新的每組人數是哪一個,這件事說明了什麼?
看答案與解析
正確答案: 1356。效果縮成原來的五分之三,樣本數卻變成三倍多——樣本數大致與效果大小的平方成反比
樣本數大致與效果大小的平方成反比。要偵測的絕對下降從五個百分點縮到三個百分點,是原來的五分之三,倒數的平方接近三,而 435 放大三倍多一點正好是 1356。如果關係是線性的,答案會是 721——那剛好是表上偵測四個百分點的那一列,所以它看起來像個合理的數字,這也是線性直覺特別難察覺的原因。2712 是同一列的總人數,把總人數讀成每組人數會讓試驗規模被低估一半。真正要帶走的是:把「臨床上有意義的最小差異」訂小一點,代價不是等比例增加而是平方級的增加,而那個值是臨床判斷,不是統計問題。
同樣是「風險減半」這個效果,基準風險 30% 的試驗總共需要 242。基準風險降到 1% 時需要多少,為什麼?
看答案與解析
正確答案: 9346。相對效果一樣,但事件變稀少了,要累積到足以分辨兩組的事件個數就得收更多
決定樣本數的其實是事件個數,不是人數。基準風險 30% 時 242 就能累積到足夠的事件;降到 1% 時同樣的相對效果需要 9346,因為每個受試者貢獻的事件機率掉到三十分之一。1812 是基準風險 5% 那一列,從它到 9346 中間只隔著一列,「溫和上升」在這張表上不成立。4673 是同一列的每組人數;總人數欄位不是重複計算而是兩組相加,把它讀成重複計算會讓試驗規模被低估一半。這解釋了為什麼罕見不良事件幾乎不可能在一般療效試驗裡做出結論,安全性訊號多半得靠上市後的資料庫研究。
一篇論文寫「本研究未達統計顯著,事後檢定力僅 20%,顯示樣本數不足」。這一頁用四千次模擬檢查了事後檢定力與 p 值的關係。哪一個說法對?
看答案與解析
正確答案: 兩者的 Spearman 相關係數 -1.000,是完全確定的單調關係——事後檢定力沒有提供 p 值以外的任何資訊
相關係數 -1.000 不是「高度相關」而是函數關係:給定樣本數與設計,事後檢定力可以由 p 值算出來,反過來也可以。所以「檢定力低」與「p 值大」是同一句話換個尺度說兩遍,不能當成樣本數不足的獨立證據。0.195 是這組模擬設定的產物,換一組參數就是別的數字,拿它當普遍事實會說錯。0.503 是這批未達顯著模擬裡事後檢定力的最大值,它為什麼落在那個位置,本頁另一題處理。這裡要擋掉的是「多說了一件事」:「距離偵測得到效果還有多遠」完全由 p 值決定,換算過去再換算回來不會多出任何東西。未達顯著的研究該報的是信賴區間,它直接回答「這份資料排除了多大的效果」。
兩份研究都報告「未達統計顯著」,一份每組 40、一份每組 400。要判斷哪一個 null 比較有資訊,該看什麼?
看答案與解析
正確答案: 看信賴區間上界。每組 40 那一份的上界中位數是 0.451 個標準差,依 Cohen 的慣例已經落在中等效果的量級,等於沒排除掉任何臨床上重要的東西
同樣是「沒有偵測到差異」,兩份研究排除掉的範圍差了三倍以上:每組 40 只能排除大於 0.451 個標準差的效果,每組 400 排到 0.138。前者依 Cohen 的慣例已經落在中等效果的量級,等於什麼臨床上重要的東西都沒排除掉;後者才真的說了點什麼。說上界會收斂到 0.138 附近,是把大樣本那一列當成兩者共有的性質,而表上三列的上界隨人數單調縮小,正是這一節要展示的東西。0.195 那條路則是繞回事後檢定力——它是 p 值的函數,未達顯著的研究依定義就不可能高,所以它區分不了這兩份研究。
兩份計畫書都寫「要偵測風險減半」。第一份的對照組風險是 20%,第二份是 5%。兩份的樣本數會一樣嗎?
看答案與解析
正確答案: 不一樣。相對效果相同時,決定樣本數的是絕對差距;對照組 20% 那一份總共 398,遠少於另一份
「減半」是相對量,而樣本數吃的是絕對量。對照組 20% 減半,絕對下降是十個百分點,總共 398;對照組 5% 減半,絕對下降只有它的四分之一,總共 1812。說「兩份都需要 1812」剛好是把第二份的數字套到兩份上,也就把相對效果誤讀成與基準風險無關。199 是第一份的每組人數,總人數是它的兩倍——把每組讀成總數,才會得出「差別只有幾十」,而實際差距是好幾倍。看到「風險減半」這種說法,第一件事是問基準風險是多少。
在 2609 個未達顯著的模擬試驗裡(每組 40、真實效果 0.35 個標準差),事後檢定力有一個最大值。它有什麼特別?
看答案與解析
正確答案: 它是 0.503,而且與樣本數、與真實效果都無關——p 恰好落在顯著門檻上時,觀察到的檢定力必然在一半附近
0.503 是這一節唯一普適的數字:事後檢定力是 p 值的函數,p 恰好等於顯著門檻時,觀察到的檢定力必然落在一半附近,與樣本數、與真實效果都無關。所以「未達顯著」與「事後檢定力低」是同一件事的兩種說法,前者成立時後者必然成立。0.195 是同一批模擬的中位數,它是每組 40、真實效果 0.35 個標準差這組設定的產物,換一組參數就會不同,把它當成普遍事實會說錯。0.278 根本不在同一欄:那是每組人數更多時信賴區間上界的中位數,以標準差為單位,不是機率。要說一份 null 有多少資訊,看信賴區間,不看事後檢定力。
用到這個方法的章節
素材來源與授權
本頁為原創內容