基礎已經雙重審閱,尚未人工抽查

線性迴歸

「其他變項固定時」這句話實際上固定了什麼、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 一起裝,不需另外下載。

先看一個變項

最小平方法(ordinary least squares, OLS)在做的事只有一件:找一條直線,讓所有點到線的垂直距離平方和最小。

y^=β^0+β^1x,(β^0,β^1)=argmini=1n(yiβ0β1xi)2\hat{y} = \hat{\beta}_0 + \hat{\beta}_1 x, \qquad (\hat{\beta}_0, \hat{\beta}_1) = \arg\min \sum_{i=1}^{n} (y_i - \beta_0 - \beta_1 x_i)^2

用產婦體重(lwt,磅)預測新生兒體重:斜率是 4.43 g/lb (95% CI 1.05–7.81,p 0.011)。 換成每 10 磅比較好想像:44.3 g。 連續變項的係數沒有單位就無法解讀,這一點和 Cox 模型的 HR 完全一樣。

左圖是新生兒體重對產婦體重的散布圖與最小平方迴歸線,右圖是新生兒體重對產婦年齡的散布圖,畫了直線與加入二次項後的曲線兩條擬合線,曲線在兩端往上翹。
左:一個變項的最小平方擬合,陰影是迴歸線的 95% 信賴帶。右:同一份資料換成年齡,直線與二次曲線畫在一起——第六節會說明為什麼曲線那條在統計上被支持,以及為什麼那個支持很脆弱。產圖腳本 figures/scripts/B2-01-linear-regression.R

這條線的 R² 只有 0.034:產婦體重解釋掉的變異不到二十分之一。 這不代表這個關聯是假的——係數的信賴區間沒有跨過 0,關聯本身有統計證據; 它代表的是新生兒體重的變異絕大部分來自別的地方。第五節會回到這件事。

係數的解讀,以及「其他變項固定時」

放進六個變項之後的完整報表(n = 189):

變項係數 (g)95% CIp
Age, per year-4.7-23.1–13.80.617
Mother's weight, per lb4.41.0–7.80.011
Smoking during pregnancy-360.7-566.0–-155.4< 0.001
Race: Black vs White-490.6-785.0–-196.30.001
Race: Other vs White-356.6-581.3–-132.00.002
History of hypertension-590.0-985.2–-194.80.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² 是「模型解釋掉的變異占總變異的比例」:

R2=1(yiy^i)2(yiyˉ)2R^2 = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2}

多變項模型的 R² 是 0.241,調整後 R² 是 0.212。兩者的差別是:

  • R² 只要加變項就不會下降,加什麼都一樣,加擲骰子產生的亂數也一樣。
  • 調整後 R² 對參數個數罰款:1(1R2)n1np11 - (1-R^2)\frac{n-1}{n-p-1}。加進去的變項如果沒帶來足夠的解釋力,它會下降。

把 200 次重複實驗畫出來就很清楚——每一步往模型裡加一個純粹的標準常態亂數:

折線圖,橫軸是加入的純亂數變項個數 0 到 20,紅線是 R 平方持續上升,藍線是調整後 R 平方大致持平並略微下降。
每一個點是 200 次亂數抽取的平均。加進去的變項與新生兒體重完全無關,R² 仍從 0.241 一路爬到 0.325;調整後 R² 從 0.212 到 0.212,沒有被騙。產圖腳本 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.6175.680.018直線版本不足以描述
產婦體重0.0110.110.741未偵測到偏離線性

年齡這一列是本頁最值得記住的一件事。線性的年齡項離顯著很遠(p 0.617), 但加入年齡平方項之後,模型有統計上可偵測的改善(p 0.018)。

如果只看第一欄就下結論「年齡與新生兒體重無關」,那是把「直線這個版本的關係沒有得到支持」 讀成了「沒有關係」。這兩件事不一樣。

換參考組:係數會變,模型不會

類別變項進入模型的方式是虛擬變數(dummy variable):kk 個類別產生 k1k-1 個欄位, 被留下來當基準的那一類叫參考組(reference group)。R 預設拿因子的第一個 level。

同一個模型,只把族裔的參考組從 White 換成 Other:

參考組對比係數 (g)95% CIp
WhiteBlack vs White-490.6-785.0–-196.30.001
WhiteOther vs White-356.6-581.3–-132.00.002
OtherWhite vs Other356.6132.0–581.30.002
OtherBlack vs Other-134.0-446.9–178.80.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
ENStatQuest with Josh Starmer· 9 min最小平方法在做什麼,九分鐘看完再讀本頁第三節,「殘差平方和最小」就不再是口號。
醫學統計 EP13 線性迴歸
繁中EDMAN MURMURS· 13 min繁中、臨床醫師視角,係數與 R² 的中文說法在這裡有對照。
生物統計學一 93.【迴歸分析 (1)】Simple Linear Regression Model
繁中臺大開放式課程 NTU OCW· 22 min繁中,把簡單線性迴歸的假設一條一條列出來,正好對應本頁第六節在檢查的東西。
Lec04 統計學(二) Ch11.1-11.5 簡單廻歸分析與相關分析
繁中NYCU OCW· 143 min兩小時的完整推導,想把公式補齊再回來的話看這支;只想讀懂論文的話不必。

素材來源與授權

本頁為原創內容

回報內容問題

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

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

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

一併送出的資訊

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