biotechknowledge

Scanpy tutorials - data integration, injest 코드 개념 설명 본문

bioinformatics

Scanpy tutorials - data integration, injest 코드 개념 설명

준2준2 2024. 12. 21. 22:05

 
생물학 논문의 기본은 실험군과 대조군을 비교하는 것이다. 예를들면 카페인을 많이 마시면 머리가 나빠진다고 주장하고싶으면 커피를 매일 마신 그룹과 물을 매일 마신 그룹을 비교하면 된다. scRNAseq도 마찬가지이다. scRNAseq은 대조군 만으로도 도출해낼 수 있는 정보가 많지만, 실험군과 비교하였을때 얻어낼 수 있는 정보의 양과 질을 극대화할 수 있다. Integration 이란, 비교하고 싶은 두 그룹을 하나의 벡터공간상에 투여하는 것을 말한다.  두 그룹은 같은 벡터공간에 존재하게되어 cell cluster를 직접 비교할 수 있고 그룹별 batch effect 보정을 하는 알고리즘,통계 기법의 발전으로 신뢰도를 더해가고 있다.

import scanpy as sc
import pandas as pd
sc.settings.verbosity = 2  # verbosity: errors (0), warnings (1), info (2), hints (3)
sc.logging.print_versions()
sc.settings.set_figure_params(dpi=80, frameon=False, figsize=(3, 3), facecolor="white")

 
코드의 진행정보를 얻기 위해 verbosity 2 로설정한다. set_figure_params 는 그래프 모양설정이다.

PBMCs

# this is an earlier version of the dataset from the pbmc3k tutorial
adata_ref = sc.datasets.pbmc3k_processed()
adata = sc.datasets.pbmc68k_reduced()

 
scanpy에서 제공하는 연습용 데이터를 불러온다. adata_ref 와 adata는 integration에 사용할 두 데이터셋이다. 보통 control을 adata_ref에 실험군을 adata에 불러온다. adata_ref 데이터는 분석을 완료한 control 이고 metadata, PCA, clustering 결과가 포함되어 있다. 

 
louvain 알고리즘으로 클러스터링되어있다. 최근에는 leiden을 더 많이 사용한다. adata_ref.obs['louvain'] 에는 cell type annotation이 저장되어 있다. adata를 adata_ref 벡터공간에 투영하고 clustering pocess를 따라간다.

 
adata 에는 700개의 cell이 있다. 위 데이터는 연습용데이터로 pbmc68k에서 일부 가져온 것으로 실전이었으면 obsm 과 몇 obs컬럼은 텅 비어있는게 정상이다.

var_names = adata_ref.var_names.intersection(adata.var_names)
adata_ref = adata_ref[:, var_names]
adata = adata[:, var_names]

 
두 데이터를 합쳐야하게때문에 두 데이터셋에서 공통으로 발현된 유전자만 걸러온다.

sc.pp.pca(adata_ref)
sc.pp.neighbors(adata_ref)
sc.tl.umap(adata_ref)

 
adata_ref 로 PCA  진행한다.

sc.pl.umap(adata_ref, color="louvain")

 
왼쪽이 원래 ref가 가지고있던 정보로 UMAP을 그린 것이고 오른쪽은 공통 유전자만 남기고 UMAP을 그린 것이다. 유전자가 1838개에서  208개로 줄었음에도 clustering 결과를 잘 유지하고 있는걸 확인 할 수 있다. 유전체 데이터는 sparsity가 심하기 때문에 어차피 많은 수의 유전자가 허수이다. 그래서 제거해도 결과가 비슷한걸로 추측해볼 수 있다.

Mapping PBMCs using ingest

sc.tl.ingest(adata, adata_ref, obs="louvain")

 
adata_ref 의 클러스터 라벨(louvain)과 임베딩 정보를 adata에 매핑한다. adata의 클러스터 라벨을 예측하고 동일한 UMAP 좌표계를 공유한다.

adata.uns["louvain_colors"] = adata_ref.uns["louvain_colors"]  # fix colors

 
클러스터 라벨의 색상을 adata_ref 와 동일하게 설정한다.

sc.pl.umap(adata, color=["louvain", "bulk_labels"], wspace=0.5)

injest 를 통해 annotation 한 결과 왼쪽과 원래 갖고있던 정보(연습용 dataset으로 세포 타입이 bulk_labels에 저장되어 있음)를 비교해 볼 수 있다. 왼쪽 위를 보면 갈색은 비슷한 위치에 매핑되었고 주황색과 하늘색은 Myeroid lineage로 넓은 의미에서 비슷한 계열로 정확하게 짚어내진 못한 걸 확인할 수 있다.

adata_concat = adata_ref.concatenate(adata, batch_categories=["ref", "new"])

 
adata 와 ref 를 하나의 객체로 합치고 batch 카탈로그를 부여한다.

adata_concat.obs.louvain = adata_concat.obs.louvain.astype("category")
# fix category ordering
adata_concat.obs.louvain.cat.reorder_categories(
    adata_ref.obs.louvain.cat.categories, inplace=True
)
# fix category colors
adata_concat.uns["louvain_colors"] = adata_ref.uns["louvain_colors"]

 
concat 객체에서 louvain을 caterogy 로 바꿔준다. ref 에 저장된 카테고리 순서를 따라 저장한다. 클러스터의 색상 정보를 ref에서 복사하여 클러스터 색상이 일관되게 유지되도록 한다.

sc.pl.umap(adata_concat, color=["batch", "louvain"])

 

 
Monocyte에서 batch effect 가 있다.(cluster가 대부분 ref로 이우어져 있다.) Megakaryocyte는 ref에만 존재하는 cluster로 데이터 크기가 작아서 생겨서 생긴 일이다. 만약 ref 와 adata가 뒤바뀌었다면 이 세포타입은 사라진다.
 
다음편에서 Normalzation, scaling, BBKNN 계속..