콘텐츠로 이동

Bonferroni와 Holm 보정

개요

한 연구가 여러 가설을 동시에 검정하면 적어도 하나를 잘못 기각할 확률이 빠르게 커진다. 예를 들어 독립인 가설 \(m = 20\)개를 수준 \(\alpha = 0.05\)에서 검정하면 참인 귀무가설을 적어도 하나 잘못 기각할 확률이 대략 \(1 - (1 - 0.05)^{20} \approx 0.64\)이다. 다중검정 보정은 유의수준이나 p-값을 조정하여 전체 오류율이 통제되도록 이 부풀림을 다룬다. 이 절에서는 가족단위 오류율(FWER)을 통제하는 널리 쓰이는 두 보정, Bonferroni와 Holm을 소개한다.

가족단위 오류율 (FWER)

귀무가설 \(H_1, H_2, \ldots, H_m\)을 동시에 검정한다고 하자. \(V\)를 잘못 기각된 참인 귀무가설의 개수(거짓 양성)라 하면 FWER은 다음으로 정의된다.

\[ \text{FWER} = P(V \geq 1) \]

어느 가설이 참이고 어느 가설이 거짓이든 \(\text{FWER} \leq \alpha\)이면 그 다중검정 절차가 수준 \(\alpha\)에서 FWER을 통제한다고 한다.

Bonferroni 보정

FWER을 통제하는 가장 단순한 접근은 Bonferroni의 것이다. 핵심 발상은 전체 유의수준 \(\alpha\)를 \(m\)개 검정에 균등하게 나누어 각 검정이 더 엄격한 문턱을 쓰게 하는 것이다. 그러면 최악의 경우에도 잘못된 기각이 하나라도 생길 전체 확률이 \(\alpha\) 아래에 머문다.

기각 규칙

\(p_1, p_2, \ldots, p_m\)을 \(m\)개 가설검정의 p-값, \(\alpha\)를 원하는 FWER이라 하자. Bonferroni 보정은 다음일 때 \(H_i\)를 기각한다.

\[ p_i \leq \frac{\alpha}{m} \]

FWER을 통제하는 이유

정당화는 Boole 부등식(합집합 한계)에서 곧바로 나온다. \(\mathcal{M}_0 \subseteq \{1, \ldots, m\}\)을 \(H_i\)가 참인 지표의 집합이라 하자. 그러면

\[ \text{FWER} = P\!\Bigl(\bigcup_{i \in \mathcal{M}_0} \{p_i \leq \alpha/m\}\Bigr) \leq \sum_{i \in \mathcal{M}_0} P(p_i \leq \alpha/m) \leq |\mathcal{M}_0| \cdot \frac{\alpha}{m} \leq \alpha \]

마지막 부등식은 \(|\mathcal{M}_0| \leq m\)을 쓴다. 이 한계는 검정 사이의 종속 구조에 대한 어떤 가정도 없이 성립하며, 이것이 Bonferroni 보정의 강점이자 한계이다.

Bonferroni의 보수성

Bonferroni 보정은 보수적이다: 특히 \(m\)이 크거나 검정통계량이 양의 상관을 가질 때 실제 FWER이 \(\alpha\)보다 훨씬 낮은 경우가 많다. 이 보수성이 통계적 검정력을 떨어뜨린다 — 검정당 문턱 \(\alpha/m\)이 너무 엄격해서 실제로 거짓인 귀무가설을 기각하지 못할 수 있다.

Holm의 단계적 하강 절차

Bonferroni는 모든 검정에 같은 엄격한 문턱 \(\alpha/m\)을 적용하지만, Holm(1979)은 가장 유의한 가설들을 기각하고 나면 남은 검정에는 덜 엄격한 문턱을 쓸 수 있음을 관찰했다. 이 단계적 하강 접근은 FWER을 여전히 수준 \(\alpha\)로 통제하면서 Bonferroni보다 균일하게 더 강력하다 — 가능한 모든 배열에서 적어도 같은 수의 가설을 기각한다.

알고리즘

  1. p-값을 정렬한다: \(p_{(1)} \leq p_{(2)} \leq \cdots \leq p_{(m)}\), 대응하는 가설은 \(H_{(1)}, H_{(2)}, \ldots, H_{(m)}\).
  2. \(i = 1\)에서 시작한다. \(p_{(i)}\)를 보정된 문턱 \(\alpha / (m - i + 1)\)과 비교한다.
  3. \(p_{(i)} \leq \alpha / (m - i + 1)\)이면 \(H_{(i)}\)를 기각하고 \(i\)를 1 늘린다.
  4. \(p_{(i)} > \alpha / (m - i + 1)\)이면 멈춘다. \(H_{(i)}, H_{(i+1)}, \ldots, H_{(m)}\)(남은 가설 전부)을 유지한다.

보정된 문턱은 증가하는 수열을 이룬다:

