ANCOVA、變化量與只看追蹤值
同一份前後測資料的三種分析方式,為什麼隨機化試驗慣用 ANCOVA(線索在基線係數上)、效率的差距隨前後測相關係數怎麼變,以及迴歸到平均長什麼樣子、為什麼只在對照組看得乾淨。
這個問題長什麼樣子
臨床試驗最常見的結構之一是前後測:每個人在隨機分配前量一次(基線),治療結束後再量一次 (追蹤)。血壓、體重、HbA1c、疼痛分數、憂鬱量表,全部都是這個形狀。
拿到這樣的資料,分析的人面前有三條路:
- 變化量分析(change score)——算每個人的「追蹤減基線」,再比較各組的平均變化量
- ANCOVA(analysis of covariance,共變數分析)——用追蹤值當結果,把基線值當共變項放進 線性迴歸
- 只看追蹤值(follow-up only)——完全不理基線,直接比較各組的追蹤平均
三條路都在估「同一個治療效果」,但估得準不準差很多。而且它們的差別可以寫成同一個模型:
只看追蹤值等於把 釘死在 0;變化量分析等於把 釘死在 1 (把 移到左邊就變成變化量);ANCOVA 是讓資料自己決定 。 本頁其餘部分都在談這一件事的後果。
這一頁的例子
MASS::anorexia 是 72 位厭食症年輕女性的體重,治療前後各量一次(單位是磅)。
三組:CBT(認知行為治療) 29 人、對照組 26 人、
家族治療 17 人,參考組是 CBT。一行就能取得,不必申請任何資料庫權限。
| 組別 | n | 基線平均 | 追蹤平均 | 平均變化量 |
|---|---|---|---|---|
| CBT(認知行為治療) | 29 | 82.69 | 85.70 | +3.01 |
| 對照組 | 26 | 81.56 | 81.11 | -0.45 |
| 家族治療 | 17 | 83.23 | 90.49 | +7.26 |
全體的前後測相關係數是 0.332。這個數字偏低, 而它會決定本頁後半所有的效率比較,所以先把它記住。
figures/scripts/B2-12-ancova.Rlibrary(MASS)
data(anorexia, package = "MASS")
a <- anorexia
a$change <- a$Postwt - a$Prewt
# 1. 變化量分析
summary(lm(change ~ Treat, data = a))
# 2. ANCOVA:追蹤值當結果,基線當共變項
summary(lm(Postwt ~ Prewt + Treat, data = a))
# 3. 只看追蹤值
summary(lm(Postwt ~ Treat, data = a))
# 三者的差別全在基線的係數上:ANCOVA 估它,另外兩個把它釘死
cor(a$Prewt, a$Postwt)
# 迴歸到平均:只在沒有接受治療的對照組裡看
co <- subset(a, Treat == "Cont")
tapply(co$change, co$Prewt <= median(co$Prewt), mean)驗證環境:R 4.6.0 + MASS 7.3.65。三個模型的 Treat 都以 CBT 為參考組,所以係數可以直接對照。
import statsmodels.api as sm
import statsmodels.formula.api as smf
a = sm.datasets.get_rdataset("anorexia", "MASS").data
a["change"] = a["Postwt"] - a["Prewt"]
print(smf.ols("change ~ C(Treat)", data=a).fit().summary()) # 變化量
print(smf.ols("Postwt ~ Prewt + C(Treat)", data=a).fit().summary()) # ANCOVA
print(smf.ols("Postwt ~ C(Treat)", data=a).fit().summary()) # 只看追蹤值
print(a[["Prewt", "Postwt"]].corr())statsmodels 的 ols 公式介面與 R 的 lm 幾乎一樣;C(Treat) 的參考組預設是字母序第一個,剛好也是 CBT。
三種做法,同一份資料
figures/scripts/B2-12-ancova.R| 對比 | 做法 | 估計(磅) | SE | p |
|---|---|---|---|---|
| 對照組 vs CBT | 變化量 | -3.46 | 2.03 | 0.094 |
| ANCOVA | -4.10 | 1.89 | 0.034 | |
| 只看追蹤值 | -4.59 | 1.97 | 0.023 | |
| 家族治療 vs CBT | 變化量 | 4.26 | 2.30 | 0.068 |
| ANCOVA | 4.56 | 2.13 | 0.036 | |
| 只看追蹤值 | 4.80 | 2.23 | 0.035 |
先講最容易被講歪的一件事。變化量分析在兩個對比上的 p 值分別是 0.094 與 0.068, 在 0.05 的水準下未達統計顯著;ANCOVA 的兩個 p 值則低於 0.05。
這不代表變化量分析「證明了沒有效果」,也不是「換個方法就做出顯著」的成功故事。 三種做法的點估計其實相當接近——對照組的三個估計落在 -4.59 到 -3.46 之間, 彼此的差距還不到一個標準誤。真正在動的是標準誤:
- 對照組的對比,SE 由大到小是變化量 2.03、 只看追蹤值 1.97、ANCOVA 1.89
- 家族治療的對比順序相同:2.30、 2.23、2.13
ANCOVA 在這份資料上確實是三者中最精確的。 但要注意幅度:它比只看追蹤值只窄了 3.8%(對照組的對比), 比變化量分析窄 6.9%。 在這種量級之下,p 值跨不跨過 0.05 是一件很脆弱的事,不值得當成結論來講。 效率的差距為什麼這麼小,下一節與第五節分別回答。
為什麼隨機化試驗慣用 ANCOVA
線索在基線那一項的係數上。ANCOVA 估出來的 = 0.434 (SE 0.161,95% CI 0.11–0.76)。
拿它去對兩個「被釘死的值」各做一次檢定:
| 虛無假設 | 哪一種做法在假設它 | t | p |
|---|---|---|---|
| 基線係數 = 0 | 只看追蹤值 | 2.70 | 0.009 |
| 基線係數 = 1 | 變化量分析 | -3.51 | < 0.001 |
兩個假設都被這份資料拒絕了。 基線與追蹤明顯有關(所以不能當它不存在), 但關聯遠遠沒有到一比一(所以也不能直接相減)。ANCOVA 在這份資料上效率最好, 就是因為它不必事先猜這個係數——它從資料裡估。 (它是不是永遠最好,是下一節的問題,答案不是「是」。)
效率的差距隨相關係數怎麼變
教科書常說「前後測相關越高,ANCOVA 越有利」。這句話沒有辦法用一份資料驗證, 因為一份資料只有一個相關係數。所以這一節改用模擬:固定樣本數與真實效果, 只讓相關係數從 0 掃到 0.9。
參數是 每組 36 人(合計剛好等於 anorexia 的 72 人)、 真實差異 0.5 個標準差、 每個格點重複 2000 次、 = 0.05、seed 固定為 20260823。
figures/scripts/B2-12-ancova.R| 相關係數 | SE:變化量 | SE:ANCOVA | SE:只看追蹤值 | 檢定力:變化量 | 檢定力:ANCOVA | 檢定力:只看追蹤值 |
|---|---|---|---|---|---|---|
| 0.00 | 0.333 | 0.237 | 0.235 | 33.3% | 56.3% | 57.0% |
| 0.20 | 0.297 | 0.233 | 0.236 | 40.0% | 56.0% | 54.5% |
| 0.35 | 0.269 | 0.222 | 0.235 | 45.9% | 61.4% | 57.1% |
| 0.50 | 0.234 | 0.205 | 0.235 | 56.8% | 66.0% | 53.9% |
| 0.70 | 0.182 | 0.169 | 0.235 | 76.2% | 82.1% | 53.4% |
| 0.90 | 0.105 | 0.103 | 0.235 | 99.9% | 99.9% | 56.1% |
三件事,照實講:
- 變化量分析在 19 個格點裡,一個都沒有贏過 ANCOVA (精確地說是 0 個)。 它與只看追蹤值的交叉點落在相關係數 0.50, 相關低於這個值時,做變化量分析比乾脆不看基線還糟。
- ANCOVA 也不是每個格點都最好。 它在 19 個格點裡贏了 16 個; 相關係數等於 0.00、0.05、0.10 時, 只看追蹤值的 SE 反而略小(相關為 0 時是 0.235 對 0.237)。原因很單純:ANCOVA 多估了一個參數, 當那個參數其實沒有用時,那個自由度就是白花的。差距很小,但它是真的。
- anorexia 的相關落在 0.332, 離模擬格點最近的是 0.35。在那裡 ANCOVA 的 SE (0.222)只比只看追蹤值 (0.235)好一點點—— 這正是本頁第三節那個「只窄了幾個百分點」的來源。
迴歸到平均
迴歸到平均(regression to the mean)是指:因為每次測量都帶有隨機成分, 基線量到特別低的人,下一次量通常會高一些;基線特別高的,下一次通常會低一些。 這不需要任何治療,也不需要任何真實的變化,光靠測量的隨機性就會發生。
最乾淨的觀察位置是沒有接受治療的對照組。把對照組依基線體重中位數 (80.65 磅)切成兩半:
| 對照組的一半 | n | 基線平均 | 追蹤平均 | 平均變化量 |
|---|---|---|---|---|
| 基線較輕的一半 | 13 | 76.83 | 80.68 | +3.85 |
| 基線較重的一半 | 13 | 86.28 | 81.53 | -4.75 |
基線較輕的一半平均增加 3.85 磅, 基線較重的一半平均減少 4.75 磅, 兩者相差 8.61 磅 (Welch t = 3.22,p = 0.004)。 而整個對照組的平均變化量只有 -0.45 磅—— 這些人沒有接受任何治療。
figures/scripts/B2-12-ancova.R常見誤用
| 誤用 | 為什麼錯 |
|---|---|
| 事後從三種做法裡挑 p 值最小的報 | 同一批人三次機會,等於未申報的多重比較 |
| 把變化量分析未達顯著寫成「治療沒有效果」 | 未達顯著只代表這個分析沒有偵測到差異 |
| 因為「隨機化後基線已平衡」就不校正基線 | 校正基線是為了降低殘差變異,不是修正不平衡 |
| 看到基線不平衡才臨時決定要校正 | 分析取決於結果,p 值與信賴區間失效 |
| 認為 ANCOVA 在任何情況下都最有效率 | 相關很低時它多花一個自由度,可能略遜於只看追蹤值 |
| 認為變化量分析總比不看基線好 | 相關低於 0.5 時它的標準誤反而更大 |
| 單臂研究拿「前後有進步」當療效證據 | 迴歸到平均與自然病程都會產生同樣的結果 |
| 用極端值收案之後再比較前後 | 收案條件本身就保證了迴歸到平均 |
| 把有治療組的「輕的進步比較多」當成迴歸到平均的證據 | 治療效果與迴歸到平均混在一起,拆不開 |
| 把變化量對基線迴歸的斜率當成迴歸到平均的大小 | 基線的測量誤差也算進去了,不是無偏估計 |
| 三組資料只報整體 F 檢定就結束 | 讀者要的是各組對比的估計與區間 |
| 把 ANCOVA 的基線係數當成「基線的療效」解讀 | 它是共變項的斜率,不是任何組間對比 |
重跑本頁的所有數字
/opt/homebrew/bin/Rscript figures/scripts/B2-12-ancova.R讀讀看這張圖
答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。
Control 相對於 CBT 這個對比,change score、ANCOVA、只用追蹤值三種做法給出三個估計。它們的差別在哪裡?
看答案與解析
正確答案: ANCOVA 給 -4.10——三者的差別在於對基線係數的假設不同,ANCOVA 讓資料自己決定
ANCOVA 給 -4.10,change score 給 -3.46,只用追蹤值給 -4.59。三種做法估的是同一個對比,差別只在對「基線係數」的假設:change score 把它釘在一(假設基線一分完全轉移到追蹤值),只用追蹤值把它釘在零(假設基線完全不影響),而 ANCOVA 讓資料自己決定。所以它們既不是不同的對比,點估計也不相同——差別來自三個不同的假設,而其中兩個是被硬性指定的。
ANCOVA 模型裡基線體重那個係數的信賴區間,同時排除了零與一。這件事說明了什麼?
看答案與解析
正確答案: 係數是 0.434——區間排除零否定了只用追蹤值,排除一否定了 change score
係數估計是 0.434,區間是 0.113 到 0.756。排除零,代表基線確實影響追蹤值,只用追蹤值那個做法(等於把係數當成零)站不住;排除一,代表基線並不是一分不差地轉移到追蹤值,change score 那個做法(等於把係數當成一)也站不住。0.113 與 0.756 是區間的兩端,任何一端單獨拿出來都只能否定一邊。這也說明為什麼「要不要校正基線」不是一個風格問題——資料對這個係數是有話說的。
把完全沒有接受治療的 control 組按基線體重分成兩半,兩半的平均變化一個往上、一個往下,而且差距達到統計顯著。這是什麼?
看答案與解析
正確答案: 基線較低那一半平均變化 3.85——按基線分組再看變化必然製造出這種對稱的假效果
這一組完全沒有接受任何治療,基線較低那一半平均變化是 +3.85,較高那一半是 -4.75,兩者差 8.61 且達到統計顯著。既然沒有治療,這個差就不可能是治療反應:測量帶有誤差,被分到「較低」那一半的人裡有一部分只是那天量得偏低,再量一次自然往上——這就是回歸到平均。按基線值把人分組再看變化,一定會製造出這種對稱的假效果,而它在報告裡讀起來很像「基線越差的人進步越多」。
用到這個方法的章節
素材來源與授權
本頁為原創內容