1 정의
삼원 상호작용 \(A \times B \times C\) 가 유의한 뒤, 한 요인 (예: \(C\)) 의 특정 level 에서 나머지 두 요인 (\(A, B\)) 의 이원 factorial (주효과 \(A\), 주효과 \(B\), 상호작용 \(A \times B\)) 을 분석하는 것이다.
각 \(C\) level 마다: - \(A\) at \(C = c_l\): simple main effect - \(B\) at \(C = c_l\): simple main effect - \(A \times B\) at \(C = c_l\): simple interaction effect
목적: 어느 panel 에서 이원 상호작용 패턴이 다른지 구체화 (G-MAX8-2 의 panel plot 정량화).
2 절차 — 삼원 상호작용 follow-up
2.1 Step 1 — Omnibus ABC 검정
먼저 \(F_{ABC}\) 가 유의한지 확인. 비유의면 simple interaction effect 분석 불필요.
2.2 Step 2 — 분석 차원 선택
\(C\) levels 에서 \(A \times B\) 분석 vs \(A\) levels 에서 \(B \times C\) 분석 — 어느 쪽? 도메인적 의미 또는 사전 가설에 따라 선택. 일반적으로 “조건적 처치” 의미가 강한 요인을 조건 (\(C\)) 으로 두고 나머지 두 요인 (\(A, B\)) 을 분석.
2.3 Step 3 — 각 level 의 SS
\(C = c_l\) level 에서 \(A \times B\) 의 SS:
\[ SS_{AB | C = c_l} = n \sum_{jk} (\bar Y_{jkl} - \bar Y_{j \cdot l} - \bar Y_{\cdot k l} + \bar Y_{\cdot \cdot l})^2 \]
자유도 \((a-1)(b-1)\). \(2 \times 2 \times 2\) 에서는 자유도 1.
2.4 Step 4 — 분모 (Error Term) 선택
| 방식 | 분모 (\(MS_{\text{err}}\)) | 자유도 |
|---|---|---|
| Pooled | 전체 \(MS_W\) | \(abc(n-1)\) |
| Separate | 해당 \(C = c_l\) level 의 \(MS_W\) | \(ab(n-1)\) |
Pooled 가 자유도 큼 (검정력 ↑) 이지만 셀별 등분산 가정 필요.
3 가설 데이터 적용
G-MAX8-1 의 가상 데이터:
| \(C=0\) (비보상) | \(C=1\) (보상) | |||
|---|---|---|---|---|
| \(B=0\) 반복 | \(B=1\) 검색 | \(B=0\) 반복 | \(B=1\) 검색 | |
| \(A=0\) (1h) | 5.0 | 6.0 | 6.5 | 7.0 |
| \(A=1\) (2h) | 7.0 | 9.5 | 8.5 | 12.0 |
각 셀 \(n=8\), \(MS_W = 1.5\).
3.1 \(A \times B\) at \(C = 0\)
cell 평균 (4 개): \((5.0, 6.0, 7.0, 9.5)\) — 정렬 \((A, B)\) = \((0,0), (0,1), (1,0), (1,1)\).
상호작용 대비 \((+1, -1, -1, +1)\): \[ \hat\psi^{(C=0)}_{AB} = 5.0 - 6.0 - 7.0 + 9.5 = 1.5 \] \[ SS^{(C=0)}_{AB} = \frac{8 \times 1.5^2}{4} = 4.5 \] \[ F^{(C=0)}_{AB} = 4.5 / 1.5 = 3.0 \quad (df = 1, 56\, \text{pooled}) \]
3.2 \(A \times B\) at \(C = 1\)
cell 평균 \((6.5, 7.0, 8.5, 12.0)\).
\[ \hat\psi^{(C=1)}_{AB} = 6.5 - 7.0 - 8.5 + 12.0 = 3.0 \] \[ SS^{(C=1)}_{AB} = \frac{8 \times 3.0^2}{4} = 18.0 \] \[ F^{(C=1)}_{AB} = 18.0 / 1.5 = 12.0 \]
3.3 해석
\(C=0\) (비보상) 에서 \(A \times B\) 상호작용은 약함 (\(F = 3.0\), 비유의 가능). \(C=1\) (보상) 에서는 강함 (\(F = 12.0\), 매우 유의). 보상 조건에서 학습 시간 × 형식 시너지가 더 강하다 는 결론.
이 두 simple interaction effect 의 차이가 곧 삼원 상호작용 SS: \[ SS_{ABC} = SS^{(C=1)}_{AB} - SS^{(C=0)}_{AB} = ? \]
(엄밀히는 분해 식이 다소 다른 형태 — 정확한 가산은 SS 의 자유도와 부호 조정 후.)
4 비직교 삼원 설계
셀 표본이 다르면 ($n_{jkl} $ 상수) 직교 분해가 깨진다. G-MAX7-3 의 Type I/II/III SS 가 그대로 확장된다.
4.1 효과 분해의 일반 형태
| Type | \(A\) 의 SS 정의 |
|---|---|
| Type I | 모형에 효과를 사전 순서로 추가, 그 단계의 잔차 SS 차이 |
| Type II | 다른 같은 또는 낮은 차수 효과 모두 포함한 모형 vs 거기에 \(A\) 추가 |
| Type III | 전체 모형 vs \(A\) 만 빠진 모형 |
7 효과 모두에 같은 정의를 적용. statsmodels, R car::Anova 가 자동.
Type II 에서는 \(A\) 의 SS 가 \(B, C, AB, AC, BC\) 를 포함한 모형에서 \(A\) 추가의 효과 (상호작용 모두 포함하지 않음). Type III 는 \(ABC\) 까지 모두 포함. 보통 Type III 가 더 보수적이지만 차이가 작은 편. 복잡 데이터에서는 두 결과를 모두 보고 안정성 점검.
5 셀 결측의 영향
\(2^3 = 8\) 셀 중 일부가 비면 (예: 표본 \(n=0\)) 일부 효과가 식별 불가능. 옵션:
- 부분 factorial 분석: 식별 가능한 효과만.
- 이원 marginal 모형: 삼원 상호작용 가정을 0 으로 두고 이원 분석.
- 데이터 추가 수집.
상용 패키지는 결측 셀을 자동 처리하지 못하는 경우가 많음. 사전 셀 표본 점검 필수.
6 Python 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
np.random.seed(2026)
# 비직교 데이터: 셀 표본 다름
cell_specs = {
(0, 0, 0): (5.0, 1.22, 8),
(0, 0, 1): (6.5, 1.22, 6),
(0, 1, 0): (6.0, 1.22, 8),
(0, 1, 1): (7.0, 1.22, 5),
(1, 0, 0): (7.0, 1.22, 8),
(1, 0, 1): (8.5, 1.22, 5),
(1, 1, 0): (9.5, 1.22, 6),
(1, 1, 1): (12.0, 1.22, 8),
}
records = []
for (a, b, c), (mu, sigma, n) in cell_specs.items():
for v in np.random.normal(mu, sigma, n):
records.append({"A": a, "B": b, "C": c, "Y": v})
data = pd.DataFrame(records)
print("Cell sizes:")
print(data.groupby(["A", "B", "C"]).size().unstack().fillna(0))
# Type II vs III ANOVA
model = ols("Y ~ C(A, Sum) * C(B, Sum) * C(C, Sum)", data=data).fit()
print("\n=== Type II SS ===")
print(sm.stats.anova_lm(model, typ=2).round(3))
print("\n=== Type III SS ===")
print(sm.stats.anova_lm(model, typ=3).round(3))
# Simple interaction effect: A x B at each C level
print("\n=== Simple interaction A x B at each C level ===")
ms_w_pooled = (sum((data.groupby(["A","B","C"])["Y"].transform(lambda x: (x - x.mean())**2)).sum())
/ (len(data) - 8))
for c_lvl in [0, 1]:
sub = data[data["C"] == c_lvl]
sub_model = ols("Y ~ C(A, Sum) * C(B, Sum)", data=sub).fit()
sub_anova = sm.stats.anova_lm(sub_model, typ=2)
interaction_row = sub_anova.loc["C(A, Sum):C(B, Sum)"]
n_sub = len(sub)
df_sub_w = sub_anova.loc["Residual", "df"]
print(f"\n C = {c_lvl}:")
print(f" SS_AB = {interaction_row['sum_sq']:.2f}")
print(f" F_pooled = {interaction_row['sum_sq'] / ms_w_pooled:.2f}")
print(f" F_separate = {interaction_row['F']:.2f}")7 결정 차트 — 삼원 분석 종합
ANOVA (Type II 또는 III)
↓
F_ABC 유의?
├── No → 이원 상호작용·주효과 분석
└── Yes → simple interaction analysis
├── 어느 차원으로 분해?
│ (도메인·사전 가설 기반 선택)
├── 각 level 에서 이원 factorial 분석
├── 분모: pooled vs separate (등분산 점검 후)
└── 다중 비교 보정 (Bonferroni 또는 사전 계획)
8 가정과 한계
- 삼원 상호작용 검정력: 자유도 1 의 작은 효과는 검출 어려움. 사전 검정력 분석.
- 셀 등분산: pooled \(MS_W\) 사용 시 검정. 위반 시 separate.
- 다중 simple interaction 검정: \(c\) 개 level 에서 모두 검정 시 FWER 부풀림. 보정.
- 결측 셀 처리: 수동 점검 필요. 통계 패키지의 default 가 안전하지 않을 수 있음.
9 MAX Ch.8 시리즈 정리
G-MAX8-0 Higher-Order Factorial 개관
G-MAX8-1 2×2×2 와 7 효과 (직교 대비, Hadamard 표)
G-MAX8-2 3 원 상호작용과 하향식 분석
G-MAX8-3 Simple Interaction Effects + Non-orthogonal ← 현재 글
│
▼
G-MAX9 (ANCOVA)
G-MON3 (Factorial 정통, 분수 분할)
10 관련 주제
선행 지식
후속 주제
- G-MAX9 — ANCOVA (작성 예정)
- G-MON3 — Factorial Experiments (작성 예정)
다른 카테고리 연결