\[ \frac{\alpha}{m}, \quad \frac{\alpha}{m-1}, \quad \frac{\alpha}{m-2}, \quad \ldots, \quad \alpha \]

뒤의 문턱이 \(\alpha/m\)보다 덜 엄격하므로 Holm은 Bonferroni만큼 또는 그보다 많이 기각한다. 동시에 단계적 하강 구조가 FWER을 수준 \(\alpha\)로 유지해 준다.

Holm이 Bonferroni를 지배하는 이유

Bonferroni에서는 모든 가설이 문턱 \(\alpha/m\)을 마주한다. Holm에서는 가장 유의한 p-값만 이 문턱을 마주하고, 두 번째로 유의한 것은 \(\alpha/(m-1)\)을, 이런 식으로 이어진다. 모든 \(i \geq 1\)에 대해 \(\alpha/(m-i+1) \geq \alpha/m\)이므로 Bonferroni가 기각하는 가설은 Holm도 기각하지만 그 역은 반드시 성립하지 않는다. 그래서 Holm이 균일하게 더 강력하다.

수치 보기

FWER \(\alpha = 0.05\)에서 가설 \(m = 4\)개를 검정하여 다음 p-값을 얻었다고 하자:

가설 p-값
\(H_A\) 0.003
\(H_B\) 0.013
\(H_C\) 0.042
\(H_D\) 0.130

Bonferroni: 보정된 문턱은 \(0.05/4 = 0.0125\)이다. \(H_A\)(\(p = 0.003\))만 기각된다. \(H_B\)는 \(p = 0.013 > 0.0125\)이므로 기각되지 않는다.

Holm: p-값을 정렬하여 차례로 비교한다:

단계 \(i\) \(H_{(i)}\) \(p_{(i)}\) 문턱 \(\alpha/(m-i+1)\) 판정
1 \(H_A\) 0.003 \(0.05/4 = 0.0125\) 기각
2 \(H_B\) 0.013 \(0.05/3 = 0.0167\) 기각
3 \(H_C\) 0.042 \(0.05/2 = 0.025\) 멈춤(유지)
4 \(H_D\) 0.130 \(0.05/1 = 0.05\) 유지

Holm은 \(H_A\)와 \(H_B\)를 모두 기각하지만 Bonferroni는 \(H_A\)만 기각한다. Holm이 FWER 통제를 희생하지 않고 검정력을 되찾는 모습을 보여준다.

같은 네 개의 p-값, 두 가지 문턱

위 표를 그대로 그린 것이다. 붉은 파선은 평평하고 초록 계단은 오른쪽으로 갈수록 올라간다. Bonferroni는 네 가설 모두에 \(\alpha/4\)를 요구하지만, Holm은 첫 번째에만 그 문턱을 요구하고 두 번째부터는 \(\alpha/3\), \(\alpha/2\), \(\alpha\)로 느슨해진다.

\(H_B\)가 그 차이가 드러나는 자리다. \(p = 0.013\)은 \(\alpha/4 = 0.0125\)보다 크지만 \(\alpha/3 = 0.0167\)보다는 작다. Bonferroni는 놓치고 Holm은 잡아낸다.

다만 계단이 느슨해지는 것은 앞의 가설들을 모두 기각한 뒤에만 허락된다. \(H_C\)에서 멈춘 것이 그 규칙이며, 뒤의 문턱이 아무리 느슨해도 한 번 멈추면 남은 가설은 모두 유지된다. 이 "멈춤" 규칙이 없으면 FWER 통제가 깨진다.

비교

성질 Bonferroni Holm
FWER 통제 예 (임의의 종속성) 예 (임의의 종속성)
검정력 보수적 균일하게 더 강력
단순함 매우 단순 조금 더 복잡
종속성에 대한 가정 필요 없음 필요 없음
알맞은 용도 빠른 조정, 적은 수의 검정 Bonferroni보다 기본으로 삼을 선택

실무에서 Bonferroni를 Holm보다 선호할 이유는 거의 없다. Holm이 같은 FWER 보장을 주면서 검정력은 엄밀히 더 크거나 같기 때문이다.

가족에 구조가 있으면 더 할 수 있다

Bonferroni와 Holm의 미덕은 가족에 대해 아무것도 묻지 않는다는 것이다. 가설들이 어떻게 얽혀 있든 \(m\)만 알면 쓸 수 있다. 그 대가가 합집합 한계의 느슨함이고, 검정통계량이 양의 상관을 가질 때 실제 FWER이 \(\alpha\)보다 훨씬 낮아지는 현상(연습문제 7)이 그 느슨함의 정체다. 구조를 모르니 최악의 경우에 맞추는 것이다.

