Urn 과 Mixed Randomisation — 비맹검 RCT 의 진정한 방어

UD(α, β) · Big Stick · Maximal Procedure · Schulz 의 절충안

비맹검 RCT 에서 Block 의 한계를 넘어서는 무작위 배정 방법을 깊이 다룬다. (1) Urn Randomisation UD(α, β) 의 적응적 균형 메커니즘, (2) Schulz 가 제안한 Mixed Randomisation 의 단계별 절차 (Panel 13.2~13.3), (3) Big Stick · Maximal Procedure · Ehrenfest Urn 같은 우수하지만 잘 안 쓰이는 방법들, (4) Schulz 외 (1995) 의 41% effect overestimation 발견의 비맹검 시험 함의 재방문. 각 방법의 수학적 메커니즘과 시뮬레이션, 일상어 비유와 반사실 시나리오를 풍부히 붙인다.

Experimentation
Epidemiology
저자

Kwangmin Kim

공개

2026년 05월 08일

이 글은 Schulz Ch.13 시리즈의 마지막 글이다. Ch.13 개관비맹검의 위험과 방어 에 이어, Urn 과 Mixed Randomisation 의 깊은 메커니즘 (Schulz full md L:19900끝) 을 다룬다. 다음은 SCH Ch.14 Allocation Concealment 시리즈로 이어진다.

1 진입 직관 — Block 너머의 세계

이전 글에서 Block 의 두 가지 한계를 분석했다.

  1. 작은 고정 블록 은 마지막 자리가 결정적
  2. Random 변동 도 selection bias 를 완전 제거하지 못함

Schulz 의 권고는 명확하다. 비맹검 시험의 표본 크기가 작거나 (n < 200), stratum 이 작으면 (< 100), Block 너머의 방법을 사용하라.

그 “너머의 방법” 이 두 가지다.

  1. Urn Randomisation (UD(α, β)) — Wei & Lachin 1988 의 적응적 디자인. 가장 추천.
  2. Mixed Randomisation — Schulz 자체 제안. Simple + Block 의 hybrid. 더 단순.

비유: Block 은 고정된 카드 뭉치를 셔플 하는 방식. Urn 은 카드 뭉치 자체가 동적으로 변하는 방식. Mixed 는 처음 한 손은 비대칭으로, 이후는 일반 셔플. 세 방식 모두 같은 목표 (균형 + unpredictability) 를 다른 방향에서 달성.

2 Urn Randomisation UD(α, β) — 적응적 균형의 우아함

2.1 메커니즘

Wei & Lachin (1988) 의 Urn Design (UD) 은 두 매개변수로 정의된다.

UD(α, β): - 시작: blue 공 \(\alpha\) 개, green 공 \(\alpha\) 개 (두 군 동등) - 매 환자마다: 1. 공을 무작위 추출 2. Blue → 환자 A 군 배정 3. Green → 환자 B 군 배정 4. 추출된 공을 복원 + 반대 색\(\beta\) 개 추가 - 다음 환자는 변경된 urn 에서 추출

초기 (UD(2,1)): blue 2, green 2 → P(blue) = 50%

환자 1: blue 추출 → A 배정
   복원 + green 1 추가 → blue 2, green 3 → P(blue) = 40%

환자 2: green 추출 → B 배정
   복원 + blue 1 추가 → blue 3, green 3 → P(blue) = 50%

환자 3: blue 추출 → A 배정
   복원 + green 1 추가 → blue 3, green 4 → P(blue) = 43%

환자 4: blue 추출 → A 배정
   복원 + green 1 추가 → blue 3, green 5 → P(blue) = 38%
   (이제 두 군 imbalance 가 커지므로 green 으로 더 기울어짐)

수식 직관: 환자 \(i\) 의 처치군 배정 확률은 현재 urn 상태 에 의존. 두 군 차이 \(|n_A - n_B|\) 가 커질수록 적은 군 으로의 확률이 자동 증가. 자연스러운 음의 피드백 (negative feedback).

2.2 매개변수의 의미

