線性迴歸:最老也最有用的模型

ISLP 第 3 章 — 對應講義 03
β̂ = (XᵀX)⁻¹Xᵀy|RSS|SE 與 t 檢定|F 檢定|R² 與 RSE|交互作用|VIF
向下捲動開始互動
📌 本頁使用方式(ISLP Ch.3|講義 03)

照節次讀:每節先讀說明,動手玩互動元件——先預測結果,再按按鈕驗證。 ② 對照講義:每個 §徽章都標了 ISLP 節號與講義頁碼,細節與完整推導請回講義與課本。 ③ 每節做 quiz:答錯就回到該節重讀,不要往下跳;錯的選項也寫了「錯在哪」。 ④ 最後翻關鍵詞彙卡自測術語,並用 REF 總覽當速查表。

CONTENTS · 內容目錄
PROLOGUE · 開場

Advertising 資料要回答的四件事 ISLP §3 開頭講義 03 · p.2–3

桌上只有一張表:200 個市場,每個市場在電視、廣播、報紙上各花了多少錢 (單位:千美元),以及賣掉多少單位的產品(單位:千個)。四欄、200 列,沒有別的。 ISLP 第 3 章開場就從這張表問出七個問題——而回答它們的工具, 全部都是同一個線性模型

這一頁的順序就是這些問題的順序。先把「一個 x 對一個 y」講到底 (怎麼估、估得準不準、配得好不好),再推到「多個 x 一起放進來」, 最後看這個模型什麼時候會壞掉、什麼時候該換工具。線性迴歸是 1805 年的東西, 但它幾乎是所有現代方法的骨架:第 6 章在它上面加懲罰項、第 7 章換掉基底函數、 第 4 章把它套進連結函數——這一章沒學牢,後面每一章都會卡

開場先記住這四個問題 ① 廣告預算跟銷售量有關係嗎? 這是「整個模型有沒有用」的問題,靠 F 檢定回答(P04)。
② 關係有多強?靠 RSE 與 R² 回答(P03)。
③ 哪些媒體有關?靠個別係數的 t 檢定與 p 值回答(P02、P04)。
④ 每個媒體的效果多大?靠係數本身與它的信賴區間回答(P02、P04)。
剩下三個問題——預測有多準、關係真的是線性嗎、媒體之間有沒有綜效—— 分別落在 P02(預測區間)、P06(殘差圖)、P05(交互作用)。

先看答案。下面這一欄「Advertising 上的答案」全部是課本 §3.4 用實際資料算出來的, 本頁每個數字都能對回去:

問題用什麼回答在哪一節Advertising 上的答案
① 有關係嗎F 檢定P04F = 570.3,p 值接近 0 →
② 有多強RSE、R²P03RSE = 1.69(sales 平均 14.02,約 12% 誤差)、R² = 0.897
③ 哪些媒體個別 t 檢定P02、P04TV t = 32.81、radio t = 21.89、newspaper t = −0.18 → 只有前兩個
④ 效果多大係數與信賴區間P02、P04TV 每千美元約 +46 單位(CI 0.043–0.049)、radio 約 +189(0.172–0.206)、newspaper 的 CI 是 (−0.013, 0.011),含 0
⑤ 預測多準信賴區間 vs 預測區間P02預測區間一定比信賴區間寬
⑥ 真的線性嗎殘差圖P06殘差有結構 → 不完全是
⑦ 有綜效嗎交互作用項P05加入 TV×radio 後 R² 從 89.7% 跳到 96.8%
報紙廣告的故事,是這一章最值得記住的一段 單獨看 newspaper, 它跟 sales 的關聯是顯著的(t = 3.30、p = 0.00115)。 可是把 TV 與 radio 一起放進模型,它的係數變成 −0.001、t = −0.18, 完全不顯著。資料沒有變,模型變了,結論就翻了。 為什麼?答案在 P04 的 Q&A——這也是老師 FAQ 的第 4 題。
QUIZ · 四個問題各配哪個工具

「三種媒體裡,哪些跟銷售量有關?」這個問題該看哪個統計量?

(A) 多元迴歸裡每一個係數各自的 t 統計量與 p 值
(B) 整個模型的 F 統計量
(C) R²,值愈高就代表愈多媒體有關
PART 01 · 簡單線性迴歸

最小平方法:讓 RSS 最小的那條線 ISLP §3.1.1講義 03 · p.4–6

先只用一個變數。假設 sales 跟 TV 預算大致是一條直線:

$$Y \approx \beta_0 + \beta_1 X$$

β₀ 是截距、β₁ 是斜率,兩個都不知道。手上有 n 對觀測值 $(x_1, y_1), \dots, (x_n, y_n)$,要挑一條「最靠近」這些點的線。 「靠近」有很多種定義,但幾乎所有人都用同一個:讓殘差平方和最小。 第 i 筆的殘差是 $e_i = y_i - \hat y_i$,於是

$$\mathrm{RSS} = e_1^2 + e_2^2 + \cdots + e_n^2 = \sum_{i=1}^{n} \left(y_i - \hat\beta_0 - \hat\beta_1 x_i\right)^2$$

對 β₀、β₁ 各偏微分等於零,解出來就是封閉解——不需要迭代、不需要調學習率、 不需要任何機率假設:

$$\hat\beta_1 = \frac{\sum_{i=1}^{n}(x_i-\bar x)(y_i-\bar y)} {\sum_{i=1}^{n}(x_i-\bar x)^2}, \qquad \hat\beta_0 = \bar y - \hat\beta_1 \bar x$$

第二式順便告訴你一件事:最小平方線一定通過 $(\bar x, \bar y)$。 下面這個元件是本頁最重要的一個——拖動任何一個點,係數、RSS、R² 全部即時重算。 先預測「把最右邊那個點往上拖,斜率會怎麼變」,再動手驗證。

可拖動的觀測值最小平方線殘差(要平方後相加)P01 下半滑桿選的試探線
拖動任何一個藍點,係數與 RSS 會即時重算。灰紫色虛線是殘差。
即時最小平方解 LIVE
β̂₀(截距)
β̂₁(斜率)
RSS
RSE
SE(β̂₁)
t = β̂₁ / SE(β̂₁)
怎麼玩
用滑鼠或手指直接把點拖走。三件事值得試:
① 把某一點往上下拖 → 看 RSS 怎麼跳;
② 把最右邊那點上下拖 → 斜率動得比拖中間的點厲害得多,這就是 P06「高槓桿點」的預告;
③ 把所有點排成一條線 → RSS 趨近 0、R² 趨近 1。
對照課本 ISLP 圖 3.1
ISLP 圖 3.1 是同一件事的 Advertising 版本:sales 對 TV 的最小平方線是 β̂₀ = 7.03、β̂₁ = 0.0475。斜率的意思是「TV 預算多花 1000 美元,平均多賣約 47.5 單位」。

接著把同一件事換個角度看。上面那張圖的橫軸是 x、縱軸是 y; 下面這張圖的兩個軸都是參數:橫軸 β₀、縱軸 β₁, 每一個點代表「一組候選的係數」,等高線代表「這組係數的 RSS 有多大」。 這就是老師 FAQ 裡問的誤差曲面(error surface):

$$\mathrm{RSS}(\beta_0, \beta_1) = \mathrm{RSS}_{\min} + n(\beta_0-\hat\beta_0)^2 + 2\left(\textstyle\sum_i x_i\right)(\beta_0-\hat\beta_0)(\beta_1-\hat\beta_1) + \left(\textstyle\sum_i x_i^2\right)(\beta_1-\hat\beta_1)^2$$

這條式子是精確的(不是近似),推導只用到最小平方解的兩個性質 $\sum e_i = 0$ 與 $\sum e_i x_i = 0$。它是 β 的二次式, 所以誤差曲面是一個碗、等高線是同心橢圓、最小點唯一。 下面的等高線就是照這條式子畫的,而且會跟著上面那張圖的點一起變

