1 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 의 한계
- 균등 데이터 필수: 학급마다 다른 학생 수가 있으면 EMS 식이 부정확.
- 결측 처리 어려움: 한 학생 결측이라도 단계별 균등 깨짐.
- 공변량 통합 어려움: ANOVA 표에 covariate 추가가 ad hoc.
- Level-별 예측 변수: ANOVA 분해에 직접 통합 안 됨.
- 음수 분산 추정 가능: 작은 표본에서.
→ 일반 권장: 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 모델 성능을 다도메인에 평가:
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.