매개변수 효과
\(\alpha\) (초기 ball 수) 클수록 균형 강제 약화 → Simple 에 가까움
\(\beta\) (추가 ball 수) 클수록 균형 강제 강화 → Block 에 가까움
UD(2, 1) Schulz 권장 — 균형과 unpredictability 의 좋은 절충
UD(0, 1) 강한 균형 강제 (위험: 결정성 증가)
UD(α, 0) Simple 과 동일 (균형 강제 없음)

2.3 장점

2.3.1 1. 시험 초기에 균형 보장

작은 표본에서 imbalance 위험 차단. 첫 5~10 명에서 우연히 한 군에 몰리는 일을 자동 보정.

2.3.2 2. 시험 진행에 따라 Simple 에 수렴

표본이 커지면 추가된 ball 들이 누적되어, 한 ball 의 추가가 전체 비율에 미치는 영향이 미미해짐. 즉 후반부는 거의 simple randomisation.

수식 직관: \(n\) 명 후 urn 에는 \(\alpha + n\beta\) 개의 ball. 다음 추출 확률 변화는 \(\beta / (\alpha + n\beta) \to 0\) (\(n \to \infty\)). 점근적으로 simple.

2.3.3 3. Block 보다 Unpredictable

매 시점의 배정 확률이 연속적으로 변함 — Block 의 결정적 마지막 자리 같은 순간이 없음. 모집 인력의 추측 정확도 약화.

2.3.4 4. 중간 분석에 유리

Sequential 모니터링을 위한 중간 분석 시점에 균형이 보장 됨. Block 보다 우수.

2.4 단점

2.4.1 1. 구현 복잡

Manual 수행 어려움 — 컴퓨터 필수. 일부 통계 software 는 표준 함수 미지원.

2.4.2 2. 표준 분석의 약간의 비호환

Permutation test 가 권장되지만 standard software 에서 지원 안 됨. 다만 시간 추세가 없으면 일반 t-test 등도 무방.

2.4.3 3. 인지도 낮음

다수 trialist 가 Urn 을 모름 또는 복잡하다고 거부. Schulz 의 강력 권장에도 불구하고 채택률 낮음.

반사실 — Urn vs Block 비교: \(n=100\) 시험. Urn UD(2,1) vs Block(8) random 변동.

  • Imbalance 위험: Urn 의 \(|n_A - n_B|\) 분포가 Block 보다 약간 넓지만 여전히 작음
  • Predictability: Urn 의 마지막 자리 추측 정확도 약 55%, Block(8) 은 약 65%
  • 종합: Urn 이 약간의 imbalance 를 받아들이는 대신 상당한 unpredictability 이득

2.5 Schulz 의 결론

“비맹검 시험에서 unpredictability 와 balance 모두 중요하면 Urn UD(α, β) 가 Block (고정 또는 random 변동 모두) 보다 우수하다.” (Wei & Lachin 1988, Schulz 2019, Ch.13 인용)

3 Mixed Randomisation — Schulz 의 절충안

Urn 이 너무 복잡하다면? Schulz 가 제안한 Mixed Randomisation 은 익숙한 도구 (Simple + Block) 의 hybrid 다.

3.1 핵심 아이디어

Permuted Block 의 결정적 마지막 자리 가 selection bias 의 진입점. 이를 차단하려면 시험 끝에 정확한 50:50 이 되지 않도록 해야 한다.

메커니즘: 시험 시작비대칭 (예: A 3, B 7) 의 first block 을 두면, 이후 정상 block 을 추가해도 누적 비율이 정확 50:50 이 안 됨. 끝부분 추측 어려워짐.

3.2 Panel 13.2 — Mixed Randomisation 단계

Step 1: 첫 비대칭 블록 (Replacement Randomisation)
  1A: 첫 블록 크기 결정 (보통 5~16)
  1B: 사전 비대칭 임계 결정 (예: A-B 차이 ≥ 4)
  1C: Simple Random 으로 sequence 생성
  1D: 비대칭 점검
  1E: 미달 시 1C 로 돌아가 재생성 (iterate), 충족 시 Step 2

Step 2: Random 변동 Permuted Block
  2A: 블록 크기 옵션 선택 (예: 8, 10, 12, 14)
  2B: Random Permuted Block 생성
  2C: 추가 비대칭 블록 또는 Simple 삽입 결정

