All Revision Notes

COM6005 Statistical Modeling · Module 4b

Model Building Techniques

COM6005 · Module 4b · Source: L4b_Model_building_L02_Complete.pdf (28 slides)

Contents · 7 sections

🎯 本講重點 (Learning outcomes)

  • 點解 categorical variable 唔可以直接乘 β\beta;用 dummy variables:k 個 categories → k−1k-1 個 dummies(statistics approach)vs one-hot encoding k 個(DM approach)。
  • Data 要用 good format(long format:所有 Y 喺同一個 column)。
  • 讀有 categorical predictors 嘅 output:intercept = baseline group,每個 dummy coefficient = 同 baseline 嘅差。
  • Python:astype('category')、C()、smf.ols('score ~ Worker + Machine', ...)。
  • Polynomials:Y=β0+β1X+β2X2+errorY=\beta_0+\beta_1X+\beta_2X^2+\text{error},formula 入面要用 I(x**2);log / reciprocal transformations。
  • Interaction terms:Y=β0+β1A+β2B+β3AB+errorY=\beta_0+\beta_1A+\beta_2B+\beta_3AB+\text{error};A:B vs A*B;categorical × categorical 嘅 interaction 數目。

⭐ 考試必溫 Top-5

  1. k 個 categories → k−1k-1 個 dummy variables(2 → 1、3 → 2、7 → 6);冇 dummy 嗰個係 baseline。
  2. Y=56+5.25XH+2.8XSY = 56 + 5.25X_H + 2.8X_S:Eng = 56、Hum = 61.25、Sci = 58.8——coefficient = 同 baseline (Eng) 嘅平均差。
  3. Machines output:Intercept 53.6167 = Worker 1 用 Machine A;Machine[T.C] = 13.9167 → 同一個 worker,用 C 比 A 平均高 13.92 分。
  4. Formula operators:+ 加 variable、- 移除(-1 冇 intercept)、: 只有 interaction、* = main effects + interaction;I() 做數學運算。
  5. Interaction 嘅意思:A 對 Y 嘅 effect 取決於 B(∂Y/∂A=β1+β3B\partial Y/\partial A = \beta_1+\beta_3B);categorical:(kA−1)(kB−1)(k_A-1)(k_B-1) 個 interaction terms(3 × 4 categories → 2×3=62\times3=6)。

1. 點解要 Model building?

Slide 1:Lecture 4 嘅 multiple linear regression Y=β0+β1X1+⋯+βpXp+errorY=\beta_0+\beta_1X_1+\cdots+\beta_pX_p+\text{error} 假設每個 X 都係 numerical、同 Y 係直線關係、而且各自獨立咁影響 Y。現實唔一定咁,所以本講教三種「擴充」model 嘅技巧:

技巧解決咩問題Formula 寫法
Categorical predictors(dummy variables)X 係類別(college、machine、weekday),唔可以直接乘 β\betay ~ C(group)
Quadratic / cubic terms(polynomials)X 同 Y 嘅關係係彎曲(non-linear)y ~ x + I(x**2)
Interaction termsA 嘅 effect 會隨 B 改變y ~ A + B + A:B 或 y ~ A*B

2. Categorical predictors:Dummy variables(slides 2–9)

Slide 2:model Y=β0+β1X1+⋯Y=\beta_0+\beta_1X_1+\cdots 要將 β1\beta_1 乘 X1X_1。如果 X1={Science,Engineering,Humanity}X_1 = \{\text{Science}, \text{Engineering}, \text{Humanity}\},「β1×Science\beta_1 \times \text{Science}」冇意思——categorical variables cannot be multiplied directly by β1\beta_1。解決方法:轉做 0/1 數字。

2.1 Statistics approach:k−1k-1 dummy variables(slide 3)

⭐ Dummy variable 數目
Categories例子Dummy variables
2Part-time / Full-time1:XF=1X_F = 1 if Full-time, 0 otherwise
3Eng / Hum / Sci2:XH=1X_H = 1 if Hum;XS=1X_S = 1 if Sci
7Sun / Mon / … / Sat6:XMONX_{MON} 至 XSATX_{SAT}

規則:k 個 categories → k−1k-1 個 dummy variables。冇自己 dummy 嗰個 category(上面嘅 Part-time、Eng、Sun)叫 baseline / reference category,佢嘅所有 dummies 都係 0。

