단일 표본 반복측정 ANOVA: 시간 효과 분해

임의블록 설계 구조, 공분산 행렬, SS 분해, E[MS] 유도, 대비 분석, 분산 성분 추정까지 수식과 직관으로

동일 피험자를 여러 시점에 반복 측정할 때 시간 효과를 어떻게 분리하는지 수식과 직관으로 상세히 설명한다. 임의블록 설계의 데이터 구조, 복합대칭 공분산 행렬, 식별 조건, 독립 표본 설계와의 비교를 포함하는 설계 구조 섹션과, 전체 변동을 피험자·시간·잔차로 분해하는 SS 항등식, 각 MS의 기댓값과 F-통계량의 정당성, ICC를 통한 분산 성분 추정, 직교 다항식·기준셀·Helmert 대비를 이용한 시간 효과의 심층 분해를 다룬다.

Statistics
Longitudinal Data Analysis
저자

Kwangmin Kim

공개

2026년 04월 09일

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\) )에 반복 측정된다.

모형: 단일 표본 반복측정 ANOVA (임의블록 설계)

\[ 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\) 이다.
\(n = 2\) 이면 대응 \(t\)-검정과 동일

시점이 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의 두 가지 핵심 성질:

  1. 대각 원소 동일: 모든 시점에서 분산이 \(\sigma_\pi^2 + \sigma_e^2\) 로 같다. 시간이 지나도 측정 변동성이 변하지 않는다고 가정한다.
  2. 비대각 원소 동일: 모든 시점 쌍의 공분산이 \(\sigma_\pi^2\) 로 같다. 1주 후와 10주 후의 측정값 사이 상관이 1주 후와 2주 후 사이 상관과 같다고 가정한다.
CS 가정의 현실적 한계

두 가지 점에서 비현실적이다.

  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 분해 항등식

\[ 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-통계량과 귀무가설

시간 효과의 검정:

시간 효과 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\) (모든 시점에서 동일 → 복합대칭).

ICC 추정량

\[ \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 관련 주제

선행 지식

후속 주제

관련 개념

Subscribe

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