Step 3: Simple 삽입 (선택적)
  3A: 삽입 크기 결정 (보통 5~16, 홀수 권장)
  3B: Simple Random 으로 생성
  3C: Step 2B 로 복귀

3.3 Panel 13.3 — 사례

\(n=100\) 시험.

Step 1 (첫 10 명, 비대칭 ≥ 4):
  Replacement Randomisation 으로 B A B B B A B B A B
  → A 3, B 7 (비대칭 4, 충족)

Step 2 (다음 30 명, Random 변동 블록 12, 8, 10):
  Block 12: ABBABBAABABA
  Block 8:  BABABBAA
  Block 10: ABBAABABBA

Step 3 (41~45, Simple):
  B A B A A

Step 2 (46~ 끝, Random 블록):
  Block 8:  ...
  ...

결과: 시험 끝까지 누적 A 비율이 정확히 50% 가 되지 않음 → 끝부분 결정성 약화 → selection bias 위험 감소.

3.4 이론적 정당화

Schulz 의 주장: Mixed Randomisation 의 unpredictability 는 Urn UD(2, 1) 와 비슷 하지만, 작은 표본에서는 Urn 보다 우수. 그리고 훨씬 더 단순.

반사실: 만약 trialist 가 Urn 을 거부한다면, 최선의 차선책 이 Mixed. 최악은 작은 고정 Block.

3.5 비판

Berger 외 (2003) 의 비판: Mixed Randomisation 도 너무 복잡하다. Block size 36 의 random 변동만으로 비슷한 unpredictability 달성 가능.

Schulz 의 응답: “Block size 36 은 큰 시험 에서만 적합. 작은 시험이나 작은 strata 에서는 Mixed Randomisation 의 비대칭 시작이 결정적.” (Schulz 2019, Ch.13)

4 “더 좋은” 방법들 — 왜 안 쓰이나

Schulz 가 Ch.13 에서 언급하는, Block 보다 우수하지만 거의 사용 안 되는 방법들.

4.1 Big Stick Design (Soares & Wu 1983)

기본은 Simple. Imbalance 가 임계치 를 넘으면 결정적으로 적은 군에 강제 배정.

사례: 임계 5. \(|n_A - n_B| < 5\) 이면 50:50, \(\geq 5\) 이면 100:0 (적은 군으로). 균형 회복 후 다시 50:50.

장점: 균형 강제는 강함, unpredictability 는 대부분 유지 (임계치를 넘는 시점만 결정적).

4.2 Biased Coin with Imbalance Tolerance

Big Stick 의 부드러운 버전. 임계 미달 시 50:50, 초과 시 60:40 (적은 군으로).

장점: 결정적 시점이 없음. Big Stick 보다 unpredictable.

4.3 Ehrenfest Urn (변형)

Urn 의 변형. 추가 ball 수가 동적으로 변동. 더 강한 적응성.

4.4 Maximal Procedure (Berger & Bakshi 2001)

가능한 모든 sequence 중 imbalance 임계 내에 있는 것만 균등 확률로 선택. 이론적으로 imbalance 와 unpredictability 의 Pareto 최적.

4.5 왜 안 쓰이나? — Berger 2014 의 review

4 개 high-impact 학술지의 RCT 중 90% 가 Block 사용. 나머지 대부분이 Minimisation. 위 우수 방법들은 거의 0%.

Schulz 의 진단: “단순함 (Simplicity) 이 가장 큰 요인일 수 있다 — Block 은 익숙하다.” (Berger 2014 인용)

반사실: 학술 커뮤니티의 학습 비용 이 더 우수한 방법의 채택을 막는 보수적 균형. CONSORT 가 Block 외 방법도 권장하지만, 통계 software 의 default 가 Block 이므로 자연스럽게 채택됨.

5 Schulz 외 (1995) — 41% Effect Overestimation 비맹검 함의

이전 글에서 인용한 발견을 비맹검 맥락에서 재해석.

