線性迴歸
「其他變項固定時」這句話實際上固定了什麼、R² 高為什麼不等於模型有用、連續變項的線性是假設不是事實,以及換一個參考組會改變哪些數字、不會改變哪些。
這個模型在解決什麼問題
臨床研究裡有一大類問題長這樣:結果是一個連續的數字(出生體重、收縮壓、eGFR、住院天數), 而你想知道某個因素跟它的關係有多大——而且是在扣掉其他因素之後還剩下多大。
t 檢定與變異數分析可以比較兩組或多組的平均值,但只能一次比一個分組變項, 而且分組變項必須是類別的。線性迴歸把這件事推廣成:同時放進多個變項,連續的與類別的都行, 對每一個給出一個係數,而那個係數的意思是「其他變項固定時,這個變項每增加一單位,結果平均變動多少」。
那句話是本頁的主軸。它聽起來很直觀,實際上藏了三個陷阱,第四節專門處理。
這一頁的例子
MASS::birthwt 是 1986 年美國麻州 Springfield 一家醫院的低出生體重研究,
189 位產婦,記錄了年齡、末次月經時的體重、族裔、懷孕期間是否抽菸、高血壓病史、
子宮易激性等等,結果變項是新生兒體重(公克)。全站的迴歸章節都用它,
一來它是世界通用的教材資料,二來它是本站禁用 Pima 糖尿病資料後指定的替代品。
新生兒體重平均 2,945 g(標準差 729 g), 其中 74 位產婦懷孕期間抽菸。
library(MASS)
data(birthwt, package = "MASS")
bw <- birthwt
bw$race_f <- factor(bw$race, levels = 1:3, labels = c("White", "Black", "Other"))
bw$smoke_f <- factor(bw$smoke, levels = 0:1, labels = c("No", "Yes"))
# 一個變項
fit_s <- lm(bwt ~ lwt, data = bw)
summary(fit_s)
# 多變項
fit <- lm(bwt ~ age + lwt + smoke_f + race_f + ht + ui, data = bw)
summary(fit) # 係數、標準誤、t、p、R²、調整後 R²、整體 F
confint(fit) # 95% 信賴區間,論文要報的是這個不是只有 p
# 換一個參考組:係數會變,模型不會
bw$race_o <- relevel(bw$race_f, ref = "Other")
fit_o <- lm(bwt ~ age + lwt + smoke_f + race_o + ht + ui, data = bw)
all.equal(fitted(fit), fitted(fit_o)) # TRUE
# 線性是假設,要檢查
anova(fit, update(fit, . ~ . + I(age^2)))驗證環境:R 4.6.0 + MASS 7.3.65。birthwt 隨 MASS 一起裝,不需另外下載。
import statsmodels.api as sm
import statsmodels.formula.api as smf
bw = sm.datasets.get_rdataset("birthwt", "MASS").data
bw["race_f"] = bw["race"].map({1: "White", 2: "Black", 3: "Other"})
bw["smoke_f"] = bw["smoke"].map({0: "No", 1: "Yes"})
fit = smf.ols("bwt ~ age + lwt + C(smoke_f) + C(race_f) + ht + ui", data=bw).fit()
print(fit.summary())
print(fit.conf_int())
# 參考組用 Treatment(reference=...) 指定
fit_o = smf.ols(
'bwt ~ age + lwt + C(smoke_f) + C(race_f, Treatment(reference="Other")) + ht + ui',
data=bw).fit()
# 線性檢查
fit_q = smf.ols("bwt ~ age + I(age**2) + lwt + C(smoke_f) + C(race_f) + ht + ui",
data=bw).fit()
print(fit.compare_f_test(fit_q))statsmodels 的 OLS 報表欄位與 R 幾乎一一對應;formula API 讓公式寫法也一樣。
先看一個變項
最小平方法(ordinary least squares, OLS)在做的事只有一件:找一條直線,讓所有點到線的垂直距離平方和最小。
用產婦體重(lwt,磅)預測新生兒體重:斜率是 4.43 g/lb (95% CI 1.05–7.81,p 0.011)。 換成每 10 磅比較好想像:44.3 g。 連續變項的係數沒有單位就無法解讀,這一點和 Cox 模型的 HR 完全一樣。
figures/scripts/B2-01-linear-regression.R這條線的 R² 只有 0.034:產婦體重解釋掉的變異不到二十分之一。 這不代表這個關聯是假的——係數的信賴區間沒有跨過 0,關聯本身有統計證據; 它代表的是新生兒體重的變異絕大部分來自別的地方。第五節會回到這件事。
係數的解讀,以及「其他變項固定時」
放進六個變項之後的完整報表(n = 189):
| 變項 | 係數 (g) | 95% CI | p |
|---|---|---|---|
| Age, per year | -4.7 | -23.1–13.8 | 0.617 |
| Mother's weight, per lb | 4.4 | 1.0–7.8 | 0.011 |
| Smoking during pregnancy | -360.7 | -566.0–-155.4 | < 0.001 |
| Race: Black vs White | -490.6 | -785.0–-196.3 | 0.001 |
| Race: Other vs White | -356.6 | -581.3–-132.0 | 0.002 |
| History of hypertension | -590.0 | -985.2–-194.8 | 0.004 |
| Uterine irritability | -528.5 | -795.1–-262.0 | < 0.001 |
抽菸那一列讀作:「在同年齡、同體重、同族裔、同高血壓病史、同子宮易激性的條件下, 懷孕期間抽菸的產婦,新生兒體重平均少 361 g。」
不校正任何東西直接比較兩組平均,抽菸組平均少 284 g (95% CI 少 72.8–494.8 g)。 校正之後差距變大了——這是常見的方向,因為族裔與體重在這份資料裡與抽菸相關, 粗比較把它們的效果混在裡面互相抵消了一部分。
還有一個常被忽略的:不要把中介因子(mediator)放進去。 如果抽菸是透過壓低胎盤血流影響體重, 把胎盤血流校正進去,等於把想估的效果扣掉一部分。
R² 與調整後 R²
R² 是「模型解釋掉的變異占總變異的比例」:
多變項模型的 R² 是 0.241,調整後 R² 是 0.212。兩者的差別是:
- R² 只要加變項就不會下降,加什麼都一樣,加擲骰子產生的亂數也一樣。
- 調整後 R² 對參數個數罰款:。加進去的變項如果沒帶來足夠的解釋力,它會下降。
把 200 次重複實驗畫出來就很清楚——每一步往模型裡加一個純粹的標準常態亂數:
figures/scripts/B2-01-linear-regression.R整體 F 檢定(8.23,df = 7 與 181,p < 0.001) 問的是「所有係數同時為 0 嗎」,相當於 Cox 模型的整體 likelihood ratio test。
線性是假設,不是預設成立的事實
「每增加一單位,結果平均變動固定的量」——這句話本身就是一個假設,而且是最容易不成立的那個。 它可以被檢定:把二次項加進模型,看有沒有改善。
| 變項 | 線性項的 p | 加入平方項後 F | 平方項的 p | 結論 |
|---|---|---|---|---|
| 年齡 | 0.617 | 5.68 | 0.018 | 直線版本不足以描述 |
| 產婦體重 | 0.011 | 0.11 | 0.741 | 未偵測到偏離線性 |
年齡這一列是本頁最值得記住的一件事。線性的年齡項離顯著很遠(p 0.617), 但加入年齡平方項之後,模型有統計上可偵測的改善(p 0.018)。
如果只看第一欄就下結論「年齡與新生兒體重無關」,那是把「直線這個版本的關係沒有得到支持」 讀成了「沒有關係」。這兩件事不一樣。
換參考組:係數會變,模型不會
類別變項進入模型的方式是虛擬變數(dummy variable): 個類別產生 個欄位, 被留下來當基準的那一類叫參考組(reference group)。R 預設拿因子的第一個 level。
同一個模型,只把族裔的參考組從 White 換成 Other:
| 參考組 | 對比 | 係數 (g) | 95% CI | p |
|---|---|---|---|---|
| White | Black vs White | -490.6 | -785.0–-196.3 | 0.001 |
| White | Other vs White | -356.6 | -581.3–-132.0 | 0.002 |
| Other | White vs Other | 356.6 | 132.0–581.3 | 0.002 |
| Other | Black vs Other | -134.0 | -446.9–178.8 | 0.399 |
四列裡真正換掉的不是「有多少證據」,而是你報得出哪些對比:White 對 Other 在兩種寫法裡 只是正負號相反,信賴區間互為鏡像,p 值一模一樣(0.002 對 0.002); 差別在於 Black 對 Other 這一列(p 0.399)只有第二種寫法直接報得出來, 第一種寫法的表上根本沒有它。而且:
- R²:0.241 對 0.241
- 殘差標準差:647.27 對 647.27
- 每一位產婦的預測值:完全相同
是同一個模型。 換參考組只是換了一組座標來描述同一個平面,就像把溫度從攝氏改成華氏—— 數字全變,冷熱沒變。
而且模型裡「沒有出現」的對比仍然存在於模型中:Black 對 White 在第一種寫法裡直接估出來, 是 -490.6 g;在第二種寫法裡要靠相減拿到, 結果是 -490.6 g。一模一樣。
常見誤用
| 誤用 | 為什麼錯 |
|---|---|
| 用線性迴歸跑二元結果 | 預測值會跑出 0–1 之外;改用邏輯迴歸 |
| 用線性迴歸跑計數或發生率 | 變異數隨平均值增大、預測值可能為負;改用Poisson 或負二項 |
| 用線性迴歸跑有設限的存活時間 | 設限資料不是缺失值也不是事件時間,見 Censoring |
| 報連續變項的係數卻不寫單位 | 每一歲、每十歲、每個標準差的係數完全不同 |
| 把「其他變項固定時」當成「排除了所有干擾」 | 只固定了模型裡有的變項 |
| 把係數讀成「介入之後會發生的事」 | 那是因果宣稱,要有設計上的理由 |
| 把中介因子當共變項校正掉 | 會把想估的效果扣掉一部分 |
| 用 R² 判斷模型「對不對」 | R² 衡量的是解釋掉多少變異,不是模型設定是否正確 |
| 比較不同結果變項的模型 R² | 分母不同,不可比 |
| 加變項後 R² 上升就認為模型變好 | R² 加什麼都會上升;至少要看調整後 R²,更好的是外部驗證 |
| 線性項不顯著就宣稱該變項無關 | 沒有得到支持的是直線這個版本,不是關係本身 |
| 用高次多項式處理非線性 | 兩端稀疏處會亂翹;改用限制性立方樣條 |
| 試了幾個參考組挑最好看的報 | 未申報的多重比較 |
| 未達顯著寫成「兩者沒有差異」 | 應寫「未偵測到差異」,並附上信賴區間說明不確定的範圍 |
重跑本頁的所有數字
/opt/homebrew/bin/Rscript figures/scripts/B2-01-linear-regression.R讀讀看這張圖
答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。
多變項模型的係數表裡,「懷孕期間抽菸」那一列的係數該怎麼讀?
看答案與解析
正確答案: -360.7 公克——抽菸者相對於不抽菸者,出生體重平均低這麼多
抽菸在這個模型裡是二元變項,所以它的係數 -360.7 是「相對於參考組」的差,不是「每多一單位」的斜率。而 -490.6 其實是族群那一列,4.4 是母親體重每增加一磅的斜率——同一張表裡有些列是每單位、有些是相對於參考組,把後者讀成前者會得到「每多抽一單位就少幾百公克」這種沒有意義的句子。讀任何一個係數之前,先確認那一列的變項是連續的還是類別的。
在原本的多變項模型上再加進一批純粹隨機產生的變項。哪一個說法對?
看答案與解析
正確答案: R 平方升到 0.325——它只會隨變項變多而上升,所以不能用來比較變項數不同的模型
R 平方從 0.241 升到 0.325,而加進去的變項是純粹的隨機數。這不是巧合而是它的數學性質:多一個變項,殘差平方和只會變小或不變,所以 R 平方只會上升。0.212 是加完之後的調整後 R 平方,它反而略降——調整後 R 平方對多出來的參數收費,這正是它存在的理由,也是為什麼比較不同大小的模型時該看它而不是 R 平方。
多變項模型底下印著一個整體 F 檢定。它回答的是什麼問題?
看答案與解析
正確答案: 分子自由度 7——問這些變項合起來有沒有解釋力
分子自由度等於模型裡的變項個數,這裡是 7,而 F 檢定問的正是「這 7 項合起來有沒有解釋力」。181 是分母自由度,189 是樣本數;三個數字上下相鄰,意思毫不相干。這個檢定不回答任何單一變項是否顯著——一個 F 檢定顯著而每一項的 p 值都不顯著的模型完全可能存在,那通常是共線性的樣子。
用到這個方法的章節
延伸觀看
The Main Ideas of Fitting a Line to Data
醫學統計 EP13 線性迴歸
生物統計學一 93.【迴歸分析 (1)】Simple Linear Regression Model
Lec04 統計學(二) Ch11.1-11.5 簡單廻歸分析與相關分析素材來源與授權
本頁為原創內容