비맹검 RCT 의 위험과 방어 — Block 함정 깊이

Cosmetic Credibility 미신과 추측 메커니즘의 수학적 분석

비맹검 RCT 에서 흔히 발생하는 두 가지 함정을 깊이 다룬다. (1) “RCT 는 정확히 같은 sample size 를 가져야 한다” 는 cosmetic credibility 미신의 실증과 위험 (Schulz 2002 의 54~71% 발견), (2) Permuted-Block 의 예측 가능성 메커니즘을 수학적으로 분석 (작은 고정 블록의 결정성, Random 변동의 부분적 한계, Blackwell-Hodges 모형). Kahan 외 (2015) 의 “16% 임상 인력이 추측 시도” 실증을 메커니즘 분해와 함께 제시. 각 분석에 일상어 비유와 반사실 시나리오를 풍부히 붙인다.

Experimentation
Epidemiology
저자

Kwangmin Kim

공개

2026년 05월 08일

이 글은 Schulz Ch.13 시리즈의 두 번째 글이다. Ch.13 개관 에서 제시한 큰 그림 중 추측 위험과 Block 방어 를 깊게 다룬다 (Schulz full md L:19654~19900). 다음 글에서는 Urn 과 Mixed Randomisation 을 다룬다.

1 진입 직관 — 왜 비맹검 시험은 통계가 아닌 행동의 문제인가

이중 맹검 시험에서 무작위 배정은 통계적 문제다. 적절히 무작위화하면 끝. 그러나 비맹검 시험에서는 인간 행동의 문제 가 추가된다.

핵심 사실: 임상 인력의 16% 가 적극적으로 배정 sequence 를 추측하려 시도한다 (Kahan 외 2015). 이는 부정행위가 아니다. 임상적 호기심 의 자연스러운 발현이다. 그러나 이 호기심이 selection bias 를 만든다.

비유: 카드 게임에서 “다른 사람의 카드를 추측하지 말 것” 이라는 규칙이 있어도, 인간은 본능적으로 카드를 보고 추측한다. RCT 에서 이 본능을 제거하는 것은 심리학적으로 불가능. 따라서 추측해도 정보가 안 새도록 시스템을 설계해야 한다.

이 글의 목적은:

  1. 왜 추측이 일어나는가 — Cosmetic credibility 미신의 실증
  2. 어떻게 정보가 새는가 — Block 의 수학적 함정
  3. 부분적 방어 — 하지만 충분하지 않다 — Random 변동의 한계

다음 글에서 완전한 방어 인 Urn 과 Mixed Randomisation 을 다룬다.

2 Cosmetic Credibility 미신 — 실증 깊이

2.1 Schulz 의 실증

Schulz (2002, Lancet) 가 일반 의학 학술지의 RCT 보고를 분석한 결과:

시험 유형 정확히 같은 sample size 비율
Simple randomised (specialist 학술지) 54%
Simple randomised (dermatology) 71%
Block randomised 36%

충격: Block 시험은 균형을 강제 하므로 정확 균형이 흔하다. 그러나 Simple randomised 시험은 우연의 결과 로만 정확 균형이 나와야 한다. Simple 의 54~71% 정확 균형은 통계적 우연으로 설명 불가능.

2.2 수학적 분석

Simple randomisation 으로 정확 균형이 나올 확률:

\[P(X = n/2 \mid X \sim \text{Binomial}(n, 0.5)) = \binom{n}{n/2} \cdot \frac{1}{2^n}\]

\(n\) 정확 균형 확률
50 11.2%
100 8.0%
200 5.6%
500 3.6%
1000 2.5%

반사실: 만약 Simple Randomisation 의 수학적 기댓값 이 5~11% 인데 관측치 가 54~71% 라면, 두 차이의 격차 (5~6 배) 는 비무작위 조작 의 비율을 시사. Schulz 는 이를 “여러 trialist 가 무의식적으로 sequence 를 수정 해 균형 강제” 라고 해석.

2.3 미신의 위험

경로 1: 연구자가 마지막 환자를 원하는 군에 강제 배정 → 무작위화 무력화.

경로 2: Block 사용 시, 작은 고정 블록 선호 → 예측 가능성 증가.