💡 點解係 k−1k-1 唔係 k?

知道 XHX_H 同 XSX_S 之後,Eng 已經確定(兩個都係 0 就係 Eng),第三個 dummy 係多餘嘅資訊。更重要:如果三個 dummies 都放,XE+XH+XS=1X_E+X_H+X_S = 1 每一行都成立,等於 intercept 嗰欄(全部 1)——X matrix 嘅 columns linearly dependent,X′XX'X 冇 inverse,Module 4 嘅 β^=(X′X)−1X′Y\hat\beta=(X'X)^{-1}X'Y 計唔到。呢個叫 dummy variable trap(perfect multicollinearity)。

2.2 Data format(slides 4–6)

Slide 4 Bad format:每個 college 一個 column(wide format),Score (Y) 分散喺三個 column。Slide 5 Good format:All Y should be in the same column——一個 column 係 X = College,一個 column 係 Y = Score(long format),每行一個 observation。

Bad (wide)Good (long)
Engineering: 45, 65, 58
Science: 36, 75, 49, 62, 72
Humanity: 86, 49, 67, 43
(Engineering, 45), (Engineering, 65), (Engineering, 58), (Science, 36), …, (Humanity, 43)——共 12 行

Slide 6:Good format transform 之後,College 變成兩個 dummy columns (XS,XH)(X_S, X_H):

CollegeXSX_SXHX_H
Engineering(baseline)00
Science10
Humanity01
import pandas as pd
# Bad format(wide)→ Good format(long)
wide = pd.DataFrame({'Engineering': [45, 65, 58, None, None],
                     'Science':     [36, 75, 49, 62, 72],
                     'Humanity':    [86, 49, 67, 43, None]})
df = wide.melt(var_name='College', value_name='Score').dropna()   # 12 行,Y 喺同一個 column

2.3 DM approach:One-hot encoding(slide 7)

Data Mining 嘅做法係 get_dummies()(slide 寫 get_dummy(),pandas 正確名係 pd.get_dummies)= one-hot encoding:k 個 categories → k 個 columns,Engineering = [1,0,0]、Science = [0,1,0]、Humanity = [0,0,1]。

Statistics approachDM approach (one-hot)
Columns 數k−1k-1k
Engineering[0, 0][1, 0, 0]
Science[1, 0][0, 1, 0]
Humanity[0, 1][0, 0, 1]
用喺有 intercept 嘅 regression(避免 dummy variable trap)Decision tree、kNN、neural network 等 DM / ML models
pd.get_dummies(df['College'], dtype=int)                    # one-hot:3 columns
pd.get_dummies(df['College'], drop_first=True, dtype=int)   # k-1:drop 第一個(Engineering)→ Humanity, Science

2.4 Model 同 coefficient 解讀(slides 8–9)

Score=β0+β1XS+β2XH+error\text{Score} = \beta_0 + \beta_1 X_S + \beta_2 X_H + \text{error}

Slide 8:Python 入面,對 variable 用 astype('category') 之後,transform 會自動做,唔使自己整 dummies。BUT this is important for the understanding of Python output——你要識讀出嚟嘅 coefficients 代表咩。

Slide 9 嘅 fitted model:

Y^=56+5.25XH+2.8XS\hat Y = 56 + 5.25X_H + 2.8X_S
⭐ 逐個 case 代入(slide 9)
CaseXHX_HXSX_SY^\hat Y
Eng0056
Hum1056 + 5.25 = 61.25
Sci0156 + 2.8 = 58.8
  • Intercept 56 = baseline group(Engineering)嘅平均 score。
  • β^H=5.25\hat\beta_H = 5.25:Humanity 學生平均比 Engineering 高 5.25 分。
  • β^S=2.8\hat\beta_S = 2.8:Science 平均比 Engineering 高 2.8 分。
  • Hum vs Sci:5.25−2.8=2.455.25 - 2.8 = 2.45(唔使再 fit,直接相減)。
💡 驗證:只有一個 categorical X 時,fitted value = 每組嘅 sample mean

用 slides 4–5 嘅數據:Eng (45+65+58)/3=56(45+65+58)/3 = 56;Sci (36+75+49+62+72)/5=294/5=58.8(36+75+49+62+72)/5 = 294/5 = 58.8;Hum (86+49+67+43)/4=245/4=61.25(86+49+67+43)/4 = 245/4 = 61.25。完全同 slide 9 一樣——OLS 喺每組入面最小化 squared error,答案就係組平均。所以 coefficient = 組平均 − baseline 平均:61.25−56=5.2561.25 - 56 = 5.25、58.8−56=2.858.8 - 56 = 2.8。

