읽기일기

Think Bayes (13) 시뮬레이션


파이썬을 활용한 베이지안 통계, 앨런 B. 다우니 지음, 권정민 옮김/한빛미디어

13.1 신장 종양 문제

온라인 통계 포럼에 다음과 같은 글이 올라왔다.

“현재 신장암 4기인데, 이 암이 퇴역 전에 생긴 것인지 알고 싶다. 암 발견 일자와 퇴역 일자를 알고 있다면 이 병이 군에서 커졌을 확률이 50/50인지 알 수 있는지? 퇴역일 기준으로 이 확률을 계산하는게 가능한지? 암 발견시 2기 진단이었고 크기는 15.5cm * 15cm 크기였음.”

다른 자료를 찾아볼 결과 상호 배가 시간(reciprocal doubling time, RDT)를 사용하여 성장율을 표시한다. 즉 RDT=1인 종양은 1년에 부피가 두배로, RDT=2는 같은 시간이 부피가 4배가 된다. RDT=-1이면 반으로 줄어들게 된다.

이제 53명에 대한 RDT 분포를 이용하여 문제를 풀어보기로 하자.

13.2 단순 모델

문제를 단순화하여 배가 시간이 일정한 상수고, 최대 한쪽 길이가 두배가 되면 부피는 8배가 되는 3차원 형태라고 하자.

군인이 증상이 보였을 때부터 전역할 때까지의 시간은 3291일이었다. 만약 종양이 중간 비율로 성장한다면 그가 전역할 때 까지 얼마나커질 수 있을까? 중간 크기의 배가 시간은 811일이다. 종양이 3차원임을 가정하면 길이의 배가 시간은 3배 더 길 것이다.

그 결과 d0은 약 6cm이다. 즉 종양이 전역 이후에 생겼다면 중간 속도 이상으로 빠르게 성장한 것이다. 따라서 이 종양이 전역 일자 전에 생겼을 가능성이 아닌 경우보다 높다고 결론지을 수 있다.

추가로 종양이 전역 후에 생겻을 경우의 성장율을 구해보자. 초기 크기가 0.1cm라고 가정하였을 때 최종 15.5cm에 도달할 때 까지 배가 단계를 얼마나 거쳐야 하는지 계산한다.

dt는 길이 배가 시간이고, vdt는 부피 배가 시간이며 rdt는 상호 배가 시간이다.

길이의 배가 횟수는 7.3, RDT는 2.4이다. 논문에 따르면 20%의 종양만이 이 정도의 속도로 자랐으므로, 이 종양이 전역 일자 전에 생겼을 가능성이 높다.

13.3 좀 더 일반적인 모델

증상 시간 별로 종양의 크기가 주어지면, 특정 일자 전에 종양이 생겻을 확률-진행 종양 나이별 분포를 알기가 더욱 쉬워진다.

이를 위해 종양 성장 시뮬레이션을 만들고, 종양 나이별 크기 상태의 분포를 만든다. 그 후 베이지안을 이용하여 크기에 따른 종양 나이별 분포를 생성해여보자.

시뮬레이션은 종양이 작은 상태에서 시작해서 다음 단계를 거친다.

  1. RDT 분포로부터 성장율을 선택한다.
  2. 구간의 끝에 종양의 크기를 계산한다.
  3. 각 구간별 종양 크기를 기록한다.
  4. 종양 크기가 최대 적합 크기를 초과할 때까지 반복한다.

초과 크기를 0.3cm으로 잡겠다. 이보다 종양이 작으면 외과적으로 수술할 일이 거의 없고 성장으로 인한 혈액 소모가 발생하지 않는다.

시간으로는 중간 시간인 245일을 잡았다.

최고 크기는 20cm로 관측 크기 범위는 1.0cm부터 12.0cm까지로, 각 구간의 끝에서 관측 범위 이상을 추론해야 하지만 결과에는 큰 영향을 미치지 않는다.

시뮬레이션은 큰 가정이 있다. 성장률은 각 구간마다 독립적이라는 것이다.

13.4 구현

rdt_seq는 성장률에 대한 CDF로부터 임의의 값을 가져오면서 함수를 반복 실행한다.
v0는 mL단위의 초기 부피다. interval은 연도로 나뉜 시간 단위다. vmax는 길이에 해당하는 최종 부피다.

volume은 종양이 구 형태라는 가정으로 길이 단위 cm에서 부피 단위 mL로 변환한다.

ExtendSequence는 매 구간의 끝에 대한 종양의 부피를 계산한다.

age는 시간 구간 끝의 종양의 나이다. seq는 부피 값을 가지고 있다. rdt는 시간 구간 동안의 성장률로 연간 배가 회수다. interval은 연간 시간 구간의 크기다.

13.5 결합 확률 캐싱

이제 캐시가 어떻게 동작하는지 살펴보자.

앞의 코드에서 각 시뮬레이션 구간에서 Add를 호출하게 되는데, 결합 분포에 새 데이터를 추가하기 전에 부피를 센티미터 단위 지름으로 변환한뒤, 센티미터에 사용할 버킷 숫자를 생성하여 해당 버킷에 부피를 추가한다.

이렇게 생성된 분포는 종양 나이와 지름에 대한 분포를 가진다.

13.6 조건 분포

생성된 결합 분포를 가로, 세로로 조사해보면 각각 크기에 따른 나이 분포를, 나이에 대한 크기의 분포를 알아볼 수 있다.

bucket은 종양 크기에 따른 버킷 번호다. Joint.Conditionalbucket에 대한 종양 나이의 PMF를 계산한다.

13.7 연속 상관관계

지금까지 많은 모델링을 선택하여 이루어진 것이다. 어디서 오차가 가장 많이 발생할까?

  • 길이에서 부피로 변환하기 위해 구 형태라고 가정햇다.
  • 참고한 분포는 논문의 53명의 환자를 대상으로 실험하였다. 샘플 숫자가 많아지면 분포가 달라질 수 있다.
  • 성장률 모델은 종양의 단계나 유형을 고려하지 않았다.
  • 성장률 분포는 종양의 크기와 상관 없다고 가정하였으나 매우 작거나 큰 경우 가정이 빗나간다.
  • 하지만 1 ~ 12 cm까지의 종양은 통계적으로 유의한 관계가 없었으므로 영향은 미미할 것이다.
  • 각 시간 구간의 성장률은 앞 구간의 성장률과 무관하다.

여기서는 첫번째와 마지막 것을 수정하여보자.

먼저 마지막 것이다.

  • 가우시안 분포를 사용하여 연관 값을 생성하자. 앞의 값을 사용해서 다음 값의 분포를 계산할 수 있다.
  • 각 값을 가우시안 CDF를 사용해서 누적확률로 변환하자.
  • 각 누적 확률을 주어진 CDF를 사용해서 연관값으로 변환하자.

cdf는 사용할 CDF이고, rho는 사용할 상관계수다. x값은 가우시안 분포, Transform은 이 변수들을 목적 분포로 변환한다.

x의 첫번째 값은 평균 0에 표준 편차가 1인 가우시안 값이다. 그 다음 값은 앞의 값에 따라 평균이 x * rho, 과 표분산이 1 - rho**2로 달라진다.

Transform은 각 가우시안 값 x를 주어진 Cdf인 y에 반영한다.

이렇게 연속 상관관계가 있도록 코드를 수정하면 나이에 따른 범위는 더욱 커진다.

이제 처음의 질문으로 돌아가 “15.5cm 길이의 종양이 있을 때 이게 8년 전에 생겼을 확률은 얼마인가?”에 답해보자.


Add a Comment Trackback