1 결측 관측의 문제
RBD/LS 의 SS 분해는 균등 데이터를 전제. 한 셀 결측이면:
- \(df\) 가 변동.
- 처치·블록 추정량이 비편향이 아님.
- ANOVA 표가 정확하지 않음.
결측 셀을 ignore 하고 ANOVA 시행 시: - SS 의 자유도 계산 잘못됨. - 처치 효과 SS 가 블록 효과 SS 와 confounded. - \(p\) 값 부정확.
해결: 1. Yates 공식: 결측값 추정 후 보정. 2. Multiple Imputation: 여러 imputed dataset 결합. 3. Mixed Model: likelihood-based 자동 처리.
2 결측 메커니즘
2.1 MCAR vs MAR vs MNAR
| 메커니즘 | 정의 | 처리 |
|---|---|---|
| MCAR (Completely At Random) | 결측이 데이터 전혀 무관 | listwise OK |
| MAR (At Random) | 결측이 관측 변수에만 의존 | imputation, mixed model |
| MNAR (Not At Random) | 결측이 결측값 자체에 의존 | 매우 어려움 (sensitivity analysis) |
농학·산업의 결측은 흔히 MCAR (자연재해, 기계 고장). 임상은 MAR 가능 (drop-out 이 상태에 의존).
MCAR: 결측 환자가 다른 환자와 평균 차이 없음. MAR: 결측 환자의 baseline 이 다를 수 있지만 baseline 통제 후 결측 = random. MNAR: 결측 환자의 결측 시점 응답이 다를 가능성 (예: 너무 아파서 측정 불가).
검정 어려움. 도메인 지식 + sensitivity analysis (다른 가정 하의 결과 비교).
3 Single Missing — Yates 의 보정
결측 셀 \((i, j)\) 의 추정값:
\[ \hat Y_{ij} = \frac{a R_i + b T_j - G}{(a-1)(b-1)} \]
- \(R_i\): \(i\) 블록의 다른 \(a-1\) 셀 합.
- \(T_j\): \(j\) 처치의 다른 \(b-1\) 셀 합.
- \(G\): 전체 합 (결측 제외).
이 추정값을 결측 셀에 대입하고 정규 RBD ANOVA 진행. 단, error \(df\) 를 1 줄여서 보정.
3.1 유도
Yates 공식은 다음 조건에서 도출: - 결측값이 처치 효과 + 블록 효과 + 잔차의 합. - 잔차 SS 최소화 (least squares).
미분 및 정리 → 위 공식.
4 Latin Square 의 단일 결측 보정
\[ \hat Y_{ijk} = \frac{a (R_i + C_j + T_k) - 2G}{(a-1)(a-2)} \]
- \(R_i\): 행 \(i\) 합.
- \(C_j\): 열 \(j\) 합.
- \(T_k\): 처치 \(k\) 합.
- \(G\): 전체 합.
LS 가 두 차원 블록이라 보정 공식이 약간 다름.
5 다중 결측
여러 셀 결측은 위 공식의 반복 적용 (수렴 필요) 또는 직접 GLS 추정 (REML 권장). Mixed model 의 likelihood-based 처리가 일반.
5.1 Multiple Imputation (MI)
여러 셀 결측 시:
- Multiple Imputation (MI): 결측 셀에 여러 (예: 5) plausible 값을 stochastic 으로 생성.
- 각 imputed 데이터셋에서 분석.
- Rubin’s rules 로 결과 결합.
R mice, Python sklearn.impute.IterativeImputer.
5.2 Mixed Model 의 자동 처리
Multilevel/mixed model 은 결측을 likelihood-based 로 자동 처리 (MAR 가정).
6 사례 — 농학 RBD
6.1 데이터
5 비료 × 4 plot, 한 plot 에서 자연재해로 한 셀 결측.
A B C D E
Plot1: 25 28 22 30 24
Plot2: 23 26 * 31 22
Plot3: 24 27 23 29 23
Plot4: 26 29 24 32 25
6.2 Yates 보정
\(\hat Y_{2,C}\) 추정: - \(R_2 = 23 + 26 + 31 + 22 = 102\) - \(T_C = 22 + 23 + 24 = 69\) - \(G = 25 + 28 + 22 + 30 + 24 + 23 + 26 + 31 + 22 + 24 + 27 + 23 + 29 + 23 + 26 + 29 + 24 + 32 + 25 = 493\) - \(\hat Y_{2,C} = (5 \times 102 + 4 \times 69 - 493) / (4 \times 3) = (510 + 276 - 493) / 12 = 293 / 12 = 24.4\)
추정값을 결측 셀에 대입.
6.3 보정 ANOVA
| Source | \(SS\) | \(df\) | \(MS\) | \(F\) |
|---|---|---|---|---|
| Treatment | 180 | 4 | 45 | \(45/2.5 = 18.0\) |
| Block | 24 | 3 | 8 | — |
| Error | \(\approx 27.5\) | 11 (= 12 − 1) | 2.5 | — |
(error df 가 12 → 11 로 감소.)
6.4 Multilevel 대안
Yates 보정과 비교적 비슷한 결과. multilevel 이 더 robust (작은 표본에서).
7 Python 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols, mixedlm
np.random.seed(2026)
treatments = ["A", "B", "C", "D", "E"]
plots = list(range(4))
records = []
for plot in plots:
block_eff = np.random.normal(0, 1.5)
for t in treatments:
treat_eff = {"A": 24, "B": 27, "C": 22, "D": 30, "E": 23}[t]
y = treat_eff + block_eff + np.random.normal(0, 1.5)
records.append({"treatment": t, "plot": plot, "Y": y})
data = pd.DataFrame(records)
# 한 셀 결측 (Plot2, C)
data_missing = data.copy()
mask = (data_missing["plot"] == 1) & (data_missing["treatment"] == "C")
true_value = data_missing.loc[mask, "Y"].iloc[0]
data_missing = data_missing[~mask]
# Yates 공식으로 추정
R_i = data_missing[data_missing["plot"] == 1]["Y"].sum()
T_j = data_missing[data_missing["treatment"] == "C"]["Y"].sum()
G = data_missing["Y"].sum()
a = len(treatments)
b = len(plots)
y_hat = (a * R_i + b * T_j - G) / ((a-1) * (b-1))
print(f"True value: {true_value:.2f}")
print(f"Yates estimate: {y_hat:.2f}")
# 추정값으로 채워서 ANOVA
data_imputed = pd.concat([data_missing, pd.DataFrame([{
"treatment": "C", "plot": 1, "Y": y_hat
}])])
model = ols("Y ~ C(treatment) + C(plot)", data=data_imputed).fit()
print("\n=== ANOVA with Yates imputation ===")
anova = sm.stats.anova_lm(model, typ=2)
print(anova.round(3))
# 또는 mixed model 로 결측 자동 처리
md = mixedlm("Y ~ C(treatment)", data=data_missing,
groups=data_missing["plot"]).fit()
print("\n=== Mixed model (REML, auto missing handling) ===")
print(md.summary().tables[1])8 가정과 한계
- MCAR 가정: 정통 Yates 공식의 전제.
- 단일 결측 vs 다중 결측: 다중 결측은 GLS/REML.
- 결측이 처치 효과와 관련: MNAR — 보정 신뢰 ↓.
- 자유도 -1 보정: error df 줄여야 정확.
- 현대 표준: multilevel REML 또는 multiple imputation.
9 Sensitivity Analysis
MAR vs MNAR 가정 하의 결과 비교: 1. MAR 가정 (multilevel REML). 2. MNAR pattern-mixture model. 3. Tipping point analysis: 결측값을 다양한 값으로 가정해 결론이 바뀌는 임계점.
이 점검이 결측 데이터 분석의 robust 보고.
10 응용
| 분야 | 결측 원인 |
|---|---|
| 농학 | 자연재해, 곤충 피해 |
| 임상 | drop-out, 부작용 |
| 산업 | machine 고장, 측정 오류 |
| 교육 | 결석, 전학 |
| IT | 사용자 이탈 |
11 ML 매핑
ML 의 cross-validation 에서 일부 fold 가 실패 (수렴 안 됨, NaN):
Fold 1: model A 정확도 = 0.85 ✓
Fold 1: model B 정확도 = NaN ✗ (실패)
Fold 2: ...
처리: - listwise: 그 fold 제외. - imputation: 다른 fold 의 평균으로 대체. - multilevel: REML 자동 처리.
multilevel 이 가장 robust.
12 본 시리즈 마무리
G-MON2-0 Complete Block 개관
G-MON2-1 CRD
G-MON2-2 RBD + Latin Square
G-MON2-3 Missing + Illustration ← 현재 글 (Ch.2 마지막)
↓
G-MON3 (Factorial)
G-MON5 (Incomplete Block)
13 관련 주제
선행 지식
후속 주제
- G-MON3 — Factorial Experiments (작성 예정)
- G-MON5 — Incomplete Block (작성 예정)
다른 카테고리 연결
14 더 읽을 거리
- Yates, F. (1933). “Analysis of replicated experiments when the field results are incomplete.” Empire Journal of Experimental Agriculture 1(2): 129-142 — Yates 공식.
- Little, R. J. A., Rubin, D. B. (2019). “Statistical Analysis with Missing Data” (3rd ed). Wiley — 결측 표준 reference.
- van Buuren, S. (2018). “Flexible Imputation of Missing Data” (2nd ed). CRC Press.
- Schafer, J. L. (1997). “Analysis of Incomplete Multivariate Data.” Chapman & Hall.
- Molenberghs, G., Kenward, M. G. (2007). “Missing Data in Clinical Studies.” Wiley.