橘點在碗底時 RSS 最小。推滑桿讓它離開,看 RSS 上升多少倍。
β₀ 偏移0.00
β₁ 偏移0.00
目前的參數點 LIVE
β₀
β₁
RSS
RSS / RSS 最小值
最小點 (β̂₀, β̂₁)
怎麼看這張圖
紅點是最小平方解(碗底),橢圓上的標籤是 RSS 相對於最小值的倍數。推滑桿讓橘點離開碗底,看它跨過幾條等高線——同時上面那張圖會出現一條綠色虛線,那就是這組係數畫出來的線。橢圓是斜的:β₀ 猜大一點時 β₁ 要猜小一點才補得回來,這就是 β̂₀ 與 β̂₁ 負相關的意思。
課本的版本 ISLP 圖 3.2
ISLP 圖 3.2 用 Advertising 的 sales~TV 畫同一張圖:最小點在 β̂₀ = 7.0326、β̂₁ = 0.0475,RSS 最小值 = 2102.53。課本畫的等高線標了 2.11、2.15、2.2、2.3、2.5、3(單位是千),對應的就是這裡的倍數。
觀念釐清
Q:誤差曲面(error surface)到底是什麼?為什麼線性迴歸不用梯度下降?

把損失函數看成參數的函數,畫出來就是誤差曲面。座標軸不是資料的 x 與 y,而是 β₀ 與 β₁;曲面的高度是「用這組參數時的 RSS」。等高線上的每一點 RSS 相同,最佳化就是從某個起點往下走到最低點。

線性迴歸的 RSS 是 β 的凸二次函數——上面那條精確式子就是證據——所以它只有一個最低點,而且對 β 微分等於零後是一組線性方程(正規方程 $X^\top X\beta = X^\top y$)。既然線性方程有封閉解 $\hat\beta = (X^\top X)^{-1}X^\top y$,就沒有必要用梯度下降一步一步爬。

那什麼時候才需要迭代?① 損失函數不是二次式(邏輯斯迴歸、SVM、神經網路);② n 或 p 太大,$X^\top X$ 這個 $p \times p$ 矩陣算不動或存不下;③ 加了不可微的懲罰項(lasso,第 6 章)。這時候才輪到梯度下降、牛頓法、座標下降上場。

Q:迴歸裡的 X 到底是隨機變數還是常數?

看情境,而且兩種寫法的結論幾乎一樣。

實驗設計裡 x 是我們自己設定的(施肥 0、5、10 公斤),把它當常數很自然,模型寫成 $Y \sim N(\beta_0+\beta_1 X,\ \sigma^2)$。觀察性研究裡 x 是跟著樣本一起抽到的(某個市場剛好花了 230.1 千美元),它本來就是隨機的,這時模型要寫成條件分佈 $Y \mid X \sim N(\beta_0+\beta_1 X,\ \sigma^2)$。

為什麼結論一樣?因為我們關心的一直是條件期望 $E[Y \mid X]$——在均方誤差下它就是最好的預測。所有的推論(SE、t、F)都是「固定住觀測到的那組 x」之後做的,也就是條件在 X 上。所以課本裡 SE 的公式長得跟「x 是常數」一樣,並不代表課本認為 x 不隨機,而是代表那些式子都是條件式的。

差別會在哪裡冒出來?當你想推廣到「新的 x 分佈」時。訓練資料的 x 集中在 0–300,硬要拿去預測 x = 1000 的市場,模型沒有任何資訊支撐——這叫外推(extrapolation),跟 x 是不是隨機無關,但正是因為 x 有它自己的分佈,這件事才需要被提醒。

講義完整實作:三種寫法配同一條線

講義 03 · 手動建模型矩陣 → sm.OLS → summarize
X = pd.DataFrame({'intercept': np.ones(Boston.shape[0]), 'lstat': Boston['lstat']}) X[:4] y = Boston['medv'] model = sm.OLS(y, X) # Intercept is not included https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.html results = model.fit() summarize(results)
預期輸出
              coef  std err       t  P>|t|
intercept  34.5538    0.563  61.415    0.0
lstat      -0.9500    0.039 -24.528    0.0

lab 用 Bostonmedv(房價中位數)對 lstat(低社經地位家庭百分比)示範。注意兩件事:sm.OLS() 不會自己加截距,所以要手動放一欄全是 1 的 intercept;② sm.OLS() 只是指定模型,真正配適的是 .fit()。斜率 −0.95 的意思是「lstat 每高 1 個百分點,medv 平均低 0.95 千美元」。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 22、24、26
講義 03 · 用 ModelSpec 建模型矩陣(後面每一章都會用)
design = MS(['lstat']) design = design.fit(Boston) X = design.transform(Boston) X[:4] design = MS(['lstat']) X = design.fit_transform(Boston) X[:4]
預期輸出
   intercept  lstat
0        1.0   4.98
1        1.0   9.14
2        1.0   4.03
3        1.0   2.94

MS() 就是 ModelSpec(),它把「要放哪些項」跟「怎麼算出矩陣」分開:fit() 記住要做什麼、transform() 真的做出矩陣,兩步可以合成 fit_transform()。手動建 X 只有單變數時輕鬆;等到要放交互作用、多項式、類別變數的虛擬欄,MS() 的價值就出來了(P04、P05 會看到)。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 30、32
QUIZ · 最小平方法

把資料裡某一個點沿著垂直方向往上移動,最小平方線一定會怎麼變?

(A) 整條線會往那個點的方向轉/移,而且那個點離 x̄ 愈遠、影響愈大
(B) 只有截距會變,斜率不變
(C) 線不會變,因為最小平方法對單一個點不敏感
PART 02 · 係數的不確定性

SE、信賴區間與 t 檢定:這個斜率可信嗎 ISLP §3.1.2講義 03 · p.7–11

β̂₁ = 0.0475 這個數字,可信嗎?先弄清楚在問什麼。真實世界裡有一條看不到的 母體迴歸線(population regression line)

$$Y = \beta_0 + \beta_1 X + \varepsilon$$

我們只有一份樣本,用它算出來的是最小平方線。 換一份樣本就會得到另一條最小平方線。好消息是最小平方估計無偏: 這些線平均起來會落在母體迴歸線上,沒有系統性偏移。壞消息是單獨一條線可能偏得不少, 而我們手上就只有一條。

偏多少?這就是標準誤(standard error)要量的東西—— 估計量在重複抽樣下的標準差:

$$\mathrm{SE}(\hat\beta_1)^2 = \frac{\sigma^2}{\sum_{i=1}^{n}(x_i-\bar x)^2}, \qquad \mathrm{SE}(\hat\beta_0)^2 = \sigma^2\left[\frac{1}{n} + \frac{\bar x^2}{\sum_{i=1}^{n}(x_i-\bar x)^2}\right]$$

第一條式子把「什麼會讓斜率估得準」講完了: 噪音 σ² 小、樣本多、x 散得開。σ² 通常不知道, 就用殘差算出來的 RSE 代替(下一節會定義)。下面這個元件把「重複抽樣」真的做一百次:

圖表需要連網載入 Chart.js。此圖的重點:100 次重抽算出的 β̂₁ 分佈是一個以真值 3 為中心的鐘形,它的標準差正好就是公式算出來的 SE。
按「抽一次」看一條新樣本配出的線;抽滿 100 次再跟公式對照。
虛擬碼 CODE
真實模型:y = 2 + 3x + ε for b in range(100): 同一組 x,重抽新的 ε b1[b] = ols(x, y).slope SE ≈ std(b1)
100 條線的落點 LIVE
已經抽了0 / 100
β̂₁ 的平均
β̂₁ 的標準差(實測)
公式給的 SE(β̂₁)
β̂₁ 的最小 / 最大
真值 β₁3.000
為什麼要看這張圖 ISLP 圖 3.3 右
SE 不是「這條線的誤差」,而是「這種線的散佈程度」。你手上只有一條線,永遠不知道它偏了多少;但公式可以告訴你「如果重來一百次,它們會散多開」。實測標準差跟公式值對得上,就證明那條公式不是憑空來的。

有了 SE,兩個標準工具就出來了。95% 信賴區間

$$\hat\beta_1 \pm t_{0.975,\,n-2} \cdot \mathrm{SE}(\hat\beta_1) \;\approx\; \hat\beta_1 \pm 2\,\mathrm{SE}(\hat\beta_1)$$

以及假設檢定。虛無假設 $H_0: \beta_1 = 0$(X 與 Y 沒有關係)對上 $H_a: \beta_1 \neq 0$,檢定統計量是

$$t = \frac{\hat\beta_1 - 0}{\mathrm{SE}(\hat\beta_1)}$$

它衡量「β̂₁ 離 0 有幾個標準誤」。$H_0$ 成立時 t 服從自由度 n − 2 的 t 分佈, n 大於約 30 之後跟標準常態幾乎一樣,所以 |t| 超過大約 2 就對應 5% 的顯著水準。 p 值是「假設 $H_0$ 為真,看到這麼極端或更極端的 t 的機率」—— 注意它不是「$H_0$ 為真的機率」。

