실습 · 연습문제 2개
ABC rejection의 수용 단계 abc-rejection
참조 테이블에 시뮬레이션 개의 파라미터 theta_sim (shape (N,))와 요약 통계 S_sim (shape (N, k))이 있다. 관측 데이터의 요약 통계는 s_obs (shape (k,))다. 함수 abc_accept(theta_sim, S_sim, s_obs, q)를 완성해 받아들인 파라미터 배열을 반환한다.
- 통계마다 척도가 다르므로, 각 열을 참조 테이블에서 잰 표준편차로 나눈다.
s_obs도 같은 값으로 나눈다. - 표준화한 공간에서 각 시뮬레이션과 관측값 사이의 유클리드 거리 를 계산한다.
- 거리의 분위수 이하인 시뮬레이션을 받아들이고, 그
theta_sim값을 반환한다.
테스트는 다음을 확인한다.
- 받아들인 개수가 약 개인지
- 받아들인 표본의 거리가 거부한 표본의 거리보다 모두 작거나 같은지
- 척도가 1000배 큰 통계가 있어도 표준화 덕분에 결과가 바뀌지 않는지
- 정보가 있는 통계를 쓰면 받아들인 θ가 참값 근처에 모이는지
힌트: 본문 셀 2의 abc 함수가 같은 일을 한다. 여기서는 열 선택 없이 S_sim의 모든 열을 쓴다.
사후 구간의 coverage 재기 interval-coverage
사전분포에서 참값 ()을 뽑아 데이터를 시뮬레이션하고, 각 데이터로 추론해 사후 표본 개를 얻었다. 사후 표본은 samples (shape (M, L)), 참값은 theta_true (shape (M,))다.
함수 coverage(samples, theta_true, level)를 완성한다.
- 각 행의 사후 표본으로 중앙
level구간 을 만든다. 분위수는np.quantile의 기본 방식으로 계산한다. - 참값이 구간 안(양 끝 포함)에 있는 비율을 반환한다.
테스트는 다음을 확인한다.
- 정확한 사후분포에서 뽑은 표본이면 coverage가
level에 가까운지(50%, 90%) - 사후분포를 일부러 너무 좁게 만들면(과신) coverage가 크게 떨어지는지
- 사후분포를 너무 넓게 만들면(보수적) coverage가
level보다 높아지는지
테스트에 쓰는 모델은 정규-정규 켤레 모델이다. , 이면 정확한 사후분포는 다(13.2장).