Schulz, Chalmers, Hayes, Altman (1995, JAMA): Concealment 부적절 시 효과 과대 추정 평균 41%, sequence 부적절 시 ~17%, blinding 부적절 시 ~17%. 합산 시 누적.

비맹검 시험의 함의:

  1. Blinding 부족 자체 의 효과 (-17% 정도) 는 불가피 — 어차피 비맹검
  2. Sequence 부적절 의 17% 는 피할 수 있음 — Urn / Mixed Randomisation
  3. Concealment 부적절 의 41% 는 반드시 피해야 함 — Ch.14 의 주제

so what: 비맹검 시험은 blinding 의 17% 손실을 받아들이는 대신, sequence 와 concealment 를 완벽히 해야 한다. 이 두 단계의 적절성이 비맹검 시험 신뢰성의 생명선.

6 코드 예시 — Urn UD(2,1) 시뮬레이션

import numpy as np

np.random.seed(42)

def urn_randomisation(n, alpha=2, beta=1):
    """UD(α, β) 시뮬레이션."""
    blue, green = alpha, alpha
    seq = []
    probs = []
    for _ in range(n):
        p_blue = blue / (blue + green)
        probs.append(p_blue)
        if np.random.random() < p_blue:
            seq.append(0)   # A
            green += beta
        else:
            seq.append(1)   # B
            blue += beta
    return np.array(seq), np.array(probs)

def block_randomisation(n, block_sizes):
    """Random 변동 블록."""
    seq = []
    while len(seq) < n:
        b = np.random.choice(block_sizes)
        half = b // 2
        block = np.array([0]*half + [1]*half)
        np.random.shuffle(block)
        seq.extend(block[:n - len(seq)])
    return np.array(seq)

def simple_randomisation(n):
    return np.random.choice([0, 1], size=n)

# 1. UD(2,1) sequence 생성 + 확률 변화
seq, probs = urn_randomisation(50)
print("UD(2,1) 처음 20 명의 P(A) 변화:")
print(f"확률: {[f'{p:.2f}' for p in probs[:20]]}")
print(f"배정: {seq[:20]}")
print(f"끝까지 균형: A={sum(seq==0)}, B={sum(seq==1)}")

# 2. Imbalance 분포 비교 (n=100, 5000 회)
n = 100
n_sim = 5000

methods = {
    "Simple":               lambda: simple_randomisation(n),
    "Block(4) random":      lambda: block_randomisation(n, [4]),
    "Block(8) random":      lambda: block_randomisation(n, [8, 10, 12]),
    "Urn UD(2,1)":          lambda: urn_randomisation(n)[0],
    "Urn UD(0,1)":          lambda: urn_randomisation(n, alpha=0.001, beta=1)[0],
}

print(f"\n[n={n} 시험, 5000 회 imbalance 분포]")
print(f"{'Method':<25} {'P(|Δ|>10)':>12} {'P(|Δ|>20)':>12} {'Mean |Δ|':>10}")
for name, gen in methods.items():
    devs = []
    for _ in range(n_sim):
        s = gen()
        n_a = sum(s == 0)
        devs.append(abs(n_a - n/2))
    devs = np.array(devs)
    print(f"{name:<25} {np.mean(devs > 10):>12.3f} {np.mean(devs > 20):>12.3f} {np.mean(devs):>10.2f}")

# 3. Predictability — 마지막 5 자리 추측 정확도
def predict_last_k(seq, k=5):
    correct = 0
    for i in range(len(seq) - k, len(seq)):
        n_a = sum(seq[:i] == 0)
        n_b = i - n_a
        guess = 0 if n_a < n_b else (1 if n_a > n_b else np.random.choice([0,1]))
        if guess == seq[i]:
            correct += 1
    return correct / k

print(f"\n[n={n} 시험, 마지막 5 자리 추측 정확도]")
for name, gen in methods.items():
    accs = [predict_last_k(gen()) for _ in range(n_sim)]
    print(f"{name:<25}: {np.mean(accs):.1%}")