Advertising 的三個單變數迴歸係數SEtp 值出處
sales ~ TV 的截距7.03260.457815.36< 0.0001表 3.1
sales ~ TV 的 TV0.04750.002717.67< 0.0001表 3.1
sales ~ radio 的 radio0.20250.02049.92< 0.0001表 3.3 上
sales ~ newspaper 的 newspaper0.05470.01663.300.00115表 3.3 下

三個單獨看都顯著——包含 newspaper。 記住這一列,P04 會回來打它一巴掌。課本的 β₀ 信賴區間是 [6.130, 7.935]、 β₁ 是 [0.042, 0.053]:「完全不打廣告時,銷售量平均落在 6130 到 7935 單位之間」。

觀念釐清
Q:線性迴歸的 LINE 假設,到底假設了什麼?

Linearity、Independence、Normality、Equal variance——四個字首拼成 LINE,好記,但更重要的是知道哪一條壞掉會傷到什麼

L(線性):$E[Y \mid X] = \beta_0+\beta_1X$ 這個形狀是對的。壞掉的話係數本身就沒有意義了——這是唯一會傷到「估計」的假設,所以殘差圖是必看的(P06 第 1 個問題)。

I(獨立):誤差項彼此不相關。壞掉時 SE 會被低估,於是 t 太大、p 值太小、信賴區間太窄——你會對一個其實很不確定的結論過度自信。時間序列與空間資料最常犯(P06 第 2 個問題)。

N(常態):誤差服從常態分佈。估計完全不需要它——最小平方解是純代數;它只用在「t 統計量真的服從 t 分佈」這件事上。而且 n 大時中央極限定理會幫忙,所以這是四條裡最不必緊張的一條。

E(等變異):所有誤差有共同的 σ²。壞掉時估計仍無偏,但 SE 的公式失準(有些點被過度信任),檢定與區間都不可靠(P06 第 3 個問題)。

一句話總結:L 壞了係數就錯;I 與 E 壞了係數還對,但不確定性的度量錯了;N 壞了而 n 又大,通常沒事。

講義完整實作:完整摘要與兩種區間

講義 03 · print(results.summary()):一次看完 SE、t、p、信賴區間、F、R²
print(results.summary())
預期輸出
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                   medv   R-squared:                       0.544
Model:                            OLS   Adj. R-squared:                  0.543
Method:                 Least Squares   F-statistic:                     601.6
Date:                Sat, 20 Sep 2025   Prob (F-statistic):           5.08e-88
Time:                        08:00:16   Log-Likelihood:                -1641.5
No. Observations:                 506   AIC:                             3287.
Df Residuals:                     504   BIC:                             3295.
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
intercept     34.5538      0.563     61.415      0.000      33.448      35.659
lstat         -0.9500      0.039    -24.528      0.000      -1.026      -0.874
==============================================================================
Omnibus:                      137.043   Durbin-Watson:                   0.892
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              291.373
Skew:                           1.453   Prob(JB):                     5.36e-64
Kurtosis:                       5.319   Cond. No.                         29.7
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

這一張表是整章的儀表板。左上是模型資訊,右上有 R-squared 0.544F-statistic 601.6Prob (F-statistic) 5.08e-88;中間那塊每一列是一個係數的 coefstd errtP>|t|/95% 信賴區間 [0.025 0.975]lstat 的區間是 [−1.026, −0.874],離 0 很遠。下面那塊 OmnibusJarque-Bera 是常態性檢定,Durbin-Watson 0.892 是殘差自相關的指標(理想值 2,這裡明顯偏低——P06 第 2 個問題)。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 35
講義 03 · 信賴區間 vs 預測區間
new_df = pd.DataFrame({'lstat':[5, 10, 15]}) newX = design.transform(new_df) newX new_predictions = results.get_prediction(newX) new_predictions.predicted_mean new_predictions.conf_int(alpha=0.05) new_predictions.conf_int(obs=True, alpha=0.05)
預期輸出
array([[17.56567478, 42.04151344],
       [12.82762635, 37.27906833],
       [ 8.0777421 , 32.52845905]])

lstat = 10 這一點,預測值都是 25.05,但:信賴區間 (24.47, 25.63) 問的是「所有 lstat = 10 的社區,平均 medv 是多少」;預測區間 (12.83, 37.28) 問的是「某一個 lstat = 10 的社區,medv 是多少」。後者寬得多,因為它還要算進個別觀測值自己的隨機誤差 ε。conf_int(obs=True) 就是切換這兩者的開關。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 39、41、43、45
QUIZ · 標準誤

同一份資料,你把預測變數 x 的單位從「元」換成「千元」(也就是全部除以 1000)。β̂₁ 與它的 t 統計量會怎麼變?

(A) β̂₁ 變成 1000 倍,SE(β̂₁) 也變成 1000 倍,t 完全不變
(B) β̂₁ 變成 1000 倍,SE 不變,所以 t 也變成 1000 倍
(C) 兩個都不變,因為線性迴歸對單位免疫
PART 03 · 模型準確度

RSE 與 R²:擬合得好不好 ISLP §3.1.3講義 03 · p.12–13

檢定過關(「有關係」)之後,下一個問題是「配得多好」。 兩個常用的量,一個有單位、一個沒有。

殘差標準誤(residual standard error)估的是誤差標準差 σ, 單位跟 y 一樣:

$$\mathrm{RSE} = \sqrt{\frac{\mathrm{RSS}}{n-p-1}} \qquad(\text{簡單線性迴歸的 } p = 1,\ \text{分母是 } n-2)$$

Advertising 用三個媒體的模型 RSE = 1.69,而 sales 的平均是 14.02—— 相對誤差大約 12%。這個「12%」是可以拿去跟老闆講的話。

把它換成無單位的比例。先定義總平方和 $\mathrm{TSS} = \sum(y_i - \bar y)^2$(完全不看 x、只用 ȳ 猜的誤差),則

$$R^2 = \frac{\mathrm{TSS} - \mathrm{RSS}}{\mathrm{TSS}} = 1 - \frac{\mathrm{RSS}}{\mathrm{TSS}}$$

讀作「y 的變異有多少比例被模型解釋掉了」。簡單線性迴歸時還有一個漂亮的事實: $R^2$ 恰好等於 x 與 y 相關係數的平方(這是 ISLP 3.7 第 7 題)。 多元迴歸時它等於 $\mathrm{Cor}(Y, \hat Y)^2$。

Advertising 上的模型RSS自由度 n−p−1RSE
只用 TV2102.531983.2590.6119
TV + radio556.911971.6810.8972
三個媒體都放556.831961.6860.8972
只用 radio3618.481984.2750.3320
只用 newspaper5134.801985.0930.0521
什麼都不放(只有截距)5417.151995.2180.0000
這張表最值得盯的是第 2 列跟第 3 列 加入 newspaper 之後: RSS 從 556.91 只掉到 556.83(幾乎沒動,但它一定會掉, 這是數學上的必然);R² 完全沒變(0.8972 → 0.8972); 可是 RSE 反而從 1.681 上升到 1.686
為什麼?因為 RSE 的分母是 n − p − 1:分子幾乎不動,分母卻從 197 掉到 196。 「多加一個沒用的變數要付代價」這件事,R² 看不到,RSE 看得到。 第 6 章的 Cp、AIC、BIC、調整後 R² 全都是在把這個代價算得更精細。

所以請把這句話刻進腦子:R² 永遠不會因為加變數而下降, 因此它不能用來比較變數個數不同的模型。要比,就要用會罰複雜度的指標, 或者乾脆用第 5 章的交叉驗證去估測試誤差。

觀念釐清
Q:R² 有可能是負的嗎?

含截距的最小平方法配在同一份資料上時,不可能。因為「只用 ȳ 猜」本身就是這個模型的一個特例(β̂₁ = 0),而最小平方法挑的是 RSS 最小的那組,所以一定 RSS ≤ TSS,於是 $R^2 \ge 0$。

但下面三種情況它真的會變成負的:

  • 模型沒有截距項:這時 β̂₁ = 0 不再是可選的方案,配出來的線可能比水平線 ȳ 還差。順帶一提,這也是為什麼 sm.OLS() 不自動加截距是個容易踩的坑。
  • 在測試資料上算 R²:$1 - \mathrm{RSS}_{\text{test}}/\mathrm{TSS}_{\text{test}}$ 完全可以是負的,意思是「你的模型在新資料上表現得比直接猜訓練集平均還爛」。sklearn.score() 就是這樣算的,看到負值不要以為程式壞了。
  • 係數不是用最小平方配的(ridge、lasso、手動指定、別人給的模型):沒有「RSS 已被最小化」這個保證。

