본문 바로가기
Programming/R

[Preprocessing] Quantile Normalization

by Kanii 2022. 5. 16.
반응형

Quantile Normalization 방법은 생물정보학에서 자주 사용되는 Microarray를 표준화하는 방법 중 하나이다.

이번 포스팅에서는 Quantile Normalization을 수행하는 방법과 R로 간단히 코드를 작성해보려고한다.


1. DNA Microarray 란?

 

DNA Microarray란 흔히 DNA칩 혹은 바이오칩으로 알려져있으며, 고체 표면위에 매우 작은 DNA 조각들을 부착해 놓은 것을 말한다.

실험 대상의 유전자를 DNA 칩과 결합시켰을 때, 각 유전자들의 발현량을 수치화하여 자료를 얻게 되고 그 자료를 분석하여 병의 원인이나 이상 유전자등을 찾는데 사용된다. 

Sample Image of Microarray - Wikipedia

이러한 Microarray data는 짧은 시간 내에 대량의 자료를 얻을 수 있다는 큰 장점이 있지만, 그만큼 다양한 형태의 오차를 포함하게 되는 단점이 존재한다.

따라서, 생물학적 차이를 제외한 다른 오차들을 제거하는 과정이 Microarray data를 분석할 때 가장 중요하다.

 

Microarray data의 전처리(preprocessing) 단계는 크게 3 단계로 나눌 수 있다.

1) Background correction : Detecting and Handling Noise
2) Normalization : Making each sample (Microarray) distribution identical in statistical properties.
3) Summarization : Combining the multiple preprocessed probe intensities to a single expression value.

(여기서 probe란 하나의 DNA sequence라고는 한다. 아직, 용어나 이론적인 background는 부족해서 공부가 더 필요할 듯!)

 

이번 포스팅에서는 전처리 단계 중 Normalization에 해당하는 Quantile Normalization에 대해서 알아보고자 한다.


2. Quantile Normalization

 

Quantile Normalization은 기준 분포(reference distribution)가 있을 때와 없을 때 적용하는 방법이 약간 다르다.

 

분포를 동일하게 만들고 싶은 기준 분포가 있을 경우는 아주 간단하다.


  1. Test data에 수집된 유전자 발현량 자료가 있을 때, 각 샘플 별 rank를 구한 rank table을 만든다. 
  2. Reference distribtion의 값을 sorting한다.
  3. 1에서 구한 rank table에 맞춰, 각 rank에 해당하는 reference distribution의 값으로 대체한다.

이해하기 쉽게 그림으로 살펴보면 다음과 같다.

Quantile Normalization with Reference distribution

 

기준 분포가 없을 때 Quantile Normalization을 하는 방법은 다음과 같다.


  1. 주어진 Test data에서 각 sample별로 rank를 구한 뒤 Rank table을 만든다.
  2. 주어진 Test data에서 각 sample별 값을 sort하여 Sort table을 만든다.
  3. Sort table을 사용하여, 각 rank 별 평균 값을 구한다.
  4. 1에서 만난 Rank table을 3에서 구한 rank별 평균 값으로 대체한다.

이해를 위해 그림을 살펴보면 다음과 같다.

 

Quantile Normalization without reference distribution

위 그림에서 나타낸 Test data를 사용하여 R로 간단하게 Quantile Normalization하는 방법을 살펴보겠다.


3. R code

 

q = matrix(data = c(11,8,5,7,10,
                    6,10,9,4,5,
                    8,2,6,7,3), byrow=F,nrow=5,ncol=3)
colnames(q)<-c("S1","S2","S3")

> q
     S1 S2 S3
[1,] 11  6  8
[2,]  8 10  2
[3,]  5  9  6
[4,]  7  4  7
[5,] 10  5  3

## Create Rank Table
qr<-apply(q,MARGIN = 2,rank)

## Create Sort Table
qs<-apply(q,MARGIN = 2,sort)

# Compute mean for same rank
qm<-apply(qs,1,mean) # Return vector, first value corresponding to rank 1

norm.q<-matrix(qm[as.vector(qr)],ncol=ncol(q),nrow=nrow(q))

qn=matrix(nrow=nrow(q),ncol=ncol(q))

for ( i in 1:length(qr)){
  r = qr[i]
  qn[i]=qm[r]
}
colnames(qn)<-colnames(q)

## Normalizing Result
> qn
           S1       S2       S3
[1,] 9.666667 6.666667 9.666667
[2,] 6.666667 9.666667 3.666667
[3,] 3.666667 8.666667 6.666667
[4,] 5.000000 3.666667 8.666667
[5,] 8.666667 5.000000 5.000000

 

Normalization 결과를 그래프로 살펴보면 다음과 같다.

 

Before Normalization
After Normalization

 

3개의 샘플이 모두 동일한 분포를 갖게 된 것을 알 수 있다.

 

4. Normalization의 이유?

 

내가 처음 Quantile Normalization에 대해서 배웠을 때, 나는 가장 먼저 다음과 같은 생각이 들었다.

 

" 이렇게 기존 값들을 다 대체해버리면, 기존 값이 가지고 있는 의미가 다 퇴색되고 뭉게질텐데 정보의 손실이 너무 크지않나?"

 

하지만, Microarray 같은 경우는 샘플마다 검출 효율이 다르고, 두 검체 간 RNA 양이 다를 수도 있고, 빛에 의한 민감성, 스캐닝 상태 등등 다양한 이유로 수치화 된 발현량 값 자체는 많은 의미를 갖지않다고 한다.

 

예를 들어, A라는 유전자가 S1에서는 12, S2에서는 2만큼 발현되었다고 생각해보자.

수치만 보면 A라는 유전자는 S1에서 훨씬 크게 발현되었다고 생각할 수 있다.

 

하지만, S1에서는 12가 가장 작은 발현량이고, S2에서는 2가 가장 큰 발현량이라면? 

A라는 유전자의 발현량 차이를 12와 2 숫자만 가지고 비교하는 것은 잘못된 접근 방법이다.

 

우리의 목표는 "A라는 유전자가 S2보다 S1에서 10만큼 더 발현했다"가 아닌, "S1과 달리 S2에서는 A라는 유전자가 가장 많이 발현했다" 이기 때문에, 수치적인 비교를 기반으로 하는 통계 방법을 적용하기 위해서는 Normalization이 필수적이다.


참고

반응형

댓글