1 세 가지 within-subjects 상황
Pre/Post (2 시점): 처치 전·후 측정. \(a = 2\). paired t-test 와 동치.
Multi-treatment crossover (다처치): 같은 피험자에게 여러 처치 순서 배정. \(a \ge 3\). 각 처치 사이 washout 필요.
Longitudinal time series (시계열): 시간에 따라 여러 시점에서 측정. \(a \ge 3\), 시점이 양적 의미. trend analysis 가능.
2 Situation 1 — Pre/Post
2.1 모형
\[ Y_{ij} = \mu + \alpha_j + \pi_i + \varepsilon_{ij},\quad j = 1, 2 \text{ (pre, post)} \]
가장 단순한 within-subjects.
2.2 분석
Difference Score (차이 점수): \[ D_i = Y_{i, \text{post}} - Y_{i, \text{pre}} \]
Paired \(t\)-test: \[ t = \frac{\bar D}{s_D / \sqrt{n}},\quad df = n-1 \]
이는 ANOVA 의 자유도 1 처치 효과 \(F\) 검정과 동치 (\(F = t^2\)).
2.3 가정
- \(D\) 의 정규성 (\(Y\) 의 정규성보다 약한 가정).
- \(D\) 의 등분산은 자동 (그룹 1 개).
2.4 응용
| 분야 | pre | post |
|---|---|---|
| 임상 | baseline SBP | 6 주 후 SBP |
| 교육 | 사전 시험 | 사후 시험 |
| IT | 처치 전 conversion | 처치 후 conversion |
| 운동 | 운동 전 심박수 | 운동 후 심박수 |
| 광고 | 노출 전 인지도 | 노출 후 인지도 |
pre/post 는 단일 처치의 효과를 측정하지만 시간 효과 (자연 회복, 외부 사건) 를 통제 하지 못한다. 진짜 처치 효과를 보려면 대조군이 필요 (RCT 의 ANCOVA — G-MAX9 또는 DiD).
pre/post within-subject 만으로는 인과 효과의 약한 증거. 통제군 + within-subject 결합이 표준 (split-plot — G-MAX12-2).
2.5 신뢰구간
차이 점수의 신뢰구간: \[ \bar D \pm t_{\alpha/2, n-1} \cdot \frac{s_D}{\sqrt n} \]
이 구간이 0 을 포함하지 않으면 처치 효과 유의.
2.6 Cohen’s \(d_z\)
within-subjects 효과 크기: \[ d_z = \frac{\bar D}{s_D} \]
between-subjects 의 Cohen’s \(d\) 보다 큰 값이 흔함 (개인 간 분산 차감).
3 Situation 2 — Multi-Treatment Crossover
3.1 모형
\[ Y_{ij} = \mu + \alpha_j + \pi_i + \varepsilon_{ij},\quad j = 1, \ldots, a \]
각 피험자가 \(a\) 개 처치를 모두 받는다 (순서는 무작위 또는 Latin Square 로 통제).
3.2 분석
One-way within-subjects ANOVA:
| Source | \(df\) | \(F\) |
|---|---|---|
| Treatment | \(a-1\) | \(MS_T / MS_{T \times S}\) |
| Subject (\(\pi\)) | \(n-1\) | — |
| Treatment × Subject (Error) | \((a-1)(n-1)\) | — |
3.3 사후 비교
처치 간 모든 쌍 비교: paired comparison + Bonferroni 또는 Tukey HSD (within-subjects 버전).
3.4 응용
| 분야 | 처치 |
|---|---|
| 임상 | 약 A → washout → 약 B → washout → 위약 (crossover) |
| 심리 | 학습 방법 1, 2, 3 (다른 단어 목록) |
| 운동학 | 신발 모델 A, B, C |
| IT | 같은 사용자가 UI 변종 A, B, C 시험 |
| 식품 평가 | 패널이 여러 레시피 시식 |
| 마케팅 | 같은 사용자에게 다른 ad 노출 |
Crossover trial 에서 약 A 의 잔여 효과가 약 B 측정에 영향 주면 carryover.
해결: 1. Washout period: 약효 소멸 기다림 (약리학 — half-life × 5). 2. Counterbalancing: 순서 무작위화. 3. Latin Square: 균형 배치. 4. Order × Treatment interaction 검정: carryover 진단.
자세한 내용 G-MAX11-3.
3.5 표본 크기 산출 — Crossover
\(a\) 처치, 검출 효과 \(f\) (Cohen), \(\alpha = 0.05\), 검정력 0.80:
| \(a\) | \(f = 0.10\) | \(f = 0.25\) | \(f = 0.40\) |
|---|---|---|---|
| 2 | 200 | 32 | 13 |
| 3 | 80 | 13 | 6 |
| 4 | 50 | 9 | 4 |
Crossover 가 between-subjects 보다 1/3 ~ 1/5 표본만 필요 (시점 간 상관에 의존).
4 Situation 3 — Longitudinal Time Series
4.1 모형
같은 피험자를 \(a\) 개 시점에서 측정. 시점은 양적 변수 (1, 2, 3, … 주).
\[ Y_{ij} = \mu + \alpha_j + \pi_i + \varepsilon_{ij} \]
4.2 분석
- One-way within-subjects ANOVA — 모든 시점이 다른가?
- Trend analysis — 양적 시점 변수에 추세 (G-MAX6) 적용.
- Growth curve modeling — multilevel model 의 시점 slope (G-MAX15).
4.3 가정
- 동일 시점 간 분산이 같음 (구형성).
- 시계열 자기상관 (인접 시점이 더 강한 상관) 이 강하면 sphericity 위반 → ε 조정 또는 multilevel model.
4.4 응용
| 분야 | 시계열 |
|---|---|
| 발달 심리 | 12, 18, 24, 30 개월 영아 |
| 약물 동력학 | 0, 1, 2, 4, 8 시간 후 농도 |
| 학습 | 1주, 2주, 3주, 4주 시험 점수 |
| IT | 7일, 14일, 21일, 28일 retention |
| 농학 | 매월 식물 키 측정 |
| 임상 | 질병 진행 trajectory |
4.5 Trend Analysis 적용
시점이 양적이면 처치 효과 SS 를 직교 다항식으로 분해 (G-MAX6):
\[ SS_{\text{treatment}} = SS_{\text{linear}} + SS_{\text{quadratic}} + SS_{\text{cubic}} + \cdots \]
각 차수의 contrast 가 의미 있는 가설 (선형 증가, 이차 곡률).
within-subjects 의 trend 는 G-MAX12 의 \(a \times b\) 사례에서 자세.
5 Difference Score 의 일반화
세 시나리오 모두에서 차이 점수가 핵심 분석 도구이다.
5.1 Pre/Post (2 시점)
\(D_i = Y_{i2} - Y_{i1}\) — 단일 차이 점수.
5.2 Multi-Treatment (\(a \ge 3\))
여러 차이 점수: \[ D_i^{(jj')} = Y_{ij} - Y_{ij'} \]
\(\binom{a}{2}\) 개의 쌍별 차이.
5.3 Trend (\(a \ge 3\), 양적 시점)
직교 다항식 대비를 차이 점수로 변환:
\[ D_i^{\text{linear}} = \sum_j c_j Y_{ij}, \quad c_j \text{는 선형 직교 계수} \]
각 피험자의 선형 추세 점수. 그 평균이 0 이 아닌가의 paired \(t\)-test.
5.4 Helmert Contrast (다처치)
각 처치를 이전 처치 평균과 비교:
\[ c^{(2)} = (-1, +1, 0, 0) \quad : \text{처치 2 vs 처치 1} \] \[ c^{(3)} = (-1/2, -1/2, +1, 0) : \text{처치 3 vs 처치 1·2 평균} \]
각 contrast 가 직교. multivariate 분석에 직접 사용 (G-MAX13).
\(Y_{ij} = \mu + \alpha_j + \pi_i + \varepsilon\) 에서 차이를 계산하면 \(\pi_i\) 가 사라 진다.
\[ Y_{i2} - Y_{i1} = (\alpha_2 - \alpha_1) + (\varepsilon_{i2} - \varepsilon_{i1}) \]
개인의 baseline (\(\pi_i\)) 이 차감되어 작은 분산만 남는다. 이것이 within-subjects 의 검정력 이득의 정확한 통계적 메커니즘.
6 사전·사후의 ANCOVA 대안
pre/post 분석에서 within-subjects difference score 와 ANCOVA 의 비교 (G-MAX9 의 Lord’s paradox 참조):
| 분석 | 식 | 가정 |
|---|---|---|
| Difference score | \(D = Y_{\text{post}} - Y_{\text{pre}}\) | \(\beta = 1\) |
| ANCOVA | \(Y_{\text{post}} \sim \text{그룹} + \beta Y_{\text{pre}}\) | \(\beta\) 추정, between-subjects design 가정 |
| Within-subjects ANOVA on \(D\) | one-sample \(t\) | within-subject |
여러 그룹의 pre/post: mixed ANOVA (group × time) — within × between (G-MAX12-2).
7 Python 코드 — 세 시나리오 비교
import numpy as np
import pandas as pd
from scipy import stats
import statsmodels.api as sm
from statsmodels.formula.api import mixedlm
from statsmodels.stats.anova import AnovaRM
np.random.seed(2026)
# Situation 1: Pre/Post (n=20)
n = 20
pi = np.random.normal(100, 10, n)
pre = pi + np.random.normal(0, 3, n)
post = pi + 5 + np.random.normal(0, 3, n) # 처치 효과 +5
t_stat, p_val = stats.ttest_rel(post, pre)
print(f"=== Situation 1: Pre/Post paired t-test ===")
print(f"Mean difference = {np.mean(post - pre):.2f}")
print(f"t = {t_stat:.3f}, p = {p_val:.4f}")
d_z = np.mean(post - pre) / np.std(post - pre, ddof=1)
print(f"Cohen's d_z = {d_z:.3f}")
# Situation 2: Multi-treatment (n=15, a=4)
n = 15
a = 4
pi = np.random.normal(100, 10, n)
treat_eff = np.array([0, 5, 10, 8])
data_long = []
for i in range(n):
for j in range(a):
y = pi[i] + treat_eff[j] + np.random.normal(0, 3)
data_long.append({"subject": i, "treatment": j, "Y": y})
data = pd.DataFrame(data_long)
# Within-subjects ANOVA
aovrm = AnovaRM(data, "Y", "subject", within=["treatment"]).fit()
print(f"\n=== Situation 2: Multi-treatment within-subjects ===")
print(aovrm.anova_table)
# Pairwise paired t-tests
print("\nPaired comparisons (Bonferroni-corrected):")
n_comparisons = 6 # 4C2
wide = data.pivot(index="subject", columns="treatment", values="Y")
for t1 in range(a):
for t2 in range(t1+1, a):
D = wide[t2] - wide[t1]
t, p = stats.ttest_1samp(D, 0)
p_bon = min(1, p * n_comparisons)
print(f" T{t2} - T{t1}: D̄ = {D.mean():+.2f}, t = {t:.2f}, p_raw = {p:.4f}, p_Bon = {p_bon:.4f}")
# Situation 3: Longitudinal time series (n=10, t=4, log-equal-spaced)
n = 10
times = [1, 2, 3, 4]
pi = np.random.normal(50, 8, n)
data_long = []
for i in range(n):
for t in times:
y = pi[i] + 5 * t + np.random.normal(0, 2) # 선형 증가
data_long.append({"subject": i, "time": t, "Y": y})
data = pd.DataFrame(data_long)
# Trend analysis (linear contrast)
linear_per_subject = data.pivot(index="subject", columns="time", values="Y")
c = np.array(times) - np.mean(times) # linear contrast
linear_scores = linear_per_subject.values @ c
t_stat, p_val = stats.ttest_1samp(linear_scores, 0)
print(f"\n=== Situation 3: Longitudinal linear trend ===")
print(f"Mean linear score = {np.mean(linear_scores):.3f}")
print(f"t = {t_stat:.3f}, p = {p_val:.4f}")
# Mixed model with time as continuous
md = mixedlm("Y ~ time", data=data, groups=data["subject"]).fit()
print(f"\n=== Mixed Model (시간 양적) ===")
print(md.summary().tables[1])8 Multilevel Model 으로의 통합
세 시나리오 모두 mixed model 의 special case:
# Pre/Post
md = mixedlm("Y ~ time_post", data, groups="subject") # time_post = 0/1
# Multi-treatment
md = mixedlm("Y ~ C(treatment)", data, groups="subject")
# Longitudinal (양적)
md = mixedlm("Y ~ time", data, groups="subject", re_formula="~time")
# random slope 가능multilevel 의 통합 lens.
9 가정과 한계 — 종합
- 세 시나리오 공통: 차이 점수의 정규성, 처치 사이 충분한 washout (carryover 방지).
- Pre/post: 시간 효과 통제 안 됨 (control group 필요).
- Multi-treatment crossover: 순서 효과 (Latin Square 권장).
- Longitudinal: 시계열 자기상관 (sphericity 위반).
- 결측 데이터: listwise → 한 시점 결측이면 그 피험자 제거. multilevel 권장.
10 ML 매핑
ML 의 모델 비교에서 cross-validation 의 fold 가 within-subject 의 subject 역할:
Fold 1: 모델 A 정확도 = 0.85, 모델 B 정확도 = 0.87
Fold 2: 모델 A 정확도 = 0.82, 모델 B 정확도 = 0.84
...
같은 fold 의 같은 데이터에 다른 모델 평가 → within-subjects.
paired t-test (모델 차이의 paired t) 가 표준 — between fold 보다 검정력 ↑.
이는 ML 의 모델 평가가 within-subjects 형태인 자연스러운 이유.
추가: cross-validation 의 fold 간 상관 (correlated samples) 이 sphericity 위반 가능 → ε 조정 권장 (Nadeau-Bengio correction).
11 본 시리즈
G-MAX11-0 Within-Subjects Univariate 개관
G-MAX11-1 Three Within-Subjects Situations + Difference Scores ← 현재 글
G-MAX11-2 Mixed Model ANOVA + Sphericity
G-MAX11-3 GG/HF Adjustments + Order Effects
G-MAX11-4 Latin Square Counterbalancing + Power
↓
G-MAX12 (Higher-Order Within), G-MAX13 (Multivariate)
12 관련 주제
선행 지식
후속 주제
- G-MAX11-2: Mixed Model + Sphericity
- G-MAX12-2: Split-Plot (Group × Time)
- G-MAX15 — Multilevel Models
다른 카테고리 연결
13 더 읽을 거리
- Maxwell, S. E., Delaney, H. D. (2004). “Designing Experiments and Analyzing Data: A Model Comparison Perspective” (2nd ed). Lawrence Erlbaum.
- Senn, S. (2002). “Cross-over Trials in Clinical Research” (2nd ed). Wiley — crossover 의 표준 reference.
- Davis, C. S. (2002). “Statistical Methods for the Analysis of Repeated Measurements.” Springer.
- Hedeker, D., Gibbons, R. D. (2006). “Longitudinal Data Analysis.” Wiley.
- Nadeau, C., Bengio, Y. (2003). “Inference for the generalization error.” Machine Learning 52(3): 239-281 — ML 의 cross-validation t-test 보정.