경로 3: Reviewer 가 균형 부재를 결함 으로 지적 → 연구자가 더욱 균형 강제로 압박.

so what: 미신은 단지 미적 선호가 아니라 방법론적 위험을 직접 만든다. Schulz 는 “Reviewer 와 editor 가 이 미신에서 벗어나야 RCT 의 자연 균형이 회복된다” 고 주장.

3 Permuted-Block 의 예측 가능성 — 수학적 함정

3.1 Block 크기 4 의 결정성 분석

블록 크기 4 (A 2, B 2). 가능한 6 가지 패턴:

AABB, ABAB, ABBA, BAAB, BABA, BBAA

블록 내부 에서 첫 3 자리가 주어졌을 때 4 번째 자리:

첫 3 자리 가능한 패턴 4 번째
AAB AABB B (확률 1)
ABA ABAB B (확률 1)
ABB ABBA A (확률 1)
BAA BAAB B (확률 1)
BAB BABA A (확률 1)
BBA BBAA A (확률 1)

결론: 블록 크기 4 에서 마지막 자리는 항상 100% 결정적. 모집 인력이 첫 3 명의 배정을 알면 4 번째는 완벽 예측.

3.2 일반화

블록 크기 \(b\) 에서:

  • \(b-1\) 자리가 주어지면 마지막 자리는 거의 항상 결정 가능
  • 즉 약 \(1/b\) 비율의 환자가 완벽 예측 가능
  • Block 크기 4: 25%, 6: 17%, 10: 10%, 20: 5%

수식 직관: 더 정확한 분석. 블록 크기 \(b\) (각 군 \(b/2\)). 임의의 시점 \(k\) (\(k = 1, ..., b-1\)) 에서 다음 자리 예측 정확도는:

\[P_{\text{correct}} = \frac{1}{2} + \frac{|\Delta_k|}{2(b-k)}\]

여기서 \(\Delta_k\)\(k\) 시점까지 두 군의 차이. 마지막 자리 (\(k = b-1\)) 에서 \(|\Delta_k| = b-k = 1\) 이므로 \(P = 1\) — 결정적.

반사실 — 블록 크기 16: 마지막 자리만 결정적, 나머지 15 자리는 부분적으로만. 블록 크기 16 의 블록 평균 예측 가능 자리는 약 1.5 자리. 즉 9.4% 만 예측 가능.

3.3 Selection Bias 의 메커니즘 — Berger-Exner 모형

Berger & Exner (1999) 의 selection bias 측정 모형. 한 환자를 모집할 때:

  1. 모집 인력이 다음 배정 (\(T_{i+1}\)) 을 부분적으로 추측
  2. 환자의 baseline 위험 (\(X_{i+1}\)) 을 평가
  3. 추측한 \(T_{i+1}\)\(X_{i+1}\) 의 적합성에 따라 등록 결정

결과: 두 군의 baseline 분포가 체계적으로 다름. 예: 새 약 군에 더 건강한 환자, 표준 군에 더 위중한 환자.

수식: 만약 모집 인력이 다음 배정을 확률 \(p\) 로 정확히 추측하고, baseline 위험에 따라 환자를 선별한다면, 두 군의 baseline 차이 (예: 평균 위험) 가 약 \(0.4(p - 0.5)\) 단위로 발생 (Berger 2014).

\(p = 0.7\) (큰 블록·random 변동 시) 에서 baseline 차이 약 0.08

\(p = 0.85\) (작은 고정 블록 시) 에서 baseline 차이 약 0.14

so what: 작은 고정 블록은 측정 가능한 selection bias 를 만든다. Schulz 외 (1995) 의 41% effect overestimation 발견의 부분적 메커니즘.

4 Schulz 외 (1995) — 41% Effect Overestimation 재방문

이전 글 (32-5) 에서 인용한 발견을 이 맥락에서 재해석.

Schulz, Chalmers, Hayes, Altman (1995, JAMA): 무작위 배정 또는 concealment 가 부적절한 시험은 치료 효과를 평균 41% 과대 추정.

이 41% 의 부분적 원인 이 비맹검 시험에서의 추측 selection bias 다.