看到負的 R²,正確的反應是:這個模型比「什麼都不學」還糟,回頭檢查有沒有截距、有沒有算錯資料集、或者根本選錯了模型。

講義完整實作:用 sklearn 算 R² 與 MSE

講義 03 · scikit-learn 版的 R² 與 MSE
ols_sl_summary = {'R2': r2_score(y_true, y_pred), 'Ex. Var': explained_variance_score(y_true, y_pred), 'MSE': mean_squared_error(y_true, y_pred)} for k, v in ols_sl_summary.items(): print(k, ':', v)
預期輸出
R2 : 0.5441462975864797
Ex. Var : 0.5441462975864798
MSE : 38.48296722989415

R2 : 0.5441 跟前面 summary()R-squared: 0.544 是同一個數,只是換了套件算。MSE : 38.483 是 RSS/n(除 n−2),所以 np.sqrt(results.scale) 給的 RSE 會比 np.sqrt(MSE) 稍大一點——差別就是自由度校正。另外 Ex. Var(explained variance)在有截距的最小平方下會等於 R²,兩者的定義只差殘差平均是否為 0 這一項。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 110、113
QUIZ · R² 與 RSE

你在模型裡加了一個完全隨機、跟 y 無關的變數。訓練資料上會發生什麼?

(A) R² 一定上升(或不變),RSE 通常上升
(B) R² 與 RSE 都會變差,因為變數沒有用
(C) 兩個都不變,因為最小平方法會自動把它的係數設成 0
PART 04 · 多元迴歸與 F 檢定

同時放進多個變數:F 檢定在問什麼 ISLP §3.2講義 03 · p.15–24

三個媒體要不要各配一條簡單迴歸,然後把結論拼起來?不行。 三條線各自忽略了另外兩個變數,而且沒辦法拿一組預算去預測銷售量。 正確的做法是讓每個變數都有自己的斜率:

$$Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p + \varepsilon$$

解讀變了,而且這是全章最重要的一句話:βⱼ 是「固定住其他所有變數不動時, Xⱼ 增加一單位對 Y 的平均影響」。同樣用最小平方法最小化

$$\mathrm{RSS} = \sum_{i=1}^{n} \left(y_i - \hat\beta_0 - \hat\beta_1 x_{i1} - \cdots - \hat\beta_p x_{ip}\right)^2$$

寫成矩陣就是一行——這也是本頁標題那條式子:

$$\hat\beta = (X^\top X)^{-1} X^\top y$$

接著是第一個問題:「至少有一個變數有用嗎」。 虛無假設是 $H_0: \beta_1 = \beta_2 = \cdots = \beta_p = 0$,用 F 檢定:

$$F = \frac{(\mathrm{TSS} - \mathrm{RSS})/p}{\mathrm{RSS}/(n-p-1)}$$

$H_0$ 為真時分子與分母的期望值都是 σ²,所以 F 應該在 1 附近; $H_a$ 為真時分子會變大,F 就明顯大於 1。多大才算大?取決於 n 與 p, 交給軟體算 p 值。下面這個元件讓你自己勾選要放哪些變數,看 tF 怎麼動:

圖表需要連網載入 Chart.js。此圖的重點:TV 與 radio 的 |t| 都在 20 以上,newspaper 只有 0.18——但把 radio 拿掉,newspaper 的 |t| 會跳到 4.35。
三個都放進模型時:TV 與 radio 的 t 值極大,newspaper 只有 −0.18。
目前模型 ISLP 表 3.1/3.3/3.4
放進去的變數TV、radio、newspaper
TV
radio
newspaper
整體 F
RSE
非做不可的兩個實驗
① 只留 newspaper|t| = 3.30,顯著。② 留 newspaper + TV|t| = 4.35,更顯著!③ 三個都放:|t| = 0.18,完全不顯著。關鍵在 radio——把它放進來,newspaper 就失業了。為什麼?看下面的相關矩陣與 Q&A。
三個媒體與 sales 的相關係數 ISLP 表 3.5
TV 0.782 · radio 0.576 · newspaper 0.228。而預測變數之間:corr(radio, newspaper) = 0.354,corr(TV, radio) = 0.055、corr(TV, newspaper) = 0.057。報紙預算高的市場,通常廣播預算也高。
三個媒體都放進去(ISLP 表 3.4/3.6)係數SEtp 值95% CI
截距2.93890.31199.42< 0.0001(2.324, 3.554)
TV0.04580.001432.81< 0.0001(0.043, 0.049)
radio0.18850.008621.89< 0.0001(0.172, 0.206)
newspaper−0.00100.0059−0.180.8599(−0.013, 0.011) 含 0

整體 F = 570.3、R² = 0.8972、 RSE = 1.686。VIF 分別是 1.005、1.145、1.145,所以 newspaper 的失業不是 共線性把 SE 撐大造成的(對照 P06 的 Credit 例子就知道差別)—— 是它的資訊真的被 radio 蓋掉了。

觀念釐清
Q:為什麼 newspaper 在單變數迴歸顯著,在多變數迴歸就不顯著了?

因為兩個迴歸問的是不同的問題

單變數迴歸的係數回答:「只看 newspaper 這一欄,它跟 sales 有沒有線性關聯?」多變數迴歸的係數回答:「在 TV 與 radio 都已知的情況下,再多知道 newspaper 有沒有幫助?」第二個問題嚴格得多。

機制就在相關矩陣裡:corr(radio, newspaper) = 0.354。假設真相是「radio 影響 sales、newspaper 不影響」。報紙預算高的市場通常廣播預算也高,廣播帶動了銷售,於是「報紙預算高的市場銷售也高」——單變數迴歸只看得到這個共同變動,就把功勞記在報紙頭上。等 radio 進了模型,功勞被歸還,報紙的係數就掉到 0 附近。

這在因果推論裡叫混淆(confounding):radio 是 newspaper 與 sales 之間的混淆變數。同一個結構也可能反過來:$X_j$ 單獨看不顯著、控制別的變數後才顯著(被壓抑效應蓋住)。所以「單變數篩選再進多變數模型」是個危險的習慣。

另一個常見但不同的成因是共線性:$X_j$ 真的有用,只是它跟別的變數太像,SE 被膨脹到檢不出來(P06 的 Credit limitrating)。分辨方法:看 VIF。這裡 newspaper 的 VIF 只有 1.145,所以是混淆,不是共線性。

Q:有了 t 檢定,為什麼還要 F 檢定?

因為多重比較。單一個 t 檢定在 α = 0.05 下有 5% 的機率誤判;但如果你有 100 個變數、逐一做 t 檢定,即使它們全部無用,預期也會冒出 100 × 0.05 = 5 個「顯著」。看到 5 個顯著就宣布發現,等於在報告雜訊。

F 檢定一次檢定全體:$H_0$ 是所有係數同時為 0。它的分佈已經把 p 個變數的維度算進去了,所以不會被這種累積誤判騙到。正確的順序是先看 F 拿入場券,再看個別 t 找名單。如果 F 不顯著,就算某個 t 看起來很漂亮,也要非常保守地對待。

還有一個 t 做不到的用途:F 可以檢定一組係數($H_0: \beta_{p-q+1} = \cdots = \beta_p = 0$)。質性變數的多個虛擬欄就是這種情況——個別虛擬欄的 t 值會隨基準水準的選擇而變,但「這個變數整體有沒有用」的 F 檢定不會(P05 會看到)。巢狀模型的比較(anova_lm())也是同一件事。

最後一個常被忽略的細節:p ≥ n 時 F 檢定根本算不出來,因為 RSS 可以壓到 0。那種情況要用第 6 章的方法。

講義完整實作:從兩個變數到全部變數

講義 03 · 兩個預測變數(lstat + age)
X = MS(['lstat', 'age']).fit_transform(Boston) y = Boston['medv'] model1 = sm.OLS(y, X) results1 = model1.fit() summarize(results1)
預期輸出
              coef  std err       t  P>|t|
intercept  33.2228    0.731  45.458  0.000
lstat      -1.0321    0.048 -21.416  0.000
age         0.0345    0.012   2.826  0.005

