Nested ANOVA 접근 — 균등 데이터의 EMS 기반 분석

Maxwell Ch.16.1 Nested Design · ANOVA Approach

3-level nested design 의 ANOVA 분해와 EMS 기반 검정 절차. 균등 데이터에서 ML 추정과 거의 동치인 결과를 산출하는 전통적 접근. 분산 성분 추정, ICC 의 정량화, ANOVA approach 의 한계와 ML 추정으로의 자연스러운 확장을 정리한다.

Experimentation
DOE
저자

Kwangmin Kim

공개

2026년 05월 08일

1 3-Level Nested ANOVA

정의: 3-Level Nested ANOVA

학교 (\(A\)) → 학급 (\(B(A)\)) → 학생, 균등 데이터 (\(a\) 학교, \(b\) 학급/학교, \(n\) 학생/학급).

\[ Y_{ijk} = \mu + \alpha_j + \beta_{k(j)} + \varepsilon_{ijk} \]

  • \(\alpha_j\): 학교 효과 (fixed 또는 random).
  • \(\beta_{k(j)}\): 학급 효과 (random within 학교).
  • \(\varepsilon_{ijk}\): 학생 잔차.

\(N = abn\) 관측.

2 EMS

Source \(df\) EMS (모두 random)
\(A\) (학교) \(a-1\) \(\sigma^2 + n \sigma^2_{B(A)} + nb \sigma^2_A\)
\(B(A)\) (학급) \(a(b-1)\) \(\sigma^2 + n \sigma^2_{B(A)}\)
Error (학생) \(ab(n-1)\) \(\sigma^2\)

2.1 검정 분모

  • \(A\) 검정 → \(MS_{B(A)}\).
  • \(B(A)\) 검정 → \(MS_E\).

2.2 분산 성분 추정

\[ \hat\sigma^2 = MS_E \] \[ \hat\sigma^2_{B(A)} = (MS_{B(A)} - MS_E) / n \] \[ \hat\sigma^2_A = (MS_A - MS_{B(A)}) / (nb) \]

음수 추정 시 0 으로 truncate.

3 가설 데이터

\(a = 3\) 학교, \(b = 4\) 학급/학교, \(n = 5\) 학생/학급. \(N = 60\).

ANOVA 표:

Source \(SS\) \(df\) \(MS\) EMS \(F\)
학교 (\(A\)) 1200 2 600 \(\sigma^2 + 5\sigma^2_{B(A)} + 20\sigma^2_A\) \(600/100 = 6.0\)
학급 (\(B(A)\)) 900 9 100 \(\sigma^2 + 5\sigma^2_{B(A)}\) \(100/20 = 5.0\)
Error 960 48 20 \(\sigma^2\)

3.1 분산 성분 계산

  • \(\hat\sigma^2 = 20\)
  • \(\hat\sigma^2_{B(A)} = (100 - 20) / 5 = 16\)
  • \(\hat\sigma^2_A = (600 - 100) / 20 = 25\)

총 분산: \(25 + 16 + 20 = 61\).

3.2 ICC

  • 학급 level ICC: \((25 + 16) / 61 = 0.67\)
  • 학교 level ICC: \(25 / 61 = 0.41\)

학교 간 차이가 크고 학급 간 차이도 상당. 동일 학급 내 두 학생의 점수가 67% 의 분산을 공유.

4 검정 결과 해석

  • \(F_A = 6.0\) (\(df = 2, 9\)): \(p \approx 0.022\). 학교 간 평균 차이 유의.
  • \(F_{B(A)} = 5.0\) (\(df = 9, 48\)): \(p < 0.001\). 학교 내 학급 간 차이 유의.
직관: 검정 분모의 의미

학교 (\(A\)) 검정 분모는 \(MS_{B(A)}\) — “학교 내 학급 변동”. 즉 “학급의 random 변동을 통제한 후 학교 효과가 유의한가?”.

만약 \(MS_E\) 를 분모로 사용하면 (잘못된 방법) \(F = 600/20 = 30\) 으로 매우 크게 나옴 → false positive.

올바른 분모 사용은 multilevel 분석의 핵심.

5 ANOVA Approach 의 한계

  1. 균등 데이터 필수: 학급마다 다른 학생 수가 있으면 EMS 식이 부정확.
  2. 결측 처리 어려움: 한 학생 결측이라도 단계별 균등 깨짐.
  3. 공변량 통합 어려움: ANOVA 표에 covariate 추가가 ad hoc.
  4. Level-별 예측 변수: ANOVA 분해에 직접 통합 안 됨.
  5. 음수 분산 추정 가능: 작은 표본에서.

→ 일반 권장: ML/REML approach (G-MAX16-2).

6 Python 코드

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