부적절 요소 효과 과대 추정 (평균)
부적절 sequence generation 1020%
부적절 allocation concealment 3040%
부적절 blinding 1020%
누적 ~41%

반사실: 만약 한 신약의 진짜 효과가 사망률 20% 감소라면:

  • 적절한 RCT: 측정 효과 ≈ 20%
  • 부적절 sequence + concealment 부재: 측정 효과 ≈ 28~30%

의사·환자가 실제보다 더 효과적 이라고 믿게 됨. 임상 결정 왜곡.

5 Kahan 외 (2015) — 16% 추측 시도의 메커니즘

Kahan, Rehal, Cro (2015) 의 Trials 발표는 비맹검 시험에서 selection bias 위험을 정량화한 중요한 연구다.

5.1 연구 설계

영국 임상 시험 인력 (임상의·연구 간호사) 대상 익명 설문. 핵심 질문:

“당신은 이전에 RCT 의 무작위 배정 sequence 패턴을 추측하려 시도한 적이 있습니까?”

5.2 결과

응답 비율
시도한 적 있음 16%
시도한 적 없음 84%

추측 방법:

  • 78%: 과거 배정의 log 유지
  • 51%: 블록 크기 역추적
  • 34%: Sequence 생성자에게 직접 질문 (!)
  • 22%: Concealment 시스템의 약점 활용

5.3 Schulz 의 해석

“16% 는 최소 추정치. 익명 설문이라도 사회적 바람직성 편향 (social desirability bias) 으로 인해 실제 추측자는 더 많을 가능성. 그리고 시도한 적 없음 의 일부도 무의식적 추측을 했을 수 있음.”

반사실: 만약 진짜 비율이 30% 라면, 전체 RCT 의 약 1/3 이 어떤 형태로든 selection bias 를 겪고 있을 가능성. 메타분석의 신뢰도가 위협받음.

6 Random 변동 블록의 효과 — 부분적이지만 중요

비맹검 시험에서 권장되는 첫 번째 방어선: Random 변동 블록 + 큰 블록 + 비공개.

6.1 효과 분석

블록 크기 4 고정 vs 6, 8, 10, 12 random 변동:

시나리오 마지막 자리 예측 정확도
Block size 4 fixed 100% (마지막 자리 결정적)
Block size 6 fixed 100%
Random {4, 6, 8} 6070% (블록 종료 시점 모호)
Random {6, 8, 10, 12} 5060%
Random {8, 12, 16, 20} 4050%

수식 직관: Random 블록 크기 \(\{b_1, b_2, ...\}\) 에서 모집 인력이 현재 어느 블록 내부 인지 모르면 다음 자리 예측이 어려워짐. 그러나 누적 배정 패턴을 분석해 블록 경계를 추정 할 수 있음.

6.2 Blackwell-Hodges 모형

Blackwell & Hodges (1957) 가 제시한 최적 추측 모형. 모집 인력이 가장 합리적으로 추측할 때 정확도 상한.

결론 (Berger 외 2003): Random 변동 블록도 selection bias 를 완전히 제거하지 못한다. 큰 블록 (≥ 16) + random 변동 + 비공개 의 조합이 가장 안전.

6.3 한계

Schulz 의 평가: “Random 블록 크기는 selection bias 를 감소 시키지만 제거 하지 않는다. 비맹검 시험에서 진정한 안전을 원하면 Block 의 사고 모형을 넘어서야 한다 — Urn 또는 Mixed Randomisation.”

이 한계가 다음 글의 출발점이다.

7 비공개의 정치 — Sequence 정보의 분리

Block 방어의 또 다른 축: Sequence 정보의 접근 권한 분리.

7.1 권한 매트릭스

정보 Sequence 생성자 모집 인력 데이터 분석가 Reviewer (시험 후)
정확한 sequence O X X (시험 중), O (시험 후) X (시험 중), O (시험 후)
블록 크기 O X X (시험 중), O (시험 후) X (시험 중), O (시험 후)
일반적 방법 (예: “변동 블록”) O O O O

원칙: 모집 인력이 sequence 의 어떤 정보도 접근하면 안 된다. 일반적 방법론만 알면 됨.

