메타데이터를 만들었으면 이제 cell QC를 진행한다. 이 단계는 여러가지 지표를 이용해 정상범위 밖에 있는 세포(이상치)를 판단하고 제거하여 데이터 품질을 올리는 단계이다.
세포의 품질을 판단하기 위해 Scater: pre-processing, quality control, normalization and visualization of single-cell RNA-seq data in R (reference) 를 참고한다. 레퍼런스에서는 mito, ribo, hb 유전자를 참고하여 cell quaility를 판단한다. 다양한 cell QC 방법이 reference가 있을테니 여러가지로 테스트 해보도록 하자..
미토콘드리아 유전자 (mt) : 세포가 손상되면 mt 유전자 발현이 비정상적으로 증가할 수 있다.
리보솜 유전자(ribo) : 리보솜 유전자 발현이 비정상적으로 높은 경우, 세포가 스트레스를 받았거나, 기술적 문제(이중세포)로 인해 유전자 발현이 왜곡되었을 가능성이 있다.
헤모글로빈 유전자 (hb) : 조직에서 수집된 샘플에서 헤모글로빈 유전자 발현이 높다면 혈액 세포 오염을 의심할 수 있다.
# mitochondrial genes, "MT-" for human, "Mt-" for mouse
adata.var["mt"] = adata.var_names.str.startswith("MT-")
# ribosomal genes
adata.var["ribo"] = adata.var_names.str.startswith(("RPS", "RPL"))
# hemoglobin genes
adata.var["hb"] = adata.var_names.str.contains("^HB[^(P)]")
위의 코드는 mt, ribo, hb 로 시작하는 유전자를 masking 한다. adata.var 에서 확인할 수 있다.
sc.pp.calculate_qc_metrics(
adata, qc_vars=["mt", "ribo", "hb"], inplace=True, log1p=True
)
mt, ribo, hb 유전자에 대해서 cell QC 하는 코드. 딸깍한번으로 가능하니 자신감이 막 생긴다.
adata.var (유전자 메터데이터)
mt:
미토콘드리아 유전자 여부를 나타내는 열입니다. True이면 해당 유전자가 미토콘드리아 유전자임을 의미합니다.
미토콘드리아 유전자는 세포 손상 여부를 평가하기 위해 사용됩니다.
ribo:
리보솜 유전자 여부를 나타내는 열입니다. True이면 해당 유전자가 리보솜 유전자임을 의미합니다.
리보솜 유전자는 세포의 단백질 합성 활동이나 스트레스 상태를 평가하는 데 사용될 수 있습니다.
hb:
헤모글로빈 유전자 여부를 나타내는 열입니다. True이면 해당 유전자가 헤모글로빈 유전자임을 의미합니다.
헤모글로빈 유전자는 혈액 세포 오염 여부를 확인하는 데 사용됩니다.
n_cells_by_counts:
해당 유전자가 발현된 세포의 수를 나타냅니다.
이 값을 통해 특정 유전자가 얼마나 많은 세포에서 발현되고 있는지 알 수 있습니다.
mean_counts:
모든 세포에서 해당 유전자의 평균 발현 수를 나타냅니다.
특정 유전자의 평균 발현 수준을 확인할 수 있어, 발현량이 높은 주요 유전자나 낮은 유전자들을 파악하는 데 유용합니다.
log1p_mean_counts:
mean_counts에 로그 변환을 적용한 값입니다. log1p는 각 값에 1을 더한 후 로그를 취하는 방식입니다.
극단적인 발현 수치를 조정하여 유전자 발현 분포를 더 균일하게 볼 수 있습니다.
pct_dropout_by_counts:
해당 유전자가 발현되지 않은 세포의 비율(%)을 나타냅니다.
높은 pct_dropout_by_counts 값은 특정 유전자가 대부분의 세포에서 발현되지 않았음을 의미하며, 발현되지 않는 유전자의 빈도를 확인할 수 있습니다.
total_counts:
해당 유전자의 총 발현 수입니다. 모든 세포에서 해당 유전자의 발현 값을 합친 것입니다.
유전자의 총 발현량을 통해, 주요 발현 유전자와 상대적으로 발현이 적은 유전자들을 파악할 수 있습니다.
log1p_total_counts:
total_counts에 로그 변환을 적용한 값입니다. log1p는 각 값에 1을 더한 후 로그를 취하는 방식입니다.
총 발현량의 로그 값으로, 극단적인 값의 영향을 줄여 데이터 분포를 균일하게 볼 수 있게 해줍니다.
adata.obs (세포 메타데이터)
sample: 각 세포가 속한 샘플 그룹을 나타냅니다. 특정 샘플에서 품질 문제가 발견될 경우 해당 샘플을 구분해 관리하거나 필터링할 수 있습니다.
n_genes_by_counts:
세포에서 발현된 서로 다른 유전자의 수입니다. 너무 낮은 값은 죽어가는 세포이거나 기술적 결함이 있는 세포일 가능성이 높습니다. 너무 높은 값은 이중 세포(두 개 이상의 세포가 하나로 잘못 수집된 경우)일 수 있습니다.
log1p_n_genes_by_counts:
n_genes_by_counts의 로그 변환 값입니다. 값의 분포를 더 균일하게 만들어, 세포 간 극단적인 차이를 줄여 QC 기준 설정에 유리합니다.
total_counts:
세포 내 총 유전자 발현 수로, 해당 세포의 전체 RNA 양을 나타냅니다. 너무 낮은 값은 데이터의 질이 낮을 가능성을 의미하며, 너무 높은 값은 이중 세포나 오염의 징후일 수 있습니다.
log1p_total_counts:
total_counts의 로그 변환 값입니다. 극단적인 발현 수치를 조정해 데이터의 분포를 균일하게 합니다.
pct_counts_in_top_50_genes:
상위 50개 유전자가 전체 발현에서 차지하는 비율입니다. 특정 유전자들만 과도하게 발현된 세포는 분석 결과를 왜곡할 수 있으며, 이는 세포가 저품질일 가능성을 나타냅니다.
pct_counts_in_top_100_genes:
상위 100개 유전자가 차지하는 비율입니다. 상위 유전자에 편향된 발현이 있는지 확인하는 데 사용되며, 이는 분석의 신뢰성에 영향을 미칠 수 있습니다.
pct_counts_in_top_200_genes:
상위 200개 유전자가 차지하는 비율입니다. 마찬가지로, 발현이 특정 유전자에 집중된 세포를 필터링하는 데 사용됩니다.
pct_counts_in_top_500_genes:
상위 500개 유전자가 차지하는 비율입니다. 발현이 상위 유전자에 편중되어 있는지 확인할 수 있습니다.
total_counts_mt:
미토콘드리아 유전자의 총 발현 수입니다. 높은 미토콘드리아 발현은 세포가 손상되었거나 죽어가고 있을 가능성을 나타내므로, 이 값이 일정 기준 이상이면 저품질 세포로 간주될 수 있습니다.
log1p_total_counts_mt:
total_counts_mt의 로그 변환 값입니다. 미토콘드리아 발현 수치를 더 균일하게 만들어 QC 기준을 설정하기 용이하게 합니다.
pct_counts_mt:
미토콘드리아 유전자가 차지하는 비율입니다. 이 값이 일정 비율 이상인 세포는 손상된 세포로 간주되어 필터링됩니다. 일반적으로 5-10% 이상의 미토콘드리아 발현 비율은 저품질 세포로 판단합니다.
total_counts_ribo:
리보솜 유전자의 총 발현 수입니다. 리보솜 유전자 발현이 너무 높으면 오염이나 기술적 문제로 인해 세포 품질이 낮을 가능성이 있습니다.
log1p_total_counts_ribo:
total_counts_ribo의 로그 변환 값입니다. 로그 변환으로 리보솜 발현 수의 분포를 더 균일하게 만듭니다.
pct_counts_ribo:
리보솜 유전자가 전체 발현에서 차지하는 비율입니다. 리보솜 발현이 높은 세포는 특정 상태에 처해 있을 수 있으며, 필요에 따라 필터링 기준이 될 수 있습니다.
total_counts_hb:
헤모글로빈 유전자의 총 발현 수입니다. 일반적으로 scRNA-seq 분석에서는 헤모글로빈 유전자가 발현되지 않는 경우가 많으므로, 높은 값은 오염을 의심할 수 있습니다.
log1p_total_counts_hb:
total_counts_hb의 로그 변환 값입니다. 헤모글로빈 발현 수를 균일하게 조정하여 QC 기준을 설정하기 좋게 만듭니다.
pct_counts_hb:
헤모글로빈 유전자가 차지하는 비율입니다. 헤모글로빈 유전자 비율이 높으면 혈액 세포의 오염 가능성을 나타낼 수 있으며, 저품질로 간주될 수 있습니다.
sc.pl.violin(
adata,
["n_genes_by_counts", "total_counts", "pct_counts_mt"],
jitter=0.4,
multi_panel=True,
)
n_genes_by_counts:
y축 (value): 각 세포에서 발현된 서로 다른 유전자의 수를 나타낸다.
해석: 세포당 발현된 유전자 수가 일정 범위 안에 있으면 건강한 세포로 간주할 수 있지만, 너무 적거나 너무 많은 유전자가 발현된 세포는 저품질일 가능성이 있다. 예를 들어, 값이 매우 낮은 세포는 죽어가는 세포일 수 있고, 값이 매우 높은 세포는 이중 세포일 수 있다.
total_counts:
y축 (value): 각 세포의 총 발현 카운트를 나타낸다.
해석: 총 발현 수가 일정 범위에 있는 세포들은 정상적일 가능성이 높다. 총 발현 수가 너무 낮으면 저품질 데이터일 수 있으며, 너무 높으면 세포 간 오염이나 이중 세포일 가능성을 있다.
pct_counts_mt:
y축 (value): 각 세포에서 미토콘드리아 유전자가 차지하는 비율을 나타낸다. (백분율).
해석: 미토콘드리아 비율이 일정 수준 이상(예: 5-10% 이상)인 세포는 손상된 세포일 가능성이 높기 때문에, 이러한 세포는 분석에서 제외할 수 있습니다. 이 플롯을 통해 미토콘드리아 비율이 높은 세포들을 쉽게 식별할 수 있다.
sc.pl.scatter(adata, "total_counts", "n_genes_by_counts", color="pct_counts_mt")
mt-gene을 시각화 한 것. 색깔이 밝아질수록(노란색) mt-gene 발현이 높아 죽은세포일 확률이 높다. 적당한 threshhold 를 주어 제거하면 된다.
sc.pp.filter_cells(adata, min_genes=100)
sc.pp.filter_genes(adata, min_cells=3)
However, sometimes what appears to be poor QC metrics can be driven by real biology so we suggest starting with a very permissive filtering strategy and revisiting it at a later point.
QC metrics에서 quality 가 떨어진다고 판단하여 제거했던 세포가 false negative 일 수 있으므로, 여러번 다른 방식으로 QC진행해봐야 한다.
sc.pp.filter_cells(adata, min_genes=100)
sc.pp.filter_genes(adata, min_cells=3)
튜토리얼에서는 아주 보수적으로, 100개 미만의 유전자를 발현한 세포, 발현된 세포가 3개 미만인 유전자를 제거하였다.