본문 바로가기
바이오 데이터/R

[유전체 분석] R을 이용한 clustering

by _avocado_ 2021. 3. 19.

Clustering

데이터를 기반으로 비슷한 특성을 갖는 값들을 집단으로 분류하는 과정이다.

비지도 학습으로 집단의 개수, 분류 기준에 따라 결과가 달라진다.


목차.

 

유전체 분석에서 많이 사용되는 clustering 방법

    1. Hierarchical clustering

    2. Consensus clustering

    3. NMF clustering

 

Expression Set의 데이터 전처리(cluster 하기 위한)


유전체 분석에서 많이 사용되는 clustering 방법

● Hierarchical clustering

 

가장 일반적으로 사용되는 방법이다.

가장 비슷하다고 생각되는 것을 묶어가며 군집화 한다. 최종적으로 1개의 군집이 될 때까지 진행한 뒤 그래프를 기준으로 적당한 클러스터 개수에서 분류한다. 아래 그림에서 빨간 선을 기준으로 clustering 하면 총 2개의 집단으로 나눈다.(초록, 빨강)

 

▶ 가장 비슷하다는 기준은 거리를 이용한다. 거리가 가까울수록 비슷한 sample이 된다.

 

- Euclidean distance: 일반적인 거리, 실생활에서 사용하는 직선거리를 의미한다.

 

- Manhattan distance: 좌표를 따라 움직이는 거리, 축을 따라 움직여 차이나는 값을 의미한다.

 

- Correlation distance: 실제 값이 아닌 상관계수를 거리로 사용한다. 값의 차이가 아닌 변화의 추세를 이용한다.

 

거리 예시

A = (1 , 2), B = (4,-2)


Euclidean distance  = $\sqrt{(4-1)^2 +(2-(-2))^2} = 5$


Manhattan distance = $|4-1| + |2-(-2)| = 7$

 

▶ 기준 거리 값, 집단과 집단 간의 거리의 기준을 정해야 한다.

 

- 가장 가까운 sample 간 거리 : single linkage

 

- 가장 먼 sample간 거리 : complete linkage

 

- 모든 sample의 거리 평균 : average linkage

▶ R 코드

# 거리행렬 구하기

d <- dist(행렬, diatance = 'euclidean') # 원하는 거리 종류를 입력한다. 각 행을 하나의 sample로 인식

# hierarchical clustering

hc <- hclust(d, method = 'single') # 거리 행렬과 거리 기준을 입력한다.

# 그래프 보기

plot(hc)

# 클러스터 개수를 정해 sample별로 나누기

cutree(hc, k=3) # k값에 나눌 집단의 개수를 넣는다.

 

▶ Heatmap

 

2차원 데이터를 시각화하는 방법이다. 유전체 데이터의 경우 column은 유전자 row는 sample인 경우가 대다수이다.

어떤 sample에서 특정 유전자의 발현량을 색으로 나타내서 전체적인 특징을 눈으로 파악할 수 있게 도와준다.

또 R의 heatmap 함수들은 column별, row별 hierarchical clusteringa을 함께 진행하기 때문에 집단별 특징을 파악하는데 유용하다.

 

▶ R 코드

# R base

heatmap(sclae(행렬))

# gplot library

library(gplot)

hc2 <- heatmap.2(sclae(행렬))

# pheatmap libarary

library(pheatmap)

pheatmap(sclae(행렬))

# Heatmap에서 hclust 가져오기

as.hclust(hc2$colDendrogram) # rowDendrogram도 가능

cutree(as.hclust(hc2$colDendrogram), k=3)

Consensus Clustering

Bioconducter package 'ConsensusClusterPlus'를 이용한 방법이다.

여러 클러스터링 방법을 앙상블 하여 나타낸 군집을 나타낸다. 군집의 개수를 정할 수 있는 다양한 그래프를 보여준다.

 

▶ consensus matrix

 

특정 개수의 군집으로 나누었을 때 공통으로 분류되는 비율을 색으로 보여주는 그래프, 그래프가 깔끔할수록 좋은 개수다.

 

