1 개요
동일한 사람을 4번 측정한다고 하자. 8학년, 9학년, 10학년, 11학년에 어휘 검사를 반복 실시했다면, 이 64개의 점수는 독립 관측이 아니다. 영리한 학생은 4년 내내 높은 점수를 유지하고, 느린 학생은 4년 내내 낮다. 이 체계적 개인차를 제거하고 시간 자체의 순수 효과를 추출하는 것이 단일 표본 반복측정 ANOVA의 핵심이다.
직관적으로는 “각 사람이 자신의 통제 집단이 된다.” 독립 표본 ANOVA에서는 집단 간 차이가 개인차와 시간 효과를 섞어서 본다. 반복측정 ANOVA는 개인차를 수직 방향으로 분리해낸 뒤, 수평 방향(시간)의 변화만 집중해서 본다. 이 분리 덕분에 검정력이 크게 향상된다.
이 포스트는 반복측정 ANOVA 개요의 단일 표본 부분을 더 깊이 파고든다. 각 수식이 왜 그렇게 생겼는지를 단계별로 유도하고 직관적 해석을 덧붙인다.
2 모형 정의와 직관
2.1 모형 방정식
\(N\) 명의 피험자( \(i = 1, \ldots, N\) )가 \(n\) 시점( \(j = 1, \ldots, n\) )에 반복 측정된다.
\[ y_{ij} = \mu + \pi_i + \tau_j + e_{ij} \]
| 성분 | 의미 | 가정 |
|---|---|---|
| \(\mu\) | 전체 평균 (고정 상수) | — |
| \(\pi_i\) | 피험자 \(i\)의 개인차 성분 | \(\pi_i \sim N(0, \sigma_\pi^2)\), 독립 |
| \(\tau_j\) | 시점 \(j\)의 고정 효과 | \(\sum_{j=1}^n \tau_j = 0\) |
| \(e_{ij}\) | 오차 | \(e_{ij} \sim N(0, \sigma_e^2)\), 독립 |
\(\pi_i\) 와 \(e_{ij}\) 는 서로 독립.
2.2 각 성분의 직관
\(\mu\): 전체 연구 기간에 걸친 집단 전체의 평균 수준이다.
\(\pi_i\) (피험자 효과): 사람마다 갖는 기저 수준의 차이다. “이 학생은 전반적으로 똑똑해서 4년 내내 평균보다 1점 높다”는 사실을 포착한다. 이 효과는 시간에 걸쳐 일정(constant) 하다고 가정한다. 즉, 어떤 시점에서도 동일한 개인 특성이 작용한다.
\(\tau_j\) (시간 효과): “모든 학생이 9학년 때 8학년보다 평균 1.4점 높다”처럼 시점이 모든 피험자에게 동일하게 미치는 효과다. 이것이 우리가 추정하고 검정하고자 하는 핵심 파라미터다.
\(e_{ij}\) (잔차): 개인 특성( \(\pi_i\) )과 시점 효과( \(\tau_j\) )로도 설명되지 않는 나머지 변동이다. “9학년 때 이 학생이 평균보다 0.3점 더 받은 것은 그날의 컨디션 때문”이라는 부분이다.
모형이 \(\pi_i + \tau_j\) 의 합(additive) 구조를 갖는다는 것은 시간 효과가 모든 피험자에게 평행하게(parallel) 작용한다는 뜻이다. 수학적으로는 피험자 \(\times\) 시간 교호작용이 없다고 가정한다. 이 가정이 성립하지 않으면(예: 어떤 치료에 어떤 사람은 크게 반응하고 어떤 사람은 전혀 반응하지 않음) 잔차 \(e_{ij}\) 가 교호작용 성분을 흡수하게 된다.
3 설계 구조 (Design Structure)
3.1 데이터 레이아웃: \(N \times n\) 행렬
\(N\) 명의 피험자와 \(n\) 시점으로 구성된 완전 교차(fully crossed) 설계의 데이터 배열은 다음과 같은 이원 분류표 형태를 갖는다.
| 시점 \(j=1\) | 시점 \(j=2\) | \(\cdots\) | 시점 \(j=n\) | 피험자 평균 | |
|---|---|---|---|---|---|
| 피험자 \(i=1\) | \(y_{11}\) | \(y_{12}\) | \(\cdots\) | \(y_{1n}\) | \(\bar{y}_{1.}\) |
| 피험자 \(i=2\) | \(y_{21}\) | \(y_{22}\) | \(\cdots\) | \(y_{2n}\) | \(\bar{y}_{2.}\) |
| \(\vdots\) | \(\vdots\) | ||||
| 피험자 \(i=N\) | \(y_{N1}\) | \(y_{N2}\) | \(\cdots\) | \(y_{Nn}\) | \(\bar{y}_{N.}\) |
| 시점 평균 | \(\bar{y}_{.1}\) | \(\bar{y}_{.2}\) | \(\cdots\) | \(\bar{y}_{.n}\) | \(\bar{y}_{..}\) |
핵심 구조적 특징:
- 셀당 관측치 1개: 피험자 \(i\) 의 시점 \(j\) 관측값 \(y_{ij}\) 는 딱 하나다. 셀당 반복이 없으므로 피험자 × 시간 교호작용과 잔차를 구별할 수 없다. 이것이 모형에 교호작용 항 \((\pi \times \tau)_{ij}\) 를 포함하지 않는 이유다.
- 총 관측수: \(Nn\) 개이며, 자유도는 \(Nn - 1\) 이다.
시점이 2개( \(j = 1, 2\) )인 경우 반복측정 ANOVA의 F-통계량은
\[ F_T = t_{\text{paired}}^2 \]
과 정확히 같다. 각 피험자의 차이 \(d_i = y_{i2} - y_{i1}\) 을 이용한 대응 \(t\)-검정은 이 설계의 특수 사례다. 시점이 3개 이상일 때 반복측정 ANOVA가 자연스러운 확장이 된다.
3.2 완전 교차 설계 (Fully Crossed Design)
임의블록 설계(Randomized Complete Block Design, RCBD)라고도 불린다.
- 피험자(블록) 와 시점(처치) 이 완전히 교차: 모든 피험자가 모든 시점에 참여한다.
- 균형성: 각 셀의 관측치 수가 동일하다(1개).
- 피험자 랜덤 배정: 피험자 효과 \(\pi_i\) 가 랜덤 효과( \(\pi_i \sim N(0, \sigma_\pi^2)\) )로 처리되므로 이 설계는 혼합 모형(mixed model)이다. 고정 효과(시간)와 랜덤 효과(개인차)가 함께 존재한다.
농업 실험의 RCBD 비유:
| 농업 RCBD | 반복측정 ANOVA |
|---|---|
| 블록(block) | 피험자(subject) |
| 처치(treatment) | 시점(time point) |
| 블록 내 처치 효과 | 피험자 내 시간 효과 |
| 블록 효과 제거 → 처치 비교 | 개인차 제거 → 시간 비교 |
블록(피험자)을 이용해 처치(시간)를 비교할 때의 변동성을 낮추는 것이 두 설계의 공통 논리다. RCBD에서 비옥도가 다른 토양 블록을 사용하듯, 반복측정에서는 능력치가 다른 피험자를 “블록”으로 사용하여 개인차를 제거한다.
3.3 설계 행렬: 고정 효과와 랜덤 효과의 구분
모형 \(y_{ij} = \mu + \pi_i + \tau_j + e_{ij}\) 를 행렬 형태로 표현하면
\[ \mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \mathbf{Z}\mathbf{b} + \boldsymbol{\epsilon}, \]
여기서
| 기호 | 크기 | 내용 |
|---|---|---|
| \(\mathbf{y}\) | \(Nn \times 1\) | 관측값 벡터 (피험자-시점 순서로 쌓음) |
| \(\mathbf{X}\) | \(Nn \times n\) | 고정 효과 설계행렬 (전체 절편 + 시점 지시변수) |
| \(\boldsymbol{\beta}\) | \(n \times 1\) | \((\mu, \tau_1, \ldots, \tau_{n-1})\) — 식별 가능한 고정 효과 |
| \(\mathbf{Z}\) | \(Nn \times N\) | 랜덤 효과 설계행렬 (피험자 지시변수) |
| \(\mathbf{b}\) | \(N \times 1\) | \((\pi_1, \ldots, \pi_N)'\) — 랜덤 효과 벡터 |
| \(\boldsymbol{\epsilon}\) | \(Nn \times 1\) | 오차 벡터 |
분포 가정:
\[ \mathbf{b} \sim N(\mathbf{0},\, \sigma_\pi^2 \mathbf{I}_N), \quad \boldsymbol{\epsilon} \sim N(\mathbf{0},\, \sigma_e^2 \mathbf{I}_{Nn}), \quad \mathbf{b} \perp \boldsymbol{\epsilon}. \]
\(\mathbf{Z}\) 의 구조: 피험자 \(i\) 에 대한 \(n\) 개 관측값 행에는 \(i\) 번째 열에만 1이 들어간다. 즉, \(\mathbf{Z} = \mathbf{I}_N \otimes \mathbf{1}_n\) (\(\otimes\) 는 Kronecker 곱).
\[ \mathbf{Z} = \begin{bmatrix} \mathbf{1}_n & \mathbf{0} & \cdots & \mathbf{0} \\ \mathbf{0} & \mathbf{1}_n & \cdots & \mathbf{0} \\ \vdots & & \ddots & \vdots \\ \mathbf{0} & \mathbf{0} & \cdots & \mathbf{1}_n \end{bmatrix} \in \mathbb{R}^{Nn \times N}. \]
3.4 공분산 구조: 복합대칭(Compound Symmetry)
랜덤 효과와 오차의 분포 가정으로부터, 피험자 \(i\) 의 반복측정 벡터 \(\mathbf{y}_i = (y_{i1}, \ldots, y_{in})'\) 의 분산-공분산 행렬은
\[ V(\mathbf{y}_i) = \sigma_\pi^2 \mathbf{1}_n \mathbf{1}_n' + \sigma_e^2 \mathbf{I}_n = \begin{bmatrix} \sigma_\pi^2 + \sigma_e^2 & \sigma_\pi^2 & \cdots & \sigma_\pi^2 \\ \sigma_\pi^2 & \sigma_\pi^2 + \sigma_e^2 & \cdots & \sigma_\pi^2 \\ \vdots & & \ddots & \vdots \\ \sigma_\pi^2 & \sigma_\pi^2 & \cdots & \sigma_\pi^2 + \sigma_e^2 \end{bmatrix}. \]
이 구조를 복합대칭(Compound Symmetry, CS)이라 한다.
CS의 두 가지 핵심 성질:
- 대각 원소 동일: 모든 시점에서 분산이 \(\sigma_\pi^2 + \sigma_e^2\) 로 같다. 시간이 지나도 측정 변동성이 변하지 않는다고 가정한다.
- 비대각 원소 동일: 모든 시점 쌍의 공분산이 \(\sigma_\pi^2\) 로 같다. 1주 후와 10주 후의 측정값 사이 상관이 1주 후와 2주 후 사이 상관과 같다고 가정한다.
두 가지 점에서 비현실적이다.
- 분산 동질성: 임상 시험에서는 처치 후기에 환자 반응의 다양성이 커지는 경우가 많다. 즉, 후기 시점의 분산이 초기보다 클 수 있다.
- 자기상관 독립성: 가까운 시점(예: 1주 vs 2주)은 먼 시점(예: 1주 vs 52주)보다 더 높은 상관을 가지는 것이 자연스럽다. CS는 이 차이를 무시한다.
CS 가정이 위반되면 F-검정이 과자유로적(too liberal)이 되어 1종 오류율이 증가한다. 이를 보정하는 것이 Greenhouse-Geisser 수정이다 (구형성 참조).
CS와 구형성(Sphericity)의 관계:
| 개념 | 조건 | 엄격도 |
|---|---|---|
| 복합대칭(CS) | 분산 동질 + 공분산 동질 | 더 강한 조건 |
| 구형성 | 모든 쌍별 차이 \(y_{ij} - y_{ij'}\) 의 분산이 동일 | 더 약한 조건 |
CS \(\Rightarrow\) 구형성이지만, 구형성 \(\not\Rightarrow\) CS. 반복측정 ANOVA의 F-검정이 유효하려면 구형성이 성립하면 충분하다. CS는 필요조건이 아니다.
3.5 식별 조건 (Identifiability)
모형 파라미터가 데이터로부터 유일하게 추정 가능하려면 다음 제약이 필요하다.
\[ \sum_{j=1}^n \tau_j = 0 \quad \Leftrightarrow \quad \bar{\tau} = 0. \]
이 제약 없이는 \(\mu\) 와 \(\tau_j\) 를 동시에 식별할 수 없다( \(\mu + c\) 와 \(\tau_j - c\) 가 모두 같은 관측값을 생성). 이 제약을 합이 0 제약(sum-to-zero constraint) 또는 효과 코딩(effect coding) 이라 한다.
\(\pi_i\) 는 랜덤 효과이므로 \(E[\pi_i] = 0\) 이 분포 가정에 이미 포함되어 있다. 별도의 제약이 필요하지 않다.
자유도 시각화: 제약이 없으면 \(1 + N + n\) 개의 파라미터( \(\mu, \pi_1, \ldots, \pi_N, \tau_1, \ldots, \tau_n\) )가 있지만, 제약 \(\sum_j \tau_j = 0\) 으로 \(n\) 개 \(\tau\) 중 1개가 결정된다. 실제로 추정 가능한 파라미터 수:
\[ 1 \, (\mu) + N \, (\pi_i\text{ 추정}) + (n-1) \, (\tau_j\text{ 추정}) = N + n. \]
하지만 \(\pi_i\) 는 랜덤 효과이므로 REML/ML로 분산 성분( \(\sigma_\pi^2\) )을 추정한다. ANOVA 추정법에서는 \(\pi_i\) 를 직접 추정하지 않고 \(SS_S\) 로 \(\sigma_\pi^2\) 를 간접 추정한다.
3.6 독립 표본 설계와의 구조적 비교
같은 \(N\) 명 \(n\) 시점 데이터를 독립 표본으로 처리할 경우와 비교하면:
| 특성 | 반복측정 (임의블록) | 독립 표본 (일원 ANOVA) |
|---|---|---|
| 피험자 처리 | 블록(랜덤 효과) | 무작위 오차에 포함 |
| 오차 항 | \(e_{ij}\): 피험자-내 변동만 | \(e_{ij}\): 피험자-간 + 피험자-내 변동 혼합 |
| F-검정 분모 | \(MS_R = \widehat{\sigma}_e^2\) | \(MS_{\text{error}} \approx \widehat{\sigma}_\pi^2 + \widehat{\sigma}_e^2\) |
| 검정력 | 높음 (분모에서 \(\sigma_\pi^2\) 제거) | 낮음 (분모에 \(\sigma_\pi^2\) 포함) |
| 독립성 가정 | 위반 (같은 사람이 반복) | 성립 (다른 사람) |
독립 표본으로 잘못 분석하면 오차 분산이 과대추정되어 검정력을 잃는다. ICC가 높을수록 이 차이는 더 커진다.
4 전체 변동의 분해: SS 항등식
4.1 핵심 항등식 유도
관측값 \(y_{ij}\) 에서 전체 평균 \(\bar{y}_{..}\) 을 뺀 편차는 세 성분으로 분해된다.
\[ \underbrace{y_{ij} - \bar{y}_{..}}_{\text{전체 편차}} = \underbrace{(\bar{y}_{i.} - \bar{y}_{..})}_{\text{피험자 편차}} + \underbrace{(\bar{y}_{.j} - \bar{y}_{..})}_{\text{시간 편차}} + \underbrace{(y_{ij} - \bar{y}_{i.} - \bar{y}_{.j} + \bar{y}_{..})}_{\text{잔차}} \]
여기서 표기법은 다음과 같다.
| 표기 | 의미 |
|---|---|
| \(\bar{y}_{..}\) | \(\frac{1}{Nn}\sum_{i,j} y_{ij}\), 전체 평균 |
| \(\bar{y}_{i.}\) | \(\frac{1}{n}\sum_{j=1}^n y_{ij}\), 피험자 \(i\)의 시점 평균 |
| \(\bar{y}_{.j}\) | \(\frac{1}{N}\sum_{i=1}^N y_{ij}\), 시점 \(j\)의 피험자 평균 |
등식이 성립하는 이유: 우변 세 항을 더하면 \(\bar{y}_{i.}\), \(\bar{y}_{.j}\), \(\bar{y}_{..}\) 이 완전히 소거되어 좌변 \(y_{ij} - \bar{y}_{..}\) 만 남는다. 이는 대수적 항등식이다.
4.2 제곱합 분해
위 항등식의 양변을 제곱하여 모든 \((i, j)\) 쌍에 대해 합산하면 교차항이 소거되어:
\[ \underbrace{\sum_{i=1}^N \sum_{j=1}^n (y_{ij} - \bar{y}_{..})^2}_{SS_{\text{Total}}} = \underbrace{n \sum_{i=1}^N (\bar{y}_{i.} - \bar{y}_{..})^2}_{SS_S} + \underbrace{N \sum_{j=1}^n (\bar{y}_{.j} - \bar{y}_{..})^2}_{SS_T} + \underbrace{\sum_{i,j} (y_{ij} - \bar{y}_{i.} - \bar{y}_{.j} + \bar{y}_{..})^2}_{SS_R} \]
\[ SS_{\text{Total}} = SS_S + SS_T + SS_R \]
이 식은 가정이 아닌 대수적 항등식이다. 데이터가 어떤 분포를 따르든 항상 성립한다.
교차항 소거의 증명: \(\sum_{i,j} (\bar{y}_{i.} - \bar{y}_{..})(\bar{y}_{.j} - \bar{y}_{..})\) 를 계산하면
\[ \sum_i (\bar{y}_{i.} - \bar{y}_{..}) \cdot \sum_j (\bar{y}_{.j} - \bar{y}_{..}) = \left(\sum_i \bar{y}_{i.} - N\bar{y}_{..}\right) \cdot (\text{유사항}) = 0 \cdot 0 = 0. \]
피험자 평균의 합 \(\sum_i \bar{y}_{i.} = N\bar{y}_{..}\) 이므로 괄호 안이 0이 된다. 나머지 두 교차항도 같은 논리로 0이다.
4.3 각 SS의 직관
\(SS_S\) (피험자 제곱합): \(n\) 으로 가중된 피험자 평균들의 분산이다. “피험자마다 시점 평균이 얼마나 다른가”를 측정한다. 이 변동은 개인차 \(\sigma_\pi^2\) 때문에 발생한다. 반복측정 ANOVA에서는 이 변동을 제거(partialing out) 함으로써 시간 효과를 더 선명하게 본다.
\(SS_T\) (시간 제곱합): \(N\) 으로 가중된 시점 평균들의 분산이다. “시점마다 전체 평균이 얼마나 다른가”를 측정한다. 이것이 순수한 시간 효과의 크기다.
\(SS_R\) (잔차 제곱합): 개인 특성과 시간 효과를 제거한 후 남은 변동이다. 완전한 모형에서 이 잔차는 \(e_{ij}\) 의 변동만 반영한다. 이것이 F-검정의 분모(오차 기준)가 된다.
5 자유도와 ANOVA 표
5.1 자유도 분해
\[ \underbrace{Nn - 1}_{df_{\text{Total}}} = \underbrace{N - 1}_{df_S} + \underbrace{n - 1}_{df_T} + \underbrace{(N-1)(n-1)}_{df_R} \]
자유도 직관:
- \(df_S = N - 1\): \(N\) 명의 피험자 평균 중 하나는 전체 평균에 의해 결정된다.
- \(df_T = n - 1\): \(n\) 개 시점 평균 중 하나는 \(\sum_j \tau_j = 0\) 조건에 의해 결정된다.
- \(df_R = (N-1)(n-1)\): 피험자 자유도와 시간 자유도의 곱. 두 방향 모두에서 제약이 걸린다.
5.2 ANOVA 표
| 변동 원인 | \(df\) | \(SS\) | \(MS\) | \(E(MS)\) | \(F\) |
|---|---|---|---|---|---|
| 피험자(S) | \(N-1\) | \(SS_S\) | \(MS_S = SS_S/(N-1)\) | \(\sigma_e^2 + n\sigma_\pi^2\) | — |
| 시간(T) | \(n-1\) | \(SS_T\) | \(MS_T = SS_T/(n-1)\) | \(\sigma_e^2 + \frac{N\sum_j \tau_j^2}{n-1}\) | \(MS_T / MS_R\) |
| 잔차(R) | \((N-1)(n-1)\) | \(SS_R\) | \(MS_R = SS_R/[(N-1)(n-1)]\) | \(\sigma_e^2\) | — |
| 합계 | \(Nn-1\) | \(SS_T\) |
6 평균제곱의 기댓값: E[MS] 유도
6.1 왜 E[MS]를 계산하는가
F-통계량의 분자와 분모를 어떻게 선택할지는 \(E[MS]\) 에서 결정된다. \(H_0\) 하에서 분자와 분모의 기댓값이 같아야 \(F \approx 1\) 이 되고, \(H_1\) 에서 분자가 커져야 한다.
6.2 \(E[MS_R]\) 유도
잔차 \(y_{ij} - \bar{y}_{i.} - \bar{y}_{.j} + \bar{y}_{..}\) 는 모형 \(y_{ij} = \mu + \pi_i + \tau_j + e_{ij}\) 에서
\[ y_{ij} - \bar{y}_{i.} - \bar{y}_{.j} + \bar{y}_{..} = e_{ij} - \bar{e}_{i.} - \bar{e}_{.j} + \bar{e}_{..} \]
임을 알 수 있다. \(\pi_i\) 와 \(\tau_j\) 항은 모두 소거된다. 따라서
\[ E[MS_R] = E\!\left[\frac{SS_R}{(N-1)(n-1)}\right] = \sigma_e^2. \]
직관: 잔차 평균제곱은 오차 분산 \(\sigma_e^2\) 의 불편 추정량이다. 피험자 효과도, 시간 효과도, 개인차도 모두 제거된 뒤 남는 순수 노이즈 수준이다.
6.3 \(E[MS_T]\) 유도
시점 평균 편차 \(\bar{y}_{.j} - \bar{y}_{..}\) 는
\[ \bar{y}_{.j} - \bar{y}_{..} = \tau_j + \bar{e}_{.j} - \bar{e}_{..} \]
임을 알 수 있다. \(\pi_i\) 는 \(j\) 에 따라 변하지 않으므로 평균을 내면 소거된다. 따라서
\[ SS_T = N \sum_{j=1}^n (\bar{y}_{.j} - \bar{y}_{..})^2 = N \sum_j (\tau_j + \bar{e}_{.j} - \bar{e}_{..})^2. \]
기댓값을 취하면
\[ E[SS_T] = N\!\left[\sum_j \tau_j^2 + E\!\left[\sum_j (\bar{e}_{.j} - \bar{e}_{..})^2\right]\right] = N \sum_j \tau_j^2 + (n-1)\sigma_e^2. \]
따라서
\[ E[MS_T] = \frac{N \sum_j \tau_j^2}{n-1} + \sigma_e^2. \]
6.4 \(E[MS_S]\) 유도
피험자 평균 편차 \(\bar{y}_{i.} - \bar{y}_{..}\) 는
\[ \bar{y}_{i.} - \bar{y}_{..} = \pi_i + \bar{e}_{i.} - \bar{e}_{..}. \]
\(\tau_j\) 는 \(i\) 에 따라 변하지 않으므로 평균을 내면 소거된다. 따라서
\[ E[MS_S] = \sigma_e^2 + n\sigma_\pi^2. \]
결과 요약:
| MS | \(E[MS]\) | 포함 정보 |
|---|---|---|
| \(MS_S\) | \(\sigma_e^2 + n\sigma_\pi^2\) | 개인차 + 오차 |
| \(MS_T\) | \(\sigma_e^2 + \frac{N\sum_j\tau_j^2}{n-1}\) | 시간 효과 + 오차 |
| \(MS_R\) | \(\sigma_e^2\) | 오차만 |
7 F-검정의 논리
7.1 F-통계량과 귀무가설
시간 효과의 검정:
\[ H_0: \tau_1 = \tau_2 = \cdots = \tau_n = 0 \quad \text{vs} \quad H_1: \text{적어도 하나의 } \tau_j \neq 0 \]
\[ F_T = \frac{MS_T}{MS_R} \sim F_{n-1,\,(N-1)(n-1)} \quad \text{under } H_0. \]
7.2 왜 \(MS_R\)이 분모인가
\(E[MS_T] = \sigma_e^2 + \frac{N\sum_j\tau_j^2}{n-1}\) 이고 \(E[MS_R] = \sigma_e^2\) 이므로
\[ E\!\left[\frac{MS_T}{MS_R}\right] \approx \frac{E[MS_T]}{E[MS_R]} = 1 + \frac{N\sum_j\tau_j^2}{(n-1)\sigma_e^2}. \]
- \(H_0\) 하에서 \(\sum_j\tau_j^2 = 0\) 이므로 \(F \approx 1\).
- \(H_1\) 하에서 \(\sum_j\tau_j^2 > 0\) 이므로 \(F > 1\).
따라서 \(F_T\) 가 크면 \(H_0\) 를 기각한다.
왜 \(MS_S\) 를 분모로 쓰지 않는가? \(E[MS_S] = \sigma_e^2 + n\sigma_\pi^2\) 인데 \(\sigma_\pi^2 > 0\) 이면 \(MS_S > MS_R\) 이 일반적이다. \(MS_S\) 를 분모로 쓰면 시간 효과가 없어도 \(F < 1\) 이 될 수 있다. 개인차는 시간 효과의 오차 기준이 될 수 없다. 오직 순수 오차 추정량 \(MS_R\) 만이 올바른 분모다.
7.3 독립 표본 ANOVA와의 비교: 검정력 향상 기제
독립 표본 일원 ANOVA를 가정하면 분모는
\[ MS_{\text{error, indep}} = \frac{SS_S + SS_R}{N(n-1)} \approx \frac{n\sigma_\pi^2 + \sigma_e^2}{\text{something}} \]
이 되어 개인차 \(\sigma_\pi^2\) 가 오차에 포함된다. 반복측정 ANOVA는 이 \(\sigma_\pi^2\) 항을 분모에서 제거함으로써 오차 분산이 줄어들고, 같은 \(\tau_j\) 에 대해 F 값이 커진다.
검정력 향상 크기는 ICC에 비례한다. ICC가 높을수록 (피험자 간 차이가 클수록) 반복측정 설계의 이득이 크다.
8 분산 성분 추정과 ICC
8.1 분산 성분 추정
\(E[MS_R] = \sigma_e^2\) 와 \(E[MS_S] = \sigma_e^2 + n\sigma_\pi^2\) 를 역산하면:
\[ \widehat{\sigma}_e^2 = MS_R \]
\[ \widehat{\sigma}_\pi^2 = \frac{MS_S - MS_R}{n} \]
\(MS_S < MS_R\) 인 경우(드물지만 가능)에는 \(\widehat{\sigma}_\pi^2 = 0\) 으로 처리한다.
이 추정법은 분산 성분의 ANOVA 추정(method of moments) 이다. 불편추정량이며, 추가 정규성 가정 없이 구할 수 있다.
8.2 급내상관계수 (ICC)
같은 피험자 \(i\) 의 두 시점 \(j \neq j'\) 관측값 사이의 상관계수는
\[ \text{Corr}(y_{ij}, y_{ij'}) = \frac{\text{Cov}(y_{ij}, y_{ij'})}{V(y_{ij})} = \frac{\sigma_\pi^2}{\sigma_\pi^2 + \sigma_e^2} = \text{ICC}. \]
공분산을 계산하면: \(\text{Cov}(y_{ij}, y_{ij'}) = \text{Cov}(\pi_i + e_{ij},\, \pi_i + e_{ij'}) = \sigma_\pi^2\) (오차는 독립).
분산: \(V(y_{ij}) = \sigma_\pi^2 + \sigma_e^2\) (모든 시점에서 동일 → 복합대칭).
\[ \widehat{\text{ICC}} = \frac{\widehat{\sigma}_\pi^2}{\widehat{\sigma}_\pi^2 + \widehat{\sigma}_e^2} = \frac{MS_S - MS_R}{MS_S + (n-1)MS_R} \]
직관: ICC는 “전체 변동 중 피험자 간 개인차가 차지하는 비율”이다. \(R^2\) 처럼 해석할 수 있다. ICC = 0.8이면 어휘 점수 변동의 80%가 “누구냐”(개인 특성)로 설명된다. ICC가 높을수록 반복측정 설계의 검정력 이득이 크다.
ICC가 \(j, j'\) 에 관계없이 모든 시점 쌍에서 동일하다는 것은 복합대칭(CS) 가정이다. CS 위반 시 F-검정이 과자유로적(too liberal)이 된다 → Greenhouse-Geisser 보정 필요. 구형성 검정과 보정에 대한 자세한 내용은 반복측정 ANOVA 개요를 참조한다.
9 시간 효과 심화 분해: 대비 분석
\(F_T\) 로 “시간 효과가 있다”는 것을 확인했다면, 다음 질문은 “어떤 패턴으로 변화하는가?”이다. 이를 위해 시간의 \(SS_T\) 를 \(n-1\) 개의 독립 성분으로 분해한다.
9.1 대비의 정의와 수식
대비(contrast) \(L\) 은 시점 평균 \(\bar{y}_{.j}\) 의 선형 결합으로 계수 합이 0이 되는 것이다:
\[ L = \sum_{j=1}^n c_j \bar{y}_{.j}, \quad \sum_j c_j = 0. \]
대비의 분산:
\[ V(L) = V\!\left(\sum_j c_j \bar{y}_{.j}\right) = \frac{\sigma_e^2}{N} \sum_j c_j^2. \]
단일 대비의 제곱합과 F-통계량:
\[ SS_L = \frac{N L^2}{\sum_j c_j^2}, \quad F_L = \frac{SS_L / 1}{MS_R} = \frac{N L^2 / \sum_j c_j^2}{MS_R} \sim F_{1,\,(N-1)(n-1)}. \]
자유도 1의 F는 곧 \(t^2\) 와 같다:
\[ t_L = \frac{L}{\sqrt{MS_R \sum_j c_j^2 / N}} \sim t_{(N-1)(n-1)}. \]
9.2 직교 대비와 SS 분해
\(n-1\) 개의 대비 \(L_1, L_2, \ldots, L_{n-1}\) 이 직교(orthogonal) 하면
\[ \sum_{k=1}^{n-1} SS_{L_k} = SS_T. \]
직교 조건: \(\sum_j c_{kj} c_{lj} = 0 \; (k \neq l)\).
이 성질 덕분에 시간의 총 변동을 독립적인 부분들로 완전 분해할 수 있다.
9.3 대비 유형 1: 직교 다항식 대비 (추세 분석)
등간격 시점( \(n = 4\), 학년 8~11)에서 직교 다항식 계수(표준화 전):
\[ \mathbf{c}_{\text{선형}} = (-3, -1, 1, 3), \quad \mathbf{c}_{\text{이차}} = (1, -1, -1, 1), \quad \mathbf{c}_{\text{삼차}} = (-1, 3, -3, 1). \]
표준화 후( \(\lambda_k = \sqrt{N/\sum_j c_{kj}^2}\) 로 나눔):
| 성분 | \(\sum_j c_j^2\) | 포착하는 패턴 |
|---|---|---|
| 선형 | 20 | 단조 증가/감소 |
| 이차 | 4 | 감속/가속(U자, 역U자) |
| 삼차 | 20 | S자 곡선 |
\(n = 4\) 의 경우 직교 다항식 행렬:
\[ C = \frac{1}{\sqrt{\lambda}} \begin{bmatrix} -3 & -1 & 1 & 3 \\ 1 & -1 & -1 & 1 \\ -1 & 3 & -3 & 1 \end{bmatrix} \]
직관: 어휘력이 매년 일정하게 증가하면 선형 성분만 유의하다. 증가 속도가 점점 느려지면 이차 성분이 음(negative)으로 유의하다. 이차 성분의 계수 추정값이 음수이면 위로 볼록(concave) 성장 곡선을 의미한다.
Bock(1975) 예제 적용:
\[ \hat{L}_{\text{선형}} = (-3)(1.14) + (-1)(2.54) + (1)(2.99) + (3)(3.47) = 6.67. \]
\(\hat{L}_{\text{선형}} / \sqrt{20} = 6.67/4.47 = 1.49\) (정규화된 선형 대비값).
\[ SS_{\text{선형}} = \frac{64 \times 6.67^2}{20} = \frac{64 \times 44.49}{20} = 142.37. \]
같은 방법으로 이차, 삼차 성분을 계산하여 \(SS_T = 194.34\) 를 완전히 분해한다.
9.4 대비 유형 2: 기준셀 대비 (Baseline 비교)
첫 시점을 기저선(baseline)으로 삼아 각 후속 시점과의 차이를 검정한다.
\[ \mathbf{c}_1 = (-1, 1, 0, 0), \quad \mathbf{c}_2 = (-1, 0, 1, 0), \quad \mathbf{c}_3 = (-1, 0, 0, 1). \]
각각 \(T_2 - T_1\), \(T_3 - T_1\), \(T_4 - T_1\) 을 검정한다.
비직교 주의: \(\mathbf{c}_1 \cdot \mathbf{c}_2 = 1 \neq 0\) 이므로 대비들이 독립이 아니다. \(SS\) 가 \(SS_T\) 로 합산되지 않는다. 각 대비를 독립적으로 해석해야 한다.
언제 사용하는가: 처치 전(기저선) 대비 각 추적 시점에서의 개선 여부를 개별 확인할 때. 임상시험에서 “2주 후”, “4주 후”, “8주 후” 각각 기저선 대비 유의한 변화가 있는가를 본다.
Bock 예제 적용:
\[ \hat{L}_1 = 2.54 - 1.14 = 1.40 \quad (9\text{학년} - 8\text{학년}), \]
\[ F_1 = \frac{64 \times 1.40^2 / 2}{0.82} = \frac{62.72}{0.82} = 76.5. \]
9.5 대비 유형 3: 프로파일 대비 (인접 시점 비교)
인접 시점 간 차이를 순서대로 검정한다.
\[ \mathbf{c}_1 = (-1, 1, 0, 0), \quad \mathbf{c}_2 = (0, -1, 1, 0), \quad \mathbf{c}_3 = (0, 0, -1, 1). \]
각각 \(T_2 - T_1\), \(T_3 - T_2\), \(T_4 - T_3\) 을 검정한다.
직관: “변화가 언제 발생하는가?”를 파악한다. 9학년 때 급증했다가 이후 안정되는지, 아니면 꾸준히 증가하는지를 구분한다.
비직교: 연속 두 대비는 \(T_2\) 시점을 공유하므로 독립이 아니다.
9.6 대비 유형 4: Helmert 대비 (역방향)
각 시점을 이후 시점들의 평균과 비교한다.
\[ \mathbf{c}_1 = (3, -1, -1, -1)/\sqrt{12},\quad \mathbf{c}_2 = (0, 2, -1, -1)/\sqrt{6}, \quad \mathbf{c}_3 = (0, 0, 1, -1)/\sqrt{2}. \]
직교성 확인: \(\mathbf{c}_1 \cdot \mathbf{c}_2 = 0\), \(\mathbf{c}_1 \cdot \mathbf{c}_3 = 0\), \(\mathbf{c}_2 \cdot \mathbf{c}_3 = 0\). 세 대비 모두 직교하므로 \(SS_T\) 를 독립 분해한다.
직관: “초기 시점이 나중 시점들의 평균과 다른가?”를 각 단계별로 확인한다. “8학년은 9-11학년 평균보다 낮은가?” → “9학년은 10-11학년 평균보다 낮은가?” → “10학년은 11학년보다 낮은가?” 증가 패턴이 시간이 지남에 따라 어디서 변화하는지를 포착한다.
9.7 대비 유형 비교 요약
| 유형 | 직교성 | 주요 질문 | 전형적 사용 상황 |
|---|---|---|---|
| 직교 다항식 | 직교 | 추세 형태(선형? 곡선?) | 등간격 시점, 성장 연구 |
| 기준셀 | 비직교 | 기저선 대비 변화 | 임상시험, 처치 전후 |
| 프로파일 | 비직교 | 인접 시점 변화 | 변화 시점 식별 |
| Helmert | 직교 | 단계별 누적 비교 | 순서 있는 시점 비교 |
9.8 다중비교 조정
\(n-1\) 개 대비를 동시에 검정하면 실험 전체 1종 오류율(FWER)이 증가한다.
- 사전 지정 대비: 연구 설계 단계에서 대비를 미리 지정했다면, 일부 통계학자는 조정이 불필요하다고 주장한다 (검정 개수가 미리 고정됨).
- Bonferroni: \(\alpha^* = \alpha/(n-1)\). 보수적이지만 간단하다.
- Fisher 보호 검정: \(F_T\) 가 먼저 유의할 때만 개별 대비를 검정한다. 직교 다항식의 경우 최고차 다항식부터 역방향(삼차 → 이차 → 선형)으로 검정하여 처음 유의하지 않은 차수에서 멈춘다.
10 예제: Bock(1975) 어휘 성장 자료
10.1 자료 개요
64명의 학생을 8~11학년(4시점)에 걸쳐 추적하여 어휘력 검사를 반복 측정했다. 시점 평균: \(\bar{y}_{.1} = 1.14\), \(\bar{y}_{.2} = 2.54\), \(\bar{y}_{.3} = 2.99\), \(\bar{y}_{.4} = 3.47\).
10.2 ANOVA 표
| 변동 원인 | \(df\) | \(SS\) | \(MS\) | \(F\) | \(p\) |
|---|---|---|---|---|---|
| 피험자 | 63 | 873.60 | 13.87 | 16.91 | < .0001 |
| 학년 | 3 | 194.34 | 64.78 | 79.02 | < .0001 |
| 잔차 | 189 | 154.94 | 0.82 | ||
| 합계 | 255 | 1222.88 |
10.3 분산 성분 추정
\[ \widehat{\sigma}_e^2 = MS_R = 0.82, \]
\[ \widehat{\sigma}_\pi^2 = \frac{MS_S - MS_R}{n} = \frac{13.87 - 0.82}{4} = 3.26, \]
\[ \widehat{\text{ICC}} = \frac{3.26}{3.26 + 0.82} = 0.80. \]
해석: 어휘 점수 변동의 80%가 피험자 간 개인차로 설명된다. 학년 효과가 아무리 크더라도, 개인의 능력 수준이 4년 내내 점수를 지배한다.
10.4 직교 다항식 분해
4시점 정규화 직교 다항식 행렬을 시점 평균 벡터 \((1.14, 2.54, 2.99, 3.47)'\) 에 적용:
\[ \hat{L}_{\text{선형}} = (-0.671)(1.14) + (-0.224)(2.54) + (0.224)(2.99) + (0.671)(3.47) = 1.67, \]
\[ \hat{L}_{\text{이차}} = (0.5)(1.14) + (-0.5)(2.54) + (-0.5)(2.99) + (0.5)(3.47) = -0.46, \]
\[ \hat{L}_{\text{삼차}} = (-0.224)(1.14) + (0.671)(2.54) + (-0.671)(2.99) + (0.224)(3.47) = 0.22. \]
| 성분 | \(\hat{L}\) | \(SS\) | \(F\) | 해석 |
|---|---|---|---|---|
| 선형 | \(1.67\) | \(177.58\) | \(216.6\) | 강한 증가 추세 |
| 이차 | \(-0.46\) | \(13.58\) | \(16.6\) | 증가 속도 감속 |
| 삼차 | \(0.22\) | \(3.17\) | \(3.9\) | 경계선 (감속의 부분 반전) |
| 합계 | \(194.33 \approx 194.34\) |
해석:
- 선형 성분: 학년이 오를수록 어휘력이 단조 증가한다. 가장 강한 신호다.
- 이차 성분: \(\hat{L}_{\text{이차}} = -0.46 < 0\) 이므로 위로 볼록(감속 성장)이다. 성장 곡선이 8학년 → 9학년 구간에서 가장 가파르고 이후 완만해진다. 원가설(“어휘 성장도 신체 성장처럼 감속한다”)을 지지한다.
- 삼차 성분: \(p = .051\) 로 경계선. 큰 비중을 두기 어렵다.
11 Python · R 코드
11.1 Step 1: 순수 Python 구현 (원리 이해)
import numpy as np
# Bock(1975) 요약 통계로 재구성 (가상 개인 데이터 사용)
rng = np.random.default_rng(42)
N, n = 64, 4 # 피험자 수, 시점 수
# 분산 성분에서 역산 (ICC=0.80, sigma_e^2=0.82, sigma_pi^2=3.26)
sigma_pi = np.sqrt(3.26)
sigma_e = np.sqrt(0.82)
tau = np.array([-1.575, 0.825, 1.275, 1.775]) # 시점 효과 (합=0 조건)
mu = 2.57 # 전체 평균
# 데이터 생성
pi_i = rng.normal(0, sigma_pi, N) # 개인차 성분
e_ij = rng.normal(0, sigma_e, (N, n)) # 오차
Y = mu + pi_i[:, None] + tau[None, :] + e_ij # N × n 행렬
# SS 분해 — 순수 numpy
grand_mean = Y.mean()
y_i_bar = Y.mean(axis=1) # 피험자 평균 (N,)
y_j_bar = Y.mean(axis=0) # 시점 평균 (n,)
SS_total = ((Y - grand_mean) ** 2).sum()
SS_S = n * ((y_i_bar - grand_mean) ** 2).sum()
SS_T = N * ((y_j_bar - grand_mean) ** 2).sum()
SS_R = ((Y - y_i_bar[:, None] - y_j_bar[None, :] + grand_mean) ** 2).sum()
df_S, df_T, df_R = N - 1, n - 1, (N - 1) * (n - 1)
MS_S = SS_S / df_S
MS_T = SS_T / df_T
MS_R = SS_R / df_R
F_T = MS_T / MS_R
print(f"SS 분해 확인: {SS_S + SS_T + SS_R:.4f} vs {SS_total:.4f}")
print(f"\n-- ANOVA 표 --")
print(f"피험자: SS={SS_S:.2f}, df={df_S}, MS={MS_S:.3f}")
print(f"시간 : SS={SS_T:.2f}, df={df_T}, MS={MS_T:.3f}, F={F_T:.2f}")
print(f"잔차 : SS={SS_R:.2f}, df={df_R}, MS={MS_R:.3f}")
# 분산 성분 추정
sigma_e2_hat = MS_R
sigma_pi2_hat = max((MS_S - MS_R) / n, 0)
ICC_hat = sigma_pi2_hat / (sigma_pi2_hat + sigma_e2_hat)
print(f"\n분산 성분: σ²_e={sigma_e2_hat:.3f}, σ²_π={sigma_pi2_hat:.3f}, ICC={ICC_hat:.3f}")
# 직교 다항식 대비 (4시점 표준화 계수)
C = np.array([
[-0.6708, -0.2236, 0.2236, 0.6708], # 선형
[ 0.5, -0.5, -0.5, 0.5 ], # 이차
[-0.2236, 0.6708, -0.6708, 0.2236], # 삼차
])
L_hat = C @ y_j_bar # (3,) 대비 추정값
SS_poly = N * L_hat ** 2 # 정규화 계수 = 1이므로 단순화
print(f"\n직교 다항식 대비:")
for k, name in enumerate(['선형', '이차', '삼차']):
F_k = SS_poly[k] / MS_R
print(f" {name}: L={L_hat[k]:.3f}, SS={SS_poly[k]:.2f}, F={F_k:.2f}")11.2 Step 2: R 구현 (실무 활용)
library(tidyverse)
library(rstatix)
library(emmeans)
# ---- 데이터 준비 (wide → long) ----
# vocab_wide: 64행 × 4열 (grade 8, 9, 10, 11)
set.seed(42)
vocab_wide <- as.data.frame(
matrix(rnorm(64 * 4, mean = c(1.14, 2.54, 2.99, 3.47), sd = 2),
nrow = 64, ncol = 4, byrow = FALSE)
)
names(vocab_wide) <- paste0("grade", 8:11)
vocab_wide$subject <- factor(1:64)
vocab_long <- vocab_wide |>
pivot_longer(starts_with("grade"), names_to = "grade", values_to = "score") |>
mutate(grade = factor(grade, levels = paste0("grade", 8:11)))
# ---- 반복측정 ANOVA (rstatix) ----
res <- anova_test(
data = vocab_long,
dv = score,
wid = subject,
within = grade
)
# GGe 보정 포함 결과 출력
get_anova_table(res)
# Mauchly 구형성 검정
res$`Mauchly's Test for Sphericity`
res$`Sphericity Corrections`
# ---- 사후 대비 (emmeans) ----
model_aov <- aov(score ~ grade + Error(subject/grade), data = vocab_long)
emm <- emmeans(model_aov, ~ grade)
# 직교 다항식 추세 분석
contrast(emm, "poly")
# 기준셀 대비 (grade8 기준)
contrast(emm, "trt.vs.ctrl", ref = "grade8")
# 프로파일 대비 (인접 시점)
contrast(emm, "consec")
# Helmert 대비
contrast(emm, "helmert")11.3 Step 3: Python statsmodels 구현
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.anova import AnovaRM
# long format 데이터 준비
data = vocab_long.copy() # subject, grade, score 컬럼 필요
# 반복측정 ANOVA
res = AnovaRM(data=data, depvar='score', subject='subject', within=['grade']).fit()
print(res.summary())
# 시점 평균 및 대비
grade_means = data.groupby('grade')['score'].mean()
tau_hat = grade_means - grade_means.mean()
print("\n시점 효과 추정값:")
print(tau_hat)
# 직교 다항식 대비
C = np.array([
[-0.6708, -0.2236, 0.2236, 0.6708],
[ 0.5, -0.5, -0.5, 0.5 ],
[-0.2236, 0.6708, -0.6708, 0.2236],
])
L = C @ grade_means.values
print("\n직교 다항식 대비 추정값:", L)12 관련 주제
선행 지식
- 종단 연구 개요 — 반복 측정 데이터의 구조, 공분산, ICC
- 반복측정 ANOVA 개요 — 단일·다중 표본, 구형성
- Oneway ANOVA — 고전적 가설, F 검정, Scheffé
- SS 분해 — Cochran 정리, Type I/II/III
후속 주제
- 다중 표본 반복측정 ANOVA (분할구획 설계)
- MANOVA — 다변량 반복측정
- Linear Mixed Model — LMM: RM-ANOVA의 현대적 대안, MAR 결측 허용 (
./LDA/01-mixed-model-intro.qmd)
관련 개념