1 도입 — 여러 대비를 동시에
A-MAX4-2 에서 한 개의 대비 검정을 다뤘다. 실무에서는 보통 여러 대비 를 동시에 수행한다. 이때 핵심 질문은 다음 두 가지다.
- 두 대비가 서로 독립적 정보 를 주는가?
- 모든 대비의 효과가 합쳐서 옴니버스 ANOVA 의 효과 와 같은가?
답은 직교 대비 (orthogonal contrasts) 의 개념에 있다.
2 직교 대비의 정의
두 대비 \(\psi_1 = \sum c_{1j} \mu_j\) 와 \(\psi_2 = \sum c_{2j} \mu_j\) 가 직교 라는 것은 다음 조건을 만족하는 것이다.
일반 (불균형) 설계:
\[ \sum_{j=1}^{J} \frac{c_{1j} \cdot c_{2j}}{n_j} = 0 \]
균형 설계 (\(n_j\) 모두 동일):
\[ \sum_{j=1}^{J} c_{1j} \cdot c_{2j} = 0 \]
2.1 직교성의 통계적 의미
두 대비가 직교일 때, 그들의 추정량 사이 상관 이 0 이다.
\[ \text{Cov}(\widehat{\psi}_1, \widehat{\psi}_2) = 0 \Leftrightarrow \widehat{\psi}_1 \perp \widehat{\psi}_2 \]
직관: 한 대비의 결과가 다른 대비에 정보를 주지 않는다. 두 대비가 독립적인 가설 을 검정한다.
직교 대비를 직각 좌표계의 축 으로 비유할 수 있다.
x 축과 y 축은 직교 이다. 점의 x 좌표를 알아도 y 좌표는 결정되지 않는다 — 두 정보는 독립 이다.
대비도 마찬가지다. 직교 대비는 서로 다른 차원 의 그룹 차이를 측정한다. 한 대비가 “약물 vs 위약” 차원, 다른 대비가 “남성 vs 여성” 차원이라면 (요인 설계), 두 차원은 직교일 수 있다.
비직교 대비는 비스듬한 좌표축 에 비유된다. 한 대비의 결과가 다른 대비의 결과를 부분적으로 예측 한다. 이는 정보가 중복됨을 의미하며, 다중 비교 보정이 더 복잡해진다.
3 직교 대비의 SS 가산성
직교 대비의 가장 중요한 성질은 제곱합의 가산성 이다.
\(J\) 그룹 ANOVA 에서 서로 직교 인 \(J - 1\) 개의 대비 \(\{\psi_1, \psi_2, \ldots, \psi_{J-1}\}\) 가 있다면:
\[ \text{SS}_B = \sum_{k=1}^{J-1} \text{SS}_{\psi_k} \]
옴니버스 그룹 간 제곱합이 \(J - 1\) 개의 직교 대비로 완전 분해 된다.
3.1 의미
옴니버스 ANOVA 가 검정하는 전체 그룹 차이 가 \(J - 1\) 개의 독립적 비교 로 정확히 분리된다. 각 비교의 자유도는 1, 합 자유도는 \(J - 1\) 로 옴니버스 분자 자유도와 일치.
3.2 4 그룹 사례 — 표준 직교 분해
4 그룹 사례에서 다음 3 개의 직교 대비를 만들 수 있다.
| 대비 | \(c_1\) | \(c_2\) | \(c_3\) | \(c_4\) | 의미 |
|---|---|---|---|---|---|
| \(\psi_1\) | 1 | -1 | 0 | 0 | 그룹 1 vs 2 |
| \(\psi_2\) | 0 | 0 | 1 | -1 | 그룹 3 vs 4 |
| \(\psi_3\) | 1 | 1 | -1 | -1 | (1, 2) vs (3, 4) |
직교성 점검 (균형 설계):
- \(\sum c_{1j} c_{2j} = (1)(0) + (-1)(0) + (0)(1) + (0)(-1) = 0\) ✓
- \(\sum c_{1j} c_{3j} = (1)(1) + (-1)(1) + (0)(-1) + (0)(-1) = 0\) ✓
- \(\sum c_{2j} c_{3j} = (0)(1) + (0)(1) + (1)(-1) + (-1)(-1) = 0\) ✓
세 대비가 모두 서로 직교 이다.
3.3 다른 직교 분해
같은 4 그룹에 대해 다른 직교 분해도 가능하다.
| 대비 | \(c_1\) | \(c_2\) | \(c_3\) | \(c_4\) | 의미 |
|---|---|---|---|---|---|
| Linear | -3 | -1 | 1 | 3 | 선형 추세 |
| Quadratic | 1 | -1 | -1 | 1 | 이차 추세 (U 형) |
| Cubic | -1 | 3 | -3 | 1 | 삼차 추세 |
이는 순서 있는 수준 (예: 약물 용량) 의 추세 분석에 적합하다.
같은 4 그룹 자료를 다른 직교 분해 로 본다는 것은 다른 질문을 한다 는 뜻이다.
- 분해 A (그룹 vs 그룹): “두 신약 vs 두 위약” 같은 범주적 질문
- 분해 B (선형/이차/삼차): “용량이 증가할수록 효과가 어떻게 변하는가” 같은 추세 질문
두 분해 모두 SS_B 를 완전히 설명하지만, 어떤 가설에 답할 수 있는가 가 다르다. 연구 질문이 어떤 분해를 선택할지 결정한다.
이는 통계 모형이 자료 자체를 결정하지 않는다 는 사실의 한 예다. 같은 자료, 다른 모형, 다른 결론.
4 직교 분해의 시각적 이해
옴니버스 \(\text{SS}_B\) 가 3 차원 벡터의 길이 제곱 이라 비유하면, 직교 대비는 3 개의 직교 축으로의 투영 이다.
피타고라스 정리에 의해:
\[ |\vec{v}|^2 = v_x^2 + v_y^2 + v_z^2 \]
마찬가지로:
\[ \text{SS}_B = \text{SS}_{\psi_1} + \text{SS}_{\psi_2} + \text{SS}_{\psi_3} \]
비직교 대비를 사용하면 이 가산성이 깨진다. 두 대비의 SS 합이 옴니버스 SS_B 보다 클 수 있다 (정보 중복 때문).
5 Gram-Schmidt 직교화
연구자가 처음에 정의한 대비들이 직교가 아닐 수 있다. 이때 Gram-Schmidt 절차로 직교화한다.
5.1 절차
- 첫 번째 대비 \(\psi_1\) 을 그대로 둔다.
- 두 번째 대비 \(\psi_2\) 에서 \(\psi_1\) 방향 성분을 뺀다.
\[ \psi_2^{\text{orth}} = \psi_2 - \frac{\langle \psi_1, \psi_2 \rangle}{\langle \psi_1, \psi_1 \rangle} \psi_1 \]
- 세 번째 대비 \(\psi_3\) 에서 \(\psi_1, \psi_2^{\text{orth}}\) 방향 성분을 뺀다.
\[ \psi_3^{\text{orth}} = \psi_3 - \frac{\langle \psi_1, \psi_3 \rangle}{\langle \psi_1, \psi_1 \rangle} \psi_1 - \frac{\langle \psi_2^{\text{orth}}, \psi_3 \rangle}{\langle \psi_2^{\text{orth}}, \psi_2^{\text{orth}} \rangle} \psi_2^{\text{orth}} \]
이 절차로 임의의 대비 집합 을 직교 집합으로 변환할 수 있다.
5.2 한계
Gram-Schmidt 직교화는 원래 가설의 의미 를 보존하지 않을 수 있다. 즉 직교화된 대비가 해석하기 어려운 형태가 된다. 따라서 가능하면 처음부터 직교 대비를 설계 하는 것이 권장된다.
6 대비의 효과 크기
대비 \(\psi\) 의 효과 크기를 측정하는 표준 지표.
6.1 Cohen’s \(d\) for Contrast
대비 \(\psi = \sum c_j \mu_j\) 의 효과 크기:
\[ d_\psi = \frac{\widehat{\psi}}{s_p \sqrt{\sum_j c_j^2}} \]
여기서 \(s_p = \sqrt{\text{MS}_W}\) 는 풀링된 표준편차.
이는 두 그룹 비교의 표준 Cohen’s \(d\) 의 대비 일반화 이다. 두 그룹 비교 (\(c = (1, -1, 0, \ldots)\)) 에서 \(\sum c_j^2 = 2\) 이므로 약간의 스케일 차이가 있다 (Maxwell 의 정의 따름).
6.2 Partial \(\eta^2\) for Contrast
대비가 (옴니버스 효과를 통제한 후) 설명하는 분산 비율:
\[ \eta^2_{\text{partial}, \psi} = \frac{\text{SS}_{\psi}}{\text{SS}_{\psi} + \text{SS}_W} \]
이는 “자료의 잔차 변동 중 이 대비가 설명하는 비율” 이다. 일반 \(\eta^2\) (\(\text{SS}_{\psi} / \text{SS}_T\)) 와 다르다.
| 효과 크기 | 분모 | 의미 |
|---|---|---|
| \(\eta^2\) | \(\text{SS}_T\) (전체) | 표본 전체에서 설명 분산 |
| Partial \(\eta^2\) | \(\text{SS}_{\psi} + \text{SS}_W\) | 다른 효과 통제 후 설명 분산 |
다요인 ANOVA 에서는 partial \(\eta^2\) 가 더 자주 사용된다.
6.3 신뢰 구간
\(\widehat{\psi}\) 의 95 % CI:
\[ \widehat{\psi} \pm t_{0.025, n-J} \cdot \text{SE}(\widehat{\psi}) \]
이는 효과의 불확실성 을 정량화한다. 점추정 + CI 의 조합이 완전한 효과 보고 의 표준이다.
7 SS 가산성의 점검 — 코드 예시
import numpy as np
import pandas as pd
from scipy.stats import t as t_dist
import statsmodels.api as sm
from statsmodels.formula.api import ols
np.random.seed(42)
n_each = 20
group_1 = np.random.normal(5.0, 1.0, n_each)
group_2 = np.random.normal(5.5, 1.0, n_each)
group_3 = np.random.normal(6.0, 1.0, n_each)
group_4 = np.random.normal(6.5, 1.0, n_each)
groups = ['G1']*n_each + ['G2']*n_each + ['G3']*n_each + ['G4']*n_each
all_data = np.concatenate([group_1, group_2, group_3, group_4])
df = pd.DataFrame({'y': all_data, 'group': groups})
# 옴니버스 ANOVA
model = ols('y ~ C(group)', data=df).fit()
anova_table = sm.stats.anova_lm(model)
print(anova_table)
ss_b = anova_table['sum_sq'].iloc[0]
ms_w = anova_table['mean_sq'].iloc[1]
df_w = int(anova_table['df'].iloc[1])
n = len(df)
means = np.array([group_1.mean(), group_2.mean(), group_3.mean(), group_4.mean()])
n_j = np.array([n_each] * 4)
def contrast_ss(c):
psi = (c * means).sum()
return psi**2 / (c**2 / n_j).sum()
# 표준 직교 분해
c1 = np.array([1, -1, 0, 0]) # G1 vs G2
c2 = np.array([0, 0, 1, -1]) # G3 vs G4
c3 = np.array([1, 1, -1, -1]) # (G1, G2) vs (G3, G4)
# 직교성 점검
print(f"\n직교성:")
print(f" c1 ⊥ c2? Σ c1·c2 = {(c1*c2).sum()}") # = 0
print(f" c1 ⊥ c3? Σ c1·c3 = {(c1*c3).sum()}") # = 0
print(f" c2 ⊥ c3? Σ c2·c3 = {(c2*c3).sum()}") # = 0
# SS 가산성
ss_psi1 = contrast_ss(c1)
ss_psi2 = contrast_ss(c2)
ss_psi3 = contrast_ss(c3)
print(f"\nSS 분해:")
print(f" SS_ψ1 (G1 vs G2) = {ss_psi1:.3f}")
print(f" SS_ψ2 (G3 vs G4) = {ss_psi2:.3f}")
print(f" SS_ψ3 ((G1,G2) vs (G3,G4)) = {ss_psi3:.3f}")
print(f" 합계 = {ss_psi1 + ss_psi2 + ss_psi3:.3f}")
print(f" 옴니버스 SS_B = {ss_b:.3f}")
print(f" 가산성 확인: {np.isclose(ss_psi1 + ss_psi2 + ss_psi3, ss_b)}")
# 추세 분해 (대안)
c_lin = np.array([-3, -1, 1, 3])
c_quad = np.array([1, -1, -1, 1])
c_cub = np.array([-1, 3, -3, 1])
print(f"\n추세 분해:")
print(f" Linear: SS = {contrast_ss(c_lin):.3f}")
print(f" Quadratic: SS = {contrast_ss(c_quad):.3f}")
print(f" Cubic: SS = {contrast_ss(c_cub):.3f}")
print(f" 합계 = {contrast_ss(c_lin) + contrast_ss(c_quad) + contrast_ss(c_cub):.3f}")
# 효과 크기 — Linear trend 의 d
s_p = np.sqrt(ms_w)
psi_lin = (c_lin * means).sum()
d_lin = psi_lin / (s_p * np.sqrt((c_lin**2).sum()))
print(f"\nLinear trend 의 d = {d_lin:.3f}")이 코드는 두 가지 직교 분해 를 비교한다. 두 분해 모두 SS_B 와 가산성을 만족하지만, 해석하는 가설 이 다르다.
8 비직교 대비 — 언제 사용하는가
연구자가 연구 질문에 가장 적합한 대비 를 설계하는 것이 우선이다. 그 결과 비직교 대비가 될 수 있다.
| 비교 | 계수 | 직교? |
|---|---|---|
| G1 vs G2 | \((1, -1, 0, 0)\) | — |
| G1 vs G3 | \((1, 0, -1, 0)\) | \(\sum c_{1j} c_{2j} = 1 \neq 0\), 비직교 |
모든 쌍별 비교 는 일반적으로 비직교다. 4 그룹의 6 개 쌍 비교 중 직교인 쌍은 일부만 (예: \(\binom{4}{2} = 6\) 개 비교 중 직교는 약 3 개).
비직교 대비를 사용할 때:
- 가산성이 깨짐 → SS 합 ≠ SS_B
- 다중 비교 보정이 더 복잡 (Bonferroni 가 보수적)
- 정보 중복 가능
9 사후 비교 (Post Hoc) 와의 연결
지금까지 다룬 대비는 계획된 (planned) 비교 — 사전에 정의된 가설. 사후 비교는 자료를 보고 결정된 비교.
| 측면 | Planned | Post Hoc |
|---|---|---|
| 직교 분해 자연스러움 | 자주 OK | 일반적으로 비직교 |
| \(\alpha\) 보정 | 단순 (없음 또는 Bonferroni) | 복잡 (Tukey, Scheffé) |
| 검정력 | 높음 | 낮음 |
사후 비교의 다중 비교 보정은 다음 챕터 (Ch.5, A-MAX5-*) 의 주제다.
10 Helmert 대비 — 자동 직교 분해
소프트웨어 (R, statsmodels) 에서 자주 사용되는 기본 직교 분해 가 Helmert 대비이다.
10.1 정의
각 그룹을 그 다음 그룹들의 평균 과 비교한다.
| 대비 | \(c_1\) | \(c_2\) | \(c_3\) | \(c_4\) |
|---|---|---|---|---|
| Helmert 1 | 3 | -1 | -1 | -1 |
| Helmert 2 | 0 | 2 | -1 | -1 |
| Helmert 3 | 0 | 0 | 1 | -1 |
10.2 의미
- Helmert 1: 그룹 1 vs 그룹 2, 3, 4 의 평균
- Helmert 2: 그룹 2 vs 그룹 3, 4 의 평균
- Helmert 3: 그룹 3 vs 그룹 4
이 대비들이 서로 직교 이며 SS 분해 가능하다.
10.3 사용 시점
각 그룹이 순차적으로 추가되는 처치 (예: baseline, +A, +A+B, +A+B+C) 의 효과를 검정할 때 자연스럽다.
11 Polynomial Contrasts (직교 다항)
수준이 동일 간격 인 양적 요인의 추세 분석.
11.1 4 수준 사례
| 대비 | \(c_1\) | \(c_2\) | \(c_3\) | \(c_4\) |
|---|---|---|---|---|
| Linear | -3 | -1 | 1 | 3 |
| Quadratic | 1 | -1 | -1 | 1 |
| Cubic | -1 | 3 | -3 | 1 |
11.2 표준화
각 대비를 \(\sqrt{\sum c_j^2}\) 로 나누면 단위 길이 가 된다. 이는 비교의 상대적 강도 를 일치시킨다.
11.3 비등 간격 사례
수준이 동일 간격이 아니면 (예: 1, 2, 5, 10), 직교 다항 계수도 수정해야 한다. R 의 contr.poly() 또는 Python 의 numpy.polynomial.legendre 가 자동 생성한다.
12 한계와 다음 챕터
이 글까지 대비 분석의 핵심 골격 을 다뤘다.
- 대비 정의와 일반화
- 모형 비교 도출
- 직교성과 SS 가산성
- 효과 크기 (\(d\), partial \(\eta^2\))
- 신뢰 구간
그러나 여러 대비를 동시에 검정 할 때 발생하는 다중 비교 인플레이션 은 아직 다루지 않았다. 이는 Maxwell Ch.5 의 주제이며, 후속 시리즈 A-MAX5-* 에서 다룬다.
13 Ch.4 마무리
Maxwell Ch.4 의 4 단계 흐름이 끝난다.
- Overview — 옴니버스 이후 개별 비교의 동기 (A-MAX4-0)
- 두 그룹 비교 — F = t² (A-MAX4-1)
- 일반 대비 — 합 0 계수 (A-MAX4-2)
- 직교 대비와 효과 크기 (이 글)
다음 챕터 Ch.5 (Multiple Comparison Problem) 는 다음 질문에 답한다.
- 여러 대비를 검정할 때 어떻게 \(\alpha\) 를 통제하는가?
- 사전 vs 사후 비교의 보정 방법
- Bonferroni, Tukey HSD, Scheffé, Dunnett, FDR
14 관련 주제
선행 지식
후속 주제 (Phase A)
- A-MAX5-0 다중 비교 overview
- A-MAX5-1 αPC, αEW, ENEPE
- A-MAX5-3 Tukey HSD, Scheffé, Dunnett
다른 카테고리 연결