이 글은 Schulz Ch.14 Allocation Concealment 시리즈의 마지막 글이다. Ch.14 개관, 은폐의 중요성, 평가 기준과 사례 에 이어, Baseline comparison 의 적절·부적절 관행 을 깊이 다룬다 (Schulz full md L:5811~6084).
1 진입 직관 — 왜 Baseline 의 Hypothesis Test 는 부조리 한가
대부분 RCT 보고서의 첫 표는 Baseline Characteristics 다 — 두 군의 연령·성별·중증도·병력 등을 비교. 이 표는 두 가지 목적을 가진다.
- 모집단 기술 — 이 시험에 참여한 환자가 어떤 특성 인가 (외적 타당도 평가)
- 두 군의 비교 가능성 — 무작위 배정이 적절히 작동했는가 의 시각적 확인
그러나 흔한 관행 이 있다 — 각 baseline 변수에 hypothesis test 를 수행해 p-value 를 표에 보고. Schulz 와 Altman 은 이 관행을 강하게 비판한다.
Altman 의 명언: “Such a procedure is clearly absurd.” (Altman 1985)
왜 부조리인가?: 무작위 배정 RCT 에서 두 군의 baseline 차이는 정의상 우연. p-value 는 “차이가 우연일 확률” 을 묻는데, 이미 우연임을 알고 있는 데이터에 묻는 것은 무의미. 0.05 p-value 가 나와도 그것은 Type I 오류 5% 의 정상 발생 — bias 의 증거가 아님.
이 글의 목적:
- 왜 baseline test 가 부조리한가 — 수학적 명료화
- 왜 부작용까지 있는가 — Schulz 외 (1994) 의 보고 억제 발견
- 무엇이 적절한 baseline 보고인가 — Panel 14.3 의 모범 사례
- Chance imbalance 의 적절한 처리 — 사전 계획적 adjustment
2 Hypothesis Test 의 부조리 — 수학적 분석
2.1 정상 가설 검정의 논리
일반적 hypothesis test 의 논리:
가설:
H_0: 효과 없음 (no effect)
H_1: 효과 있음
데이터 관찰:
→ 만약 H_0 가 참이라면, 이 데이터가 관찰될 확률 (p-value)
→ p < 0.05 이면 H_0 를 *기각* — 효과 *있을 가능성*
이 논리의 핵심: H_0 가 참인지 모르는 상태에서 데이터로 추론.
2.2 Baseline Test 의 문제
무작위 배정 RCT 에서 baseline 차이의 가설:
가설:
H_0: 두 군의 baseline 분포가 같다
H_1: 두 군의 baseline 분포가 다르다
문제: H_0 는 *정의상 참*.
→ 무작위 배정 = 두 군이 *동일 모집단에서 추출됨* = 분포 같음
→ H_0 는 알려진 진실이지 검증 대상이 아님
수식 직관: 무작위 배정 변수 \(T\) 와 baseline 변수 \(X\) 사이:
\[T \perp\!\!\!\perp X \quad (\text{무작위 배정의 정의})\]
즉 \(E[X | T = 0] = E[X | T = 1]\). 두 군의 baseline 평균이 동일 모집단 평균 으로 같다. 차이는 순수 우연 (random sampling variability).
반사실: 만약 \(T\) 와 \(X\) 가 종속이라면 (예: 임상의가 위험 낮은 환자에게 새 약 선택), 그것은 concealment 부재의 증거. 그러나 이를 p-value 로 검출하는 것은 부적절 — concealment 평가는 직접 보고 (sequence generation, allocation method) 로 해야 함.
2.3 Type I 오류의 정상 발생
Hypothesis test 의 본질: \(\alpha = 0.05\) 면 5% 의 진짜 무차이 데이터 에서도 \(p < 0.05\) 발생.
시나리오: 20 개 baseline 변수 (연령·성별·BMI·흡연·…) 를 검정하면, 기댓값 1 개 가 우연히 \(p < 0.05\). 이는 bias 의 증거가 아님 — 다중 검정의 정상 결과.
반사실: Reviewer 가 baseline 표에서 한 변수의 \(p < 0.05\) 를 imbalance 의 증거 로 해석하면 잘못된 비판. 시험을 부당히 거부 하거나 post-hoc adjustment 를 강요할 수 있음.
3 Hypothesis Test 의 부작용 — 보고 억제 메커니즘
Schulz 의 가장 흥미로운 발견 — baseline test 는 단지 무의미한 게 아니라 적극적 해롭다.
3.1 Schulz 외 (1994) 의 발견
분석 결과 (Schulz, Chalmers, Grimes, Altman 1994; Altman & Doré 1990):
Baseline hypothesis test 사용 시험에서, 유의 결과의 비율이 우연 기댓값 (5%) 보다 적다.
이게 왜 충격인가:
정상 기대:
20 개 baseline 변수 × 100 개 시험 = 2000 검정
α = 0.05 → 우연히 100 개 (5%) 가 p < 0.05 가 되어야 함
관찰:
실제 p < 0.05 비율이 5% 보다 *적음*
Schulz 의 해석: “일부 연구자가 유의한 baseline 차이를 의도적으로 보고하지 않음. ‘유의한 baseline imbalance 가 있으면 보고서가 의심받을 것’ 이라는 잘못된 인식 때문.”
반사실: 만약 한 시험에서 baseline 연령 \(p = 0.04\) 발견. 연구자가 “이 변수는 별로 중요하지 않다” 며 표에서 제외. 다른 변수들만 보고. Reviewer 는 “baseline 잘 균형되었다” 고 판단. 정보 은폐 가 의도치 않게 일어남.
3.2 문제의 핵심
Hypothesis test 가 imbalance 의 imaginary 평가 도구 로 작동:
- 연구자가 baseline 차이의 통계적 유의성 을 검토
- 유의하면 보고 억제 또는 post-hoc 변경 동기 발생
- Reviewer 도 유의성으로만 baseline 평가 — 임상적 중요성 무시
- 결과: Reviewer 가 시험의 baseline 적절성을 진짜로 평가할 수 없음
so what: Hypothesis test 는 단지 무의미한 게 아니라 시험 진실성을 위협. 학술지·CONSORT 가 baseline test 사용을 명시적으로 비추천 하는 이유.
4 적절한 Baseline 보고 — Panel 14.3
Schulz 의 모범 사례 (Panel 14.3):
| Characteristic | Antibiotic Group | Placebo Group |
|---|---|---|
| Age (mean ± SD) (years) | 30.2 ± 5.2 | 31.1 ± 5.9 |
| Weight (median [IQR]) (kg) | 64 (55, 82) | 65 (56, 85) |
| Nulliparous (n, %) | 62 (53%) | 63 (49%) |
| Previous pelvic inflammatory disease (n, %) | 24 (21%) | 28 (22%) |
핵심 특징:
- 연속 변수: 평균 + SD (또는 중앙값 + IQR)
- 범주 변수: 빈도 + 백분율
- p-value 없음
- 명시적 단위 (years, kg)
4.1 변수 유형별 적절 통계
| 변수 유형 | 분포 | 적절 통계 | 부적절 |
|---|---|---|---|
| Continuous, 정규 | 연령, BMI, 혈압 | 평균 ± SD | t-test p-value |
| Continuous, 비대칭 | 체중, 시간, 비용 | 중앙값 + IQR | t-test p-value |
| Categorical, 이분 | 성별, 흡연 | n (%) | χ² test p-value |
| Categorical, 다범주 | 인종, 교육 | n (%) per category | χ² test p-value |
| Continuous, count | 입원 횟수 | 중앙값 + IQR or 평균 | Poisson test |
변동성 표기 — SD vs SE vs CI:
통계 의미 적절성 SD (Standard Deviation) 데이터 분포의 폭 [O] Baseline 에 적절 SE (Standard Error) 추정량의 정밀성 [X] Baseline 에 부적절 95% CI 모수의 추정 구간 [X] Baseline 에 부적절 Baseline 표는 기술 통계 (descriptive), SE/CI 는 추론 통계 (inferential). 두 목적이 다름.
4.2 비대칭 분포의 처리
나이 같은 정규 분포 변수는 평균·SD. 체중·소득·입원 일수 같은 비대칭 분포는 중앙값·IQR.
반사실: 입원 일수의 분포가 강하게 우편향 (대부분 1~3 일, 일부 30+ 일). 평균 5.2 일, SD 8.7 일을 보고하면 오해 — “평균적으로 5 일 입원” 이 아니라 대부분은 단기, 일부는 매우 장기. 중앙값 2 일 (IQR 1, 4) 이 더 정확한 그림.
5 What to Look for — Baseline Reading 능력
CONSORT 와 Schulz 의 권장 — Reviewer·독자가 baseline 표를 어떻게 평가 해야 하나:
5.1 Step 1: 임상적 중요성 (Clinical Importance)
질문: 이 변수가 결과에 영향을 줄 가능성 이 큰가?
| 변수 | 결과 영향 가능성 |
|---|---|
| 연령 (대부분 시험) | 높음 |
| 성별 (대부분 시험) | 중~높음 |
| 질병 중증도 (severity) | 매우 높음 |
| 동반 질환 (comorbidity) | 높음 |
| 학력 | 보통 낮음 |
| 직업 | 보통 낮음 |
함의: 임상적으로 중요한 변수에서 imbalance 가 있으면 우려. 덜 중요한 변수에서 imbalance 는 무시.
5.2 Step 2: Imbalance 의 크기 (Magnitude)
질문: Imbalance 가 결과에 영향을 줄 만큼 큰가?
| 임상적 중요 변수 | Imbalance 크기 | 우려 수준 |
|---|---|---|
| 연령 | 1 년 차이 | 낮음 |
| 연령 | 5 년 차이 | 중 |
| 연령 | 10 년 차이 | 높음 |
| 중증도 (1~5 단계) | 0.3 단계 차이 | 낮음 |
| 중증도 | 1 단계 차이 | 매우 높음 |
so what: Hypothesis test 의 p-value 가 아니라 임상적 의미 로 평가. 100 명 시험에서 연령 차이 5 년 (\(p = 0.03\)) 은 우려, 100,000 명 시험에서 연령 차이 0.5 년 (\(p = 0.001\)) 은 무시.
5.3 Step 3: 다중 비교 인식
질문: 몇 개 변수를 비교했는가? 한 변수의 imbalance 가 우연의 정상 발생 인가?
반사실: 20 개 변수 × Type I 5% = 1 개 우연 imbalance 기댓값. 시험에서 1~2 개 imbalance 발견은 정상. 5~10 개 imbalance 는 우연이 아닐 가능성 — concealment 우려.
6 Chance Imbalance 의 적절한 Adjustment
무작위 배정에도 chance imbalance 는 발생한다. 어떻게 처리해야 하나?
6.1 통계적 분석에서의 자연스러운 처리
Schulz 의 핵심: “결과 분석의 통계 검정이 chance imbalance 를 자동으로 처리한다. 무작위 배정의 random variability 는 기존 통계 이론 에 이미 포함됨.”
즉 t-test, ANOVA, Cox regression 등의 분산 추정 이 chance imbalance 를 반영. 별도 보정 불필요.
6.2 Adjusted Analysis 의 적절성
그러나 adjusted analysis 가 유용한 경우가 있다.
권장: 사전 계획된 (pre-specified) adjustment — 시험 시작 전에 “연령·중증도로 보정” 을 명시. 결과 분석 시 이 변수들로 adjusted estimator 계산.
이는 다음 두 가지 이점:
- 정밀성 (precision): \(\hat{\theta}_{\text{adjusted}}\) 의 분산이 일반적으로 더 작음
- 편향 차단: Chance imbalance 의 영향 추가 차단
수식 직관: ANCOVA (Analysis of Covariance) 의 결과 표준 오차:
\[\text{SE}(\hat{\theta}_{\text{adj}}) = \text{SE}(\hat{\theta}_{\text{unadj}}) \cdot \sqrt{1 - r^2}\]
여기서 \(r\) 은 covariate 와 결과의 상관. \(r = 0.5\) 면 SE 가 약 13% 감소 → 검정력 증가.
6.3 Post-hoc Adjustment 의 위험
반대: 결과 보고서에서 imbalance 발견 후 보정한 분석 = post-hoc adjustment. 위험:
- 변수 선택의 임의성 — 어떤 변수를 보정할지 결과를 보고 결정 → bias
- 유리한 결과 cherry-picking — 여러 보정 시나리오 중 가장 유리한 것 선택
- 재현 불가능성 — 다른 연구자가 동일 결과 재현 어려움
권장: 모든 adjusted analysis 는 사전 계획. 사후 발견 imbalance 보정은 exploratory 로만 보고.
7 CONSORT 의 권장 사항
CONSORT 2010 Item 15:
“A table showing baseline demographic and clinical characteristics for each group.”
추가 권장:
- 임상적으로 중요한 변수만 포함
- p-value 제거
- 평균·SD 또는 중앙값·IQR 적절 사용
- 백분율은 분모 명시 (예: “62/117 (53%)” 또는 “53% (n = 62)”)
8 IT / 디지털 실험 매핑
| 역학 (RCT) | IT (A/B Test) |
|---|---|
| Baseline characteristics table | Pre-period activity table (per bucket) |
| Hypothesis test on baseline | Pre-period statistical test (남용) |
| Sequentially numbered IDs | Hash-based assignment |
| Chance imbalance | Random allocation imbalance |
| Pre-specified adjustment | CUPED, CUPAC variance reduction |
| Post-hoc imbalance check | A/A test |
| Altman “clearly absurd” | “Pre-period p-value 보지 마라” 의 IT 버전 |
A/B 테스트의 동형 함정: IT 에서 pre-period 차이 를 hypothesis test 로 평가하는 관행이 흔하다. 그러나 hash 기반 assignment 가 적절하면 정의상 우연. p-value 보고 시험 진행 결정에 사용하는 것은 baseline test 와 동일하게 부조리.
CUPED 의 가치: Deng 외 (2013) 의 CUPED (Controlled-experiment Using Pre-Experiment Data) 는 사전 계획된 adjustment 의 IT 버전. Pre-period 활동을 covariate 로 활용해 분산 감소. 이는 임상의 ANCOVA 와 동형.
9 코드 예시 — Baseline 분석 시뮬레이션
import numpy as np
from scipy import stats
np.random.seed(42)
# 시험 시뮬레이션 1000 회
n_sim = 1000
n_per_arm = 100
n_baseline_vars = 20
# 각 시험에서 baseline 변수 비교
all_p_values = []
for _ in range(n_sim):
# 무작위 배정된 두 군
group_A = np.random.normal(50, 10, n_per_arm) # 연령 (mean=50, SD=10)
group_B = np.random.normal(50, 10, n_per_arm)
# 20 개 baseline 변수 비교
for _ in range(n_baseline_vars):
var_A = np.random.normal(50, 10, n_per_arm)
var_B = np.random.normal(50, 10, n_per_arm)
_, p = stats.ttest_ind(var_A, var_B)
all_p_values.append(p)
# Type I 오류율 — α=0.05 에서 5% 가 정상
p_significant = np.mean(np.array(all_p_values) < 0.05)
print(f"[Baseline test 의 Type I 오류 시뮬레이션]")
print(f"전체 검정 수: {len(all_p_values)}")
print(f"P(p < 0.05) = {p_significant:.3f} (이론적 0.050)")
print(f"→ 무작위 배정 하에서 정확히 5% 가 우연 유의 — bias 증거 아님\n")
# 한 시험당 유의 변수 수
n_significant_per_trial = []
for trial_p in np.array(all_p_values).reshape(n_sim, n_baseline_vars):
n_significant_per_trial.append(sum(trial_p < 0.05))
print("[한 시험당 유의 변수 수 분포]")
import collections
counts = collections.Counter(n_significant_per_trial)
for n_sig in sorted(counts.keys()):
pct = counts[n_sig] / n_sim * 100
print(f" {n_sig}/20 변수 유의: {counts[n_sig]} 시험 ({pct:.1f}%)")
# 적절한 baseline 보고 형식
print("\n[적절한 Baseline Table — Panel 14.3 형식]")
np.random.seed(42)
n_per_arm = 100
# 시뮬레이션 데이터
ages_A = np.random.normal(30.2, 5.2, n_per_arm)
ages_B = np.random.normal(31.1, 5.9, n_per_arm)
weight_A = np.random.lognormal(np.log(64), 0.3, n_per_arm)
weight_B = np.random.lognormal(np.log(65), 0.3, n_per_arm)
nullip_A = np.random.binomial(1, 0.53, n_per_arm)
nullip_B = np.random.binomial(1, 0.49, n_per_arm)
pid_A = np.random.binomial(1, 0.21, n_per_arm)
pid_B = np.random.binomial(1, 0.22, n_per_arm)
print(f"{'Characteristic':<40} {'Antibiotic':>20} {'Placebo':>20}")
print(f"{'-'*40} {'-'*20} {'-'*20}")
print(f"{'Age (mean ± SD) (years)':<40} {f'{ages_A.mean():.1f} ± {ages_A.std():.1f}':>20} {f'{ages_B.mean():.1f} ± {ages_B.std():.1f}':>20}")
print(f"{'Weight (median [IQR]) (kg)':<40} {f'{np.median(weight_A):.0f} ({np.percentile(weight_A, 25):.0f}, {np.percentile(weight_A, 75):.0f})':>20} {f'{np.median(weight_B):.0f} ({np.percentile(weight_B, 25):.0f}, {np.percentile(weight_B, 75):.0f})':>20}")
print(f"{'Nulliparous (n, %)':<40} {f'{nullip_A.sum()} ({nullip_A.mean()*100:.0f}%)':>20} {f'{nullip_B.sum()} ({nullip_B.mean()*100:.0f}%)':>20}")
print(f"{'Previous PID (n, %)':<40} {f'{pid_A.sum()} ({pid_A.mean()*100:.0f}%)':>20} {f'{pid_B.sum()} ({pid_B.mean()*100:.0f}%)':>20}")
print("\n→ p-value 없음, 평균/중앙값 + 변동성 통계만")
print("→ Reviewer 가 임상적 중요성과 imbalance 크기로 평가")
# Adjusted analysis 시뮬레이션 — CUPED-like
print("\n[Pre-specified Adjustment 의 효과]")
n = 200
true_effect = 0.5
baseline = np.random.normal(0, 1, n)
T = np.random.choice([0, 1], n)
# 결과 = 처치 효과 + baseline 영향 + noise
Y = T * true_effect + 0.7 * baseline + np.random.normal(0, 1, n)
# Unadjusted
mean_T = Y[T == 1].mean()
mean_C = Y[T == 0].mean()
unadjusted = mean_T - mean_C
se_unadjusted = np.sqrt(Y[T == 1].var()/sum(T==1) + Y[T == 0].var()/sum(T==0))
# Adjusted (linear regression)
import statsmodels.api as sm
X = sm.add_constant(np.column_stack([T, baseline]))
model = sm.OLS(Y, X).fit()
adjusted = model.params[1]
se_adjusted = model.bse[1]
print(f"진짜 효과: {true_effect:.2f}")
print(f"Unadjusted: {unadjusted:.3f} (SE: {se_unadjusted:.3f})")
print(f"Adjusted: {adjusted:.3f} (SE: {se_adjusted:.3f})")
print(f"SE 감소율: {(1 - se_adjusted/se_unadjusted)*100:.0f}%")이 코드는 (1) Baseline test 의 Type I 오류율이 정확히 5% — bias 증거 아님, (2) 한 시험당 평균 1 개 유의 변수가 우연 발생, (3) 적절한 baseline 표 형식, (4) Pre-specified adjustment 의 분산 감소 효과를 보여준다.
10 결론 — Ch.14.3 의 한 줄 요약
Baseline 표는 기술 통계만, hypothesis test 는 부조리.
핵심 행동 권고:
- Baseline 표에 p-value 보고 금지 — 정의상 부조리 (Altman)
- 변수 유형별 적절 통계 — 평균·SD / 중앙값·IQR / n·%
- 임상적 중요성 + Imbalance 크기 로 평가, 통계적 유의성 X
- Adjusted analysis 는 사전 계획만 — Post-hoc 보정 위험
- CUPED 같은 IT variance reduction 도 동일 원리 (사전 계획)
Ch.14 시리즈를 종합하면: Concealment 의 적절성은 RCT 신뢰성의 최대 단일 결정 요인 이다. Sequence generation·Concealment·Baseline 보고 모두 방법론적 표준 을 따라야 비로소 RCT 가 진실의 추구 도구가 된다.
다음 챕터 (Ch.15) 는 또 다른 critical topic — Exclusions and Losses (ITT 원칙) 을 다룬다.
11 관련 주제
선행 지식
Phase C 후속 글
- SCH Ch.15 Exclusions/ITT 시리즈 (placeholder)
다른 카테고리 연결
- CUPED 분산 감소 (placeholder)
- A/A Testing (placeholder)
12 참고문헌
- Schulz, K. F. & Grimes, D. A. (2019). Essential Concepts in Clinical Research (2nd ed.), Ch.14, Panel 14.3. Elsevier.
- Altman, D. (1985). Comparability of randomised groups. Statistician 34, 125-136.
- Altman, D. G. & Doré, C. J. (1990). Randomisation and baseline comparisons in clinical trials. Lancet 335, 149-153.
- Schulz, K. F., Chalmers, I., Grimes, D. A., Altman, D. G. (1994). Assessing the quality of randomization. JAMA 272, 125-128.
- Senn, S. (1997). Statistical Issues in Drug Development. Wiley.
- Lavori, P. W., Louis, T. A., Bailar, J. C., Polansky, M. (1983). Designs for experiments — parallel comparisons of treatment. N. Engl. J. Med. 309, 1291-1299.
- Deng, A., Xu, Y., Kohavi, R., Walker, T. (2013). Improving the sensitivity of online controlled experiments by utilizing pre-experiment data. WSDM (CUPED).