1 개요
종단 데이터를 분석할 때, 같은 데이터도 어떻게 배치하느냐에 따라 사용할 수 있는 분석법이 달라진다. 이것은 단순한 소프트웨어 편의 문제가 아니다. 데이터 배치 방식은 모형이 데이터를 어떤 수학적 객체로 취급하는지를 결정하며, 이로부터 가정, 결측치 처리 방식, 검정력이 모두 달라진다.
반복측정 ANOVA는 Long format(단변량 배치, univariate setup), MANOVA는 Wide format(다변량 배치, multivariate setup)을 사용한다 (Hedeker & Gibbons, 2006, Ch.3).
2 두 가지 데이터 배치
\(N\) 명의 피험자가 \(n\) 시점에 반복 측정되는 연구를 가정한다. 피험자 \(i\) 의 시점 \(j\) 에서의 관측값을 \(y_{ij}\) 로 표기한다.
2.1 Long format: 단변량 배치
ANOVA에서 피험자 \(i\) 의 \(n\) 시점 관측은 \(n\) 개의 별도 행으로 표현된다. 피험자 \(N = 2\), 시점 \(n = 3\) 인 예:
| Subject | Time | \(y\) |
|---|---|---|
| 1 | 1 | \(y_{11}\) |
| 1 | 2 | \(y_{12}\) |
| 1 | 3 | \(y_{13}\) |
| 2 | 1 | \(y_{21}\) |
| 2 | 2 | \(y_{22}\) |
| 2 | 3 | \(y_{23}\) |
총 \(N \times n\) 개의 행이 생성된다. 데이터셋의 변수는 세 가지: subject, time, y.
핵심 관점: 시점별 측정값 \(y_{i1}, y_{i2}, y_{i3}\) 은 동일 변수 \(y\) 의 반복 인스턴스(instance)로 취급된다. 시간은 분류 변수(categorical predictor)로, 종속변수의 변동을 설명하는 데 사용된다.
2.2 Wide format: 다변량 배치
MANOVA에서 피험자 \(i\) 의 \(n\) 시점 관측은 \(n\) 개의 별도 변수(한 행)로 표현된다.
| Subject | \(y_1\) | \(y_2\) | \(y_3\) |
|---|---|---|---|
| 1 | \(y_{11}\) | \(y_{12}\) | \(y_{13}\) |
| 2 | \(y_{21}\) | \(y_{22}\) | \(y_{23}\) |
총 \(N\) 개의 행이 생성된다. 데이터셋의 변수는 \(n+1\) 개: subject, y1, y2, …, yn.
핵심 관점: 시점별 측정값 \(y_{i1}, y_{i2}, y_{i3}\) 은 서로 다른 변수들(\(y_1, y_2, y_3\))로 취급된다. 시간은 명시적 변수가 아니라, 변수의 순서에 암묵적으로 내포되어 있다.
3 수학적 객체로서의 차이
같은 관측값이지만, 두 배치에서 어떤 수학적 객체로 표현되는지가 다르다.
3.1 ANOVA (Long format)의 수학적 표현
피험자 \(i\) 의 관측은 \(n\) 개의 독립 스칼라 관측으로 구성된다.
\[ y_{i1}, \; y_{i2}, \; \ldots, \; y_{in} \]
모형은 이것들을 “하나의 반응변수 \(y\) 의 반복 측정”으로 간주한다. 선형 모형은
\[ y_{ij} = \mu + \pi_i + \tau_j + e_{ij} \tag{2.1} \]
여기서 모수의 차원이 작다: \(\mu\) (스칼라), \(\pi_i\) (\(N\) 개), \(\tau_j\) (\(n\) 개), \(\sigma_e^2\) (스칼라). 오차 공분산 구조는 단 두 개의 모수 \(\sigma_\pi^2, \sigma_e^2\) 로 완전히 결정된다.
3.2 MANOVA (Wide format)의 수학적 표현
피험자 \(i\) 의 관측은 하나의 \(n \times 1\) 벡터이다.
\[ \mathbf{y}_i = \begin{bmatrix} y_{i1} \\ y_{i2} \\ \vdots \\ y_{in} \end{bmatrix} \in \mathbb{R}^n \]
모형은 이 벡터를 하나의 다변량 관측으로 간주한다:
\[ \mathbf{y}_i = \boldsymbol{\mu} + \boldsymbol{\varepsilon}_i, \quad \boldsymbol{\varepsilon}_i \sim N(\mathbf{0}, \boldsymbol{\Sigma}) \tag{3.1} \]
\(\boldsymbol{\Sigma}\) 는 \(n \times n\) 공분산 행렬로, 비구조적(unstructured) 형태에서는 \(n(n+1)/2\) 개의 독립 모수를 가진다.
직관: ANOVA는 “시점들이 같은 반응변수의 여러 버전”이라고 보는 것이고, MANOVA는 “시점들이 각각 독립적인 변수이고, 이 변수들이 함께 하나의 다변량 반응을 구성”한다고 본다.
4 데이터 배치와 공분산 가정의 관계
데이터 배치 방식은 공분산 구조에 대한 가정과 직결된다.
4.1 ANOVA: 복합대칭 가정
Long format에서 피험자 \(i\) 의 반복 측정 벡터의 공분산 행렬은
\[ \text{Cov}(\mathbf{y}_i) = \sigma_\pi^2 \mathbf{1}\mathbf{1}' + \sigma_e^2 \mathbf{I} = \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) 이라 한다. 모든 대각원소가 같고( \(\sigma_\pi^2 + \sigma_e^2\) ), 모든 비대각원소가 같다( \(\sigma_\pi^2\) ). 즉, 어떤 두 시점 사이의 상관도 동일하다.
\[ \text{Corr}(y_{ij}, y_{ij'}) = \frac{\sigma_\pi^2}{\sigma_\pi^2 + \sigma_e^2} \equiv \rho \quad (j \neq j') \]
이 가정의 직관: “피험자 수준의 랜덤 효과 \(\pi_i\) 만이 시점 간 상관을 만든다. \(\pi_i\) 는 모든 시점에 동일하게 영향을 주므로, 가까운 시점이든 먼 시점이든 상관이 같다.”
4.2 MANOVA: 비구조적 공분산
Wide format에서 \(\boldsymbol{\Sigma}\) 에 아무 제약이 없다.
\[ \boldsymbol{\Sigma} = \begin{bmatrix} \sigma_{11} & \sigma_{12} & \cdots & \sigma_{1n} \\ \sigma_{12} & \sigma_{22} & \cdots & \sigma_{2n} \\ \vdots & & \ddots & \vdots \\ \sigma_{1n} & \sigma_{2n} & \cdots & \sigma_{nn} \end{bmatrix} \]
\(n = 4\) 이면 추정해야 할 모수가 \(4 \times 5 / 2 = 10\) 개이고, \(n = 10\) 이면 \(55\) 개다. 시점이 늘어날수록 추정해야 할 공분산 모수도 급증한다.
이 구조의 직관: “시점 1과 시점 2 사이의 상관이 시점 1과 시점 4 사이보다 강할 수 있다. 데이터가 이 구조를 스스로 결정하도록 허용한다.”
5 결측치 처리의 근본적 차이
데이터 배치 방식이 결측치를 어떻게 다루는지를 결정한다. 이것이 실무에서 가장 중요한 차이다.
5.1 Long format에서의 결측
\(y_{i3}\) 이 결측인 피험자 \(i = 3\) 을 가정하자:
| Subject | Time | \(y\) |
|---|---|---|
| 3 | 1 | 4.2 |
| 3 | 2 | 3.9 |
| 3 | 3 | NA |
Long format에서 이 피험자는 불완전하지만, 2개의 관측( \(t = 1, 2\) )은 여전히 분석에 기여할 수 있다. 반복측정 ANOVA의 분산분해표는 이 피험자를 완전히 제외하지 않고, 사용 가능한 시점의 정보를 활용하는 것이 원칙적으로 가능하다.
(단, 전통적 반복측정 ANOVA 구현은 이 피험자를 완전 제외하기도 한다. 이는 소프트웨어의 구현 방식 문제이지, Long format 자체의 필연적 제약은 아니다. LMM은 Long format에서 MAR 결측까지 자연스럽게 처리한다.)
5.2 Wide format에서의 결측
같은 피험자가 Wide format에서는
| Subject | \(y_1\) | \(y_2\) | \(y_3\) |
|---|---|---|---|
| 3 | 4.2 | 3.9 | NA |
MANOVA는 이 행 전체를 제외한다.
이유: MANOVA는 \(\mathbf{y}_i = (y_{i1}, y_{i2}, y_{i3})'\) 를 하나의 다변량 관측 벡터로 취급한다. 이 벡터의 한 원소라도 결측이면, 벡터 자체가 불완전하다. MANOVA의 우도함수와 SSCP 행렬 계산은 완전한 \(n \times 1\) 벡터를 요구하므로, 부분 결측 피험자는 계산에 참여할 방법이 없다.
MANOVA가 완전 데이터만 사용한다는 것은 단순한 “불편함”이 아니다. 탈락(dropout)이 무작위가 아닌 경우(예: 증상이 악화된 피험자가 더 많이 탈락), 완전 데이터만 분석하면 심각한 선택 편향(selection bias) 이 발생한다.
혼합효과 모형(LMM)이 MANOVA를 대체한 핵심 이유 중 하나가 바로 이 점이다. LMM은 MAR(Missing At Random) 메커니즘 하에서 결측 피험자도 우도에 기여하게 한다.
6 배치별 모형 차원의 비교
\(N = 100\) 명, \(n = 4\) 시점의 예로 두 배치의 모형 복잡도를 비교한다.
| 항목 | Long format (ANOVA) | Wide format (MANOVA) |
|---|---|---|
| 데이터 행 수 | \(400\) | \(100\) |
| 종속변수 수 | 1 (\(y\)) | 4 (\(y_1, y_2, y_3, y_4\)) |
| 오차 공분산 모수 | 2 (\(\sigma_\pi^2, \sigma_e^2\)) | 10 (\(\boldsymbol{\Sigma}\) 의 유일 원소) |
| 시간 표현 방식 | 분류 변수 time |
암묵적 (변수 이름에 내포) |
| 결측 허용 범위 | 부분 결측 처리 가능 | 완전 데이터만 |
| 분석법 | 반복측정 ANOVA, LMM | MANOVA |
시점이 \(n = 10\) 으로 늘어나면 MANOVA의 공분산 모수는 \(10 \times 11 / 2 = 55\) 개가 된다. \(N = 50\) 명이라면 55개의 모수를 50개의 피험자로 추정해야 하므로, 추정 자체가 불가능해진다( \(N < n(n+1)/2\) 조건 위반).
이것이 MANOVA가 시점 수가 많은 연구에서 실용적이지 않은 이유다.
7 포맷 변환의 수학적 의미
두 포맷은 같은 데이터의 두 가지 표현이다. 변환은 정보 손실 없이 가능하다.
7.1 Wide → Long 변환
Wide format 행렬 \(\mathbf{Y}\) (\(N \times n\))를 Long format 벡터 \(\mathbf{y}\) (\(Nn \times 1\))로 변환:
\[ \mathbf{y} = \text{vec}(\mathbf{Y}') = \begin{bmatrix} y_{11} \\ y_{12} \\ \vdots \\ y_{1n} \\ y_{21} \\ \vdots \\ y_{Nn} \end{bmatrix} \]
\(\text{vec}(\cdot)\) 은 행렬을 열 방향으로 쌓는 벡터화 연산이다.
직관: Wide format의 각 행(피험자의 시간 벡터)을 아래로 순서대로 쌓으면 Long format이 된다.
7.2 Long → Wide 변환
Long format에서 피험자 \(i\) 의 행들을 모아 벡터 \(\mathbf{y}_i = (y_{i1}, \ldots, y_{in})'\) 를 구성하고, 이 벡터들을 행으로 쌓으면 \(N \times n\) 행렬 \(\mathbf{Y}\) 가 된다.
\[ \mathbf{Y} = \begin{bmatrix} \mathbf{y}_1' \\ \mathbf{y}_2' \\ \vdots \\ \mathbf{y}_N' \end{bmatrix} \]
결측이 있을 때: 피험자 \(i\) 의 일부 시점이 결측이면, Wide format에서 \(\mathbf{y}_i\) 벡터가 불완전하여 MANOVA에서 그 행을 제외한다. Long format에서는 결측 행만 제거되고 나머지 행은 남는다.
이것이 두 포맷의 결측 처리 차이가 데이터 구조에서 비롯된다는 것을 보여준다.
8 피험자 구조와 공분산 행렬의 연결
8.1 Long format에서의 공분산 구조
Long format 모형 \(y_{ij} = \mu + \pi_i + \tau_j + e_{ij}\) 에서 피험자 \(i\) 의 관측 벡터 \(\mathbf{y}_i = (y_{i1}, \ldots, y_{in})'\) 의 공분산은
\[ \text{Cov}(\mathbf{y}_i) = \sigma_\pi^2 \mathbf{1}\mathbf{1}' + \sigma_e^2 \mathbf{I}_n \]
이 행렬은 피험자 랜덤 효과 \(\pi_i\) 의 분산 \(\sigma_\pi^2\) 이 모든 시점 쌍에 공통으로 기여하는 구조다.
직관: “어떤 피험자가 전반적으로 점수가 높은 사람”이라면, 그 사람의 모든 시점 점수가 동시에 높아진다. 이 공통 상승이 \(\sigma_\pi^2 \mathbf{1}\mathbf{1}'\) 로 표현된다. 시점-특이적 변동은 \(\sigma_e^2 \mathbf{I}\) 로, 시점 간 독립이다.
8.2 Wide format에서의 공분산 구조
Wide format 모형 \(\mathbf{y}_i = \boldsymbol{\mu} + \boldsymbol{\varepsilon}_i\) 에서 피험자 \(i\) 의 반응 벡터의 공분산은
\[ \text{Cov}(\mathbf{y}_i) = \boldsymbol{\Sigma} \]
\(\boldsymbol{\Sigma}\) 의 \((j, j')\) 원소 \(\sigma_{jj'}\) 는 시점 \(j\) 와 \(j'\) 사이의 공분산이다. 이 행렬은 임의의 형태를 가질 수 있으므로, \(\sigma_{12} \neq \sigma_{13}\) (1주차-2주차 공분산 \(\neq\) 1주차-3주차 공분산)도 허용된다.
8.3 구형성 조건의 배치별 해석
구형성(sphericity) 조건은 두 배치에서 동일한 내용이지만 다르게 표현된다.
Long format (ANOVA 관점): 직교 다항 변환 \(\mathbf{P}\) 를 적용한 오차 벡터 \(\mathbf{P}\boldsymbol{\varepsilon}_i\) 의 공분산 행렬 \(\mathbf{P}\boldsymbol{\Sigma}\mathbf{P}'\) 의 하 \((n-1) \times (n-1)\) 부분행렬이 \(\sigma_e^2 \mathbf{I}_{n-1}\) 과 같을 조건이다.
Wide format (MANOVA 관점): 비구조적 \(\boldsymbol{\Sigma}\) 에서 이 조건이 성립하는지 Mauchly 검정으로 확인한다. 위반되면 \(\epsilon\) 보정(Greenhouse-Geisser, Huynh-Feldt)이나 MANOVA를 선택한다.
9 포맷 변환 코드
9.1 R: tidyr 기반 변환
library(tidyverse)
# Wide format 예시 데이터
wide_df <- tibble(
subject = 1:5,
y1 = c(4.2, 3.8, 5.1, 4.6, 3.9), # 1시점
y2 = c(3.9, 3.5, 4.7, 4.2, 3.6), # 2시점
y3 = c(3.5, 3.2, 4.3, 3.8, 3.2), # 3시점
y4 = c(3.1, 2.9, 3.9, 3.4, 2.8) # 4시점
)
# Wide → Long 변환
long_df <- wide_df |>
pivot_longer(
cols = starts_with("y"),
names_to = "time",
values_to = "y"
) |>
mutate(time = as.integer(str_remove(time, "y")))
cat("Long format (처음 8행):\n")
print(head(long_df, 8))
# 총 5명 × 4시점 = 20행
# Long → Wide 변환
wide_recovered <- long_df |>
pivot_wider(
names_from = "time",
values_from = "y",
names_prefix = "y"
)
cat("\nWide format (복원):\n")
print(wide_recovered)
# 결측이 있는 경우
long_missing <- long_df |>
# 피험자 3의 4시점을 결측으로 만들기
mutate(y = if_else(subject == 3 & time == 4, NA_real_, y))
cat("\nLong format (결측 포함, 피험자 3의 시점 4 = NA):\n")
print(long_missing |> filter(subject == 3))
# 피험자 3의 나머지 관측(시점 1~3)은 유지됨 → ANOVA/LMM은 이를 활용
wide_missing <- long_missing |>
pivot_wider(names_from = "time", values_from = "y", names_prefix = "y")
cat("\nWide format (결측 포함):\n")
print(wide_missing)
# 피험자 3의 행에 NA 존재 → MANOVA는 이 행 전체를 제외
# MANOVA: 완전 데이터만 사용
complete_subjects <- wide_missing |>
filter(complete.cases(wide_missing))
cat("\nMANOVA에 사용되는 피험자 수:", nrow(complete_subjects), "/", nrow(wide_missing), "\n")9.2 Python: pandas 기반 변환
import numpy as np
import pandas as pd
# Wide format 예시 데이터
wide_df = pd.DataFrame({
"subject": range(1, 6),
"y1": [4.2, 3.8, 5.1, 4.6, 3.9],
"y2": [3.9, 3.5, 4.7, 4.2, 3.6],
"y3": [3.5, 3.2, 4.3, 3.8, 3.2],
"y4": [3.1, 2.9, 3.9, 3.4, 2.8]
})
# Wide → Long 변환
long_df = wide_df.melt(
id_vars = "subject",
value_vars = ["y1", "y2", "y3", "y4"],
var_name = "time",
value_name = "y"
)
long_df["time"] = long_df["time"].str.replace("y", "").astype(int)
long_df = long_df.sort_values(["subject", "time"]).reset_index(drop=True)
print("Long format (처음 8행):")
print(long_df.head(8))
print(f"총 행 수: {len(long_df)} (= {wide_df.shape[0]}명 × 4시점)")
# Long → Wide 변환
wide_recovered = long_df.pivot(index="subject", columns="time", values="y")
wide_recovered.columns = [f"y{c}" for c in wide_recovered.columns]
wide_recovered = wide_recovered.reset_index()
print("\nWide format (복원):")
print(wide_recovered)
# 결측 시뮬레이션
long_missing = long_df.copy()
long_missing.loc[(long_missing["subject"] == 3) & (long_missing["time"] == 4), "y"] = np.nan
wide_missing = long_missing.pivot(index="subject", columns="time", values="y")
wide_missing.columns = [f"y{c}" for c in wide_missing.columns]
wide_missing = wide_missing.reset_index()
print("\nWide format (결측 포함):")
print(wide_missing)
# Long format: 결측 행만 제거 → 나머지 관측 보존
long_complete_rows = long_missing.dropna(subset=["y"])
print(f"\nLong format 완전 관측 수: {len(long_complete_rows)} / {len(long_missing)}")
print("피험자 3의 완전 관측 행 (시점 1~3 유지):")
print(long_complete_rows[long_complete_rows["subject"] == 3])
# Wide format: 행 전체 제거
wide_complete_rows = wide_missing.dropna()
print(f"\nWide format 완전 피험자 수: {len(wide_complete_rows)} / {len(wide_missing)}")
print("(피험자 3은 행 전체 제거됨)")
# Step 2: 실무 — statsmodels MANOVA는 wide format 사용
from statsmodels.multivariate.manova import MANOVA
# 완전 데이터만으로 MANOVA 실행
Y_complete = wide_complete_rows[["y1", "y2", "y3", "y4"]].values
# (group 변수가 있으면 MANOVA 공식에 추가)
print(f"\nMANOVA에 사용 가능한 피험자: {len(wide_complete_rows)}명")10 실무 상황별 포맷 선택
분석 목적과 데이터 특성에 따라 포맷을 선택한다.
| 상황 | 권장 포맷 | 이유 |
|---|---|---|
| 반복측정 ANOVA 수행 | Long format | aov() + Error(subject/time) 또는 ezANOVA() |
| MANOVA 수행 | Wide format | manova(), MANOVA.from_formula() |
| LMM 수행 | Long format | lme4::lmer(), statsmodels.MixedLM |
| GEE 수행 | Long format | geepack::geeglm(), statsmodels.GEE |
| 결측이 많음 | Long format → LMM | MANOVA 불가, LMM이 MAR까지 허용 |
| 시점 수 많음 (\(n > 10\)) | Long format → LMM | MANOVA의 공분산 모수 급증 |
| 탐색적 시각화 | Long format | ggplot2, seaborn 모두 long format 선호 |
11 표기법 정리: 인덱싱 방식 비교
같은 관측값 \(y_{i=3, j=2}\) 를 각 포맷에서 어떻게 접근하는지 비교한다.
Long format (Python 기준):
# 피험자 3, 시점 2의 관측값
val = long_df.loc[(long_df["subject"] == 3) & (long_df["time"] == 2), "y"].values[0]Wide format (Python 기준):
수학적 행렬 표현에서는 두 가지 인덱싱이 모두 동치다. Long format은 행 인덱스가 \((i, j)\) 쌍이고, Wide format은 행 인덱스가 \(i\), 열 인덱스가 \(j\) 다.
\[ y_{ij} = \mathbf{Y}[i, j] \quad (\text{Wide format의 } (i, j) \text{ 원소}) \]
12 요약: 두 배치의 핵심 함의
| 항목 | Long format (ANOVA용) | Wide format (MANOVA용) |
|---|---|---|
| 핵심 관점 | 시점 = 하나의 반응변수의 반복 인스턴스 | 시점 = 별개의 변수, 함께 다변량 벡터 구성 |
| 수학적 객체 | \(N \times n\) 개의 스칼라 관측 | \(N\) 개의 \(n \times 1\) 벡터 관측 |
| 공분산 모수 | 2개 (\(\sigma_\pi^2, \sigma_e^2\)) 로 제약 | \(n(n+1)/2\) 개, 무구조 |
| 결측 처리 | 부분 결측 피험자의 완전 관측 행 보존 | 결측 행 전체 제거 |
| 분석법 | 반복측정 ANOVA, LMM, GEE | MANOVA |
| 시점 수 증가 영향 | 데이터 행 수 증가 (관리 가능) | 공분산 모수 이차 증가 (위험) |
13 관련 주제
선행 지식
후속 주제
관련 개념