1 개요
앞선 포스트들에서 반복측정 MANOVA의 이론적 틀을 구축했다.
- [173] MANOVA 접근법 개요 (SSCP 분해, 네 가지 검정 통계량)
- [175] 일표본 MANOVA: P 행렬 유도, SST* · SSR* 행렬 구조
- [176] 다표본 MANOVA: SSG* 행렬, 집단×시간 교호작용
이 포스트는 이론을 수치로 확인하는 Illustration 단계다. Bock(1975) § 및 Hedeker & Gibbons(2006, Ch.3)의 어휘 성장 데이터를 이용하여 다음을 단계별로 계산한다.
- 직교 다항식 행렬 \(P\) 구성과 \(\hat{\theta} = P\bar{y}\) 계산
- SST* (시간 SSCP) 행렬 수치 구성
- SSR* (잔차 SSCP) 행렬 수치 구성
- 결정방정식 풀이 → Roy’s largest root, Wilks’ Λ
- F 변환 및 유의성 판단
- 개별 추세 F 검정: Method A(구형성 가정) vs Method B(MANOVA)
- 단변량 RM ANOVA 결과 추출 (SSCP에서 직접 복원)
수치 계산을 따라가면서 “왜 이 행렬이 이 구조를 가지는가”에 대한 직관을 동시에 확인한다.
2 데이터: Bock 어휘 성장 연구
2.1 연구 설계
Bock(1975)의 어휘 성장 데이터는 미국 학생 64명을 대상으로 8학년에서 11학년까지(4개 시점) 어휘 점수를 측정한 종단 연구다.
| 변수 | 값 |
|---|---|
| 피험자 수 \(N\) | 64 |
| 시점 수 \(n\) | 4 (8학년, 9학년, 10학년, 11학년) |
| 반응 변수 | 어휘 점수 (연속형) |
2.2 시점별 요약 통계 (Table 2.1 요약)
\[ \bar{y} = \begin{bmatrix} 1.14 \\ 2.54 \\ 2.99 \\ 3.47 \end{bmatrix} \quad \text{(8, 9, 10, 11학년 평균)} \]
직관: 점수가 단조 증가하지만, 증가폭은 8→9학년(1.40) > 9→10학년(0.45) > 10→11학년(0.48)으로 초기에 급격히 증가한 뒤 점차 감소한다. 이는 양의 선형 추세와 음의 이차 추세(감속 성장)가 공존함을 시사한다.
3 직교 다항식 행렬 \(P\) 구성
3.1 \(P\) 행렬의 역할
시간 효과를 분해하려면 각 추세(상수, 선형, 이차, 삼차) 성분을 직교 단위로 표현해야 한다. 직교성은 추세들 사이의 교란(confounding)을 제거하여 각 추세를 독립적으로 검정할 수 있게 한다.
\(P\) 행렬은 시간 행렬 \(T\)로부터 Cholesky 분해로 유도된다:
\[ P = S^{-1}T, \quad SS' = TT' \]
여기서 \(S\) 는 하삼각 행렬이다.
3.2 \(n=4\) 등간격 시점의 \(P_4\) 행렬
4개 등간격 시점에서 직교 다항식 대비를 표로 구하거나 위 Cholesky 방법으로 계산하면 다음을 얻는다 (Hedeker & Gibbons, 2006, Ch.3):
\[ P_4 = \begin{bmatrix} 0.5 & 0.5 & 0.5 & 0.5 \\ -0.67082 & -0.22361 & 0.22361 & 0.67082 \\ 0.22361 & -0.67082 & 0.67082 & -0.22361 \\ -0.22361 & 0.67082 & -0.67082 & 0.22361 \end{bmatrix} \]
행 순서: (0) 상수, (1) 선형, (2) 이차, (3) 삼차.
직관: 각 행이 하나의 “필터”다. 상수 행 \([0.5, 0.5, 0.5, 0.5]\) 를 곱하면 4시점 평균이 나온다. 선형 행 \([-0.67, -0.22, 0.22, 0.67]\) 는 가중 증가율을 포착한다 — 시간이 지날수록 가중치가 커지므로 전반적인 증가 추세에 민감하다. 이차 행은 가속/감속을 잡는다.
\(P\) 의 직교성 확인:
\[ PP' = I_4 \quad \text{(행 벡터들이 서로 직교, 단위 길이)} \]
4 \(\hat{\theta} = P\bar{y}\): 직교 다항식 추정량
\(\bar{y}\) 에 \(P_4\) 를 전치 없이 곱하면 변환된 평균 벡터 \(\hat{\theta}\) 를 얻는다:
\[ \hat{\theta} = P\bar{y} = P_4 \begin{bmatrix} 1.14 \\ 2.54 \\ 2.99 \\ 3.47 \end{bmatrix} \]
계산 결과:
| 성분 | \(\hat{\theta}\) 값 | 해석 |
|---|---|---|
| 상수 \(\hat{\theta}_0\) | 5.0694 | 전체 총 평균 × \(\sqrt{N}\) 스케일 |
| 선형 \(\hat{\theta}_1\) | 1.6658 | 점수가 시간에 따라 증가 (양수) |
| 이차 \(\hat{\theta}_2\) | −0.4606 | 증가 속도가 감속 (음수 → 오목형 성장) |
| 삼차 \(\hat{\theta}_3\) | 0.2224 | 3차 비선형 성분 (작음) |
직관: 선형 성분(1.666)이 이차 성분(−0.461)보다 약 3.6배 크다. 따라서 주된 시간 추세는 선형 증가이며, 그 위에 완만한 감속이 얹혀 있는 형태다. 삼차 성분(0.222)은 작아서 유의하지 않을 가능성이 높다.
수기 계산 검증 (선형 성분):
\[ \hat{\theta}_1 = (-0.67082)(1.14) + (-0.22361)(2.54) + (0.22361)(2.99) + (0.67082)(3.47) \]
\[ = -0.765 - 0.568 + 0.669 + 2.328 = 1.664 \approx 1.6658 \]
5 SST* 행렬 구성
5.1 공식
\[ \text{SST}^* = N \cdot P\bar{y} \cdot (P\bar{y})' = N \hat{\theta}\hat{\theta}' \]
즉, 변환된 평균 벡터 \(\hat{\theta}\) 의 외적(outer product)에 \(N=64\) 를 곱한 행렬이다.
직관: SSCP는 “평균의 제곱 합”을 행렬로 확장한 것이다. 단변량에서 \(\text{SS}_T = N\sum_j (\bar{y}_j - \bar{y})^2\) 인 것처럼, 다변량에서는 변환된 평균 벡터의 제곱 합이 SST*의 대각원소들이 된다.
5.2 수치 (Hedeker & Gibbons, 2006, Table 3.1)
SST* 의 대각원소:
| 대각원소 | 값 | 의미 |
|---|---|---|
| \(\text{sst}_0\) | 1644.71 | 상수항 SS (= \(N \cdot \hat{\theta}_0^2 = 64 \times 5.0694^2\)) |
| \(\text{sst}_1\) | 177.59 | 선형 추세 SS |
| \(\text{sst}_2\) | 13.58 | 이차 추세 SS |
| \(\text{sst}_3\) | 3.17 | 삼차 추세 SS |
검증: \(N \times \hat{\theta}_1^2 = 64 \times 1.6658^2 = 64 \times 2.775 = 177.6\) ✓
SST* 는 \(4 \times 4\) 대칭 행렬이며, \((k, l)\) 원소는 \(N \hat{\theta}_k \hat{\theta}_l\) 이다. 예를 들어:
\[ \text{sst}_{12} = N \hat{\theta}_1 \hat{\theta}_2 = 64 \times (1.6658)(-0.4606) = -49.11 \]
6 SSR* 행렬 구성
6.1 공식
\[ \text{SSR}^* = P\left(Y'Y - N\bar{y}\bar{y}'\right)P' \]
괄호 안의 \(Y'Y - N\bar{y}\bar{y}'\) 는 원래 시점별 공분산 행렬에 비례하는 편차 제곱합·교차곱 행렬이다.
6.2 수치 (Table 3.1)
SSR* 의 대각원소:
| 대각원소 | 값 | 의미 |
|---|---|---|
| \(\text{ssr}_0\) | 873.60 | 피험자 간 SS |
| \(\text{ssr}_1\) | 50.42 | 피험자×선형 SS (선형 추세 오차) |
| \(\text{ssr}_2\) | 43.95 | 피험자×이차 SS (이차 추세 오차) |
| \(\text{ssr}_3\) | 60.57 | 피험자×삼차 SS (삼차 추세 오차) |
직관: SSR* 대각원소 세 값(50.42, 43.95, 60.57)이 비슷한 크기다. 이는 세 추세 성분의 오차 분산이 유사함을 의미하며, 구형성(sphericity) 가정이 크게 위반되지 않는다는 신호다. 실제로 Hedeker & Gibbons(2006)는 구형성 검정이 기각되지 않는다고 언급한다.
6.3 SSR* 의 비대각 원소
SSR* 의 비대각 원소는 추세 성분들 사이의 상관을 반영한다. 완전한 구형성이라면 이 비대각 원소는 모두 0이어야 한다:
\[ \text{SSR}^* \approx \begin{bmatrix} 873.60 & 3.84 & -49.82 & -23.76 \\ 3.84 & 50.42 & 12.05 & -3.36 \\ -49.82 & 12.05 & 43.95 & -4.27 \\ -23.76 & -3.36 & -4.27 & 60.57 \end{bmatrix} \]
하우 3×3 블록(선형·이차·삼차 부분)의 비대각 원소들이 대각 원소 대비 상대적으로 작다. 이는 구형성 가정이 대체로 성립함을 지지한다.
7 다변량 시간 효과 검정
7.1 결정방정식 풀이
시간 효과의 귀무가설 \(H_0: \tau = 0\) 을 검정하기 위해 SST* 와 SSR* 의 하위 \((n-1) \times (n-1) = 3 \times 3\) 블록을 추출한다. 이 블록을 각각 \(\text{SST}^*_{(3)}\), \(\text{SSR}^*_{(3)}\) 으로 표기한다.
결정방정식:
\[ |\text{SST}^*_{(3)} - \lambda \, \text{SSR}^*_{(3)}| = 0 \]
Cholesky 분해 \(\text{SSR}^*_{(3)} = EE'\) 를 이용하면 단일 행렬 고유값 문제로 환원된다:
\[ |E^{-1}\text{SST}^*_{(3)}(E^{-1})' - \lambda I_3| = 0 \]
이 방정식의 해(고유값):
\[ \lambda_1 = 4.7432 \quad (\text{Roy's largest root}) \]
직관: \(\lambda_1 \approx 4.74\) 는 “SST* 가 SSR* 의 약 4.7배”라는 의미다. 귀무가설이 참이면 \(\lambda_1 \approx 1\) 이어야 하므로, 4.74는 매우 강한 시간 효과를 시사한다.
7.2 Wilks’ Λ
\[ \Lambda = \frac{1}{1 + \lambda_1} = \frac{1}{1 + 4.7432} = 0.17412 \]
일표본 경우 고유값이 하나이므로 Wilks’ Λ 도 단일 항이다.
해석: \(\Lambda = 0.174\) 는 “시간에 의해 설명되지 않은 분산 비율”이다. 1에서 빼면 약 83%의 시간 분산이 설명된다. 이 값을 F 통계량으로 변환하면 (Finn, 1974):
\[ F = 96.45, \quad df = (3, 61), \quad p < 0.0001 \]
8 개별 추세 F 검정: Method A vs Method B
8.1 Method A: 구형성 가정 (pooled \(\text{MS}_R\))
구형성이 성립하면 \(\text{SSR}^*_{(3)}\) 의 3개 대각원소를 평균하여 공통 오차항을 만든다:
\[ \text{MS}_R = \frac{\text{ssr}_1 + \text{ssr}_2 + \text{ssr}_3}{(N-1)(n-1)} = \frac{50.42 + 43.95 + 60.57}{63 \times 3} = \frac{154.94}{189} = 0.8201 \]
선형 추세:
\[ F_{\text{linear}}^{(A)} = \frac{\text{sst}_1 / 1}{\text{MS}_R} = \frac{177.59}{0.8201} = 216.63, \quad df = (1, 189) \]
8.2 Method B: MANOVA (separate denominators)
MANOVA는 각 추세 성분에 자체 오차항을 사용한다:
\[ F_{\text{linear}}^{(B)} = \frac{\text{sst}_1 / 1}{\text{ssr}_1 / (N-1)} = \frac{177.59}{50.42/63} = \frac{177.59}{0.8003} = 221.88, \quad df = (1, 63) \]
8.3 세 추세 성분 비교표
| 추세 | \(\text{sst}_k\) | \(\text{ssr}_k\) | \(F^{(A)}\) (df=1,189) | \(F^{(B)}\) (df=1,63) | 판단 |
|---|---|---|---|---|---|
| 선형 | 177.59 | 50.42 | 216.63 | 221.88 | 매우 유의 |
| 이차 | 13.58 | 43.95 | 16.56 | 19.46 | 매우 유의 |
| 삼차 | 3.17 | 60.57 | 3.87 | 3.29 | 유의하지 않음 (p≈0.075) |
핵심 비교:
- 선형·이차: 두 방법 모두 매우 유의. 어휘 점수는 시간에 따라 선형 증가하며, 증가 속도는 점차 감속한다.
- 삼차: Method A 는 F=3.87 (df=189, 임계값 낮음), Method B 는 F=3.29 (df=63, 임계값 높음). 두 방법 모두 p≈0.075로 한계적이다.
- 검정력 방향: 구형성이 성립하므로 Method A 가 분모 자유도(189 vs 63)가 더 커서 임계 F 값이 낮다. 결과적으로 Method A 가 삼차 항에서 미세하게 더 높은 검정력을 갖는다.
8.4 검정력 직관
Method A (RM ANOVA): 분모 \(\text{MS}_R\) 은 세 추세 오차의 평균으로 구성 — 분모 df = \((N-1)(n-1) = 189\).
Method B (MANOVA): 각 추세마다 개별 오차항 사용 — 분모 df = \(N-1 = 63\).
분모 df가 클수록 임계값이 작아진다. 구형성이 성립하면 평균이 안전하므로 Method A 의 큰 df 가 검정력 이점을 제공한다. 구형성이 위반되면 평균 자체가 편향되어 Method B 가 더 신뢰할 수 있다.
9 단변량 RM ANOVA 결과 추출
SSCP 행렬로부터 단변량 ANOVA 표를 직접 복원할 수 있다. 이것이 MANOVA 접근의 또 다른 장점이다 — 하나의 SSCP 계산으로 단변량·다변량 결과를 모두 얻는다.
9.1 SS 추출 규칙
| ANOVA 소스 | 공식 | 수치 |
|---|---|---|
| \(\text{SS}_S\) (피험자 간) | \(\text{ssr}_0\) (SSR* 첫 번째 대각) | 873.60 |
| \(\text{SS}_T\) (시간) | \(\text{sst}_1 + \text{sst}_2 + \text{sst}_3\) | \(177.59 + 13.58 + 3.17 = \mathbf{194.34}\) |
| \(\text{SS}_R\) (잔차) | \(\text{ssr}_1 + \text{ssr}_2 + \text{ssr}_3\) | \(50.42 + 43.95 + 60.57 = \mathbf{154.94}\) |
9.2 단변량 ANOVA 표
| 소스 | df | SS | MS | F | p |
|---|---|---|---|---|---|
| 피험자 | 63 | 873.60 | 13.87 | 16.91 | <.0001 |
| 시간 | 3 | 194.34 | 64.78 | 78.99 | <.0001 |
| 잔차 (피험자×시간) | 189 | 154.94 | 0.820 | — | — |
\(F_{\text{시간}} = \text{MS}_T / \text{MS}_R = 64.78 / 0.820 = 78.99\)
두 접근법 비교: 단변량 F = 78.99 vs 다변량 F(Wilks’ Λ 기반) = 96.45. 두 방법이 모두 강하게 유의하지만 수치가 다른 이유는 분모 구성 방식(평균 vs 행렬식)이 다르기 때문이다.
10 구형성 검정 결과
교재에서 이 데이터의 구형성 검정 결과는 기각되지 않는다고 언급한다 (Hedeker & Gibbons, 2006, Ch.3). SSR* 의 하위 3×3 블록을 기반으로 Mauchly 검정을 수행하면 구형성 가정이 지지된다.
실제로 \(\text{ssr}_1 = 50.42\), \(\text{ssr}_2 = 43.95\), \(\text{ssr}_3 = 60.57\) 의 세 값이 비슷한 크기임은 구형성의 직관적 증거다.
이 데이터에서는 구형성이 성립하므로 Method A (RM ANOVA)와 Method B (MANOVA) 모두 유효하다. 그러나 일반적인 종단 데이터에서는 구형성이 종종 위반된다. 분산이 시간이 지남에 따라 증가하거나, 멀리 떨어진 시점 간 상관이 가까운 시점보다 작아지는 패턴이 흔하다. 이 경우 MANOVA (Method B) 또는 혼합효과 공분산 패턴 모형이 권장된다.
11 R 코드: 단계별 수치 재현
library(tidyverse)
# ----------------------------------------------------------------
# Step 1: 데이터 — Bock vocabulary growth 요약 통계
# (N=64, 4 timepoints)
# ----------------------------------------------------------------
N <- 64
n <- 4
# 시점별 평균 벡터
y_bar <- c(1.14, 2.54, 2.99, 3.47)
# 실제 데이터가 없으므로 SSR* 수치를 직접 사용 (교재 Table 3.1)
# SST* 대각원소
sst <- c(1644.71, 177.59, 13.58, 3.17) # 상수, 선형, 이차, 삼차
# SSR* 행렬 (하위 3x3 블록)
SSR_sub <- matrix(c(
50.42, 12.05, -3.36,
12.05, 43.95, -4.27,
-3.36, -4.27, 60.57
), nrow=3, byrow=TRUE)
# SST* 하위 3x3 블록 (대각원소만 있는 대각행렬로 근사)
SST_sub <- diag(sst[2:4]) # 비대각 원소는 교재 Table 3.1 참조
# ----------------------------------------------------------------
# Step 2: 직교 다항식 행렬 P_4 구성
# ----------------------------------------------------------------
time_matrix <- rbind(
rep(1, 4), # 상수
1:4, # 선형
(1:4)^2, # 이차
(1:4)^3 # 삼차
)
# Cholesky 방법으로 직교화
P_raw <- solve(chol(time_matrix %*% t(time_matrix))) %*% time_matrix
# 행 정규화 (각 행을 단위 벡터로)
P4 <- t(apply(P_raw, 1, function(r) r / sqrt(sum(r^2))))
cat("P4 행렬:\n")
print(round(P4, 5))
# ----------------------------------------------------------------
# Step 3: 변환된 평균 벡터 theta_hat
# ----------------------------------------------------------------
theta_hat <- P4 %*% y_bar
cat("\ntheta_hat:\n")
cat("상수:", round(theta_hat[1], 4), "\n")
cat("선형:", round(theta_hat[2], 4), "\n")
cat("이차:", round(theta_hat[3], 4), "\n")
cat("삼차:", round(theta_hat[4], 4), "\n")
# SST* 대각원소 검증
sst_manual <- N * theta_hat^2
cat("\nSST* 대각원소 (수동):", round(sst_manual, 2), "\n")
# ----------------------------------------------------------------
# Step 4: 다변량 검정 — Roy's largest root, Wilks' Lambda
# ----------------------------------------------------------------
# Cholesky 분해
E <- t(chol(SSR_sub)) # SSR = EE', E는 하삼각
# 표준 고유값 문제
M <- solve(E) %*% SST_sub %*% t(solve(E))
eigenvalues <- eigen(M)$values
lambda1 <- max(eigenvalues)
wilks_lambda <- prod(1 / (1 + eigenvalues))
cat("\n--- 다변량 검정 결과 ---\n")
cat("고유값들:", round(eigenvalues, 4), "\n")
cat("Roy's largest root λ₁:", round(lambda1, 4), "\n")
cat("Wilks' Λ:", round(wilks_lambda, 5), "\n")
# ----------------------------------------------------------------
# Step 5: 개별 추세 F 검정
# ----------------------------------------------------------------
ssr_diag <- c(50.42, 43.95, 60.57) # ssr_1, ssr_2, ssr_3
# Method A: pooled MS_R
MS_R_pooled <- sum(ssr_diag) / ((N-1) * (n-1))
F_methodA <- sst[2:4] / MS_R_pooled
# Method B: MANOVA (separate denominator)
MS_R_sep <- ssr_diag / (N-1)
F_methodB <- sst[2:4] / MS_R_sep
cat("\n--- 개별 추세 F 검정 ---\n")
trend_names <- c("선형", "이차", "삼차")
for (k in 1:3) {
cat(sprintf("%s: Method A F=%.2f (df=1,%d) Method B F=%.2f (df=1,%d)\n",
trend_names[k],
F_methodA[k], (N-1)*(n-1),
F_methodB[k], N-1))
}
# ----------------------------------------------------------------
# Step 6: 단변량 RM ANOVA 결과 추출
# ----------------------------------------------------------------
ssr_0 <- 873.60 # SSR* 첫 번째 대각원소
SS_S <- ssr_0
SS_T <- sum(sst[2:4])
SS_R <- sum(ssr_diag)
MS_S <- SS_S / (N-1)
MS_T <- SS_T / (n-1)
MS_R <- SS_R / ((N-1)*(n-1))
F_subjects <- MS_S / MS_R
F_time <- MS_T / MS_R
cat("\n--- 단변량 RM ANOVA (SSR*에서 추출) ---\n")
cat(sprintf("피험자: SS=%.2f, MS=%.3f, F=%.2f\n", SS_S, MS_S, F_subjects))
cat(sprintf("시간: SS=%.2f, MS=%.3f, F=%.2f\n", SS_T, MS_T, F_time))
cat(sprintf("잔차: SS=%.2f, MS=%.3f\n", SS_R, MS_R))12 Python 코드: 단계별 수치 재현
import numpy as np
# ----------------------------------------------------------------
# Step 1: 데이터 설정
# ----------------------------------------------------------------
N = 64
n = 4
y_bar = np.array([1.14, 2.54, 2.99, 3.47])
# SST* 대각원소 (교재 Table 3.1)
sst = np.array([1644.71, 177.59, 13.58, 3.17])
# SSR* 하위 3x3 블록
SSR_sub = np.array([
[ 50.42, 12.05, -3.36],
[ 12.05, 43.95, -4.27],
[ -3.36, -4.27, 60.57]
])
# SST* 하위 3x3 블록
SST_sub = np.diag(sst[1:])
# ----------------------------------------------------------------
# Step 2: 직교 다항식 행렬 P4
# ----------------------------------------------------------------
time_mat = np.vstack([np.ones(4), np.arange(1,5), np.arange(1,5)**2, np.arange(1,5)**3])
# Cholesky 분해로 직교화
TT = time_mat @ time_mat.T
S = np.linalg.cholesky(TT) # lower triangular
P_raw = np.linalg.inv(S) @ time_mat
# 행 정규화
P4 = P_raw / np.linalg.norm(P_raw, axis=1, keepdims=True)
print("P4 행렬:")
print(np.round(P4, 5))
# ----------------------------------------------------------------
# Step 3: 변환 평균 벡터
# ----------------------------------------------------------------
theta_hat = P4 @ y_bar
print(f"\ntheta_hat: {np.round(theta_hat, 4)}")
print(f"SST* 대각 검증: {np.round(N * theta_hat**2, 2)}")
# ----------------------------------------------------------------
# Step 4: 다변량 검정
# ----------------------------------------------------------------
E = np.linalg.cholesky(SSR_sub) # lower triangular, SSR = EE'
E_inv = np.linalg.inv(E)
M = E_inv @ SST_sub @ E_inv.T
eigenvalues = np.linalg.eigvalsh(M)[::-1] # 내림차순
lambda1 = eigenvalues[0]
wilks_lambda = np.prod(1.0 / (1.0 + eigenvalues))
print(f"\n고유값: {np.round(eigenvalues, 4)}")
print(f"Roy's largest root λ₁ = {lambda1:.4f}")
print(f"Wilks' Λ = {wilks_lambda:.5f}")
# ----------------------------------------------------------------
# Step 5: 개별 추세 F 검정
# ----------------------------------------------------------------
ssr_diag = np.array([50.42, 43.95, 60.57])
MS_R_pooled = ssr_diag.sum() / ((N-1) * (n-1))
F_methodA = sst[1:] / MS_R_pooled
MS_R_sep = ssr_diag / (N-1)
F_methodB = sst[1:] / MS_R_sep
print("\n개별 추세 F 검정:")
for k, name in enumerate(["선형", "이차", "삼차"]):
print(f" {name}: A={F_methodA[k]:.2f}(df=1,{(N-1)*(n-1)}) "
f"B={F_methodB[k]:.2f}(df=1,{N-1})")
# ----------------------------------------------------------------
# Step 6: 단변량 RM ANOVA 추출
# ----------------------------------------------------------------
ssr_0 = 873.60
SS_S = ssr_0
SS_T = sst[1:].sum()
SS_R = ssr_diag.sum()
MS_S = SS_S / (N-1)
MS_T = SS_T / (n-1)
MS_R = SS_R / ((N-1)*(n-1))
print(f"\n단변량 RM ANOVA:")
print(f" 피험자: SS={SS_S:.2f}, F={MS_S/MS_R:.2f}")
print(f" 시간: SS={SS_T:.2f}, F={MS_T/MS_R:.2f}")
print(f" 잔차: SS={SS_R:.2f}, MS={MS_R:.3f}")13 결과 요약 및 해석
13.1 이 데이터에서 배운 것
| 질문 | 답 |
|---|---|
| 시간 효과가 있는가? | 있다. Wilks’ Λ=0.174, F(3,61)=96.45, p<0.0001 |
| 어떤 추세가 지배적인가? | 선형 증가 (F≈222), 이차 감속 (F≈19) 모두 유의 |
| 삼차 추세는? | 유의하지 않음 (F≈3.3, p≈0.075) |
| 구형성은 성립하는가? | 성립함 (SSR* 대각원소들이 유사) |
| 방법 A vs B 중 무엇이 좋은가? | 구형성 성립 시 A (RM ANOVA) — 검정력 우위 (df=189 vs 63) |
13.2 성장 곡선 해석
직교 다항식 추정량을 종합하면 어휘 점수의 성장 패턴은 다음과 같다:
\[ \hat{\mu}_j = \hat{\theta}_0 \cdot p_{0j} + \hat{\theta}_1 \cdot p_{1j} + \hat{\theta}_2 \cdot p_{2j} \]
- \(\hat{\theta}_1 = 1.666 > 0\): 전반적으로 시간에 따라 증가
- \(\hat{\theta}_2 = -0.461 < 0\): 성장 속도가 점차 감소 (오목형 성장)
- \(\hat{\theta}_3 = 0.222 \approx 0\): 삼차 성분은 무시 가능
결론: 어휘 성장은 2차 다항식 \(\hat{\mu}(t) = a + bt - ct^2\) (b,c>0) 로 잘 표현되며, 초기에는 빠르게 증가하다가 고학년에서 증가세가 완만해진다.
14 관련 주제
선행 지식
연장 분석
- 다표본 반복측정 MANOVA (s 집단)
- 공분산 패턴 모형 — MANOVA 한계 극복, 구조적 Σ 모형
- 혼합효과 회귀모형 — 결측 데이터·불균등 시점 처리
개념 비교
- 단일 표본 반복측정 ANOVA 분해 — 이 포스트의 단변량 결과(F=78.99)와 대응
- 다중 표본 반복측정 ANOVA