aget = 2.826、p = 0.005,在這個模型裡是顯著的。先記住這個數字,看下一張卡。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 74
講義 03 · 全部 12 個預測變數
# 我們現在可以使用相同的模型矩陣建構器,使用 `terms` 中的所有變數來擬合模型。 X = MS(terms).fit_transform(Boston) model = sm.OLS(y, X) results = model.fit() summarize(results)
預期輸出
              coef  std err       t  P>|t|
intercept  41.6173    4.936   8.431  0.000
crim       -0.1214    0.033  -3.678  0.000
zn          0.0470    0.014   3.384  0.001
indus       0.0135    0.062   0.217  0.829
chas        2.8400    0.870   3.264  0.001
nox       -18.7580    3.851  -4.870  0.000
rm          3.6581    0.420   8.705  0.000
age         0.0036    0.013   0.271  0.787
dis        -1.4908    0.202  -7.394  0.000
rad         0.2894    0.067   4.325  0.000
tax        -0.0127    0.004  -3.337  0.001
ptratio    -0.9375    0.132  -7.091  0.000
lstat      -0.5520    0.051 -10.897  0.000

同一個 aget 從 2.826 掉到 0.271、p 從 0.005 變成 0.787——這就是上面 Q&A 講的現象在 lab 裡的實例,跟 Advertising 的 newspaper 是同一個病。indus(p = 0.829)也是。lab 的儲存格 79 接著示範怎麼用 Boston.columns.drop(['medv','age'])age 拿掉重配,拿掉之後 lstatt 從 −10.897 變成 −11.483,SE 從 0.051 縮到 0.048——變數少一個,剩下的反而估得更準。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 75、77
QUIZ · F 檢定

某個模型的 F 統計量是 1.04,p 值 0.41;但其中有一個變數的 t = 2.3、p = 0.023。該怎麼解讀?

(A) 很可能是多重比較的假陽性,應該非常保守地看待那個「顯著」的變數
(B) t 檢定比 F 檢定精細,所以應該相信 t:那個變數確實有用
(C) 兩個結果矛盾,說明資料違反常態假設,要先做轉換
PART 05 · 質性變數與交互作用

類別變數怎麼進模型,交互作用又是什麼 ISLP §3.3.1–3.3.2講義 03 · p.25–36

前面所有的 x 都是數字。可是「貨架位置:好/中/差」、「是不是學生」、 「哪一個地區」怎麼放進模型?答案簡單到有點好笑:編成 0 與 1

兩個水準只要一欄。以 Credit 資料的 Student 為例:

$$x_i = \begin{cases} 1 & \text{第 } i \text{ 個人是學生} \\ 0 & \text{不是學生} \end{cases} \qquad\Longrightarrow\qquad y_i = \begin{cases} \beta_0 + \beta_1 + \varepsilon_i & \text{是學生} \\ \beta_0 + \varepsilon_i & \text{不是} \end{cases}$$

於是 β₀ 是「非學生的平均」、β₁ 是「學生比非學生多出來的部分」。 k 個水準只要 k − 1 欄;沒有分到欄的那個水準叫基準水準 (baseline),截距代表它。為什麼不給每個水準都一欄? 因為 k 欄加起來恆等於 1,會跟截距完全共線,矩陣就不可逆了—— 這叫虛擬變數陷阱(dummy variable trap)。

Credit 上的兩個例子係數SEtp 值解讀
截距(非學生)480.36923.43420.499< 0.0001非學生的平均 balance
Student[Yes]396.45674.1045.350< 0.0001學生平均多 396 → 876.83
截距(African American)531.0046.31911.464< 0.0001基準水準的平均
Ethnicity[Asian]−18.68665.021−0.2870.774比基準少 18.7,但 p 很大
Ethnicity[Caucasian]−12.50356.681−0.2210.826比基準少 12.5,p 也很大

下面三列就是 ISLP 表 3.8(課本用的欄名是 region/East/South/West,ISLP 的 Python 資料集把同一欄命名為 Ethnicity,數字完全一致)。三個水準的整體檢定 F = 0.0434、p = 0.9575——「族群跟 balance 無關」。 重點是:個別虛擬欄的係數與 p 值會隨基準水準的選擇而變,整體的 F 檢定不會。 所以判斷一個質性變數整體有沒有用,要看 F,不要看個別虛擬欄。

接著是交互作用。標準線性模型是加法的: 每個變數的效果跟其他變數的值無關。可是「電視廣告的效果會不會取決於廣播花了多少」 這種問題(行銷上叫綜效、統計上叫交互作用)就違反加法假設。解法是丟一個乘積項進去:

$$Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 X_1X_2 + \varepsilon = \beta_0 + (\beta_1 + \beta_3 X_2)\,X_1 + \beta_2 X_2 + \varepsilon$$

看第二種寫法:$X_1$ 的斜率變成 $\beta_1 + \beta_3X_2$, 會隨 $X_2$ 移動。當 $X_2$ 是質性變數(0/1)時這件事特別好看—— 就是「兩條線平不平行」:

非學生學生非學生的迴歸線學生的迴歸線
兩條線平行=沒有交互作用。切換後推滑桿,看學生那條線轉起來。
β₃−2.00
兩條線 LIVE
模式
非學生的斜率 β₁
學生的斜率 β₁+β₃
交互作用項 β₃
RSS
怎麼玩
先按「切換」看沒有交互作用的版本:兩條線平行,只有截距不同,意思是「收入對 balance 的影響,學生跟非學生完全一樣」。切到有交互作用之後推 β₃ 滑桿,看學生那條線怎麼轉。滑桿放在最小平方解上時 RSS 最小;往兩邊推,RSS 就爬起來。
課本的數字 ISLP 圖 3.7
ISLP 圖 3.7 就是這兩張圖。最小平方解:無交互作用時兩條線的共同斜率是 5.98;有交互作用時非學生 6.22、學生 4.22(β̂₃ = −2.00)。也就是說收入上升對學生的 balance 影響比較小。不過這一項的 t = −1.15、p = 0.25,並不顯著。
Advertising 加入 TV×radio(ISLP 表 3.9)係數SEtp 值
截距6.75020.247927.23< 0.0001
TV0.01910.001512.70< 0.0001
radio0.02890.00893.240.0014
TV×radio0.00110.000120.73< 0.0001

R² 從 89.7%(只有主效果)跳到 96.8%。換個算法更有感:加法模型配完後剩下的變異裡, 有 (96.8 − 89.7)/(100 − 89.7) ≈ 69% 被這一個乘積項解釋掉了。 係數的解讀是「TV 預算每多 1000 美元,銷售量增加 (19 + 1.1 × radio) 單位」—— 廣播花得愈多,電視廣告愈有效。這就是綜效。

階層原則(hierarchical principle) 只要模型放了交互作用項 X₁X₂,就要連主效果 X₁X₂ 一起放, 即使它們的 p 值不顯著。
兩個理由:① 如果 X₁X₂ 跟 y 有關,那 X₁ 的係數是不是剛好為 0 根本不重要; ② 乘積項通常跟主效果高度相關,抽掉主效果會讓乘積項被迫去承擔主效果, 它的係數就不再是「交互作用」的意思了。
同一個原則也適用於多項式:放了 就要放 x

講義完整實作:交互作用與類別變數

講義 03 · 用 tuple 指定交互作用項
X = MS(['lstat', 'age',('lstat', 'age')]).fit_transform(Boston) model2 = sm.OLS(y, X) summarize(model2.fit())
預期輸出
              coef  std err       t  P>|t|
intercept  36.0885    1.470  24.553  0.000
lstat      -1.3921    0.167  -8.313  0.000
age        -0.0007    0.020  -0.036  0.971
lstat:age   0.0042    0.002   2.244  0.025

MS(['lstat', 'age', ('lstat', 'age')]) 裡的 tuple ('lstat','age') 就是交互作用項,欄名會自動變成 lstat:age。它的 t = 2.244、p = 0.025,顯著;而 age 的主效果 t = −0.036 完全不顯著——照階層原則,還是要留著它

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 93
講義 03 · 三個水準的類別變數(Carseats 的 ShelveLoc)
allvars = list(Carseats.columns.drop('Sales')) y = Carseats['Sales'] final = allvars + [('Income', 'Advertising'), ('Price', 'Age')] X = MS(final).fit_transform(Carseats) model = sm.OLS(y, X) summarize(model.fit())
預期輸出
                      coef  std err       t  P>|t|
