25.1 시뮬레이션 기반 추론

실습 · 연습문제 2개

ABC rejection의 수용 단계 abc-rejection

참조 테이블에 시뮬레이션 NN개의 파라미터 theta_sim (shape (N,))와 요약 통계 S_sim (shape (N, k))이 있다. 관측 데이터의 요약 통계는 s_obs (shape (k,))다. 함수 abc_accept(theta_sim, S_sim, s_obs, q)를 완성해 받아들인 파라미터 배열을 반환한다.

  1. 통계마다 척도가 다르므로, 각 열을 참조 테이블에서 잰 표준편차로 나눈다. s_obs도 같은 값으로 나눈다.
  2. 표준화한 공간에서 각 시뮬레이션과 관측값 사이의 유클리드 거리 did_i를 계산한다.
  3. 거리의 qq 분위수 이하인 시뮬레이션을 받아들이고, 그 theta_sim 값을 반환한다.

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

  • 받아들인 개수가 약 qNqN개인지
  • 받아들인 표본의 거리가 거부한 표본의 거리보다 모두 작거나 같은지
  • 척도가 1000배 큰 통계가 있어도 표준화 덕분에 결과가 바뀌지 않는지
  • 정보가 있는 통계를 쓰면 받아들인 θ가 참값 근처에 모이는지

힌트: 본문 셀 2의 abc 함수가 같은 일을 한다. 여기서는 열 선택 없이 S_sim의 모든 열을 쓴다.

사후 구간의 coverage 재기 interval-coverage

사전분포에서 참값 θ~m\tilde\theta_m (m=1,…,Mm = 1, \dots, M)을 뽑아 데이터를 시뮬레이션하고, 각 데이터로 추론해 사후 표본 LL개를 얻었다. 사후 표본은 samples (shape (M, L)), 참값은 theta_true (shape (M,))다.

함수 coverage(samples, theta_true, level)를 완성한다.

  1. 각 행의 사후 표본으로 중앙 level 구간 [Q(1−level)/2, Q(1+level)/2][Q_{(1-\text{level})/2},\ Q_{(1+\text{level})/2}]을 만든다. 분위수는 np.quantile의 기본 방식으로 계산한다.
  2. 참값이 구간 안(양 끝 포함)에 있는 비율을 반환한다.

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

  • 정확한 사후분포에서 뽑은 표본이면 coverage가 level에 가까운지(50%, 90%)
  • 사후분포를 일부러 너무 좁게 만들면(과신) coverage가 크게 떨어지는지
  • 사후분포를 너무 넓게 만들면(보수적) coverage가 level보다 높아지는지

테스트에 쓰는 모델은 정규-정규 켤레 모델이다. θ∼N(0,1)\theta \sim \mathcal{N}(0, 1), x∣θ∼N(θ,1)x \mid \theta \sim \mathcal{N}(\theta, 1)이면 정확한 사후분포는 N(x/2,1/2)\mathcal{N}(x/2, 1/2)다(13.2장).