無母數檢定:Wilcoxon 與 Kruskal-Wallis
Wilcoxon rank-sum 檢定的虛無假設是隨機優勢(stochastic ordering),不是中位數相等——所以「兩組中位數一樣、p 值卻顯著」不是矛盾。還有為什麼只報 p 值不夠、Hodges-Lehmann 位移估計怎麼讀、無母數與取對數估的是不同的量、相同值對精確 p 值的影響,以及 Kruskal-Wallis 之後的兩兩比較。
這個方法在解決什麼問題
「資料看起來不常態,所以我改跑 Wilcoxon」——這是無母數檢定最常見的登場方式, 而它幾乎總是伴隨一個沒有被說出口的誤解:以為 Wilcoxon 是在比中位數。
它不是。Wilcoxon rank-sum 檢定(又叫 Mann-Whitney U 檢定)比的是隨機優勢 (stochastic ordering):隨機抽一個 A 組的人、隨機抽一個 B 組的人,前者比後者大的機率是不是二分之一。 寫成式子就是虛無假設 。中位數只是分布的一個摘要,而這個機率吃的是整個分布。
兩者大部分時候會給出一致的結論,但不是同一件事——而它們分開的時候, 報表上就會出現一組看起來自相矛盾的數字:兩組中位數印在 Table 1 上一模一樣, 底下那個 p 值卻是顯著的。本頁的第二節就是把那個情境完整做出來。
本頁用兩份資料:MASS::birthwt(189 位產婦,結果變項是新生兒出生體重,公克)
與 datasets::sleep(Student 1908 年那份安眠藥資料),
與 t 檢定與變異數分析那一頁用的是同一組變項定義,
所以兩頁的數字可以直接對照。
虛無假設是隨機優勢,不是中位數
下面這組資料是刻意構造出來的,用來示範一件真的會發生的事。 情境是同一種手術在兩家醫院的住院天數(單位是天):
- 甲院沒有固定的出院流程,每個病人依狀況決定,於是有一條很長的下尾(術後隔天就走的人不少),上方則封在 9 天。
- 乙院有一套以第七天出院為目標的流程,所以幾乎沒有人在第 6 天以前離開,剩下的變異全部往上跑——併發症把少數人留到三、四週。
甲院(30 人):1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9
乙院(30 人):6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 12, 13, 14, 17, 18, 20, 22, 25
| 醫院 | n | 中位數(天) | 平均(天) | 四分位距 | 全距 |
|---|---|---|---|---|---|
| 甲 | 30 | 7 | 6.23 | 4.25 到 8 | 1 到 9 |
| 乙 | 30 | 7 | 10.1 | 7 到 11.75 | 6 到 25 |
兩組中位數的差是 0 天——完全相同。 而 Wilcoxon rank-sum 檢定給出 W = 629,p = 0.007。
figures/scripts/B1-04-nonparametric.R中間那格是重點。乙院的累積分布函數從頭到尾都不高於甲院—— 也就是說,不論你把門檻設在幾天,乙院超過那個門檻的比例都不會比甲院低。 這正是「乙院系統性地比較久」的嚴格意思,而它與「兩組中位數相同」完全相容: 兩條階梯都在第 7 天那一階跨過 0.5。
順帶一提,同一組資料的平均數差是 3.87 天,Welch t 檢定 p < 0.001。 平均數看得見的東西,中位數看不見——右尾那幾個住到三週的病人,正是臨床上最該被看見的人。
把隨機優勢變成一個能報的數字
不必停在抽象的層次,它可以直接估出來:把所有跨組配對拿出來數一遍, 一方較大就記一分,兩者相同就各記半分,除以配對總數。上圖的 C 格畫的就是這件事—— 900 個格子,每一格是一對病人。
構造例的估計值是 0.699,也就是說隨便抓一組甲乙兩院的病人, 乙院那位住得比較久的機率大約是 70%。
真實資料也一樣可以報。birthwt 裡未抽菸與抽菸兩組的出生體重,
這個機率是 0.617——隨機抓一對母嬰,未抽菸那組的嬰兒比較重的機率大約
62%。
它的好處是可以直接講給人聽:「隨機挑一位接受新療法的病人,他的恢復比隨機挑一位接受標準治療的病人好, 機率是七成」,比 p 值有訊息量得多,而且不需要任何分布假設。
只報 p 值不夠:Hodges-Lehmann 位移估計
Wilcoxon 的輸出預設只有一個 p 值,於是很多論文的 Results 就寫成 「中位數 A vs B(p = …)」。這個寫法把兩個不同的東西併在一起: 中位數是各組的摘要,p 值是組間的檢定,中間缺了「差多少、精確度多少」的效果量。
補上那一格的是 Hodges-Lehmann 位移估計:所有跨組配對差值的中位數。
R 的 wilcox.test(conf.int = TRUE) 會一併給出它與信賴區間,單位與原始資料相同。
figures/scripts/B1-04-nonparametric.R以 birthwt 的抽菸與否為例,同一個比較有三個不同的數字:
| 估計量 | 值(公克) | 95% CI | 它估的是什麼 |
|---|---|---|---|
| 兩組中位數之差 | 324.5 | 預設不提供 | 兩個摘要值相減,不是任何檢定的估計對象 |
| Hodges-Lehmann 位移估計 | 306.2 | 85 到 512 | 隨機一對跨組個案的差值的中位數 |
| Welch 平均差 | 283.8 | 78.6 到 489 | 兩組平均數之差 |
三個數字都在三百公克上下,但它們不是同一個量。中間那列的定義值得再讀一次: Hodges-Lehmann 估的是「配對差值的中位數」,不是「中位數的差」—— R 的說明文件把後者明白標成常見誤解。這兩者在對稱分布下會很接近,在偏態分布下不會。
實務上的寫法:報「Hodges-Lehmann 位移估計 306.2 公克
(95% CI 85 到 512,Wilcoxon rank-sum p = 0.007)」,
必要時再加上 的估計 0.617。
順帶檢查:直接算 8510 個配對差值的中位數是 307 公克,
與 wilcox.test() 回報的 306.2 公克非常接近,但不是同一個數。
差別來自算法:wilcox.test() 是把檢定反轉、用 uniroot 解出來的,
不是直接取那 8510 個差值的中位數。
無母數還是取對數?兩條路估的對象不同
右偏的變項(住院天數、費用、生物標記濃度)還有第二條路:取對數之後跑 t 檢定。 兩條路都合理,但它們的產出不是同一個量,而論文必須說清楚走的是哪一條。
同一份 birthwt 資料,兩條路的結果是:
| 分析路線 | 點估計 | 95% CI | 尺度 |
|---|---|---|---|
| Wilcoxon + Hodges-Lehmann | 306.2 | 85 到 512 | 公克(加法的位移) |
| 取對數後 t 檢定 | 1.101 | 1.014 到 1.196 | 倍數(乘法的比值) |
第二列的意思是:未抽菸組的幾何平均出生體重(2950.8 公克) 是抽菸組(2679.8 公克)的 1.101 倍, 換算成百分比是高出 10.1%(95% CI 1.4% 到 19.6%), p = 0.022。
差別不只是換算單位而已:
- 加法的位移假設兩組相差一個固定的量。出生體重適合這樣看——臨床門檻(低出生體重 2500 公克)是加法的,「少 300 公克」對每一個嬰兒的意義大致相同。
- 乘法的比值假設兩組相差一個固定的倍數。跨越好幾個數量級的量(病毒量、C 反應蛋白、住院費用)適合這樣看——「高 10%」在低值與高值處都成立,而「高 300 單位」在低值處可能是三倍、在高值處微不足道。
- 取對數的 t 檢定估的是幾何平均的比值,不是算術平均的比值。把對數尺度上的平均數反轉回來得到的是幾何平均,它一定小於或等於算術平均;要主張算術平均要另外處理。
- 取對數要求所有觀測值為正。有零值時常見的
log(x + 1)會讓那個常數影響結果,而且比值失去乾淨的解釋。
相同值與精確 p 值
秩檢定的精確 p 值來自「把 N 個觀測值重新分派到兩組」的所有排列。 資料裡出現相同值(ties)時,這些觀測值只能給相同的平均秩,排列的參考分布因此改變。
birthwt 的出生體重記錄到公克,仍然有 131 個相異值分給 189 筆資料,
其中 97 筆與別人共用同一個值,最大的一群有 5 筆。
臨床資料幾乎不可能沒有 ties。
多數教科書寫的是「有 ties 就算不出精確 p 值,軟體會退回常態近似」。
這句話對現在的 R 已經不成立(本頁驗證於 R 4.6.0):
wilcox.test() 內建了 Streitberg-Röhmel 移位演算法,
在有 ties 時改用「條件於觀測到的秩」的排列分布,照樣給精確推論。
真正切換預設的是樣本數,不是 ties:兩組都少於 50 筆時走精確法,否則走常態近似。
所以本頁的構造例(每組 30 筆)拿到的是精確 p 值,
而 birthwt 的抽菸比較(115 對 74)拿到的是常態近似。
把 birthwt 裡出生體重在全體中唯一的那些列抽出來(92 筆,完全沒有 ties),
再把同一批資料四捨五入到最接近的 250 公克——
也就是病歷回顧實際上能拿到的精度——可以看到 ties 的代價:
| 同一批 92 筆資料 | 相異值 | 最大同值群 | W | 精確 p | 常態近似 p |
|---|---|---|---|---|---|
| 記錄到公克(無 ties) | 92 | 1 | 1180 | 0.2500 | 0.2487 |
| 四捨五入到 250 公克 | 17 | 12 | 1160 | 0.3181 | 0.3174 |
同一批病人、同一個比較,只因為量得比較粗,檢定統計量與 p 值就都動了。 測量精度是分析的一部分,不是資料收集階段結束後就不再影響結果的事。
幾個實務要點:
- 報軟體與版本。 同一份資料在舊版 R、SPSS、SAS 上可能拿到常態近似而不是精確 p 值,兩者不會完全相同。
- 連續性校正只影響常態近似那條路。 本頁的抽菸比較有校正時 p = 0.00677,沒有校正時 p = 0.00674;差距通常很小,但 p 值貼著門檻時就不是小事。
- 不要為了消除 ties 去加隨機擾動。 那等於把答案交給亂數種子。
- ties 多到某個程度時,該換的是模型不是檢定:結果變項本來就是有序類別(疼痛分級、NYHA 分級)時,有序邏輯迴歸能同時給出效果量與共變項校正。
配對版:Wilcoxon signed-rank
同一個人前後測、同一個人左右眼、配對設計——有一對一的連結就要用配對版本, 理由與 配對 t 檢定完全相同:配對把人與人之間的差異整個消掉。
Wilcoxon signed-rank 檢定的做法是:算出每個人的差值,依絕對值大小排序給秩,
再看正差值的秩和有沒有偏離。用 Student 那份安眠藥資料(10 位受試者各試兩種藥),
每個人的差值是 1.2, 2.4, 1.3, 1.3, 0, 1, 1.8, 0.8, 4.6, 1.4。
注意其中有 1 個差值為零的受試者。這在配對資料裡很常見, 而不同軟體的處理方式不一樣:
| 分析方式 | 統計量 | 點估計(小時) | 信賴區間 | p |
|---|---|---|---|---|
| signed-rank(R 4.6.0 現行做法) | V = 54 | 1.3 | 0.9 到 2.7(實際水準 95.6%) | 0.0039 |
| signed-rank(丟掉零差值的教科書做法) | V = 45 | 1.4 | 1.1 到 2.95(實際水準 96.5%) | 0.0039 |
| 配對 t 檢定 | t = 4.06 | 1.58 | 0.7 到 2.46 | 0.0028 |
兩種零差值處理法在這份資料上給出相同的 p 值,但點估計與區間都不一樣, 而且沒有任何輸出會提醒你剛剛做了一個選擇。有零差值時,把軟體與版本寫進 Methods。
還有一個容易被忽略的細節:上表兩個無母數區間的實際涵蓋水準是 95.6% 與 96.5%,不是剛好 95%。 秩統計量是離散的,能達到的水準只有有限幾個,R 會挑最接近的並如實標出來。
三組以上:Kruskal-Wallis 與事後兩兩比較
Kruskal-Wallis 檢定是 ANOVA 的秩版本:把所有觀測值一起排序,再問各組的平均秩是不是都一樣。 它同樣是一個綜合檢定(omnibus test),顯著只代表「不全相同」,不說是誰跟誰不同。
用 birthwt 依產婦族群分成三組:
| 組別 | n | 中位數(公克) | 四分位距 | 平均秩 |
|---|---|---|---|---|
| White | 96 | 3062 | 2584.75 到 3651 | 106.1 |
| Black | 26 | 2849 | 2370.5 到 3057 | 77.5 |
| Other | 67 | 2835 | 2313 到 3274 | 85.8 |
綜合檢定的結果是 = 8.52,df = 2,p = 0.014。
接下來的兩兩比較有一個常見的做法是錯的:跑三次 Wilcoxon rank-sum。 問題在於每一次都只拿其中兩組重新排秩,第三組的資訊被丟掉了, 而且各次的參考分布互不相容。正確的做法(Dunn 檢定)是只排一次秩, 用全體樣本算出的變異數去比較各組的平均秩,並且共用同一套 ties 校正。
figures/scripts/B1-04-nonparametric.R| 比較 | 平均秩 | Dunn z | 未調整 p | Holm 調整後 p |
|---|---|---|---|---|
| White vs Black | 106.1 vs 77.5 | 2.37 | 0.0179 | 0.0537 |
| White vs Other | 106.1 vs 85.8 | 2.33 | 0.0197 | 0.0537 |
| Black vs Other | 77.5 vs 85.8 | -0.66 | 0.5096 | 0.5096 |
這張表是本節的重點。綜合檢定 p = 0.014 是顯著的, 但三個兩兩比較經 Holm 調整之後沒有一個達到統計顯著。 這不是矛盾,也不代表各組之間沒有差異——只代表這份資料的證據強度不足以在控制家族錯誤率的前提下, 指認出是哪兩組不同。要寫的是「未達統計顯著」,不是「沒有差異」。
幾個實務要點:
- 事後比較的方法與調整法要事先寫進計畫書。 「所有兩兩比較」與「只比對照組」需要的調整不同,型一錯誤累積的原理見 t 檢定與變異數分析。
- Holm 幾乎總是優於 Bonferroni。 兩者控制的都是家族錯誤率,Holm 是逐步做法,檢定力嚴格較高而假設不變。
- Kruskal-Wallis 也不是在比中位數。 要把它讀成「位移」需要各組分布形狀相似這個額外假設,和兩組的情況一樣。
- 有共變項要校正時,秩檢定就不夠用了。 秩檢定沒有校正機制;改用有序邏輯迴歸或對轉換後的變項跑線性迴歸。
動手跑一次
library(MASS)
data(birthwt, package = "MASS")
birthwt$smoke_f <- factor(birthwt$smoke, levels = c(0, 1),
labels = c("Non-smoker", "Smoker"))
birthwt$race_f <- factor(birthwt$race, levels = 1:3,
labels = c("White", "Black", "Other"))
# 兩組獨立樣本:一定要加 conf.int = TRUE,才拿得到 Hodges-Lehmann 估計
wilcox.test(bwt ~ smoke_f, data = birthwt, conf.int = TRUE)
# P(X > Y):直接數配對,同值各算半分
ns <- birthwt$bwt[birthwt$smoke_f == "Non-smoker"]
sm <- birthwt$bwt[birthwt$smoke_f == "Smoker"]
mean(outer(ns, sm, ">")) + 0.5 * mean(outer(ns, sm, "=="))
# 另一條路:取對數後 t 檢定,得到的是幾何平均的比值
fit <- t.test(log(ns), log(sm))
unname(exp(c(diff(rev(fit$estimate)), fit$conf.int)))
# 配對版。⚠️ R 4.6 起公式介面不接受 paired = TRUE(會直接報錯),
# 要嘛給兩個向量,要嘛用 Pair() 的寫法。
data(sleep)
d1 <- sleep$extra[sleep$group == 1]
d2 <- sleep$extra[sleep$group == 2]
wilcox.test(d2, d1, paired = TRUE, conf.int = TRUE)
wilcox.test(Pair(d2, d1) ~ 1, conf.int = TRUE) # 等價寫法
# 三組以上
kruskal.test(bwt ~ race_f, data = birthwt)
# Dunn 事後比較:只排一次秩,用全體的變異數,最後做 Holm 調整
r <- rank(birthwt$bwt); N <- length(r); tie <- table(birthwt$bwt)
s2 <- N * (N + 1) / 12 - sum(tie^3 - tie) / (12 * (N - 1))
nn <- tapply(r, birthwt$race_f, length); rb <- tapply(r, birthwt$race_f, mean)
cb <- combn(levels(birthwt$race_f), 2)
z <- apply(cb, 2, function(k) (rb[[k[1]]] - rb[[k[2]]]) /
sqrt(s2 * (1 / nn[[k[1]]] + 1 / nn[[k[2]]])))
data.frame(pair = apply(cb, 2, paste, collapse = " vs "),
z = round(z, 2),
p_holm = p.adjust(2 * pnorm(-abs(z)), method = "holm"))驗證環境:R 4.6.0 + MASS 7.3.65。conf.int = TRUE 不是預設值,但少了它就只有 p 值可報。
import numpy as np
import statsmodels.api as sm
from scipy import stats
bw = sm.datasets.get_rdataset("birthwt", "MASS").data
ns = bw.loc[bw["smoke"] == 0, "bwt"].to_numpy()
smk = bw.loc[bw["smoke"] == 1, "bwt"].to_numpy()
# 檢定本身有:method="exact" / "asymptotic" 對應 R 的 exact 參數
stats.mannwhitneyu(ns, smk, alternative="two-sided")
# ⚠️ scipy 沒有 Hodges-Lehmann 估計,也沒有它的信賴區間。
# 點估計可以自己算(就是配對差值的中位數);區間要自己 bootstrap,
# 那與 R 用檢定反轉得到的區間不是同一個東西,不要混報。
diffs = np.subtract.outer(ns, smk).ravel()
hodges_lehmann = np.median(diffs)
# P(X > Y) 同樣自己數
p_superior = (np.mean(np.subtract.outer(ns, smk) > 0)
+ 0.5 * np.mean(np.subtract.outer(ns, smk) == 0))
sleep = sm.datasets.get_rdataset("sleep").data
d1 = sleep.loc[sleep["group"] == 1, "extra"].to_numpy()
d2 = sleep.loc[sleep["group"] == 2, "extra"].to_numpy()
stats.wilcoxon(d2, d1) # zero_method 預設與 R 不同,要顯式指定
groups = [g["bwt"].to_numpy() for _, g in bw.groupby("race")]
stats.kruskal(*groups)
# ⚠️ Dunn 事後比較不在 scipy 裡(scikit-posthocs 有);
# 要留在標準函式庫裡就照上面 R 那段的公式自己寫。scipy 有 mannwhitneyu / wilcoxon / kruskal,但沒有內建的 Hodges-Lehmann 估計與信賴區間,也沒有 Dunn 事後比較——下面誠實地把能做與不能做的分開列。
常見誤用
| 誤用 | 為什麼錯 |
|---|---|
| 說「Wilcoxon 在比中位數」 | 它檢定的是 ;中位數相同而檢定顯著是可能的 |
| 只報 p 值,效果量寫「中位數 A vs B」 | 中位數之差不是這個檢定的估計對象;該報的是 Hodges-Lehmann 位移估計與其信賴區間 |
| 把 Hodges-Lehmann 讀成「中位數的差」 | 它是「差的中位數」,偏態資料下兩者不同 |
| 先跑常態性檢定再決定要不要用無母數 | 檢定力隨 n 走向與需求相反,詳見 t 檢定那一頁 |
| 資料偏態就自動選無母數,不考慮取對數 | 兩條路估的是位移與比值,該由臨床解釋決定,不是由 p 值決定 |
| 把 Hodges-Lehmann 的公克數與幾何平均比值放同一欄比較 | 尺度不同,一個是加法一個是乘法,不可直接比較 |
| 三組以上跑三次 Wilcoxon 不調整 | 每次重新排秩丟掉第三組資訊,而且家族錯誤率沒有被控制 |
| 綜合檢定顯著就宣稱「各組都不同」 | Kruskal-Wallis 只說「不全相同」;本頁的例子調整後沒有一組兩兩比較達到顯著 |
| 為了消除 ties 對資料加隨機擾動 | 結論會隨亂數種子改變 |
| 配對資料有零差值卻不說明處理方式 | 保留與丟棄給出不同的點估計與區間,而輸出不會提醒你 |
| p > 0.05 就說「兩組沒有差異」 | 只能說本研究未偵測到差異;要主張相等需要等效性設計與預設的界限 |
| 需要校正共變項時仍用秩檢定 | 秩檢定沒有校正機制,該換成迴歸模型 |
重跑本頁的所有數字
/opt/homebrew/bin/Rscript figures/scripts/B1-04-nonparametric.R讀讀看這張圖
答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。
兩家醫院的住院天數中位數完全相同,中位數差是 0,Wilcoxon rank-sum 檢定卻達到統計顯著。這是哪裡算錯了嗎?
看答案與解析
正確答案: 沒算錯。檢定問的是隨機優勢:隨便抓一組兩院的病人,乙院那位住得比較久的機率是 0.70,而這件事與兩組中位數相同完全相容
Wilcoxon 的虛無假設是隨機優勢,不是中位數相等。乙院的累積分布函數從頭到尾都不高於甲院——不論門檻設在幾天,乙院超過那個門檻的比例都不會比甲院低——而兩條階梯又在同一階跨過一半,所以「乙院系統性地比較久」與「兩組中位數相同」完全相容,0.70 就是把這件事變成一個能報的數字。0.00 這個中位數差是真的,它只是回答了另一個問題。3.87 這個平均數差同樣是真的,而且它看得見中位數看不見的東西:右尾那幾個住到三、四週的病人,正是臨床上最該被看見的人。但把兩個摘要量的分歧當成「算錯」是誤讀,分歧本身才是資訊。反過來說,中位數差很多而 Wilcoxon 未達統計顯著,同樣不是矛盾。
同一份出生體重資料,Wilcoxon 加 Hodges-Lehmann 的點估計是 306.2 公克,取對數後 t 檢定的點估計則是一個倍數。這兩條路能不能互相取代?
看答案與解析
正確答案: 不能。1.1 是幾何平均的比值,量的是倍數;位移估計量的是公克
加法的位移假設兩組相差一個固定的量,乘法的比值假設相差一個固定的倍數。出生體重的臨床門檻是加法的——少三百公克對每一個嬰兒的意義大致相同——所以位移估計講得通。病毒量、C 反應蛋白、住院費用這種跨好幾個數量級的量則相反:高一成在低值與高值處都成立,而高三百單位在低值處可能是三倍、在高值處微不足道。324.5 是兩組中位數的差,它與 306.2 接近不是因為四捨五入,而是因為兩者都在同一個加法尺度上,但定義不同:位移估計是所有跨組配對差值的中位數。10.1 這個百分比是幾何平均比值換算來的,而幾何平均一定小於或等於算術平均,把它乘回算術平均會得到一個沒有人定義過的量;要主張算術平均要另外處理。另外,取對數要求所有觀測值為正,有零值時常見的加一再取對數會讓那個常數影響結果,比值也失去乾淨的解釋。
同一批 92 位產婦(53 位未抽菸、39 位抽菸)的出生體重,記錄到公克時算出來的精確 p 是 0.2500;把同一批資料四捨五入到最接近的 250 公克之後,精確 p 變成 0.3181。為什麼會動?
看答案與解析
正確答案: 四捨五入把 12 筆資料擠進同一個值,相同值只能拿到相同的平均秩,參考分布因此改變
秩檢定的精確 p 值來自「把觀測值重新分派到兩組」的所有排列。出現相同值時那些觀測值只能拿到相同的平均秩,參考分布跟著改變,於是同一批病人、同一個比較,只因為量得比較粗,檢定統計量與 p 值就都動了——四捨五入之後最大的一群有 12 筆共用同一個值。17 個相異值是同一件事的另一種說法,但樣本數並沒有變小,還是那 92 個人,變的是他們能被區分到什麼程度。50 確實是 R 在精確法與常態近似之間切換的門檻,但它看的是每一組的筆數,而 53 已經跨過那條線了——這一批在 R 的預設下走的其實是常態近似,本頁表格裡的精確 p 是腳本顯式指定 exact = TRUE 算出來的,兩種算法的 p 值在同一張表上並列。所以那個選項錯的不是門檻本身,是「四捨五入讓這批資料跨過門檻」這個推論,四捨五入只改變相異值的個數,53 與 39 這兩個組別人數在四捨五入前後完全一樣。順帶一提,不要為了消除相同值去加隨機擾動,那等於把答案交給亂數種子;相同值多到某個程度時,該換的是模型而不是檢定。
安眠藥資料的十位受試者裡有一位差值為零。R 現行做法的 signed-rank 統計量是 54,教科書丟掉零差值的做法是 45,兩者的 p 值相同。這代表兩種做法可以互換嗎?
看答案與解析
正確答案: 不可以。丟掉零差值之後點估計變成 1.40,與現行做法不同,區間也不同,而且沒有任何輸出會提醒你剛剛做了一個選擇
p 值相同不代表結論相同。丟掉零差值之後點估計變成 1.40,與現行做法的點估計不一樣,區間也不一樣,而報表上沒有任何東西提醒你剛剛做了一個選擇——所以有零差值時要把軟體與版本寫進 Methods。1.58 是配對 t 檢定的平均差,它是另一條路上的量:signed-rank 報的點估計叫虛擬中位數,只有在差值分布對稱時才等於差值的中位數,差值本身明顯偏態時,這個檢定就不再是「不需要任何假設」的安全選項。95.60 這個數字也值得看一眼:無母數區間的實際涵蓋水準不是剛好九成五,秩統計量是離散的,能達到的水準只有有限幾個,而兩種零差值處理法達到的水準並不相同。
三個族群的出生體重做 Kruskal-Wallis,p = 0.0141。Dunn 事後比較裡,白人對黑人的未調整 p 是 0.0179、Holm 調整後是 0.0537。這一段該怎麼寫?
看答案與解析
正確答案: 寫調整後的 0.0537,並說明綜合檢定顯著只代表各組不全相同
Kruskal-Wallis 是綜合檢定,顯著只代表各組的平均秩不全相同,不說是誰跟誰不同,所以 0.0141 之後必須做事後比較,而事後比較要調整——「綜合檢定顯著就不必再調整」正是 Fisher’s LSD 的說法,組數超過三組時它保護不了家族錯誤率。調整之後 0.0179 變成 0.0537,落在慣用水準的另一側,而這正是該誠實寫出來的地方:未調整看起來顯著、調整後不顯著,兩個數字都報,讀者才判斷得出來。0.5096 是另外一組比較調整後的 p 值,它不代表整組的錯誤率,Holm 是對每一個比較各自調整,不是取最大值。而未達顯著只能寫成本研究未偵測到差異,不能寫成各組相同。
論文寫「未抽菸組與抽菸組的出生體重,隨機抓一對母嬰、未抽菸那組的嬰兒比較重的機率」,後面接著一個數字。同一段還有 Wilcoxon 的 p 值與 Hodges-Lehmann 位移估計。這個機率回答的是什麼?
看答案與解析
正確答案: 0.617 回答兩組重疊得多嚴重——它就是把組別當金標準、結果變項當預測值時的 ROC 曲線下面積
0.617 是隨機優勢的估計值:把所有跨組配對數一遍,一方較大記一分、兩者相同各記半分,除以配對總數。它等於把組別當金標準、結果變項當預測值時的 ROC 曲線下面積,也就是 c-statistic,把 Wilcoxon 的統計量除以兩組人數的乘積就會得到它。0.007 是同一個檢定的 p 值,它回答「這樣的重疊程度像不像抽樣運氣」,而不是「重疊多嚴重」——樣本數夠大時,一個很接近一半的機率照樣可以得到很小的 p 值。0.699 來自本頁刻意構造出來的教學資料,腳本把它標成假設性資料、不是任何研究的結果,拿它跟真實資料的估計相減,得到的是一個沒有對象的數字。這個量真正的好處是可以直接講給人聽,比 p 值有訊息量得多。
用到這個方法的章節
延伸觀看
醫學統計 EP10 t 檢定與非參數法
醫學統計 EP11 ANOVA素材來源與授權
本頁為原創內容