# 4. Mixed Randomisation 시뮬레이션
def mixed_randomisation(n, asymmetric_size=10, asymmetric_diff=4, block_options=[8, 10, 12, 14]):
    """Schulz Mixed Randomisation."""
    seq = []
    # Step 1: 비대칭 시작 블록
    while True:
        block = simple_randomisation(asymmetric_size)
        if abs(sum(block) - asymmetric_size/2) >= asymmetric_diff:
            seq.extend(block)
            break
    # Step 2: Random 블록
    while len(seq) < n:
        b = np.random.choice(block_options)
        half = b // 2
        block = np.array([0]*half + [1]*half)
        np.random.shuffle(block)
        seq.extend(block[:n - len(seq)])
    return np.array(seq)

# Mixed 시뮬레이션
print(f"\n[Mixed Randomisation 시뮬레이션 — n={n}]")
mixed_seqs = [mixed_randomisation(n) for _ in range(n_sim)]
mixed_devs = [abs(sum(s == 0) - n/2) for s in mixed_seqs]
mixed_pred = [predict_last_k(s) for s in mixed_seqs]
print(f"Imbalance: P(|Δ|>10) = {np.mean(np.array(mixed_devs) > 10):.3f}")
print(f"마지막 5 자리 예측: {np.mean(mixed_pred):.1%}")

이 코드는:

  1. UD(2,1) 의 확률 변화 — 매 환자마다 균형 적응
  2. Imbalance 분포 비교 — Urn 이 Block 과 비슷한 균형, Simple 보다 좋음
  3. Predictability 비교 — Urn 이 Block 보다 unpredictable, Simple 만큼은 아니지만 매우 가까움
  4. Mixed Randomisation — Block 보다 unpredictable, Urn 과 비슷

결과 해석: Urn UD(2,1) 과 Mixed Randomisation 모두 Block 의 균형Simple 의 unpredictability 의 좋은 절충점. 비맹검 시험에서 어느 쪽이든 사용 이 Block 만 사용보다 우수.

7 결론 — Ch.13 시리즈의 종합 메시지

비맹검 RCT 의 무작위 배정은 통계가 아닌 행동 디자인의 문제다.

Ch.13 의 세 글을 한 문단으로 압축하면:

비맹검 시험은 환자의 군 정보가 시험 진행 중 알려진다 는 본질적 약점이 있다. 이 약점은 균형 미신 (cosmetic credibility) 과 작은 고정 Block 의 결정성 으로 인해 selection bias 의 침투 통로 가 된다. Schulz 외 (1995) 의 41% effect overestimation 발견은 이 침투의 정량적 크기를 보여준다. 방어책은 세 단계다 — (1) 균형 미신 거부, (2) 큰·random 변동 Block (단 부분적 방어), (3) Urn UD(α, β) 또는 Mixed Randomisation (완전한 방어). \(n > 200\) 이면 Simple 도 충분. 모든 방법의 전제 조건 은 generation 과 implementation 의 분리 + concealment (다음 챕터의 주제).

다음 챕터 (Ch.14) 는 이 모든 안전장치의 마지막 한 조각Allocation Concealment 를 다룬다.

8 관련 주제

선행 지식

Phase C 후속 글

9 참고문헌

  • Schulz, K. F. & Grimes, D. A. (2019). Essential Concepts in Clinical Research (2nd ed.), Ch.13. Elsevier.
  • Wei, L. J. & Lachin, J. M. (1988). Properties of the urn randomization in clinical trials. Control. Clin. Trials 9, 345-364.
  • Soares, J. F. & Wu, C. F. J. (1983). Some restricted randomization rules. Comm. Statist. Theory Methods 12, 2017-2034.
  • Berger, V. W. & Bakshi, A. (2001). Maximum allocation rules. Stat. Med. 20, 3401-3414.
  • Berger, V. W., Ivanova, A., Knoll, M. (2003). Minimizing predictability while retaining balance through the use of less restrictive randomization procedures. Stat. Med. 22, 3017-3028.
  • Schulz, K. F., Chalmers, I., Hayes, R. J., Altman, D. G. (1995). Empirical evidence of bias. JAMA 273, 408-412.
  • Berger, V. W. (2014). Quantifying the magnitude of baseline covariate imbalances. Stat. Med. 33, 4133-4135.

Subscribe

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