12.4 구간 추정·가설 검정·부트스트랩

실습 · 연습문제 2개

Benjamini–Hochberg 절차 구현하기 benjamini-hochberg

검정 mm개의 p-value가 있을 때, Benjamini–Hochberg(BH) 절차는 거짓 발견 비율의 기댓값(FDR)을 qq 이하로 유지하면서 기각할 가설을 고른다.

  1. p-value를 작은 순서로 정렬한다: p(1)≤p(2)≤⋯≤p(m)p_{(1)} \le p_{(2)} \le \dots \le p_{(m)}
  2. p(k)≤km qp_{(k)} \le \dfrac{k}{m}\,q를 만족하는 가장 큰 순위 kk를 찾는다.
  3. 순위 1,…,k1, \dots, k의 가설을 모두 기각한다. 그런 kk가 없으면 아무것도 기각하지 않는다.

bh_reject(pvals, q=0.05)를 완성한다. 입력과 같은 순서의 boolean 배열(기각하면 True)을 반환한다.

주의: 2단계는 "작은 쪽부터 조건을 확인하다 처음 실패하면 멈춘다"가 아니다. 조건을 만족하는 가장 큰 순위를 찾고, 그보다 작은 순위는 조건을 만족하지 않아도 모두 기각한다(step-up 절차). 테스트에 이 차이를 드러내는 예가 있다.

부트스트랩 신뢰구간: 샘플 단위와 그룹 단위 bootstrap-ci

두 함수를 완성한다. 둘 다 np.random.default_rng(seed)로 난수 생성기를 만들고, 같은 seed면 같은 구간을 반환해야 한다. 반환값은 (lo, hi) 두 실수다.

  1. percentile_ci(x, stat, n_boot=2000, alpha=0.05, seed=0)
    • 1차원 배열 x에서 길이가 같은 표본을 복원추출로 n_boot번 뽑는다.
    • 각 표본에 stat(1차원 배열을 받아 실수를 반환하는 함수)을 적용한다.
    • 그 값들의 100⋅α/2100\cdot\alpha/2 백분위수와 100⋅(1−α/2)100\cdot(1-\alpha/2) 백분위수를 반환한다.
  2. group_bootstrap_ci(values, groups, n_boot=2000, alpha=0.05, seed=0)
    • values[i]는 그룹 groups[i](셀·환자·장비 등)에 속한 측정값이다.
    • 샘플이 아니라 그룹을 복원추출한다. 그룹 GG개 중 GG개를 뽑고, 뽑힌 그룹의 모든 값을 모아 평균을 낸다(같은 그룹이 두 번 뽑히면 두 번 들어간다).
    • 그 평균들의 백분위수로 구간을 만든다.

테스트는 다음을 확인한다.

  • 정규 표본의 평균에 대한 percentile_ci가 xˉ±1.96 s/n\bar{x} \pm 1.96\,s/\sqrt{n}과 비슷하다.
  • 같은 그룹 안의 값이 강하게 상관된 데이터에서 group_bootstrap_ci가 샘플 단위 구간보다 훨씬 넓다.
  • 그룹마다 값이 하나뿐이면 두 방법의 구간 폭이 비슷하다.