import statsmodels.formula.api as smf
model = smf.ols('Score ~ College', data=df).fit()   # College 係 string,自動當 categorical
print(model.params)
# Intercept              56.00
# College[T.Humanity]     5.25
# College[T.Science]      2.80
⚠️ 易錯:Dummy coefficient 唔係「該組嘅平均」

β^H=5.25\hat\beta_H = 5.25 係 Hum 同 baseline 嘅差,唔係 Hum 嘅平均(61.25)。而 coefficient 嘅 t-test H0:βH=0H_0: \beta_H = 0 係測試「Hum 平均 = Eng 平均」,唔係測試 Hum 平均 = 0。換 baseline(例如 Science),所有 coefficients 數值都會變,但 fitted values 唔變。

Slide 10 只係一張插圖(實驗室人員操作機器),引入下一個例子,冇額外內容。

3. Real data:Machines(slides 11–16)

Slide 11:Six workers were chosen randomly to operate each machine three times.(Source:Pinheiro and Bates,R package MEMSS)

  • Worker:worker 嘅 unique identifier(1–6,staff ID)
  • Machine:machine brand(A / B / C)
  • score:productivity score(Y)

總共 6×3×3=546 \times 3 \times 3 = 54 個 observations。

3.1 Worker 雖然係數字,都係 categorical(slides 12–14)

Slide 12 good format:每行 (Worker, Machine, Score)。Worker 用 1–6 表示,但 1、2、3 只係 ID label——Worker 6 唔係「Worker 1 嘅六倍」。如果唔處理,Python 會當 Worker 係 numerical,只 fit 一條 slope(每加 1 號 worker,score 變幾多),完全冇意思。所以要:

machines_data['Worker'] = machines_data['Worker'].astype('category')

Slide 13 transform 後:Worker 6 levels → 5 dummies(W2–W6,Python 叫 T.2–T.6),Machine 3 levels → 2 dummies(MB、MC,即 T.B、T.C)。Baseline = Worker 1、Machine A。

score=β0+β1W2+β2W3+β3W4+β4W5+β5W6+β6MB+β7MC+error\text{score} = \beta_0 + \beta_1W_2 + \beta_2W_3 + \beta_3W_4 + \beta_4W_5 + \beta_5W_6 + \beta_6M_B + \beta_7M_C + \text{error}
⭐ Parameter 數目

1 (intercept) + (6−1)(6-1) + (3−1)(3-1) = 8 個 β\beta;Df Model = 7(唔計 intercept);Df Residuals = 54−8=4654 - 8 = 46。

📝 註

Slides 12–13 表入面嘅 score(45、65、58…)同 college 例子嘅數字一樣,應該係示範 format 用嘅;slide 16 顯示嘅真實 machines_data 頭幾行係 Worker 1, Machine A:52.0、52.8、53.1。

3.2 Python program(slide 15)

import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
machines_data = pd.read_csv("machines.csv")
machines_data['Worker'] = machines_data['Worker'].astype('category')   # ID → categorical
model = smf.ols('score ~ Worker + Machine', data=machines_data).fit()  # Machine 係 string,自動 categorical
print(model.summary())

3.3 讀 output(slide 16)

項目值
No. Observations / Df Residuals / Df Model54 / 46 / 7
R-squared / Adj. R-squared0.867 / 0.847
F-statistic / Prob (F)42.83 / 4.61e-18
AIC / BIC284.9 / 300.8
coefstd errtP>|t|[0.0250.975]
Intercept53.61671.21744.0590.00051.16756.066
Worker[T.2]−2.92221.490−1.9610.056−5.9220.078
Worker[T.3]5.21111.4903.4960.0012.2118.211
Worker[T.4]−1.33331.490−0.8950.376−4.3331.667
Worker[T.5]1.81111.4901.2150.231−1.1894.811
Worker[T.6]−10.33331.490−6.9330.000−13.333−7.333
Machine[T.B]7.96671.0547.5590.0005.84510.088
Machine[T.C]13.91671.05413.2050.00011.79516.038