np.random.seed(2026)
a, b, n = 3, 4, 5
school_eff = np.random.normal(0, 5, a)
class_eff = {(s, c): np.random.normal(0, 4) for s in range(a) for c in range(b)}

records = []
for s in range(a):
    for c in range(b):
        for st in range(n):
            y = (50 + school_eff[s] + class_eff[(s, c)]
                 + np.random.normal(0, np.sqrt(20)))
            records.append({"school": s, "class": f"{s}_{c}", "Y": y})
data = pd.DataFrame(records)

# Nested ANOVA
model = ols("Y ~ C(school) + C(school):C(class)", data=data).fit()
anova = sm.stats.anova_lm(model, typ=2)
print("=== Nested ANOVA ===")
print(anova.round(3))

# 검정 분모 변경
ms_school = anova.loc["C(school)", "mean_sq"]
ms_class = anova.loc["C(school):C(class)", "mean_sq"]
ms_e = anova.loc["Residual", "mean_sq"]

F_school = ms_school / ms_class
df_school = anova.loc["C(school)", "df"]
df_class = anova.loc["C(school):C(class)", "df"]
from scipy import stats as sps
p_school = 1 - sps.f.cdf(F_school, df_school, df_class)
print(f"\nSchool F: {F_school:.2f}, df=({df_school:.0f}, {df_class:.0f}), p = {p_school:.4f}")

# 분산 성분
sigma_e = ms_e
sigma_class = (ms_class - ms_e) / n
sigma_school = (ms_school - ms_class) / (n * b)
print(f"\nVariance components:")
print(f"  sigma_e^2     = {sigma_e:.2f}")
print(f"  sigma_class^2 = {sigma_class:.2f}")
print(f"  sigma_school^2 = {sigma_school:.2f}")
print(f"  ICC school = {sigma_school / (sigma_school + sigma_class + sigma_e):.3f}")
print(f"  ICC class  = {(sigma_school + sigma_class) / (sigma_school + sigma_class + sigma_e):.3f}")

7 ANOVA 와 Multilevel 의 비교

균등 데이터에서 두 접근 거의 동치:

# Multilevel (REML)
from statsmodels.formula.api import mixedlm
md = mixedlm("Y ~ 1", data=data, groups=data["school"],
             vc_formula={"class": "0 + C(class)"}).fit()
print("\n=== Mixed Model REML ===")
print(f"sigma_school^2 = {md.cov_re.iloc[0, 0]:.2f}")
print(f"sigma_class^2  = {md.vcomp[0]:.2f}")
print(f"sigma_e^2      = {md.scale:.2f}")

ANOVA 와 Multilevel 의 분산 성분 추정이 거의 같음 (REML 이 약간 정확).

8 가정과 한계

  • 균등 데이터: 비균등은 ML 권장.
  • 분산 성분 음수 추정: ANOVA 의 한계.
  • Level-별 covariate: 통합 어려움.
  • 결측: ANOVA listwise.
  • Random effect 정규성: 검토 필요.

9 응용

9.1 1. 교육 다층 연구

학교 → 학급 → 학생 → 시점.

각 level 의 분산 성분 분리 추정.

9.2 2. 임상 다센터

센터 → 환자 → 시점.

9.3 3. 농학 다농장

지역 → 농장 → plot → 시점.

9.4 4. 메타분석

메타분석 → 연구 → 환자.

10 ML 매핑

매핑: ML 다도메인 평가의 nested

ML 모델 성능을 다도메인에 평가:

Domain (학교 역할): 3 도메인 (의료, 금융, 교육)
Sub-domain (학급 역할): 각 도메인 4 sub-domain
Dataset (학생 역할): 각 sub-domain 5 datasets

분산 분해: - \(\sigma^2_{\text{domain}}\): 도메인 간 baseline 차이. - \(\sigma^2_{\text{sub-domain}}\): sub-domain 내 변동. - \(\sigma^2\): dataset 별 변동.

각 component 의 contribution 분리. 모델 성능의 일반화 분석.

11 본 시리즈

G-MAX16-0  개관
G-MAX16-1  Nested ANOVA Approach  ← 현재 글
G-MAX16-2  ML Approach + Unbalanced
G-MAX16-3  Level-별 Predictor + Random Slope

12 관련 주제

선행 지식

후속 주제

다른 카테고리 연결

13 더 읽을 거리

  • Searle, S. R., Casella, G., McCulloch, C. E. (2006). “Variance Components.” Wiley.
  • Cochran, W. G., Cox, G. M. (1957). “Experimental Designs” (2nd ed). Wiley.
  • Snijders, T. A. B., Bosker, R. J. (2012). “Multilevel Analysis” (2nd ed). Sage.
  • Raudenbush, S. W., Bryk, A. S. (2002). “Hierarchical Linear Models” (2nd ed). Sage.

Subscribe

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