MANOVA Illustration — Bock 어휘 성장 데이터 수치 예시

직교 다항식 변환, SSCP 행렬, Roy’s Root, Wilks’ Λ 단계별 계산

Bock(1975)의 어휘 성장 데이터(N=64, 4시점)를 이용하여 반복측정 MANOVA의 전체 계산 절차를 단계별로 수행한다. 직교 다항식 P 행렬로 평균 벡터를 변환하고, SST* · SSR* SSCP 행렬을 구성한 뒤, 결정방정식으로 Roy’s largest root와 Wilks’ Λ를 도출하고 ANOVA vs MANOVA 검정력을 수치로 비교한다.

Statistics
Longitudinal Data Analysis
저자

Kwangmin Kim

공개

2026년 04월 10일

1 개요

앞선 포스트들에서 반복측정 MANOVA의 이론적 틀을 구축했다.

  • [173] MANOVA 접근법 개요 (SSCP 분해, 네 가지 검정 통계량)
  • [175] 일표본 MANOVA: P 행렬 유도, SST* · SSR* 행렬 구조
  • [176] 다표본 MANOVA: SSG* 행렬, 집단×시간 교호작용

이 포스트는 이론을 수치로 확인하는 Illustration 단계다. Bock(1975) § 및 Hedeker & Gibbons(2006, Ch.3)의 어휘 성장 데이터를 이용하여 다음을 단계별로 계산한다.

  1. 직교 다항식 행렬 \(P\) 구성과 \(\hat{\theta} = P\bar{y}\) 계산
  2. SST* (시간 SSCP) 행렬 수치 구성
  3. SSR* (잔차 SSCP) 행렬 수치 구성
  4. 결정방정식 풀이 → Roy’s largest root, Wilks’ Λ
  5. F 변환 및 유의성 판단
  6. 개별 추세 F 검정: Method A(구형성 가정) vs Method B(MANOVA)
  7. 단변량 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 검정력 직관

왜 구형성이 성립할 때 RM ANOVA가 더 강력한가?

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

선행 지식

연장 분석

개념 비교

Subscribe

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