intercept           6.5756    1.009   6.519  0.000
CompPrice           0.0929    0.004  22.567  0.000
Income              0.0109    0.003   4.183  0.000
Advertising         0.0702    0.023   3.107  0.002
Population          0.0002    0.000   0.433  0.665
Price              -0.1008    0.007 -13.549  0.000
ShelveLoc[Good]     4.8487    0.153  31.724  0.000
ShelveLoc[Medium]   1.9533    0.126  15.531  0.000
Age                -0.0579    0.016  -3.633  0.000
Education          -0.0209    0.020  -1.063  0.288
Urban[Yes]          0.1402    0.112   1.247  0.213
US[Yes]            -0.1576    0.149  -1.058  0.291
Income:Advertising  0.0008    0.000   2.698  0.007
Price:Age           0.0001    0.000   0.801  0.424

ShelveLocBadMediumGood 三個水準,MS() 自動產生兩欄 ShelveLoc[Good]ShelveLoc[Medium]——Bad 被丟掉當基準(它是第一個水準)。係數 4.85 與 1.95 都是「相對於 Bad」的差距,順序也符合直覺:好位置 > 中等 > 差位置。這一格同時放了兩個交互作用 Income:Advertising(p = 0.007,顯著)與 Price:Age(p = 0.424,不顯著)。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 103、105
QUIZ · 質性變數與交互作用

一個三水準的質性變數,你把基準水準從「差」換成「好」。什麼會變、什麼不會變?

(A) 個別虛擬欄的係數、SE、p 值都會變;配適值、預測、R²、整體 F 檢定都不變
(B) 什麼都不會變,因為虛擬變數的編碼方式不影響模型
(C) 係數不變,但 R² 會變,因為模型矩陣不同了
PART 06 · 六個潛在問題

非線性、殘差相關、異質變異、離群、高槓桿、共線性 ISLP §3.3.3講義 03 · p.37–52

線性迴歸配起來很容易,配出錯的結論也一樣容易。 ISLP §3.3.3 列了六個潛在問題,講義 p.37–52 用了 16 頁講它們。 先看全表,再一個一個動手看:

#問題怎麼看出來會傷到什麼怎麼處理
1非線性殘差 vs 配適值有 U 形或曲線結構係數本身就沒意義加 x²、log x、√x,或第 7 章的樣條
2誤差相關殘差按順序畫出來有波動、Durbin–Watson 遠離 2SE 被低估 → 信賴區間太窄、p 值太小改用時間序列模型、混合模型、群聚穩健 SE
3異質變異殘差圖呈漏斗形、scale-location 往上爬SE 失準(估計仍無偏)log y 或 √y、加權最小平方、穩健 SE
4離群值(y 怪)學生化殘差 |值| > 3RSE 變大、R² 變小;係數可能還好查是不是記錄錯誤;不要只因為難看就刪
5高槓桿(x 怪)槓桿值遠超過平均 (p+1)/n一個點就能扳動整條線檢查該筆資料;報告拿掉它之後的結果
6共線性相關矩陣、VIF > 5 或 10SE 膨脹 → 檢定力下降,變數有用卻檢不出來拿掉一個、或把它們合成一個變數

問題 1 到 5 全部靠四張診斷圖看。下面這個元件把五組資料 (一組乾淨的、四組各有一種病徵)跟四張圖交叉組合起來—— 先切資料再切圖,把每一種病徵長什麼樣記進眼睛裡

圖表需要連網載入 Chart.js。此圖的重點:殘差圖出現 U 形=非線性;漏斗形=異質變異;Q-Q 圖偏離 45 度線=誤差不常態;右下角遠離群體=高槓桿點。
先用下拉選單換資料,再按四個按鈕換圖。乾淨的資料四張圖都該沒有結構。
四張圖各看什麼
① 殘差 vs 配適值:最重要的一張。應該是一團沒有結構的雲,紅線(分箱平均)應該貼著 0。有 U 形=非線性,有漏斗=異質變異。
② Q-Q 圖:學生化殘差的分位數對常態分位數。貼著 45 度線=常態;兩端翹起=厚尾(有離群值)。
③ scale-location:看 √|學生化殘差| 有沒有隨配適值上升,專門抓異質變異。
④ 殘差 vs 槓桿值:右上/右下角的點最危險——同時是離群值又是高槓桿點。
這一組資料的診斷數字
n
β̂₁
RSE
最大 |學生化殘差|
最大槓桿值
槓桿值的平均 (p+1)/n
課本裡的對應圖 ISLP 圖 3.9/3.12/3.13
第 ② 組是真的 Auto 資料(mpg 對 horsepower),就是 ISLP 圖 3.9 左那張經典的 U 形殘差圖;加上 horsepower² 之後 U 形會消失(圖 3.9 右)。第 ④ ⑤ 組對應圖 3.12 與圖 3.13。

離群值與高槓桿點的判準要說清楚。學生化殘差是把殘差除以它自己的 估計標準差:

$$r_i = \frac{e_i}{\mathrm{RSE}\sqrt{1-h_i}}$$

為什麼要除以 $\sqrt{1-h_i}$?因為每一筆殘差的變異數其實不一樣 ($\mathrm{Var}(e_i) = \sigma^2(1-h_i)$)——高槓桿點的殘差天生就小, 直接比原始殘差對它不公平。學生化之後才有共同尺度,|rᵢ| > 3 就可疑。

槓桿值 $h_i$ 是帽子矩陣的對角元,衡量「第 i 筆的 x 有多不尋常」。 簡單線性迴歸有明確公式:

$$h_i = \frac{1}{n} + \frac{(x_i-\bar x)^2}{\sum_{j=1}^{n}(x_j-\bar x)^2}$$

它介於 1/n 與 1 之間,而且所有 $h_i$ 的平均恰好是 (p+1)/n。 遠超過這個平均(實務上常用 2 倍或 3 倍當門檻)就是高槓桿點。

最危險的組合是「離群值 + 高槓桿」 只是離群值(y 怪、x 正常):它會推高 RSE、 拉低 R²,但因為槓桿小,對係數的影響有限。
只是高槓桿(x 怪、但落在趨勢上):它其實幫忙——把 x 的範圍拉開會降低 SE(β̂₁)。
兩個同時發生(ISLP 圖 3.13 的第 41 筆):一個點就能把整條線扳過去, 而且因為槓桿高、殘差被壓小,它在原始殘差圖上還不一定顯眼。 這就是為什麼一定要看「殘差 vs 槓桿值」那張圖, 以及為什麼 Cook's distance(同時算進兩者)是標準工具。

第六個問題自己一節。共線性是指兩個以上的預測變數彼此高度相關。 它不會讓估計有偏,但會讓 RSS 的等高線從碗變成一條狹長的溝—— 沿著溝走,RSS 幾乎不變,於是「哪一組係數最好」變得極難分辨。 量化的工具是變異數膨脹因子:

$$\mathrm{VIF}(\hat\beta_j) = \frac{1}{1 - R^2_{X_j \mid X_{-j}}} \qquad\Longrightarrow\qquad \frac{\mathrm{SE}(\hat\beta_j)\ \text{有共線性}} {\mathrm{SE}(\hat\beta_j)\ \text{無共線性}} = \sqrt{\mathrm{VIF}}$$

$R^2_{X_j \mid X_{-j}}$ 是「拿 $X_j$ 對其他所有預測變數做迴歸」得到的 R²。 它接近 1 就代表 $X_j$ 的資訊已經被別人講完了,VIF 就爆掉。 最小值是 1(完全無共線性),超過 5 或 10 就要處理。 推下面這根滑桿,看信賴區域怎麼從圓變成溝:

ρ = 0:等高線是圓,兩個係數互不干擾。把滑桿往右推看看。
ρ0.00
即時計算 LIVE
corr(X₁, X₂) = ρ0.00
VIF = 1/(1−ρ²)1.00
SE 膨脹倍數 = √VIF1.00
t 值縮小成原來的100%
同樣的資料量,等效於
判準沒有問題
怎麼看這張圖 ISLP 圖 3.15
兩軸是兩個係數(已中心化到最小平方解)。紅色曲線是 RSS 的等高線,也就是「同樣好」的係數組合;淡藍色的十字帶是各自單獨的 95% 信賴區間。
ρ = 0 時等高線是圓,兩個係數各自估得準。ρ → 1 時它拉成一條沿著 β₁ = −β₂ 的長溝:「兩個係數的和」還是估得很準,但「各自是多少」完全分不出來。這正是 ISLP 圖 3.15 右邊那張圖。
Credit 資料上的真實案例 ISLP 表 3.11
balance 對 age + limitlimit 的 SE = 0.005、t = 34.5、p < 0.0001。
改成對 rating + limit:同一個 limit 的 SE 變成 0.064(膨脹 12.8 倍)、t 掉到 0.38、p = 0.70。
三個一起放時 VIF 是 1.01、160.67、160.59。拿掉 rating,R² 只從 0.754 掉到 0.750——幾乎沒損失,問題卻解決了