Slide 16 用紅框圈住 Worker[T.2] … Machine[T.C]——即係 slide 13 嘅 dummy columns,T. = Treatment coding(同 baseline 比較)。

⭐ 點樣解讀(考試寫法)
  • Intercept 53.6167:baseline 組合(Worker 1 用 Machine A)嘅預測 score。
  • Machine[T.B] 7.9667:同一個 worker(holding worker constant),用 Machine B 比 Machine A 平均高 7.97 分;p=0.000p = 0.000 → 顯著。
  • Machine[T.C] 13.9167:Machine C 比 A 平均高 13.92 分;C vs B:13.9167−7.9667=5.9513.9167 - 7.9667 = 5.95。
  • Worker[T.6] −10.3333:喺同一部機上,Worker 6 平均比 Worker 1 低 10.33 分(顯著,CI [−13.333,−7.333][-13.333, -7.333] 唔包 0)。
  • Worker[T.2] −2.9222,p=0.056>0.05p = 0.056 > 0.05:喺 5% level,冇足夠證據話 Worker 2 同 Worker 1 唔同(CI [−5.922,0.078][-5.922, 0.078] 包 0)。T.4、T.5 亦唔顯著。
  • t=coef/std errt = \text{coef}/\text{std err}:7.9667/1.054=7.5597.9667/1.054 = 7.559 ✔
⭐ 手計 prediction

Worker 3 用 Machine C:53.6167+5.2111+13.9167=72.744553.6167 + 5.2111 + 13.9167 = 72.7445。
Worker 6 用 Machine B:53.6167−10.3333+7.9667=51.250153.6167 - 10.3333 + 7.9667 = 51.2501。
Worker 1 用 Machine A:只有 intercept = 53.6167。

💡 呢個 model 隱含嘅假設

Machine 嘅 effect 對所有 workers 一樣(例如 C 永遠比 A 高 13.92,唔理邊個 worker)——即係冇 interaction。如果某啲 worker 特別擅長某部機,就要加 Worker:Machine interaction(見 §5.3)。

4. Polynomials 同 transformations(slides 17–22)

Slide 17:multiple linear regression 假設 linear relationship,但 linear relationship does not always hold。呢個時候可以加原數據嘅 squares、cubes……

Y=β0+β1X+β2X2+error(Y=mileage, X=horsepower)Y = \beta_0 + \beta_1 X + \beta_2 X^2 + \text{error} \qquad (Y = \text{mileage},\ X = \text{horsepower})

Slide 18:用教科書 Python package ISLP 入面嘅 dataset “Auto”。If a transformed value is used, the formula need to be bracketed to avoid confusion:

model = smf.ols('y ~ x + I(x**2)', data=data).fit()   # smf 可以用 string formula 指定 model
# Auto 例子(ISLP):
# from ISLP import load_data
# Auto = load_data('Auto')
# model = smf.ols('mpg ~ horsepower + I(horsepower**2)', data=Auto).fit()
⭐ Polynomial regression 仍然係 “linear” regression

