본문 바로가기
컴퓨터/수학이랑

resampling을 이용한 방법 (bootstrapping)

by adnoctum 2010. 7. 2.


   resampling이란 모분포의 형태를 알 수 없을 때, 현재 갖고 있는 데이터의 일부분을 재추출하여 분포를 만든 후 관측하는 값의 통계적 의미를 확인하는 방법이다.

   우선 estimate 에 대해 살펴 보고 넘어 가자. 일련의 데이터가 있을 때, 우리는 그 데이터의 총체적 특성을 나타내는 값으로 보통 '(산술)평균'을 이용한다. 즉, 평균이란 데이터 집합의 특성을 표현하기 위한 수치 중 하나의 예일 뿐이다. 최대, 최소, 중간값, 모드, 표준편차, skew, n-th moment 등 데이터 집합의 특성을 표현하기 위한 값에는 매우 많은 종류가 있다. 이 글에서는, 데이터가 주어지면 그 데이터를 이용하여 하나의 실수값을 계산해 낼 수 있을 때, 그 실수를 estimate 라 지칭한다. 보다 정확한 정의는 다른 곳을 참고.

   본론으로 들어 가서, resampling은 모분포의 형태를 알 수 없을 때 주로 사용하는 방법이다. 즉, 모분포를 알 수 없으므로 일반적인 통계적 공식들을 사용하기 힘들 때, 현재 갖고 있는 데이터를 이용하여 모분포와 비슷할 것으로 추정되는 분포를 만들어 보자는 것이다. 즉, 현재 N 개의 데이터가 있고, 이 데이터로부터 estimator E 를 계산해서 이 E 가 통계적으로 유용한지 알고 싶을 때, E의 분포를 알아야 그 중요도를 판단할 수 있을 것이다. E가 산술평균이라면 CLT에 의해 E의 분포는 결국 정규분포로 감을 알 수 있지만, 그렇지 않을 경우에는 난감해진다. 따라서 다음과 같이 한다.

1. N개에서 k(<N)개를 무작위로 선택한다.
2. k개를 이용하여 E를 계산한다.
3. 위 작업을 10,000 번 반복하여 E의 분포 D를 얻어 낸다.
4. N개에 대한 E가 D에서 어느 곳에 위치하는지를 검사하여 통계적 중요도를 판단한다.


예를 들어 보자. 10,000 개의 데이터가 있다. 내가 이런저런 방법으로 이 중 10개가 매우 중요하다고 선택하였다. 만약 중요하다면 이 데이터 10개에 대하여, 다음과 같이 정의된 estimator E의 실제로 계산된 값이 매우 커야 한다. 즉, 데이터

에 대하여,



위와 같이 정의된 estimator E의 값이 매우 커야 한다고 가정해 보자. 만약 위와 같은 경우라면 E 는 어떤 분포를 그릴까? 우리가 많이 사용하는 분포들은 주로 정규분포 혹은 그와 비슷한 형태의 분포를 가정하여 만들어진 공식들인데, 위와 같이 E가 복잡한 형태라면 어느 분포를 가질 것인지 예측하기 힘들다. 이럴 때 resampling을 이용할 수 있다. 즉,

위와 같은 경우 10,000 개의 전체 데이터에서 무작위로 10개를 선택하고, 그 10개의 데이터에 대해서 E를 전부 계산하여 그 분포를 확인한다. 그리고, 그 분포에서 실제로 관측한 E가 어느 위치에 존재하는지를 확인하는 것이다. 만약 관측된 E 보다 큰 E가 50% 라면 그것은 그냥 우연히 나온 값일 가능성이 크니까 애초에 고른 10개의 데이터가 별로 의미있다고 하기 힘들다. 즉, 이렇게 저렇게 잘 골랐다고 했지만 사실 아무렇게나 골라도 그 데이터에 해당하는 정도의 값이 나온다면 별로 의미없는 것이 되겠지. 예를 들어 1000 번을 resampling 했다고 해보자. 즉,

T1 = {d(1,1), d(1,2), ..., d(1,10)},
T2 = {d(2,1), d(2,2), ..., d(2,10)},
...
T1000 = {d(1000,1), d(1000,2), ..., d(1000,10)},

이 경우 각 Ti에 대하여 E(Ti)를 위 공식으로 계산을 하면 E1, ..., E1000 처럼 1,000 개의 E 값이 계산된다. 이렇게 resampling 한 data로 만든 분포가 empirical distribution 이 된다. 이 때, 만약 '큰 값'이 의미있는 것이라면 우리가 실제 데이터로 계산한 E 보다 큰 E의 비율이 empirical p-value 가 된다. 만약 우리가 계산한 값이 0.5 였는데 resampling  했을 때는 이 값보다 큰 비율이 0.001 이라면 0.5 라는 값은 매우 의미있다 할 수 있다. 왜냐 하면 아무렇게나 데이터를 선택해서는 그 값보다 큰 값이 나올 확률이 매우 작기 때문이다 (ps참고). 그런데 0.5 보다 큰 값이 전체 1,000 번 resampling 한 것 중 458 번 나왔다면 0.5 라는 것은 별로 의미 없는 값이라 하겠다. 왜냐 하면 아무렇게나 선택해도 그 비슷한 값이 나오곤 하니까. 그림으로 보자면 다음과 같다.



위에서, 관측된 값1 의 경우, 우연히 이런 값이 나올 확률은 resampling 을 해 본 결과 매우 적음을 알 수 있다. 그러나 관측된 값2 의 경우에는 아무렇게나 데이터를 선택해도 이와 비슷한 값이 나오곤 한다. 따라서 empirical p-value가 작은 관측된 값1 은 충분히 유의미하다 하겠다. 만약 '값이 작은 것' 이 의미있는 경우였다면 관측된 값보다 작은 것의 비율을 empirical p-value로 사용해야 할 것이다.

   현재 나는, 대략 15,000 개의 유전자의 양이 측정된 값이 대략 50개 있다고 하면, 유전자 집합 두 개를 선택한 후 그 두 집합의 pearson's correlation coefficient (PCC) 를 보는 것인데, 이 PCC 값의 p-value를 계산함에 있어 일반적으로 사용하는 방법이 잘 통하지 않는다는 것을 확인한 후 resampling 을 하고 있다. resampling 의 장점은 모분포의 형태를 고려하지 않아도 된다는 것인데, 문제는 시간이 너무 오래 걸린다는 것이다 >.<"" CPU 8개 써서 이틀째 하고 있으니... 뭐, 워낙 많은 데이터를 처리하고 있긴 하지만.




ps. 통계적으로 유의미하다는 것은, 우리가 관측한 사건은 우연히 일어나기 어렵다는 것을 의미한다. 다시 말해, 일어날 확률이 매우 작은 사건이 실제로 일어났을 경우 그 사건은 유의미하다고 간주하는 것이다. 동전을 100번 던졌는데 전부 앞면이 나왔다면 이것은 통계적으로 일어나기 매우 어려운 일이 실제로 일어난 것이므로 뭔가 있는 것이다. 시험이라는 제도도 마찬가지. 100 점을 받을 '확률'은 50점을 받을 확률보다 훨씬 작고, 0 점을 받을 확률보다 훨씬 작다. 그래서 100 점을 받는 것이 통계적으로 의미가 있는 것이다.