7.2 구현 사례

시스템 메커니즘
봉인된 봉투 (sealed envelope) 순차 번호, 불투명, sequence 생성자가 봉인
중앙 무작위 (central randomisation) 전화·웹 시스템, 모집 인력이 환자 정보 입력 시 sequence 자동 반환
약사 통제 (pharmacy control) 약물이 미리 블라인드 라벨, 약사만 sequence 알고 약 배포

7.3 위반 사례 (Schulz 의 anecdote)

Schulz 가 인용하는 위반 사례 (Schulz 1995, JAMA):

  • 반투명 봉투를 강한 빛에 비춰 내용 확인
  • 중앙 무작위 전화에서 여러 환자의 배정을 미리 요청
  • PI 의 책상 서랍에서 sequence 파일을 밤에 열람

반사실: 이런 위반은 부정행위 가 아니다. 임상적 호기심 의 발현. 그러나 결과적으로 selection bias 를 만든다. 시스템 설계가 호기심을 불가능 하게 해야 한다.

8 IT / 디지털 실험 매핑

역학 (RCT) IT (A/B Test)
Cosmetic credibility 미신 “정확 50:50 이어야 안전” 신화
16% 추측 시도 사용자가 본인 군 추측·확인
Block 결정성 Hash bucket 패턴 노출
Random 변동 블록 Hash salt rotation
Sequence 비공개 Hash function + secret salt
봉인된 봉투 Encrypted assignment service
중앙 무작위 Centralized assignment server
약사 통제 Feature flag service

IT 의 추가 위험: IT 에서는 사용자가 URL 파라미터·DOM 요소 등을 통해 본인 군을 추측할 수 있다. 이는 임상의 16% 추측보다 더 흔할 수 있음 (개발자가 호기심에 코드 검사). Hash + secret + obfuscation 의 다중 방어 필요.

9 코드 예시 — Block 함정과 Random 변동의 효과

import numpy as np
from itertools import permutations

np.random.seed(42)

# 1. Block size 별 마지막 자리 예측 가능 비율
def block_predictability_exact(block_size):
    half = block_size // 2
    base = [0]*half + [1]*half
    patterns = list(set(permutations(base)))

    # 첫 (b-1) 자리 → 마지막 자리 매핑
    last_map = {}
    for p in patterns:
        prefix = tuple(p[:-1])
        if prefix not in last_map:
            last_map[prefix] = []
        last_map[prefix].append(p[-1])

    # Unique 한 prefix (마지막 결정적) 의 비율
    determined = sum(1 for v in last_map.values() if len(set(v)) == 1)
    return determined / len(last_map)

print("[Block 크기별 마지막 자리 결정성]")
for b in [4, 6, 8, 10, 16, 20]:
    p = block_predictability_exact(b)
    print(f"Block size {b:>2}: 결정성 = {p:.1%}")

# 2. Random 변동 블록의 추측 정확도
def simulate_guessing(block_sizes, n_trial=1000, n_per_trial=200):
    correct, total = 0, 0
    for _ in range(n_trial):
        seq = []
        n_a, n_b = 0, 0
        while len(seq) < n_per_trial:
            b = np.random.choice(block_sizes)
            half = b // 2
            block = np.array([0]*half + [1]*half)
            np.random.shuffle(block)
            for assignment in block:
                # 추측: 부족한 군
                guess = 0 if n_a < n_b else (1 if n_a > n_b else np.random.choice([0,1]))
                if guess == assignment:
                    correct += 1
                total += 1
                if assignment == 0:
                    n_a += 1
                else:
                    n_b += 1
            if len(seq) + len(block) > n_per_trial:
                seq.extend(block[:n_per_trial - len(seq)])
                break
            seq.extend(block)
    return correct / total

