ANCOVA 도입과 RBD 의 ANCOVA — 농학·산업 사례

Montgomery Ch.8.1-8.2 ANCOVA Intro · ANCOVA for RBD

RBD 설계에 covariate 를 추가한 ANCOVA 모형의 적합 절차, ANOVA 표 해석, 보정 평균 (adjusted means) 계산, 검정력 비교를 농학적 사례로 정리한다. Maxwell Ch.9 의 임상 ANCOVA 와의 차이, 회귀 동질성 가정, 실무 적용까지 통합 다룬다.

Experimentation
DOE
저자

Kwangmin Kim

공개

2026년 05월 08일

1 RBD with Covariate

정의: RBD ANCOVA Model

\[ Y_{ij} = \mu + \tau_j + \beta_i + \gamma(X_{ij} - \bar X) + \varepsilon_{ij} \]

  • \(\tau_j\): 처치 (fixed).
  • \(\beta_i\): 블록 효과.
  • \(\gamma\): covariate 의 회귀 계수.
  • \(X_{ij}\): covariate (예: 초기 식물 크기).
  • \(\varepsilon \sim N(0, \sigma^2)\).

ANOVA 의 일반화 — block 통제 + covariate 통제.

2 농학 사례

2.1 가상 실험

5 비료 (A, B, C, D, E) × 4 농장 (블록). 각 셀에 1 plot. \(Y\): 수확량 (kg/plot). \(X\): 토양 비옥도 점수 (사전 측정).

가상 데이터:

농장 비료 \(X\) \(Y\)
1 A 60 35
1 B 60 40
1 C 60 30
1 D 60 45
1 E 60 33
2 A 80 50
2 B 80 55

각 농장 내 \(X\) 가 비슷 (block effect 통제) 하지만 각 plot 의 미세 변동 잔존.

3 ANOVA vs ANCOVA 비교

3.1 ANOVA (covariate 무시)

Source \(SS\) \(df\) \(MS\) \(F\)
비료 240 4 60 \(60 / 6 = 10.0\)
농장 800 3 267 \(267/6 = 44\)
잔차 72 12 6

3.2 ANCOVA

covariate 통제 후:

Source \(SS\) \(df\) \(MS\) \(F\)
비료 (adjusted) 240 4 60 \(60 / 3 = 20.0\)
농장 (adjusted) 50 3 17
Covariate (\(X\)) 750 1 750
잔차 33 11 3

(가상 수치 — 실제 데이터에 따라 변동.)

비료 검정력: \(F\)\(10 \to 20\) 으로 증가. covariate 가 잡음의 일부를 설명.

농장 효과의 SS 가 줄음: 농장 간 차이의 일부가 토양 비옥도로 흡수.

직관: covariate 가 블록의 일부를 대체

블록 (농장) 의 효과는 토양 비옥도, 일조량, 배수성 등의 종합. covariate \(X\) (토양 비옥도) 가 그 일부를 명시적으로 측정 → 블록 효과의 SS 감소, 잔차도 감소.

이것이 ANCOVA 의 농학적 가치 — 블록 효과를 더 세밀하게 설명할수록 처치 효과의 검정력 ↑.

또 ANCOVA 는 연속 측정 의 covariate 를 활용 (이산 block 이 아닌). 더 풍부한 정보.

4 보정 평균 (Adjusted Means)

각 처치의 보정 평균: \[ \bar Y_j^{\text{adj}} = \bar Y_j - \hat\gamma (\bar X_j - \bar X) \]

각 비료 그룹 내 covariate 가 우연히 다를 때 보정.

4.1 가상 결과

비료 \(\bar Y_j\) \(\bar X_j\) \(\bar Y_j^{\text{adj}}\)
A 42 70 41.5
B 47 70 46.5
C 38 70 37.5
D 52 70 51.5
E 41 70 40.5

이 경우 모든 covariate 평균이 같아 보정이 minimal. 다르면 보정 차이 ↑.

5 회귀 동질성 가정

함정: 회귀 동질성 위반

ANCOVA 는 모든 처치 그룹이 같은 \(\gamma\) 가정. 위반 시: - 처치 × covariate interaction 존재. - 처치 효과가 covariate 수준에 따라 달라짐 (HTE).

검정: \[ F_{\text{slope}} = \frac{SS(\text{slope difference})}{MS_E^{\text{full}}} \]

유의면 ANCOVA 부적합. Johnson-Neyman 절차 또는 separate analysis.

6 검정력 비교

분석 비료 \(F\) \(df_E\)
CRD (블록·covariate 무시) 3 16
RBD (covariate 무시) 10 12
ANCOVA (covariate 추가) 20 11

각 단계마다 잔차 분산 ↓ → 검정력 ↑.

7 Maxwell Ch.9 와의 비교

Maxwell G-MAX9 Montgomery G-MON8
응용 분야 임상·심리 농학·산업
강조점 Lord’s paradox, change score 결측, 변환, 비균등 설계
데이터 교육 점수, SBP 수확량, 수율
처치 모형 CRD, RBD RBD, Latin Square, factorial
변환 부수적 핵심 (heteroscedasticity 통제)