講義完整實作:VIF、多項式與 anova_lm

講義 03 · 用串列生成式算每一欄的 VIF
vals = [VIF(X, i) for i in range(1, X.shape[1])] vif = pd.DataFrame({'vif':vals}, index=X.columns[1:]) vif
預期輸出
              vif
crim     1.767486
zn       2.298459
indus    3.987181
chas     1.071168
nox      4.369093
rm       1.912532
age      3.088232
dis      3.954037
rad      7.445301
tax      9.002158
ptratio  1.797060
lstat    2.870777

range(1, X.shape[1]) 從 1 開始是為了跳過第 0 欄的截距。Boston 的 12 個變數裡最大的是 tax 9.00 與 rad 7.45——這兩個確實相關(稅率高的地區通常離高速公路近),落在「要留意但還不到災難」的區間。跟 Credit 的 160 比一比就知道什麼叫嚴重。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 87、89
講義 03 · 加二次項修掉非線性
X = MS([poly('lstat', degree=2), 'age']).fit_transform(Boston) model3 = sm.OLS(y, X) results3 = model3.fit() summarize(results3)
預期輸出
                              coef  std err       t  P>|t|
intercept                  17.7151    0.781  22.681    0.0
poly(lstat, degree=2)[0] -179.2279    6.733 -26.620    0.0
poly(lstat, degree=2)[1]   72.9908    5.482  13.315    0.0
age                         0.0703    0.011   6.471    0.0

poly('lstat', degree=2) 產生的是正交多項式基底(為了數值穩定),所以係數 −179.23 與 72.99 不能直接讀成「lstat 與 lstat² 的係數」;要那樣讀得加 raw=True。兩種基底的配適值完全相同,只是係數不同。二次項的 p 值實質為 0,表示它確實改善了模型。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 96
講義 03 · anova_lm:用 F 檢定比較巢狀模型
anova_lm(results1, results3)
預期輸出
   df_resid           ssr  df_diff      ss_diff           F        Pr(>F)
0     503.0  19168.128609      0.0          NaN         NaN           NaN
1     502.0  14165.613251      1.0  5002.515357  177.278785  7.468491e-35

比較「lstat + age」與「poly(lstat,2) + age」兩個巢狀模型。F = 177.28、p = 7.47e-35,二次項不能省。注意一個漂亮的事實:177.28 恰好是上一張卡裡二次項 t = 13.315 的平方(13.315² ≈ 177.3)——巢狀模型只差 1 個自由度時,F 就是 t 的平方。這也解釋了為什麼 P04 說「F 可以檢定一組係數」是 t 檢定的推廣。另外 lab 的儲存格 60 用 np.argmax(infl.hat_matrix_diag) 找出 Boston 裡槓桿值最大的是第 374 筆。

來源:Ch03-linreg-lab-zh.ipynb · 儲存格 98
QUIZ · 診斷圖

殘差對配適值的圖呈明顯的 U 形。下面哪個結論是對的?

(A) 線性假設被違反了,係數本身的解讀就已經有問題,要先修模型的形狀
(B) 誤差不是常態分佈,應該對 y 取 log
(C) 有離群值把殘差拉歪了,把最大的幾個殘差刪掉重配就好
QUIZ · 共線性

兩個預測變數的相關係數是 0.9。它們的 VIF 大約多少?SE 被膨脹幾倍?

(A) VIF ≈ 5.3、SE 膨脹約 2.3 倍
(B) VIF ≈ 0.9、SE 膨脹 0.9 倍
(C) VIF ≈ 10、SE 膨脹 10 倍
PART 07 · 與 KNN 的比較

什麼時候線性模型會輸給 KNN ISLP §3.5講義 03 · p.53–58

線性迴歸是參數方法(parametric):它先假設 f 的形狀 (一條直線),然後只需要估 p + 1 個數字。好處很多——容易配、係數可解讀、 有現成的 t 與 F 檢定。壞處只有一個,但很致命:如果那個形狀猜錯了, 就算資料再多也救不回來

對照組是 K 近鄰迴歸(KNN regression),一個徹底的無母數方法。 要預測 $x_0$,就找離它最近的 K 個訓練點,把它們的 y 平均起來:

$$\hat f(x_0) = \frac{1}{K} \sum_{i \in \mathcal{N}_0} y_i$$

它對 f 的形狀不做任何假設。K 小=很有彈性但很不穩(K = 1 會穿過每一個訓練點); K 大=很平滑但可能糊掉真正的結構。這是第 2 章偏差–變異取捨的又一個化身。

那到底該用哪個?下面這個元件把 ISLP 圖 3.19 與 3.20 的實驗重跑一遍, 三個視角回答三個問題:

圖表需要連網載入 Chart.js。此圖的重點:真實關係是直線時線性迴歸大勝;愈彎 KNN 愈有優勢;但變數一多(p ≥ 4),KNN 就迅速輸掉——這是維度詛咒。
按三個按鈕切換視角。先猜「真相是直線時誰贏」,再看答案。
三個視角
① 真實形狀:三種真相(直線/輕微彎/很彎)下,線性迴歸與最佳 KNN 誰的測試 MSE 低。
② K 的取捨:固定「很彎」的真相,看 KNN 的測試 MSE 怎麼隨 K 變化,以及線性迴歸的水平基準線在哪。
③ 維度 p:真相只跟第一個變數有關,其餘 p − 1 個全是純噪音。看兩者怎麼隨 p 退化。
目前這一組數字 LIVE 讀烘焙資料
視角
線性迴歸的測試 MSE
KNN 最好的測試 MSE
最好的 K
誰贏
課本的結論 ISLP §3.5
「KNN 至少不會比線性迴歸差太多,可能好很多」——這句話只在 p 很小時成立。ISLP 圖 3.20:真相明顯非線性時,p = 1 或 2 時 KNN 贏,p = 3 打成平手,p ≥ 4 之後線性迴歸反過來贏,而且 KNN 的 MSE 是十倍級地爆掉。原因是 50 筆資料撒進 20 維空間之後,任何一點的「最近鄰」其實都離得很遠。
為什麼 p 大的時候無母數方法會崩掉 這叫維度詛咒 (curse of dimensionality)。KNN 的整個邏輯建立在「最近的 K 個點跟 x₀ 很像」之上。 可是在 20 維裡,50 個點彼此的距離都差不多遠——「最近鄰」變成一個名不符實的詞, 拿它們的 y 平均就等於拿一群不相干的點平均,偏差大到無法忍受。
線性迴歸靠的是「所有 n 筆資料共同決定 p + 1 個係數」, 每筆資料都在為全域的形狀投票,不依賴局部鄰居,所以 p 變大只讓變異增加一點。
經驗法則:每個變數分到的樣本數太少時,偏好參數方法。
線性迴歸KNN 迴歸
對 f 的假設線性(強)只假設平滑(弱)
要估的東西p + 1 個係數沒有參數,但要留著全部訓練資料
真相是線性時(估得又快又準)略差(多付了變異)
真相很彎時系統性偏差,救不回來大勝
p 變大時退化得慢迅速崩掉(維度詛咒)
可解讀性係數、p 值、信賴區間都有幾乎沒有
雜訊變數的影響多估幾個接近 0 的係數而已直接污染距離的計算
預測的成本一次乘法每次都要掃過全部訓練資料

最後一件事,也是課本特別強調的:就算 KNN 的測試 MSE 稍微低一點, 選線性迴歸仍然可能是對的。能用幾個係數把結論講給老闆聽、 能附上 p 值與信賴區間,這些在真實工作裡值得換掉一點點預測精度。 第 7 章會給你一個折衷方案(GAM):保留「每個變數各自一條曲線」的可解讀性, 同時放掉線性的限制。

QUIZ · 線性迴歸 vs KNN

真實關係明顯非線性,n = 50。什麼情況下線性迴歸反而贏過 KNN?

(A) 預測變數的個數 p 一多(大約 p ≥ 4)就會贏,因為 KNN 受維度詛咒重傷
(B) 永遠不會贏,因為 KNN 不做任何形狀假設,一定更接近真相
(C) 只要把 K 調大就會贏,因為 K 大 KNN 就退化成線性迴歸
EXERCISES · 練習