“Linear” 指 model 對 parameters β\beta 係線性,唔係對 X。將 X2X^2 當成另一個 predictor X2X_2,就係普通 multiple linear regression,OLS / β^=(X′X)−1X′Y\hat\beta=(X'X)^{-1}X'Y 照用。

💡 Quadratic term 點解讀

X 嘅 effect 唔再係常數:dYdX=β1+2β2X\dfrac{dY}{dX} = \beta_1 + 2\beta_2X。β2>0\beta_2 > 0 → 向上彎(U 形);β2<0\beta_2 < 0 → 向下彎(∩ 形),轉折點喺 X=−β1/(2β2)X = -\beta_1/(2\beta_2)。例如(假設數字)Y^=10+4X−0.5X2\hat Y = 10 + 4X - 0.5X^2:X=4X = 4 時 Y 最高;X<4X < 4 時 X 越大 Y 越大,X>4X > 4 之後反而下降。所以唔好單獨解讀 β1\beta_1。

4.1 Formula syntax(slides 19–21)

⭐ Basic formula structure & common operators(slide 19)
model = smf.ols(formula="y ~ x1 + x2", data=df).fit()   # y = dependent;x1, x2 = independent
OperatorMeaningExampleEquivalent expansion / result
~分隔 dependent(左)同 independent variables(右)y ~ x1
+Add variabley ~ x1 + x2包括 x1x_1 同 x2x_2
-Remove variable or intercepty ~ x1 - 1包括 x1x_1,without an intercept
:Interaction termy ~ x1:x2只有 product x1×x2x_1 \times x_2
*Main effects and interactionsy ~ x1*x2y ~ x1 + x2 + x1:x2

Slide 20:I() function 叫 formula processor 將括號入面嘅 operators 當成普通數學運算,唔係 formula operators:

# 包括 x1、x2 同 x2 嘅平方
model = smf.ols(formula="y ~ x1 + x2 + I(x2**2)", data=df).fit()
⚠️ 唔加 I() 會靜靜雞錯

喺 formula 入面 ** 係 formula operator(interaction 嘅次方),x**2 會被理解成 x 同自己嘅 interaction = 就係 x。我喺 statsmodels 0.15 試過:'y ~ x + x**2' 只 fit 到 Intercept 同 x,冇報錯、冇 x2x^2。同樣 y ~ x1 + x2 唔等於 y ~ I(x1 + x2):前者兩個 predictors,後者一個(兩者之和)。

Slide 20 Pro-Tip:fit 高次 polynomial(cubic、quartic)寫好多個 I() 好麻煩,可以用 poly() 生成 orthogonal polynomials:

# 自動生成 x2 嘅 linear 同 quadratic terms
model = smf.ols(formula="y ~ x1 + poly(x2, degree=2, raw=True)", data=df).fit()
⚠️ poly() 唔係個個版本都用到

我喺 statsmodels 0.15(預設用 patsy 處理 formula)試 poly(x, degree=2, raw=True),出 NameError: name 'poly' is not defined。如果你部機都係咁,就照用 I(x**2) + I(x**3)。另外 raw=True 係直接用 x,x2x, x^2;raw=False 先係 orthogonal polynomials。

⭐ Categorical variables & functions(slide 21)
  • C():text strings 或者包喺 C() 入面嘅 variables 自動當 categorical(one-hot encoded),first alphabetical category dropped as the baseline intercept。例:y ~ C(group);machines 例子可以寫 C(Worker) 代替 astype('category')。
  • NumPy / custom functions:可以直接喺 formula 用 vectorized functions,例:np.log(y) ~ x1 + np.sqrt(x2)。
  • Q():column 名有空格或特殊字符時用,例:Q('dependent var') ~ Q('independent var')。
💡 Baseline = 第一個 alphabetical category

College 例子:Engineering < Humanity < Science(字母次序)→ Engineering 係 baseline,所以 output 係 College[T.Humanity]、College[T.Science]。Machine:A 係 baseline。想換 baseline:C(College, Treatment('Science')) → 得到 Intercept 58.8、Engineering −2.8、Humanity 2.45(我實際跑過)。

4.2 Beyond polynomials(slide 22)

Non-linear modelTransform 成 linearsmf formula
Y=a ebXY = a\,e^{bX}(exponential)log⁡Y=log⁡a+bX\log Y = \log a + bXnp.log(y) ~ x
Y=aXbY = aX^b(power)log⁡Y=log⁡a+blog⁡X\log Y = \log a + b\log Xnp.log(y) ~ np.log(x)
Y=a+bXY = a + \dfrac{b}{X}(reciprocal)本身已經對 a、b 線性,predictor 係 1/X1/Xy ~ I(1/x)

(Slide 寫 log⁡Y=a+bX\log Y = a + bX,嗰度嘅 a 其實係 transform 後嘅 intercept log⁡a\log a。)

💡 Log transform 嘅解讀

log⁡Y=a+bX\log Y = a + bX:X 加 1,Y 大約變 100b%100b\%(b 細嗰陣)。log⁡Y=a+blog⁡X\log Y = a + b\log X:X 加 1%,Y 大約變 b%b\%——即 elasticity。Log Y 亦常用嚟處理 Module 4 提過嘅 heteroskedasticity(漏斗形 residuals)。注意 log 只適用於正數。

5. Interaction terms(slides 23–28)

5.1 咩係 interaction(slide 23)

數學上,A 同 B 嘅 interaction term 就係 AB(相乘)。Slide 23 用打印機做例子:

Value(Printer)+Value(Ink)  <  Value(Printer + Ink)\text{Value(Printer)} + \text{Value(Ink)} \;<\; \text{Value(Printer + Ink)}

單獨一部 printer(冇墨)或者單獨一盒 ink(冇機)價值都好低,合埋先有用——complementary effect。合埋多出嚟嗰部分(the extra)就係 interaction。

⭐ 冇 interaction vs 有 interaction
冇 interaction有 interaction
ModelY=β0+β1A+β2BY=\beta_0+\beta_1A+\beta_2BY=β0+β1A+β2B+β3ABY=\beta_0+\beta_1A+\beta_2B+\beta_3AB
A 對 Y 嘅 effectβ1\beta_1(固定,唔理 B 係幾多)β1+β3B\beta_1+\beta_3B(隨 B 改變)
Effect 點樣加埋Additive:各自貢獻相加合埋有額外(β3>0\beta_3>0,complementary)或者抵消(β3<0\beta_3<0)
💡 數字例子(假設數字,唔係 slides 嘅 output)

Y^=10+2A+3B+4AB\hat Y = 10 + 2A + 3B + 4AB。
B=0B = 0:A 每加 1,Y 加 2。B=1B = 1:A 每加 1,Y 加 2+4=62 + 4 = 6。
A = 1、B = 1 時:10+2+3+4=1910 + 2 + 3 + 4 = 19;如果只係 additive(冇 4AB4AB)就係 15——多出嘅 4 就係 interaction(printer + ink 嘅 “extra”)。

5.2 Continuous × continuous(slide 24)

Y=β0+β1A+β2B+β3AB+error(Y=mileage, A=horsepower, B=weight)Y = \beta_0 + \beta_1A + \beta_2B + \beta_3AB + \text{error} \qquad (Y=\text{mileage},\ A=\text{horsepower},\ B=\text{weight})
# 同樣用 ISLP 嘅 Auto dataset;Python 入面 interaction term 寫 A:B
model = smf.ols('y~A+B+A:B', data=data).fit()
# 等同 smf.ols('y~A*B', data=data).fit()
# Auto:smf.ols('mpg ~ horsepower + weight + horsepower:weight', data=Auto).fit()

直覺:horsepower 對 mileage 嘅影響,可能取決於架車有幾重——β3\beta_3 量度呢個「取決於」。Slides 冇提供呢個 model 嘅 output,所以呢度唔列數字。

⚠️ 常見錯誤

加 interaction 時通常要保留 main effects(用 A*B 或 A+B+A:B),唔好淨係寫 y ~ A:B——後者只有 product 一項,等於假設 A、B 各自冇 effect。有 interaction 時,β1\beta_1 只代表 B=0B = 0 時 A 嘅 effect,唔可以再講「A 每加 1,Y 變 β1\beta_1」。

5.3 Categorical × categorical(slides 25–27)

Slide 25:用 statsmodels.formula.api,

  • A 有 3 categories(Eng / Sci / Hum)→ 2 個 dummy variables(AS,AHA_S, A_H)
  • B 有 4 categories(Year 1 / 2 / 3 / 4)→ 3 個 dummy variables(B2,B3,B4B_2, B_3, B_4)
  • Interaction terms(最少)=2×3== 2 \times 3 = 6:ASB2,ASB3,ASB4,AHB2,AHB3,AHB4A_SB_2, A_SB_3, A_SB_4, A_HB_2, A_HB_3, A_HB_4
  • Python output 命名:例如 ASB2A_SB_2 會顯示成 A[T.S]:B[T.2](slide 寫 “T.S T.2”)
⭐ 數 terms 公式

A 有 kAk_A 個 categories、B 有 kBk_B 個:

1⏟intercept+(kA−1)⏟A+(kB−1)⏟B+(kA−1)(kB−1)⏟A:B=kAkB\underbrace{1}_{\text{intercept}} + \underbrace{(k_A-1)}_{A} + \underbrace{(k_B-1)}_{B} + \underbrace{(k_A-1)(k_B-1)}_{A:B} = k_A k_B

College × Year:1+2+3+6=12=3×41 + 2 + 3 + 6 = 12 = 3 \times 4。Machines(Worker × Machine):1+5+2+10=18=6×31 + 5 + 2 + 10 = 18 = 6 \times 3——即每個 worker-machine 組合有自己嘅平均。每個組合有 3 次重複,所以 residual df = 54−18=3654 - 18 = 36。

Slides 26–27:同一個 machines data 加 interaction——即係問「Machine 嘅 effect 係咪對每個 worker 都一樣?」

machines_data = pd.read_csv("machines.csv")
# Approach 1:先轉 category,再明確寫 main effects + interaction
machines_data['Worker'] = machines_data['Worker'].astype('category')
model = smf.ols('score ~ Worker + Machine + Worker:Machine', data=machines_data).fit()
model.summary()
# Approach 2:用 C() 同 *,一行搞掂(結果一樣)
model = smf.ols('score ~ C(Worker)*Machine', data=machines_data).fit()
💡 點解呢個 data 可以 fit interaction?

因為每個 worker 喺每部機都做咗 3 次。如果每個組合只得 1 個 observation,18 個 parameters fit 18 個數據點會 perfect fit(residual df = 0),冇辦法估計 error,亦做唔到 test。Slides 冇提供 interaction model 嘅 output。

5.4 Higher-order interactions(slide 28)

y ~ A*B*C     # All terms:A + B + C + A:B + A:C + B:C + A:B:C
y ~ A:B:C     # Only ABC(只有三者相乘一項)
層次A, B, C 嘅例子數目
Main effectsA, B, C3
Second-order interactionsAB, AC, BC3
Third-order interactionsABC1
Higher-order interactions(4 個或以上 variables 相乘)less important
💡 點解 higher-order 冇咁重要

Terms 數目增長得好快(categorical 仲要乘 dummy 數),parameters 多咗 → Module 4 講嘅 overfitting、要好多數據;而且三個以上 variables 嘅 interaction 好難解讀。實務上通常只考慮 main effects 同 second-order interactions,再用 AIC / BIC / out-of-sample RMSE 決定留唔留。

自我測驗 Self-test

Q1. Variable “Region” 有 North / East / South / West / Central 5 個 categories。Regression(有 intercept)要幾多個 dummy variables?如果用 one-hot encoding 全部放入去會點?

5−1=45 - 1 = 4 個。放晒 5 個 + intercept:5 個 dummies 每行加埋都係 1,同 intercept column 一樣 → perfect multicollinearity(dummy variable trap),X′XX'X 冇 inverse,OLS 冇唯一解。Python C(Region) 會自動 drop 第一個 alphabetical category(Central)做 baseline。

Q2. Y^=70−4XB+6XC\hat Y = 70 - 4X_B + 6X_C(baseline = Group A)。計三組嘅預測值,並解讀 −4-4。B 同 C 差幾多?

A = 70;B = 66;C = 76。−4-4:Group B 平均比 baseline Group A 低 4 單位。C − B = 6−(−4)=106 - (-4) = 10。

Q3. 數據:Group P:10, 14;Group Q:20, 22, 24;Group R:5, 7。用 y ~ C(group) fit,寫出 fitted equation。

組平均:P = 12、Q = 22、R = 6。Baseline = P(字母最前)。Y^=12+10XQ−6XR\hat Y = 12 + 10X_Q - 6X_R。

Q4. 用 machines output(slide 16):預測 Worker 5 用 Machine C 嘅 score;Worker 3 同 Worker 6 用同一部機,差幾多?

Worker 5, C:53.6167+1.8111+13.9167=69.344553.6167 + 1.8111 + 13.9167 = 69.3445。Worker 3 − Worker 6 = 5.2111−(−10.3333)=15.54445.2111 - (-10.3333) = 15.5444(冇 interaction,所以任何一部機都係呢個差)。

Q5. Worker[T.2] 嘅 coef = −2.9222,p=0.056p = 0.056,95% CI [−5.922,0.078][-5.922, 0.078]。用 α=0.05\alpha = 0.05 寫結論。

H0:β=0H_0: \beta = 0(Worker 2 同 Worker 1 喺同一部機嘅平均 score 一樣)。p=0.056>0.05p = 0.056 > 0.05,CI 包 0 → do not reject H0H_0:喺 5% level 冇足夠證據話 Worker 2 同 Worker 1 有分別。

Q6. 點解 Worker(數值 1–6)要 astype('category')?唔做會 fit 咗咩 model?

Worker 號碼只係 ID label,冇大小意義。唔轉嘅話會當 numerical,只 fit 一個 slope:score=β0+β1⋅Worker+⋯\text{score} = \beta_0 + \beta_1\cdot\text{Worker} + \cdots,即假設 worker 號碼每加 1,score 線性變 β1\beta_1——毫無意義,亦只用 1 個 parameter 而唔係 5 個。

Q7. 以下 formula 各自 fit 咗咩 terms?(a) y ~ x + x**2 (b) y ~ x + I(x**2) (c) y ~ a*b (d) y ~ a:b - 1

(a) Intercept、x——** 被當 formula operator,冇 x2x^2!(b) Intercept、x、x2x^2。(c) Intercept、a、b、a:b。(d) 只有 a × b,冇 intercept。

Q8. Y^=5+1.5A+2B−0.5AB\hat Y = 5 + 1.5A + 2B - 0.5AB。B = 0 同 B = 4 時,A 加 1 單位 Y 變幾多?呢個 interaction 係 complementary 定係抵消?

A 嘅 effect = 1.5−0.5B1.5 - 0.5B。B = 0:+1.5;B = 4:1.5−2=−0.51.5 - 2 = -0.5。β3<0\beta_3 < 0:B 越大,A 嘅正面 effect 越細甚至反轉——抵消(唔係 complementary)。

Q9. A = Faculty(4 categories),B = Gender(2),C = Mode(Full-time / Part-time)。y ~ A*B*C 有幾多個 parameters(包括 intercept)?

Dummies:A 3、B 1、C 1。Main:3+1+1=53+1+1=5;second-order:AB=3, AC=3, BC=1AB=3,\ AC=3,\ BC=1,共 7;third-order:ABC=3ABC = 3。總數 1+5+7+3=16=4×2×21+5+7+3 = 16 = 4\times2\times2。

Q10. 寫出 Y=aXbY = aX^b 嘅 linearised form 同 smf formula。如果 fit 出 slope = 0.8,點解讀?

log⁡Y=log⁡a+blog⁡X\log Y = \log a + b\log X;smf.ols('np.log(y) ~ np.log(x)', data=df).fit()。b=0.8b = 0.8:X 增加 1%,Y 大約增加 0.8%(elasticity)。

一頁總結 Cheat sheet

⭐ 考前速記
  • Categorical X 唔可以直接乘 β\beta → dummy variables;k categories → k−1k-1 dummies(2→1、3→2、7→6);全 0 嗰個 = baseline。
  • One-hot(DM,pd.get_dummies)= k columns;regression 有 intercept 時放 k 個 → dummy variable trap(X′XX'X singular)。drop_first=True → k−1k-1。
  • Good format:所有 Y 喺同一 column(long format,melt())。
  • Y^=56+5.25XH+2.8XS\hat Y = 56 + 5.25X_H + 2.8X_S:Eng 56、Hum 61.25、Sci 58.8;intercept = baseline 平均,dummy coef = 同 baseline 嘅差(= 組平均差)。
  • Python:astype('category') 或 C(var);baseline = first alphabetical;C(x, Treatment('B')) 換 baseline;output 名 Var[T.level]。
  • Machines:score ~ Worker + Machine,8 params,df 46,R2=0.867R^2 = 0.867;Intercept 53.6167(W1, A);B +7.9667、C +13.9167;W6 −10.3333;W2 p=0.056p = 0.056 唔顯著。
  • Polynomial:Y=β0+β1X+β2X2Y=\beta_0+\beta_1X+\beta_2X^2,對 β\beta 仍然 linear;I(x**2)(唔加 I() 會靜靜雞冇咗 x2x^2);effect = β1+2β2X\beta_1+2\beta_2X。
  • Operators:~ 分 Y/X;+ 加;-1 冇 intercept;: 只有 product;* = main + interaction;I() 數學運算;Q() 特殊 column 名;np.log() 可直接用。
  • Transform:Y=aebX→log⁡Y=log⁡a+bXY=ae^{bX} \to \log Y=\log a+bX;Y=aXb→log⁡Y=log⁡a+blog⁡XY=aX^b \to \log Y=\log a+b\log X;Y=a+b/XY=a+b/X 用 I(1/x)。
  • Interaction = AB;complementary effect(printer + ink);∂Y/∂A=β1+β3B\partial Y/\partial A=\beta_1+\beta_3B;保留 main effects。
  • Categorical interaction:(kA−1)(kB−1)(k_A-1)(k_B-1) terms(3×4 → 6);總 params = kAkBk_Ak_B;Worker + Machine + Worker:Machine ≡ C(Worker)*Machine。
  • y~A*B*C = 3 main + 3 second-order + 1 third-order;y~A:B:C 只有 ABC;higher-order 較唔重要。