print("\n[Random 변동 블록의 평균 추측 정확도]")
configs = [
    ("Fixed Block(4)",         [4]),
    ("Fixed Block(6)",         [6]),
    ("Fixed Block(10)",        [10]),
    ("Random {4, 6, 8}",       [4, 6, 8]),
    ("Random {6, 8, 10, 12}",  [6, 8, 10, 12]),
    ("Random {8, 12, 16, 20}", [8, 12, 16, 20]),
    ("Simple",                 None),
]
for name, sizes in configs:
    if sizes is None:
        # Simple
        correct, total = 0, 0
        for _ in range(1000):
            seq = np.random.choice([0, 1], 200)
            n_a, n_b = 0, 0
            for a in seq:
                guess = 0 if n_a < n_b else (1 if n_a > n_b else np.random.choice([0,1]))
                if guess == a:
                    correct += 1
                total += 1
                if a == 0:
                    n_a += 1
                else:
                    n_b += 1
        acc = correct / total
    else:
        acc = simulate_guessing(sizes)
    print(f"{name:<25}: {acc:.1%}")

# 3. Schulz 2002 cosmetic credibility 시뮬레이션
print("\n[Cosmetic Credibility — 정확 균형 확률]")
from scipy.stats import binom
for n in [50, 100, 200, 500, 1000]:
    p_exact = binom.pmf(n//2, n, 0.5)
    print(f"n={n:>4}: P(정확 균형) = {p_exact:.4f} ({p_exact*100:.1f}%)")
print("\n관측: Simple RCT 의 54~71% 가 정확 균형 — 이는 우연의 5~6 배.")
print("→ 비무작위 조작이 흔히 일어남을 강력 시사.")

# 4. Berger 2014 selection bias 추정
print("\n[Berger 2014 — 추측 정확도 → baseline imbalance]")
for p in [0.5, 0.55, 0.65, 0.75, 0.85, 1.00]:
    bias = 0.4 * (p - 0.5)
    print(f"P(correct guess) = {p:.2f}: Baseline 차이 ≈ {bias:.3f}")
print("→ 작은 고정 블록 (p≥0.85) 은 선명한 baseline imbalance 생성.")

이 코드는:

  1. Block 크기별 결정성 (b=4 에서 100%, b=20 에서 ~5%)
  2. Random 변동의 효과 (50~70% 추측 정확도, Simple 의 50% 와 비교)
  3. Cosmetic credibility 의 통계적 불가능성 (관측 54% vs 우연 8%)
  4. Berger 2014 baseline imbalance 정량화

10 결론 — Block 방어의 두 메시지

균형 강제는 함정이고, 작은 고정 블록은 위험하다.

핵심 행동 권고:

  1. Cosmetic credibility 미신을 거부 — 약간의 imbalance 는 무작위의 증거
  2. 블록 크기 ≥ 10, 가능하면 16 이상
  3. 블록 크기 random 변동
  4. 블록 크기 비공개 — sequence 생성자만 앎
  5. Sequence 분리 권한 — 모집 인력 차단

그러나 Block 은 완벽한 방어가 아니다. Random 변동도 selection bias 를 완전히 제거하지 못한다. 비맹검 시험에서 진정한 안전을 원하면 다음 글에서 다룰 Urn 또는 Mixed Randomisation 이 필요하다.

11 관련 주제

선행 지식

Phase C 후속 글

12 참고문헌

  • Schulz, K. F. & Grimes, D. A. (2019). Essential Concepts in Clinical Research (2nd ed.), Ch.13. Elsevier.
  • Schulz, K. F. & Grimes, D. A. (2002). Generation of allocation sequences in randomised trials. Lancet 359, 515-519.
  • Schulz, K. F. (1995). Subverting randomization in controlled trials. JAMA 274, 1456-1458.
  • Schulz, K. F., Chalmers, I., Hayes, R. J., Altman, D. G. (1995). Empirical evidence of bias. JAMA 273, 408-412.
  • Kahan, B. C., Rehal, S., Cro, S. (2015). Risk of selection bias in randomised trials. Trials 16, 405.
  • Berger, V. W. (2014). Quantifying the magnitude of baseline covariate imbalances. Stat. Med. 33, 4133-4135.
  • Berger, V. W. & Exner, D. V. (1999). Detecting selection bias in randomized clinical trials. Control. Clin. Trials 20, 319-327.
  • Blackwell, D. & Hodges, J. L. (1957). Design for the control of selection bias. Ann. Math. Statist. 28, 449-460.

Subscribe

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