Quantile normalization

생물정보학에서 자주 사용되는 정규화 방법 중 하나인 quantile normalization이다. Quantile normalization은 비교하려는 샘플들의 분포를 완전히 동일하게 만들고 싶을 때, 또는 기준이 되는 분포(reference distribution)가 있는 경우 샘플들의 분포를 모두 기준 분포와 동일하게 만들고 싶을 때 사용할 수 있다.

복잡한 방식을 사용하는 과정이 아닌지라 쉽게 이해하고 쉽게 써먹을 수 있다.

 

알고리즘

  1. 샘플 내 값을 오름차순 정렬
  2. 아래 과정을 모든 n에 대하여 반복
    1. (기준 분포가 있을 떄)
      1. 모든 샘플의 n 번째 값들을 기준 분포의 n 번째 분위수로 대체
    2. (기준 분포가 없을 때)
      1. 각 샘플의 n 번째 값들을 평균(또는 중간값)
      2. 각 샘플의 n 번째 값들을 모두 2-1.의 값으로 대체
  3. 정렬된 데이터를 원래 데이터의 순서대로 복구

 

이해가 어렵다면 바로 아래 “예시”로 넘어가도 된다.

“값들을 순서대로 나열했을 때 n 번째 값”이 바로 통계학에서의. n 번째 분위수(n-th quantile)의 개념에 해당하고, 각 샘플 분포의 n 번째 분위수를 동일하게 조정해주는 작업이므로 quantile normalization이라는 이름이 붙었다.

딱히 알고리즘이랄 것도 없다. 1.에서 정렬 시 오름차순 대신 내림차순을 써도 아무 상관이 없다. 기준 분포가 없을 때 2-1.에서 평균, 중간값 대신 가중평균 등 자신에게 적합한 대푯값을 사용해도 된다.

 

예시

1. 이해를 위한 간단한 예시

다음 테이블과 같은 세 샘플(A, B, C)의 데이터가 있다고 하자. A, B, C의 분포가 동일해지도록 median quantile normalization해보자. 셀 색상은 원래 데이터의 순서를 표시하기 위해 넣어보았다.

qn_whole

  1. 열 별로 값을 정렬한다.
  2. 정렬된 데이터에서 행 별로 중간값을 계산한다.
  3. 각 행의 값을 2.에서 계산한 중간값으로 바꾼다.
  4. 정렬을 해제하여 기존 데이터와 같은 순서로 돌려준다

 

2. 규모가 좀 더 큰 예시

서로 다른 샘플에 어떤 실험을 한 결과 데이터가 세 세트(A, B, C) 있다고 하자. 세 샘플을 용이하게 비교하기 위해 샘플의 분포를 quantile normalize하여 동일하게 만들어보자.

 

기준 분포가 있을 때

표준정규분포를 기준 분포로 삼는다고 하자.

정규화 전 각 샘플의 분포는 아래와 같다.

A  B   C
0   3.570614    5.015660    6.526778
1   5.965098    1.258324    2.285988
2   3.767857    0.974910    4.374467
3   3.538398    3.362349    1.779624
4   5.178286    1.575602    3.065568
5   3.578033    3.434900    5.086503
6   5.330161    3.431059    3.573926
7   5.002079    4.885904    2.318780
8   5.694074    4.000688    4.615286
9   6.026262    -0.499165   1.999979
before

 

표준정규분포의 101-quantile을 사용하여 quantile normalization하면,

A  B   C
0   -1.000990   1.410420    1.410420
1   0.960838    -1.180947   -1.000990
2   -0.922178   -1.346263   0.162024
3   -1.086568   0.162024    -1.232341
4   0.162024    -0.848716   -0.476577
5   -0.960838   0.263612    0.620918
6   0.289397    0.238000    -0.187224
7   -0.012409   1.232341    -0.922178
8   0.651302    0.682300    0.368003
9   1.042824    -2.330079   -1.132497
after_ref

모든 샘플의 분포가 표준정규분포와 일치하는 것을 확인할 수 있다.

 

기준 분포가 없을 때

기준 분포가 없이 median을 사용하여 정규화하면,

A  B   C
0   -1.000990   1.410420    1.410420
1   0.960838    -1.180947   -1.000990
2   -0.922178   -1.346263   0.162024
3   -1.086568   0.162024    -1.232341
4   0.162024    -0.848716   -0.476577
5   -0.960838   0.263612    0.620918
6   0.289397    0.238000    -0.187224
7   -0.012409   1.232341    -0.922178
8   0.651302    0.682300    0.368003
9   1.042824    -2.330079   -1.132497
after

역시 마찬가지로 모든 샘플의 분포를 동일하게 만들 수 있다.

 

참고

이 코드를 돌리면 예시 2-2를 직접 해볼 수 있다.

웹 폰트 추출기