動手驗證:ISLP 第 3 章精選題 ISLP §3.7 習題

下面幾題取自 ISLP §3.7 的課後習題,題號都對得回課本。先自己想過再點選項; 每個選項——包含錯的——都寫了為什麼。想看完整解答再對照下面3個站。

EXERCISE 1 · ISLP 3.7 第 1 題

課本要你描述表 3.4 的 p 值各自對應什麼虛無假設,並用 sales/TV/radio/newspaper 的語言(不要用係數)講結論。下面哪個描述對了?

(A) 每個 p 值對應「在其他兩個媒體的預算固定的情況下,這個媒體與 sales 無關」;結論是 TV 與 radio 有關,newspaper 沒有
(B) 每個 p 值對應「這個媒體單獨跟 sales 無關」;結論是 newspaper 跟 sales 無關
(C) 四個 p 值一起對應「三個係數同時為 0」;結論要看整體的 F 檢定
EXERCISE 2 · ISLP 3.7 第 3 題(a)

模型是 salary = 50 + 20·GPA + 0.07·IQ + 35·Level + 0.01·(GPA×IQ) − 10·(GPA×Level),其中 Level = 1 代表大學畢業。固定 IQ 與 GPA,哪個說法對?

(A) GPA 夠高時,高中畢業生的平均起薪反而比大學畢業生高
(B) 大學畢業生的平均起薪一定比高中畢業生高,因為 Level 的係數 35 是正的
(C) GPA×IQ 的係數只有 0.01,非常小,所以幾乎沒有交互作用效果
EXERCISE 3 · ISLP 3.7 第 4 題(a)(b)

n = 100、單一預測變數。真實關係線性的。把「線性迴歸」與「三次迴歸」的訓練 RSS 與測試 RSS 比一比,預期是什麼?

(A) 訓練 RSS:三次一定較低(或相等);測試 RSS:預期線性較低
(B) 兩個都是三次較低,因為三次模型比較有彈性
(C) 資訊不足,兩個都無法判斷
EXERCISE 4 · ISLP 3.7 第 7 題

課本要你證明簡單線性迴歸(只有一個 x、有截距)的 R² 等於 x 與 y 相關係數的平方。為什麼這件事在多元迴歸就不能照搬?

(A) 多元迴歸有多個 x,沒有單一個「x 與 y 的相關係數」;對應的結果變成 R² = Cor(y, ŷ)²
(B) 因為多元迴歸的 R² 不再介於 0 與 1 之間
(C) 因為多元迴歸要用調整後 R²,普通 R² 不再有意義
REFERENCE · 總覽

線性迴歸速查表 ISLP Ch.3

考前把這一頁掃過去就好。

公式速查

名稱式子備註
簡單線性模型$Y = \beta_0 + \beta_1 X + \varepsilon$式 3.5
最小平方解$\hat\beta_1 = \frac{\sum(x_i-\bar x)(y_i-\bar y)}{\sum(x_i-\bar x)^2}$,$\hat\beta_0 = \bar y - \hat\beta_1\bar x$式 3.4;必過 $(\bar x,\bar y)$
矩陣寫法$\hat\beta = (X^\top X)^{-1}X^\top y$多元迴歸的封閉解
斜率的標準誤$\mathrm{SE}(\hat\beta_1)^2 = \sigma^2/\sum(x_i-\bar x)^2$式 3.8;x 散得開就小
截距的標準誤$\mathrm{SE}(\hat\beta_0)^2 = \sigma^2\left[\frac1n+\frac{\bar x^2}{\sum(x_i-\bar x)^2}\right]$式 3.8
95% 信賴區間$\hat\beta_1 \pm 2\,\mathrm{SE}(\hat\beta_1)$式 3.9;嚴格版用 t 分位數
t 統計量$t = \hat\beta_1/\mathrm{SE}(\hat\beta_1)$式 3.14;df = n−2
殘差標準誤$\mathrm{RSE} = \sqrt{\mathrm{RSS}/(n-p-1)}$式 3.15/3.25;有單位
$R^2 = 1 - \mathrm{RSS}/\mathrm{TSS}$式 3.17;簡單迴歸時 $= \mathrm{Cor}(x,y)^2$
F 統計量$F = \frac{(\mathrm{TSS}-\mathrm{RSS})/p}{\mathrm{RSS}/(n-p-1)}$式 3.23;$H_0$ 下約為 1
學生化殘差$r_i = e_i/(\mathrm{RSE}\sqrt{1-h_i})$$|r_i|>3$ 可疑
槓桿值$h_i = \frac1n + \frac{(x_i-\bar x)^2}{\sum(x_j-\bar x)^2}$式 3.37;平均恰為 $(p+1)/n$
VIF$\mathrm{VIF}(\hat\beta_j) = 1/(1-R^2_{X_j\mid X_{-j}})$$>5$ 或 $10$ 要處理;SE 膨脹 $\sqrt{\mathrm{VIF}}$
交互作用$Y = \beta_0 + (\beta_1+\beta_3X_2)X_1 + \beta_2X_2 + \varepsilon$式 3.33;斜率隨 $X_2$ 移動

Advertising 資料上的所有數字(本頁每個元件都能對回這張表)

模型截距TVradionewspaperFRSE
只有 TV7.03260.0475
(t 17.67)
312.10.61193.259
只有 radio9.31160.2025
(t 9.92)
98.40.33204.275
只有 newspaper12.35140.0547
(t 3.30)
10.90.05215.093
TV + newspaper5.77490.0469
(t 18.17)
0.0442
(t 4.35)
179.60.64583.121
TV + radio2.92110.0458
(t 32.91)
0.1880
(t 23.38)
859.60.89721.681
三個都放2.93890.0458
(t 32.81)
0.1885
(t 21.89)
−0.0010
(t −0.18)
570.30.89721.686
TV + radio + TV×radio6.75020.0191
(t 12.70)
0.0289
(t 3.24)
TV×radio 0.0011
(t 20.73)
0.96780.944

newspapert 值一路 從 3.30(單獨)→ 4.35(加了 TV)→ −0.18(再加 radio)。 同一欄資料,三個結論。差別只在「控制了什麼」。

六個潛在問題的一頁速查

問題看哪張圖/哪個數字傷到係數嗎傷到 SE/檢定嗎
1. 非線性殘差 vs 配適值(U 形)
2. 誤差相關殘差按順序排列、Durbin–Watson不會會(低估 SE)
3. 異質變異殘差圖漏斗形、scale-location不會
4. 離群值學生化殘差 $|r_i|>3$可能(槓桿低時影響小)會(RSE 變大)
5. 高槓桿$h_i \gg (p+1)/n$會(一個點就夠)
6. 共線性相關矩陣、VIF不會(仍無偏)會(SE 膨脹 $\sqrt{\mathrm{VIF}}$)
三個一定要記住的觀念 1. 多元迴歸的每個係數都是「控制住其他變數之後」的效果。 單變數顯著、多變數不顯著(Advertising 的 newspaper、Boston 的 age)不是矛盾, 是兩個問題的答案不同。
2. 先 F 再 t。F 回答「至少有一個有用嗎」,t 回答「是哪些」。 跳過 F 直接看 t,變數一多就會被多重比較咬到。
3. 六個問題裡只有「非線性」會讓係數本身失去意義; 誤差相關、異質變異、共線性傷的是 SE 與檢定,係數還是無偏的。 所以殘差圖不是選修,是必看。

本頁「預期輸出」逐字取自課程 lab notebook(老師在課程環境實跑);圖表用的烘焙資料由 tools/frames/ 在固定種子下產生,環境為 numpy 1.24.4 · pandas 2.3.2 · scikit-learn 1.6.1 · scipy 1.13.1 · statsmodels 0.14.2 · ISLP 0.4.0 · pygam 0.10.1。每張卡下方的「來源」標了 lab 的儲存格編號,可以直接回去對。

QUIZ · 自我檢測

本章自我檢測 課程題庫 ch3 · 6 題

這些題目取自課程題庫,只給對錯與說明,不計分。答錯就回到對應章節重讀。

CARDS · 關鍵詞彙卡

關鍵詞彙卡:點卡片翻面 課程題庫 · 28 張

詞彙卡取自本章講義與 ISLP 第 3 章,正面是中文術語(附英文原名)。 先看正面、心裡默想定義,再翻面對答案;洗牌後再過一輪,直到每張都能不看答案講出來。