그러나 가족의 종속 구조를 아는 경우가 있다. 11.3절 사후비교가 대표적이다. 분산분석 뒤에 \(k\)개 집단의 평균을 견주는 비교들은 하나의 합동 \(\text{MS}_W\)와 하나의 오차 자유도 \(N - k\)를 공유하고, 같은 집단 평균을 함께 쓴다. 균형 설계에서 두 쌍별 비교의 상관은 정확히 \(1/2\)이다. 종속을 모르는 것이 아니라 정확히 아는 형편이며, 아는 만큼 정확한 방법이 있다.

  • Tukey의 HSD는 쌍별 비교 전체에 대해 정확하다. 스튜던트화 범위분포가 "\(k\)개 평균의 최대 차이"의 참 귀무분포이기 때문이다.
  • Dunnett 검정은 대조군과의 \(k-1\)개 비교에 대해 정확하다. 상관을 반영한 다변량 \(t\)-분포를 쓴다.
  • Scheffé 방법은 가능한 모든 선형 대비에 대해 정확하다. 그래서 쌍별 비교만 볼 때는 오히려 지나치게 보수적이다.

세 방법 모두 같은 가족에서 Bonferroni보다 임계값이 작다. 같은 논리가 두 장에서 되풀이되는 것이 아니라, 9.6절이 포기한 정보를 11.3절이 되찾는 것이다. 구조를 모르면 합집합 한계밖에 없고, 구조를 알면 정확한 분포를 쓸 수 있다. 이 절의 방법들이 여전히 쓰이는 이유는 그 구조가 없는 가족 — 서로 무관한 평가변수, 하위집단, 유전 변이 — 이 훨씬 흔하기 때문이다.

연습문제

연습문제 1. 어떤 연구자가 가설검정 5개를 수행하여 p-값 0.008, 0.025, 0.040, 0.060, 0.120을 얻었다. \(\alpha = 0.05\)에서 Bonferroni 보정을 적용하고 어느 가설이 기각되는지 말하라.

풀이

Bonferroni 보정 문턱은 \(\alpha/m = 0.05/5 = 0.01\)이다.

각 p-값을 0.01과 비교한다:

검정 p-값 \(< 0.01\)? 판정
1 0.008 예 기각
2 0.025 아니오 기각 못함
3 0.040 아니오 기각 못함
4 0.060 아니오 기각 못함
5 0.120 아니오 기각 못함

검정 1만 기각된다. Bonferroni는 보수적이다: 보정하지 않은 수준에서는 유의한 \(p = 0.025\)의 검정 2가 기각되지 않는다.

연습문제 2. 연습문제 1과 같은 p-값에 \(\alpha = 0.05\)에서 Holm(단계적 하강) 절차를 적용하라. 결과를 Bonferroni와 비교하라.

풀이

p-값을 정렬한다: \(p_{(1)} = 0.008, p_{(2)} = 0.025, p_{(3)} = 0.040, p_{(4)} = 0.060, p_{(5)} = 0.120\).

\(j\)번째 정렬된 검정의 Holm 문턱은 \(\alpha/(m - j + 1)\)이다:

단계 \(j\) \(p_{(j)}\) 문턱 \(\alpha/(m-j+1)\) $p_{(j)} < $ 문턱? 판정
1 0.008 0.05/5 = 0.010 예 기각
2 0.025 0.05/4 = 0.0125 아니오 멈춤

2단계에서 기각하지 못하면 거기서 멈추고 남은 검정은 기각하지 않는다.

결과: 이 경우에는 Bonferroni와 마찬가지로 검정 1만 기각된다. 그러나 Holm은 Bonferroni보다 균일하게 더 강력하며(결코 더 적게 기각하지 않으며), p-값 배열이 다르면 더 많이 기각할 수 있다.

연습문제 3. Bonferroni 보정이 가족단위 오류율(FWER)을 수준 \(\alpha\)로 통제함을 증명하라. 합집합 한계를 쓰라.

풀이

\(\mathcal{H}_0\)을 참인 귀무가설의 집합이라 하고 \(|\mathcal{H}_0| = m_0 \leq m\)이라 하자. FWER은:

\[ \text{FWER} = P\!\left(\bigcup_{i \in \mathcal{H}_0} \{p_i < \alpha/m\}\right) \leq \sum_{i \in \mathcal{H}_0} P(p_i < \alpha/m) = m_0 \cdot \frac{\alpha}{m} \leq m \cdot \frac{\alpha}{m} = \alpha \]

첫 부등식은 Boole 부등식(합집합 한계)이다. 두 번째 등식은 참인 귀무가설 아래에서 p-값이 \((0,1)\) 위의 균등분포를 따르므로 \(P(p_i < \alpha/m) = \alpha/m\)이라는 사실을 쓴다. 마지막 부등식은 \(m_0 \leq m\)을 쓴다.

이 증명은 검정의 종속 구조에 대해 아무 가정도 하지 않는다. 그래서 Bonferroni가 임의의 종속성에서 타당하지만 보수적일 수 있는 것이다. \(\square\)

연습문제 4. 참인 귀무가설의 수 \(m_0\)이 \(m\)보다 훨씬 작을 때, 또는 검정이 양의 상관을 가질 때 Bonferroni가 보수적인(FWER \(\ll \alpha\)인) 이유를 설명하라.

풀이

\(m_0 \ll m\)일 때: 증명에서 \(m_0 \leq m\)을 썼으므로 실제 FWER은 최대 \(m_0 \alpha/m\)이다. 1000개 귀무가설 중 10개만 참이면(\(m_0 = 10\)) 참 FWER은 최대 \(10 \times 0.05/1000 = 0.0005\)로 명목 \(\alpha = 0.05\)보다 훨씬 낮다. Bonferroni 문턱은 최악의 경우(\(m_0 = m\))에 맞추어져 있다.

양의 상관이 있을 때: 합집합 한계 \(P(\cup A_i) \leq \sum P(A_i)\)는 사건들이 서로 배반일 때만 등호에 가깝다. 검정이 양의 상관을 가지면(검정통계량이 자료를 공유할 때 흔하다) 사건 \(\{p_i < \alpha/m\}\)이 함께 일어나는 경향이 있어 합집합이 합보다 훨씬 작아진다. 실제 FWER이 \(\alpha\)보다 훨씬 작을 수 있다.

두 보수성의 원천 모두 검정력을 떨어뜨려 참 효과를 탐지하기 어렵게 만든다. Holm 절차가 첫 번째 문제를 부분적으로 다루고, 재표본추출 기반 방법(예: 순열 FWER)이 두 번째를 다룬다.

연습문제 5. 보정된 \(p\)-값의 개념을 설명하고, 여섯 가지 방법(본페로니·시닥·홀름·호크버그·BH·BY)을 같은 자료에 모두 적용해 비교하라.

풀이

보정된 \(p\)-값. "이 값을 \(\alpha\)와 직접 비교하면 해당 절차의 결론이 나오는 수"다. 절차마다 정의가 다르다.

import numpy as np

p = np.array([0.001, 0.008, 0.039, 0.041, 0.23, 0.76])
m = len(p)
ps = np.sort(p)
i = np.arange(1, m + 1)

bonf = np.minimum(ps * m, 1)
sidak = 1 - (1 - ps)**m
holm = np.maximum.accumulate(np.minimum((m - i + 1) * ps, 1))
hoch = np.minimum.accumulate(((m - i + 1) * ps)[::-1])[::-1]
bh = np.minimum.accumulate((m / i * ps)[::-1])[::-1]
c_m = np.sum(1 / i)
by = np.minimum(np.minimum.accumulate((c_m * m / i * ps)[::-1])[::-1], 1)

print(f"{'p':>8s} {'본페로니':>9s} {'시닥':>8s} {'홀름':>8s} "
      f"{'호크버그':>9s} {'BH':>8s} {'BY':>8s}")
for j in range(m):
    print(f"{ps[j]:8.3f} {bonf[j]:9.4f} {sidak[j]:8.4f} {holm[j]:8.4f} "
          f"{hoch[j]:9.4f} {bh[j]:8.4f} {by[j]:8.4f}")
print("\nq = 0.10 에서 기각 수:",
      f"본페로니 {(bonf <= 0.10).sum()}, 홀름 {(holm <= 0.10).sum()}, "
      f"호크버그 {(hoch <= 0.10).sum()}, BH {(bh <= 0.10).sum()}, "
      f"BY {(by <= 0.10).sum()}")
       p      본페로니       시닥       홀름      호크버그       BH       BY
   0.001    0.0060   0.0060   0.0060    0.0060   0.0060   0.0147
   0.008    0.0480   0.0471   0.0400    0.0400   0.0240   0.0588
   0.039    0.2340   0.2123   0.1560    0.1230   0.0615   0.1507
   0.041    0.2460   0.2221   0.1560    0.1230   0.0615   0.1507
   0.230    1.0000   0.7916   0.4600    0.4600   0.2760   0.6762
   0.760    1.0000   0.9998   0.7600    0.7600   0.7600   1.0000

q = 0.10 에서 기각 수: 본페로니 2, 홀름 2, 호크버그 2, BH 4, BY 2

여섯 방법의 성격.

방법 통제 대상 가정 강도
본페로니 FWER 없음 가장 약함
시닥 FWER 독립 본페로니보다 약간 강함
홀름 FWER 없음 본페로니를 항상 지배
호크버그 FWER 양의 종속(PRDS) 홀름보다 강함
BH FDR 독립 또는 PRDS 훨씬 강함
BY FDR 임의의 종속 BH보다 약함

읽기.

  1. 홀름이 본페로니를 지배한다. 모든 \(p\)에서 홀름의 보정값이 본페로니 이하다. 본페로니를 쓸 이유가 없다.

  2. 호크버그가 홀름보다 강하다. 셋째·넷째에서 0.156 대 0.123이다. 다만 양의 종속 가정이 필요하다.

  3. 시닥의 이득이 미미하다. 본페로니와 소수 셋째 자리에서 갈린다. 독립 가정을 추가로 지불할 가치가 없다.

  4. BH가 훨씬 많이 기각한다. 4개 대 2개다. 통제 대상이 FWER이 아니라 FDR이기 때문이다. 공정한 비교가 아니다 — 목표가 다르다.

  5. BY는 BH보다 훨씬 보수적이다. \(c(m)=\sum_{i=1}^m1/i\)배 만큼 문턱을 낮추며, \(m=6\)에서 \(c(6)=2.45\)다. \(m\)이 크면 \(c(m)\approx\log m\)으로 커져 대가가 크다.

선택 지침.

  • FWER이 필요하면 홀름(가정 없음) 또는 호크버그(양의 종속이 그럴듯할 때).
  • FDR로 충분하면 BH. 탐색적 대규모 검정의 표준이다.
  • 종속 구조를 전혀 모르면 BY. 다만 대가가 크므로, 순열 기반 방법을 먼저 고려한다.
  • 본페로니와 시닥은 교육용으로만.

연습문제 6. 홀름 절차가 본페로니를 항상 지배함을 증명하고, 그런데도 본페로니가 여전히 쓰이는 이유를 논하라.

풀이

홀름 절차. \(p_{(1)}\le\cdots\le p_{(m)}\)에 대해 \(k=1,2,\dots\) 순서로

\[ p_{(k)}\le\frac{\alpha}{m-k+1} \]

를 확인하고, 처음 실패하는 곳에서 멈춘다. 그 앞까지 기각한다.

지배의 증명. 본페로니는 \(p_{(k)}\le\alpha/m\)를 요구한다. 홀름의 문턱 \(\alpha/(m-k+1)\)은 \(k\ge1\)에서

\[ \frac{\alpha}{m-k+1}\ \ge\ \frac{\alpha}{m} \]

이므로 모든 단계에서 홀름의 문턱이 더 느슨하다. 따라서 본페로니가 기각하는 것은 홀름도 기각한다. \(\square\)

엄밀하게는 순차성을 확인해야 한다. 본페로니가 \(H_{(j)}\)를 기각하면 \(p_{(j)}\le\alpha/m\)이고, \(k\le j\)인 모든 \(k\)에 대해 \(p_{(k)}\le p_{(j)}\le\alpha/m\le\alpha/(m-k+1)\)이므로 홀름의 단계가 \(j\)까지 끊기지 않는다. 따라서 홀름도 기각한다.

FWER 통제의 증명 개요. 참인 귀무가설의 집합을 \(\mathcal I_0\)(\(|\mathcal I_0|=m_0\))라 하고, 그중 가장 작은 \(p\)-값을 \(p_{\min}\)이라 하자. 홀름이 참인 가설을 하나라도 기각했다면, 그 가설이 기각된 단계 \(k^*\)에서 \(p_{\min}\le\alpha/(m-k^*+1)\)이다. 그 단계 이전에 기각된 \(k^*-1\)개는 모두 거짓 귀무가설이므로 \(k^*-1\le m-m_0\), 즉 \(m-k^*+1\ge m_0\)이다. 따라서

\[ p_{\min}\le\frac{\alpha}{m-k^*+1}\le\frac{\alpha}{m_0} \]

합집합 한계로 \(P(p_{\min}\le\alpha/m_0)\le m_0\cdot\alpha/m_0=\alpha\)다. \(\square\)

그런데 왜 본페로니가 여전히 쓰이는가.

  1. 단순함. "\(\alpha\)를 \(m\)으로 나눈다"는 한 줄로 설명된다. 홀름은 순차 절차라 설명이 길다.

  2. 신뢰구간으로 곧장 확장된다. 본페로니는 \(1-\alpha/m\) 수준의 구간을 만들면 끝이다. 홀름에 대응하는 동시 신뢰구간은 만들기 어렵다 — 이것이 실무적으로 가장 큰 이유다.

  3. 계획 단계에서 쓰기 쉽다. 표본크기 계산에 \(\alpha/m\)을 넣으면 된다. 홀름은 기각 순서에 의존해 사전 계산이 어렵다.

  4. 차이가 작은 경우가 많다. 가장 작은 \(p\)-값에서는 두 절차가 동일하다. 주 결과 하나만 중요하다면 차이가 없다.

권고. 검정만 보고한다면 홀름을 쓴다. 이유 없이 검정력을 버릴 필요가 없다. 동시 신뢰구간이 필요하면 본페로니가 현실적인 선택이다.

연습문제 7. 검정들이 상관되어 있을 때 본페로니가 얼마나 보수적이 되는지 모의실험으로 확인하고, 대안을 제시하라.

풀이
import numpy as np
from scipy import stats

rng = np.random.default_rng(19)
M, m = 40_000, 10

print(f"{'ρ':>5s} {'무보정 FWER':>12s} {'본페로니 FWER':>14s} "
      f"{'홀름 FWER':>11s} {'최대통계량 FWER':>16s}")
for rho in [0.0, 0.3, 0.6, 0.9, 0.99]:
    S = rho * np.ones((m, m)) + (1 - rho) * np.eye(m)
    L = np.linalg.cholesky(S)
    z = rng.standard_normal((M, m)) @ L.T
    p = 2 * stats.norm.sf(np.abs(z))
    ps = np.sort(p, axis=1)

    raw = (p < 0.05).any(1).mean()
    bonf = (p < 0.05 / m).any(1).mean()
    thr = 0.05 / (m - np.arange(m))
    holm = (ps <= thr).any(1).mean()       # 근사(첫 실패까지 보는 대신)

    # 최대통계량의 귀무분포를 몬테카를로로 구해 문턱을 잡는 방법
    zz = rng.standard_normal((M, m)) @ L.T
    cmax = np.percentile(np.abs(zz).max(1), 95)
    step = (np.abs(z).max(1) > cmax).mean()

    print(f"{rho:5.2f} {raw:12.4f} {bonf:14.4f} {holm:11.4f} {step:16.4f}")
    ρ     무보정 FWER      본페로니 FWER     홀름 FWER       최대통계량 FWER
 0.00       0.3985         0.0492      0.0492           0.0487
 0.30       0.3548         0.0451      0.0452           0.0501
 0.60       0.2462         0.0329      0.0330           0.0476
 0.90       0.1268         0.0169      0.0185           0.0467
 0.99       0.0693         0.0077      0.0352           0.0495

상관이 커질수록 본페로니가 보수적이 된다. \(\rho=0.9\)에서 0.017, \(\rho=0.99\)에서 0.008로 명목의 6분의 1이다.

왜 그런가. 본페로니는 합집합 한계 \(P(\cup A_i)\le\sum P(A_i)\)를 쓰는데, 사건들이 겹칠수록 이 한계가 느슨해진다. \(\rho=1\)이면 모든 검정이 같은 사건이라 실제 FWER이 \(\alpha/m=0.005\)가 된다. 위 표의 \(\rho=0.99\) 값 0.0077이 그 극한에 가깝다.

최대통계량 방법(순열/부트스트랩)이 정확하다. 모든 \(\rho\)에서 0.047~0.050이다. 상관 구조를 자료에서 반영하기 때문이다. 위 코드의 홀름 값은 첫 실패에서 멈추지 않은 근사라 \(\rho\)가 매우 클 때 조금 커지는데, 정식 홀름은 본페로니와 마찬가지로 보수적이 된다.

대안들.

방법 원리 장단점
순열 기반 최대통계량 귀무분포를 재표본으로 구성 정확하지만 계산 무거움. 교환가능성 필요
웨스트폴-영 단계적 하강 순열 + 단계적 절차 가장 강력한 FWER 방법
다변량 \(t\) 분포 상관행렬을 모형으로 상관을 알아야 함
유효 검정 수 \(m_{\text{eff}}<m\)을 추정해 나눔 어림이지만 간단
호크버그·호멜 양의 종속 가정 계산이 가볍고 개선이 있음

유효 검정 수의 예. 고유값 기반 어림으로

\[ m_{\text{eff}}=\frac{\left(\sum_j\lambda_j\right)^2}{\sum_j\lambda_j^2} \]

를 쓰면, \(\rho=0.9\), \(m=10\)에서 \(m_{\text{eff}}=1.21\)이다. 사실상 하나의 검정임을 반영한다.

실무 권고. 유전체처럼 상관이 강한 대규모 검정에서는 순열 기반 방법이나 FDR을 쓴다. 본페로니를 그대로 쓰면 검정력을 크게 잃는다.

연습문제 8. 계층적(순차) 검정 절차가 보정 없이 FWER을 유지하는 원리를 설명하고, 설계 시 주의점을 적어라.

풀이

고정 순서 절차. 가설을 \(H_1,H_2,\dots,H_m\) 순서로 미리 정하고, 순서대로 각각 수준 \(\alpha\)로 검정하되 처음 기각에 실패하면 멈춘다.

왜 보정이 필요 없는가. \(H_1\)이 참이라면 그것을 기각할 확률이 \(\alpha\)이고, 그때만 오류가 시작된다. \(H_1\)이 거짓이고 \(H_2\)가 참이면, 오류는 \(H_1\)을 기각한 뒤에 \(H_2\)를 기각할 때 생기는데 그 확률도 \(\alpha\) 이하다. 일반적으로

\[ P(\text{참인 가설을 하나라도 기각})\le P(\text{첫 참 가설을 기각})\le\alpha \]

