23.6 결과 분석과 주장의 범위

실습 · 연습문제 1개

Holm 보정 구현하기 holm-correction

조건 kk개에 대한 주장을 동시에 할 때, Holm 절차는 가족별 오류율(적어도 하나가 거짓 양성일 확률)을 α\alpha 이하로 유지하면서 Bonferroni보다 많은 가설을 기각한다.

  1. p-value를 작은 순서로 정렬한다: p(1)≤p(2)≤⋯≤p(k)p_{(1)} \le p_{(2)} \le \dots \le p_{(k)}
  2. j=1,2,…j = 1, 2, \dots 순서로 p(j)≤αk−j+1p_{(j)} \le \dfrac{\alpha}{k - j + 1}인지 확인한다. 만족하면 기각하고 다음으로 넘어간다.
  3. 처음 만족하지 못하는 순간 멈춘다. 그 뒤의 가설은 조건을 만족해도 기각하지 않는다(step-down 절차).

같은 결론을 보정된 p-value로도 표현할 수 있다. 정렬된 순서에서

p~(j)=min⁡(1,  max⁡i≤j (k−i+1) p(i))\tilde{p}_{(j)} = \min\Big(1,\; \max_{i \le j}\, (k - i + 1)\, p_{(i)}\Big)

이고, p~(j)≤α\tilde{p}_{(j)} \le \alpha인 가설을 기각한다. 앞 순위의 최댓값을 이어받는 부분(max⁡i≤j\max_{i \le j})이 3단계의 "멈춤"을 표현한다.

holm(pvals, alpha=0.05)를 완성한다. 반환값은 (reject, p_adj)이고, 둘 다 입력과 같은 순서의 배열이다.

반환 shape 의미
reject (k,) bool 기각하면 True
p_adj (k,) float Holm 보정 p-value, 1을 넘지 않는다

예: holm([0.004, 0.014, 0.020, 0.200])의 p_adj는 [0.016, 0.042, 0.042, 0.2]이고 앞의 세 개를 기각한다.

힌트: np.argsort로 정렬 순서를 얻고, np.maximum.accumulate로 누적 최댓값을 구한 뒤, 정렬 순서를 되돌려 원래 위치에 넣는다.