아래 그림에서 k=7일 때 가장 깔끔한 모습을 보인다. (모자이크처럼 지지직 거리는 부분이 없다.)

▶ consensus CDF & Delta area

 

consensus CDF

 

클러스터 개수에 따라 consensus index 값들의 누적 값 그래프이다. 색 0~1을 기준으로 전체 에서의 비율의 값을 누적 그래프로 표현

(index = 0인 점의 의미: 색 0(흰색)의 비율, index = 0.5의 의미: 색 0.5 보다 작은 값들의 비율)

Delta area

 

각 클러스터 개수의 consensus CDF에서 index가 0.9인 값과 0.1인 값의 차이를 나타낸 그래프 elbow method처럼 아래로 툭 튀어나온 클러스터의 값을 군집 개수로 정한다.

▶ R 코드

library(ConsensusClusterPlus)

# clustering

# plot = 저장할 방식,title = 저장할 폴더 이름

# 폴더안에 그래프를 저장해준다. consensus matrix, cdf, delta area

cc <- ConsensusClusterPlus(행렬, maxK=5,plot='png',title='ALL')

# 군집 개수 정하고 분류 가져오기

cc[[3]]$consensusClass # 3개의 군집으로 나눈 결과 가져온다.

NMF clustering

행렬 분해를 이용한 분류 방법, 음수가 없는 데이터를 음수가 없는 행렬로 분해한다. 유전체 데이터에서 발현량을 측정값으로 사용하기 때문에 유전자별, sample별로 분해할 때 음수의 값을 가질 수 없다. 따라서 유전체 분석에서 NMF는 유용한 방법이다.

또한 유전자별, sample별로 분해하기 때문에 특정 군집에서 어떤 유전자가 대표적인 유전자 인지 알 수 있다는 장점이 있다.

chphenetic plot에서 값이 1에 가까운 지점을 군집 개수로 한다.

 

▶ R 코드

library(NMF)

# clustering

nmf <- NMF(행렬, rank = 2:5) # 오래걸린다

# 결과 시각화

nmf$fit # 결과

consensusmap(nmf$fit) # consensus matrix

plot(nmf$fit) # cophenetic plot을 포함한 여러 그래프

# 군집 개수별 결과 가져오기

predict(nmf$fit[[1]]) # rank에서 지정한 값들의 순서를 입력한다. 이번 예시에서는 k=2를 가져오기 위해 1 

Expression Set의 데이터 전처리(cluster 하기 위한)

Expression Set 중 assayData를 이용하여 클러스터링을 진행하기 위해 각 방법별 전 처리과정이 필요하다.

 

● assayData

# ExpressionSet에서 assayData 가져오기

expr <- exprs(ExpressionSet)

● 변화가 있는 유전자 고르기

 

mad를 이용하여 변화가 있는 값을 골라낸다. mad에 대한 설명

 

[기초 통계학 :: R 실습] MAD(Median Absolute Deviation)을 이용한 아웃라이어 색출하기!

이번 포스팅에서는 MAD(Median Absolute Deviation)을 이용하여 아웃라이어를 제거하는 것에 대해서 ...

blog.naver.com

# mad값 구하기

mad_gene <- apply(expr,1,mad) # row 별로 적용

# mad값 분포 확인 후 기준값을 정하고 필터링

quantile(mad_gene) # 중앙값을 기준으로 하겠다. 중앙값=0.7이라 가정

f.expr <- expr[mad_gene>0.7,]

 

● distance 구하기

 

dist() 함수는 row를 하나의 sample로 하여 거리를 구한다. expr에서는 column이 sample이므로 t() 함수를 이용해 전치한다.

d <- dist(t(f.expr))

 

● heatmap 그리기

 

heatmap에서 색으로 변화를 보기 때문에 center를 0으로 맞춰주는 것이 좋다.

gene_mean <- apply(f.expr,1,mean) # gene 별

f.cen.expr <- f.expr - gene.mean

 

● NMF

 

NMF를 진행하기 위해서는 음의 값이 없어야 한다. (기본적으로 발현량은 0보다 크다.)

f.expr을 사용한다.

댓글