본 시리즈는 두 시각의 통합.

8 Python 코드

import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols

np.random.seed(2026)
fertilizers = ["A", "B", "C", "D", "E"]
farms = list(range(4))
fert_eff = {"A": 0, "B": 5, "C": -3, "D": 9, "E": -1}
farm_eff = {0: -10, 1: 5, 2: -8, 3: 13}
gamma = 0.6  # 토양 비옥도의 회귀 계수

records = []
for farm in farms:
    farm_baseline = 50 + farm_eff[farm]
    for fert in fertilizers:
        X = farm_baseline + np.random.normal(0, 3)  # 토양 비옥도
        Y_true = 40 + fert_eff[fert] + farm_eff[farm] + gamma * (X - 50)
        Y = Y_true + np.random.normal(0, 2)
        records.append({"farm": farm, "fertilizer": fert, "X": X, "Y": Y})

data = pd.DataFrame(records)

# 1) ANOVA (covariate 무시)
model_anova = ols("Y ~ C(fertilizer) + C(farm)", data=data).fit()
print("=== ANOVA (no covariate) ===")
print(sm.stats.anova_lm(model_anova, typ=2).round(3))

# 2) ANCOVA
model_ancova = ols("Y ~ C(fertilizer) + C(farm) + X", data=data).fit()
print("\n=== ANCOVA (with covariate X) ===")
print(sm.stats.anova_lm(model_ancova, typ=2).round(3))

# 비교
F_ano = sm.stats.anova_lm(model_anova).loc["C(fertilizer)", "F"]
F_anc = sm.stats.anova_lm(model_ancova).loc["C(fertilizer)", "F"]
print(f"\nF (ANOVA) = {F_ano:.2f}, F (ANCOVA) = {F_anc:.2f}")
print(f"검정력 ratio: {F_anc / F_ano:.2f}")

# Adjusted means
gamma_hat = model_ancova.params["X"]
mean_X = data["X"].mean()
adjusted = {}
for fert in fertilizers:
    sub = data[data["fertilizer"] == fert]
    adj = sub["Y"].mean() - gamma_hat * (sub["X"].mean() - mean_X)
    adjusted[fert] = adj
print("\n=== Adjusted means ===")
for fert, v in adjusted.items():
    raw = data[data["fertilizer"] == fert]["Y"].mean()
    print(f"  {fert}: raw = {raw:.2f}, adjusted = {v:.2f}")

# 회귀 동질성 검정
model_full = ols("Y ~ C(fertilizer) * X + C(farm)", data=data).fit()
F_slope = (model_ancova.ssr - model_full.ssr) / (len(fertilizers) - 1)
F_slope /= model_full.mse_resid
from scipy import stats
p_slope = 1 - stats.f.cdf(F_slope, len(fertilizers) - 1, model_full.df_resid)
print(f"\n=== Slope homogeneity test ===")
print(f"F = {F_slope:.2f}, p = {p_slope:.4f}")

9 가정과 한계

  • 회귀 동질성: 모든 처치 그룹이 같은 \(\gamma\) 가정.
  • 선형성: \(X\)\(Y\) 의 관계가 선형. 위반 시 다항식.
  • 공변량의 처치 전 측정: covariate 가 처치에 영향받지 않음.
  • 결측 데이터: covariate 결측 시 분석 어려움.

10 응용

분야 처치 공변량
농학 비료 토양 비옥도, 초기 식물 크기
임상 약물 baseline 점수
산업 공정 machine 의 calibration
동물 사료 초기 체중, 성별
교육 교수법 IQ, 사전 지식
IT UI 변종 사용자 사전 활동

11 ML 매핑

매핑: ML 의 baseline-controlled comparison

ML 모델 평가에서 baseline accuracy 통제:

Treatment: 모델 (A, B, C, D)
Block: dataset (4 datasets)
Covariate: baseline accuracy (어느 simple model 의 accuracy)

분석: \[ \text{accuracy}_{ij} = \mu + \tau_j + \beta_i + \gamma \cdot \text{baseline}_{ij} + \varepsilon \]

baseline 이 dataset 의 difficulty 를 측정 → 잔차 ↓ → 처치 (모델) 검정력 ↑.

이는 ML 의 systematic baseline-controlled 비교의 통계적 형식.

12 본 시리즈

G-MON8-0  개관
G-MON8-1  ANCOVA + RBD  ← 현재 글
G-MON8-2  CRD/Latin/비직교
G-MON8-3  비직교 + 다중 공변량
G-MON8-4  결측과 변환

13 관련 주제

선행 지식

후속 주제

14 더 읽을 거리

  • Cochran, W. G., Cox, G. M. (1957). “Experimental Designs” (2nd ed). Wiley.
  • Pearce, S. C. (1983). “The Agricultural Field Experiment.” Wiley.
  • Snedecor, G. W., Cochran, W. G. (1989). “Statistical Methods” (8th ed). Iowa State.
  • Maxwell, S. E., Delaney, H. D. (2004). “Designing Experiments and Analyzing Data.”

Subscribe

Enjoy this blog? Get notified of new posts by email: