1 정의
처치 그룹 \(j = 1, \ldots, a\), 그룹 내 피험자 \(i = 1, \ldots, n\) 에 대해
\[ Y_{ij} = \mu + \alpha_j + \beta(X_{ij} - \bar X) + \varepsilon_{ij} \]
제약: \(\sum_j \alpha_j = 0\), \(\varepsilon \sim N(0, \sigma^2)\) iid.
가정: 1. 선형성: \(X\) 와 \(Y\) 의 관계가 선형. 2. 회귀 동질성: 모든 그룹이 같은 기울기 \(\beta\) 를 가진다. 3. 공변량의 처치 전 측정: \(X\) 가 처치에 영향받지 않음. 4. 정규성·등분산: \(\varepsilon\) 의 표준 가정. 5. 공변량 측정 무오차: \(X\) 가 신뢰성 있게 측정됨 (위반 시 attenuation bias).
2 모형 비교 — 처치 효과 검정
ANCOVA 의 처치 효과 \(\alpha_j\) 의 통계적 유의성 검정은 두 모형의 SSE 차이.
| 모형 | 식 | 자유도 |
|---|---|---|
| Full (ANCOVA) | \(Y = \mu + \alpha_j + \beta(X - \bar X) + \varepsilon\) | \(N - a - 1\) |
| Restricted (Reg only) | \(Y = \mu + \beta(X - \bar X) + \varepsilon\) | \(N - 2\) |
\[ SS_{\text{treatment} | X} = E_{\text{Restricted}} - E_{\text{Full}} \]
자유도 \(a - 1\). \(F\) 통계량: \[ F = \frac{SS_{\text{treatment} | X} / (a-1)}{MS_W^{\text{ANCOVA}}} \]
이는 “공변량 \(X\) 를 통제한 후의 처치 효과” 를 검정한다.
3 회귀 동질성 검정
회귀 동질성 = 모든 그룹의 \(\beta\) 가 같다는 가정. 검정은 모형 비교:
| 모형 | 식 | 자유도 |
|---|---|---|
| 동질성 ANCOVA | \(Y = \mu + \alpha_j + \beta(X - \bar X) + \varepsilon\) | \(N - a - 1\) |
| 이질성 ANCOVA | \(Y = \mu + \alpha_j + \beta_j(X - \bar X) + \varepsilon\) | \(N - 2a\) |
\[ SS_{\text{slope difference}} = E_{\text{동질}} - E_{\text{이질}} \]
자유도 \(a - 1\). \(F\) 통계량: \[ F_{\text{slope}} = \frac{SS_{\text{slope difference}} / (a-1)}{MS_W^{\text{이질}}} \]
비유의 (\(p > 0.05\)) 면 동질성 가정을 받아들이고 ANCOVA 진행. 유의면 alternative analysis (G-MAX9-3).
- 검정력 부족: 자유도가 \(a-1\) 의 작은 효과 — 비유의가 “동질성 보장” 이 아닐 수 있음.
- 사후 검정: 동질성 검정 후 ANCOVA 진행은 multistep 절차로 Type I error 가 부풀려짐.
권장: 시각적 점검 (그룹별 scatterplot + 회귀선) 을 항상 동반. 기울기가 명백히 다르면 검정 결과와 무관하게 alternative 사용.
4 가설 데이터 — 3 그룹 ANCOVA
처치: 약 A, 약 B, 위약. 각 \(n = 10\). 공변량 \(X\) = baseline SBP, 응답 \(Y\) = 6 주 후 SBP.
| 그룹 | \(\bar X_j\) | \(\bar Y_j\) |
|---|---|---|
| A | 165 | 145 |
| B | 158 | 152 |
| Control | 162 | 160 |
전체 \(\bar X = 161.7\), \(\bar Y = 152.3\). 모집된 회귀 기울기 \(\hat\beta = 0.5\) (가설).
4.1 Step 1 — ANOVA (X 무시)
\[ SS_{\text{treatment}}^{\text{ANOVA}} = n \sum_j (\bar Y_j - \bar Y)^2 \] \[ = 10[(145-152.3)^2 + (152-152.3)^2 + (160-152.3)^2] \] \[ = 10[53.3 + 0.09 + 59.3] = 1126.7 \]
4.2 Step 2 — ANCOVA
\(\bar Y_j^{\text{adj}} = \bar Y_j - \hat\beta(\bar X_j - \bar X)\):
| 그룹 | adj |
|---|---|
| A | \(145 - 0.5 \times 3.3 = 143.4\) |
| B | \(152 - 0.5 \times (-3.7) = 153.9\) |
| Control | \(160 - 0.5 \times 0.3 = 159.9\) |
\(\bar Y^{\text{adj}} = 152.4\) (≈ grand mean).
\[ SS_{\text{treatment} | X} = n \sum_j (\bar Y_j^{\text{adj}} - \bar Y)^2 \] \[ = 10[(143.4-152.3)^2 + (153.9-152.3)^2 + (159.9-152.3)^2] \] \[ = 10[79.2 + 2.6 + 57.8] = 1396 \]
(가설 데이터 — baseline 보정 후 처치 효과가 더 크게 잡힌다.)
ANCOVA 의 \(MS_W\) 는 ANOVA 보다 작다 (공변량 통제로 분산 감소). 두 효과가 결합되어 ANCOVA 의 \(F\) 가 ANOVA 보다 크다.
5 회귀 동질성 시각적 점검
Y │
│ *(A, slope=0.5)
│ *
│*
│
│ o(B, slope=0.6)
│ o
│ o
│
│ △(C, slope=0.4)
│ △
│ △
│
└─────────────────── X
세 회귀선의 기울기가 비슷하면 동질성 OK. 명백히 다르면 ANCOVA 부적절.
6 Python 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
# 가상 데이터: 3 그룹 ANCOVA
np.random.seed(2026)
groups = ["A", "B", "Control"]
n_per_group = 10
beta_true = 0.5
mu_X = {"A": 165, "B": 158, "Control": 162}
mu_Y_unadjusted = {"A": 145, "B": 152, "Control": 160}
records = []
for g in groups:
X = np.random.normal(mu_X[g], 5, n_per_group)
Y = mu_Y_unadjusted[g] + beta_true * (X - mu_X[g]) + np.random.normal(0, 3, n_per_group)
for x, y in zip(X, Y):
records.append({"group": g, "X": x, "Y": y})
data = pd.DataFrame(records)
# Step 1 — ANOVA only (X 무시)
anova_model = ols("Y ~ C(group, Sum)", data=data).fit()
print("=== ANOVA (X ignored) ===")
print(sm.stats.anova_lm(anova_model, typ=2).round(3))
# Step 2 — ANCOVA (baseline 통제)
ancova_model = ols("Y ~ C(group, Sum) + X", data=data).fit()
print("\n=== ANCOVA ===")
print(sm.stats.anova_lm(ancova_model, typ=2).round(3))
print(f"\nbeta estimate: {ancova_model.params['X']:.3f} (true = {beta_true})")
# Step 3 — Homogeneity of regression test
ancova_full_model = ols("Y ~ C(group, Sum) * X", data=data).fit()
print("\n=== Homogeneity test (slopes equal across groups?) ===")
hom_anova = sm.stats.anova_lm(ancova_full_model, typ=2)
print(hom_anova.round(3))
slope_int_row = hom_anova.loc["C(group, Sum):X"]
print(f"\nSlope difference F = {slope_int_row['F']:.2f}, p = {slope_int_row['PR(>F)']:.4f}")
if slope_int_row['PR(>F)'] > 0.05:
print(" → 동질성 가정 OK. ANCOVA 결과 신뢰 가능.")
else:
print(" → 동질성 위반. alternative analysis (G-MAX9-3) 진행.")
# Adjusted means
mean_X_overall = data["X"].mean()
adj_means = {}
for g in groups:
sub = data[data["group"] == g]
adj = sub["Y"].mean() - ancova_model.params["X"] * (sub["X"].mean() - mean_X_overall)
adj_means[g] = adj
print(f"\nAdjusted means: {adj_means}")
print(f"Unadjusted means: {data.groupby('group')['Y'].mean().to_dict()}")기대 출력:
=== ANOVA (X ignored) ===
sum_sq df F PR(>F)
C(group, Sum) ~1100 2.0 ~30 ~0.000
Residual ~500 27.0 ...
=== ANCOVA ===
sum_sq df F PR(>F)
C(group, Sum) ~1300 2.0 ~70.0 ~0.000 (← 더 큰 F!)
X ~250 1.0 ~25.0 0.000
Residual ~250 26.0 ...
=== Homogeneity test ===
slope_int F ≈ 0.5, p ≈ 0.6 → 동질성 OK
7 가정 위반의 결과
7.1 회귀 동질성 위반
처치 효과가 baseline 에 따라 달라진다 (HTE). ANCOVA 의 단일 \(\hat\alpha_j\) 추정은 잘못된 평균. 대안: - Johnson-Neyman 절차: 처치 효과가 유의한 baseline 범위를 식별. - Baseline 별 separate analysis: baseline 을 분위수로 나눠 ANCOVA 적용. - Quantile regression: baseline 의 분위별 효과 추정.
7.2 공변량 측정 오차
\(X\) 에 측정 오차가 있으면 회귀 계수 \(\hat\beta\) 가 attenuated (0 쪽으로 편향). 처치 효과 추정도 영향. 대안: - Errors-in-variables regression (Total Least Squares). - Latent variable model — \(X\) 의 측정 변수 여러 개로 latent 추정.
7.3 처치 후 측정 공변량
처치가 \(X\) 에 영향을 미쳤다면 공변량 통제는 처치 효과의 일부를 제거. post-treatment adjustment bias. 절대 피해야 함.
8 가정과 한계 — 종합
- 선형성: 비선형이면 다항식 또는 변환.
- 공변량의 처치 전 측정: 필수.
- 회귀 동질성: 검정 + 시각적 점검.
- 공변량 측정 무오차 (또는 작음): 측정 오차가 크면 attenuation.
- 공변량과 처치의 독립: 무작위 배정 RCT 에서 자동, 관찰 연구에서는 selection bias.
9 관련 주제
선행 지식
후속 주제
다른 카테고리 연결