웹사이트를 둘러보다 마음에 드는 폰트가 있으면 다운로드할 수 있도록 (지나치게) 간단한 툴을 제작해보았다.

폰트 정보가 담긴 CSS stylesheet를 찾아 서버 내 웹폰트 경로를 추출하여 다운로드한다. 폰트 다운로드 링크가 닫혀있는 경우에는 메뉴에 폰트명이 표시되지만 다운받을 수는 없다.

Python 3가 설치되어있다는 전제하에 딱 한 줄이면 사이트에서 폰트를 다운받을 수 있다.

예를 들어 카카오서체를 다운받고 싶다면 카카오서체가 적용되어있는 카카오 같이가치 사이트를 다음과 같이 스크립트에 입력하면 된다.

./extract_webfont.py 'https://together.kakao.com'

툴은 여기에서 다운로드할 수 있다. 아파치 2.0 라이센스로 공개된 스크립트의 확장이다.
서체마다 저작권에 유의하여 사용할 것.


Sequence Motif 등장 확률

전체 n ntd로 이루어진 target RNA 한 가닥이 있다고 하자. 이 RNA는 완전히 랜덤하게 만들어진 가닥이라고 가정한다. 즉, 각 위치에 A, U, G, C가 같은 확률로 존재할 수 있다.

이제 k-mer sequence motif가 하나 있다고 하자. 이 sequence motif는 특정되어 있다.

이 때 Target RNA 가닥에서 이 motif가 한 번이라도 등장할 확률은 얼마일까?

우연한 기회에 이 문제에 대해 생각해보게 되어 여사건의 확률 등의 방법을 생각해보다 이런 방법으로는 쉽게 풀리지 않는다는걸 알게 되었다.

검색을 해봐도 정확한 해답을 제시하는 사람은 많지 않았다 (너무 쉬운 문제여서 인지?). 여기서는 확률의 inclusion-exclusion principle을 이용한 해답을 소개하려 한다.

마주서기 문제

본 문제와 비슷하지만 비교적 단순한 문제를 먼저 살펴보자.

n쌍의 부부가 있다. 한 쪽에는 남편끼리, 다른 쪽에는 부인끼리 늘어 설 때, 적어도 한 쌍의 부부가 서로 마주보고 설 확률은 얼마일까?

이 문제 역시 여사건의 확률을 이용해서 풀기는 쉽지 않다 (재귀함수를 만들게 된다). 대신 inclusion-exclusion principle을 사용해서 풀어보자.

사건 A_i를 “i번째 부부가 서로 마주보고 서는 사건”이라고 하자. 그러면

\begin{array}{lcl} &&P(A_i) = \dfrac{(n-1)!}{n!} \text{, } i=1, ..., n \\ &&P(A_i \cap A_j) = \dfrac{(n-2)!}{n!} \text{, } i < j \\ && ... \\ &&P(A_1 \cap A_2 \cap ... \cap A_n) = \dfrac{1}{n!} \end{array}

이므로

\begin{array}{lcl} P(\cup_{i=1}^{n} A_i) &=& \sum_{i=1}^{n}P(A_i) - \sum_{i<j}P(A_i \cap A_j) \\ & & + ... + (-1)^{n+1}\sum_{i<j<...<l}P(A_i \cap A_j \cap ... \cap A_l) \\ &=& \sum_{i=1}^{n} (-1)^{i+1} \dfrac{1}{i!} \end{array}

이다.

본 문제

사건 A_i \text{, } i=1, ..., m를 “i번째 위치에 motif가 등장하는 사건”이라고 하자. 단 mnk로 나눈 몫이다. 그러면

\begin{array}{lcl} &&P(A_i) = \dfrac{4^{n-k}}{4^n} \text{, } i \leq n-(k-1) \\ &&P(A_i \cap A_j) = \dfrac{4^{n-2k}}{4^n} \text{, } i<j \text{ and } i, j \leq n-2(k-1) \\ &&P(A_i \cap A_j \cap A_k) = \dfrac{4^{n-3k}}{4^n} \text{, } i<j<k\text{ and } i, j, k \leq n-3(k-1) \\ &&... \\ &&P(A_1 \cap A_2 \cap ... \cap A_m) = \dfrac{4^{n-mk}}{4^n} \end{array}

이므로 마주서기 문제에서와 같은 방법으로

P(\cup_{i=1}^{m} A_i) = \sum_{i=1}^{m} (-1)^{i+1} \binom{n-i(k-1)}{i} 4^{-ki}

임을 알 수 있다.

이 방법으로 1~500 ntd의 random target sequence에 3, 4, 7-mer fixed motif가 존재할 확률을 그래프로 나타내보면 다음과 같다.

Thu Oct 25 00:15:46 2018

Update:

위 방법이 일부 상황에서 정확한 값을 반환하지 않는다고 한다. 더 일반적인 경우에도 사용 가능한 Markov chain 방법을 쓴 Udaqueness 님의 글을 참고.


참고