핵심은 "멈춤"이다. 앞에서 막히면 뒤를 볼 수 없으므로, 여러 번 기회를 얻지 못한다.

import numpy as np
from scipy import stats

rng = np.random.default_rng(27)
M, m = 40_000, 4

# H1, H2 는 거짓(효과 있음), H3, H4 는 참
shift = np.array([3.0, 2.5, 0.0, 0.0])
z = rng.standard_normal((M, m)) + shift
p = 2 * stats.norm.sf(np.abs(z))

# 고정 순서 절차
err = 0
for row in p:
    for j in range(m):
        if row[j] > 0.05:
            break
        if shift[j] == 0:          # 참인 가설을 기각
            err += 1
            break
print(f"고정 순서 절차의 FWER = {err / M:.4f}")
print(f"보정 없이 모두 검정할 때 FWER = "
      f"{(p[:, 2:] < 0.05).any(1).mean():.4f}")
고정 순서 절차의 FWER = 0.0314
보정 없이 모두 검정할 때 FWER = 0.0984

보정 없이도 FWER이 0.031로 유지된다. 모두 검정하면 0.098이다.

설계 시 주의점 다섯.

  1. 순서를 자료를 보기 전에 정한다. 이것이 전부다. 결과를 보고 순서를 바꾸면 보장이 사라진다.

  2. 중요한 것을 앞에. 앞에서 막히면 뒤를 아예 못 본다. 주 결과 → 핵심 부수 결과 → 그 밖 순서가 자연스럽다.

  3. 앞의 가설이 기각될 가능성이 높아야 한다. 첫 가설의 검정력이 낮으면 전체가 막힌다. 검정력이 높은 것을 앞에 두는 전략과 중요도 순서가 충돌할 수 있다.

  4. 분기 구조도 가능하다. 고정 순서가 너무 경직되면 그래프 기반 절차를 쓴다. 가설들을 노드로 두고, 기각 시 \(\alpha\)를 다른 노드로 "물려주는" 규칙을 미리 정한다. 유연하면서 FWER이 보장된다.

  5. 부분적 실패의 처리. \(H_1\)은 기각, \(H_2\)는 실패, \(H_3\)는 \(p=0.001\)인 상황에서 \(H_3\)을 보고할 수 없다. 이것이 답답하지만 규칙을 지켜야 보장이 유지된다. 탐색적 결과로 따로 보고한다.

실무 사례. 임상시험에서 "주 평가변수 → 주요 부 평가변수 1 → 2 → 3" 순서를 계획서에 명시하는 것이 표준이 되었다. 규제기관이 이 구조를 권장한다.

연습문제 9. 다중검정 보정을 언제 해야 하고 언제 하지 말아야 하는지 판단 기준을 세워라.

풀이

핵심 질문 — "무엇이 하나의 가족인가." 보정의 범위를 정하는 것이 가장 어렵고 가장 임의적인 부분이다.

보정해야 하는 경우.

  1. 하나의 결론을 여러 검정으로 뒷받침할 때. "어느 하나라도 유의하면 효과가 있다"는 논리를 쓴다면 FWER 통제가 필요하다.

  2. 여러 결과변수·시점·하위집단을 훑고 유의한 것을 보고할 때. 앞서 본 HARKing의 구조다.

  3. 규제 제출. 확증적 시험에서 여러 주 평가변수나 용량군이 있으면 보정이 요구된다.

  4. 대규모 탐색. 유전체, 뇌영상, 대규모 A/B 시험. 다만 FWER보다 FDR이 적절한 경우가 많다.

보정하지 말아야 하는(또는 불필요한) 경우.

  1. 각 검정이 독립적인 연구 질문일 때. 한 논문에 서로 무관한 세 연구가 실렸다고 보정하지 않는다.

  2. 모든 결과를 빠짐없이 보고하고, 독자가 스스로 판단할 수 있을 때. 로드먼·펄먼 등이 주장하는 입장이다.

  3. 주 결과가 하나로 사전에 정해져 있고 나머지는 탐색적이라고 명시할 때.

  4. 추정이 목적일 때. 여러 모수의 크기를 보고하는 것이 목적이면, 각각의 구간을 보고하고 "동시 보장은 없다"고 밝히면 된다.

애매한 회색지대.

상황 논쟁점
한 논문의 여러 검정 논문이 가족의 단위인가
한 연구자의 평생 검정 극단적으로 밀면 보정이 무한해진다
하위집단 분석 사전 정의면 보정, 사후면?
여러 시점 반복측정 모형으로 다루면 보정 불필요

널리 받아들여지는 원칙 셋.

  1. "하나의 결론"이 기준이다. 여러 검정이 같은 주장을 뒷받침하면 한 가족이다.

  2. 투명성이 보정을 대체할 수 있다. 몇 개의 검정을 했고 무엇이 유의했는지 전부 보고하면, 보정하지 않아도 독자가 할인해 읽을 수 있다. 숨기는 것이 진짜 문제다.

  3. 사전등록이 가족을 정의한다. 계획서에 "주 결과 하나, 부수 결과 다섯, 보정 방법 X"라고 적으면 논쟁이 사라진다.

베이즈 관점. 계층모형으로 여러 모수를 함께 추정하면 축소(shrinkage)가 다중성을 자동으로 처리한다. 별도의 보정이 필요 없다는 것이 겔먼 등의 주장이다. 다만 모형 가정이 필요하다.

연습문제 10. 다중검정 보정 결과를 어떻게 보고해야 하는지 정리하라.

풀이

보고할 것 일곱.

  1. 검정의 총 개수 \(m\). 보정의 분모다.
  2. 가족의 정의. 무엇을 한 가족으로 묶었고 왜인지.
  3. 통제 대상. FWER인가 FDR인가. 수준은 얼마인가.
  4. 방법 이름. 본페로니/홀름/BH/순열 기반 등. 순열이면 횟수도.
  5. 원 \(p\)-값과 보정된 \(p\)-값을 모두. 독자가 다른 보정을 적용해 볼 수 있어야 한다.
  6. 효과크기와 구간. 보정된 동시 구간이면 그렇다고 밝힌다.
  7. 사전 계획 여부. 보정 방법을 미리 정했는가.

좋은 표의 형태.

가설 효과크기 (95% CI) 원 \(p\) 보정 \(p\) (홀름) 결론
\(H_1\) 3.2 (1.1, 5.3) 0.004 0.020 기각
\(H_2\) 2.1 (0.2, 4.0) 0.031 0.124 비기각
\(H_3\) 1.4 (\(-\)0.5, 3.3) 0.148 0.296 비기각
\(H_4\) 0.3 (\(-\)1.6, 2.2) 0.756 0.756 비기각

이 표가 좋은 이유. 원 \(p\)와 보정 \(p\)를 나란히 두어 보정의 영향이 한눈에 보이고, 효과크기와 구간이 있어 실무적 판단이 가능하다.

흔한 잘못.

  • 보정 후 결과만 싣기. 독자가 다른 보정이나 메타분석에 쓸 수 없다.
  • \(m\)을 밝히지 않기. 보정을 재현할 수 없다.
  • 유의한 것만 표에 넣기. 선택적 보고다.
  • "BH 보정했다"만 적고 \(q\) 수준을 안 밝히기.
  • 구간은 보정하지 않고 \(p\)만 보정하기. 앞서 본 쌍대성의 불일치다.
  • 사후에 보정 방법을 바꾸기. 유의해지는 방법을 고르면 보정의 의미가 사라진다.

FDR을 쓸 때의 추가 사항.

  • \(q\)-값을 보고한다. "이 가설을 기각할 때 예상되는 FDR"로 해석된다.
  • 기각된 가설 수와 예상 거짓발견 수를 함께 적는다. "\(q=0.05\)에서 200개를 기각했으며, 이 중 약 10개가 거짓발견으로 예상된다."
  • 독립성 가정이 그럴듯한지 논한다. 아니면 BY나 순열 기반을 쓴다.

한 문장. 보정은 결론을 바꾸는 절차이므로, 그 절차 자체가 검증 가능해야 한다. 원 \(p\)-값, \(m\), 방법을 모두 적으면 그것이 가능해진다.


정리하며

FWER 을 통제하는 두 가지 표준 방법이다.

규칙 성격
본페로니 모든 \(p_i\le\alpha/m\) 단순, 보수적
홀름 \(p\) 값을 정렬해 단계적으로 비교 언제나 본페로니 이상
  • 본페로니는 \(\alpha\) 를 균등하게 나눈다. 증명이 한 줄(본페로니 부등식)이고 독립성을 가정하지 않는다는 것이 큰 장점이다. 3장에서 본 \(P(\cup A_i)\le\sum P(A_i)\) 가 근거다.
  • 홀름은 본페로니를 개선한다. 정렬한 \(p\) 값을 \(\alpha/m\), \(\alpha/(m-1)\), … 과 차례로 비교하며, 본페로니가 기각하는 것은 홀름도 반드시 기각한다. 같은 FWER 보장에 검정력이 더 높으므로 홀름을 쓰지 않을 이유가 없다.
  • 대가는 검정력이다. \(m\) 이 커지면 문턱이 너무 엄격해져 실제 효과를 대거 놓친다.
  • 보정된 \(p\) 값으로 보고하는 편이 편하다. \(\min(1,\,m\,p_i)\) 처럼 조정해 두면 독자가 익숙한 \(0.05\) 와 비교할 수 있다.

다음 절 거짓발견율로 넘어간다. 검정이 수만 개일 때는 FWER 통제 자체가 비현실적이 된다.