-
single-cell analysisBio-info/analysis 2025. 3. 5. 13:39
- var index로 유전자 이름 설정
->> anndata concat
- nan 값을 0으로 변환 -> 나중에 count 셀 때 인식 가능
- obs 인덱스 재설정
anndata.concat
adata = anndata.concat(filtered_ann_list.values(), label='batch', join='outer') # var의 합집합 사용 (var_names 기준)
-여러 개의 anndata 합침
-row (cell) 단위로 stack 함
-label : obs에 새로운 그룹 지정
-index_unique : 중복 유전자 이름을 처리
*var의 index로 유전자 이름이 들어가 있어야 함
UserWarning: Observation names are not unique. To make them unique, call .obs_names_make_unique. utils.warn_names_duplicates("obs")
-> 여러 AnnData 객체에 동일한 obs_names(세포 ID)가 포함되어 있으면 AnnData가 이를 감지하고 경고 메시지를 출력
sc.pp.calculate_qc_metrics()
-품질 관리(QC, Quality Control) 지표 계산
-세포/유전자별 QC 메트릭스를 계산하고, 이를 adata.obs와 adata.var에 추가
sc.pp.calculate_qc_metrics( adata, qc_vars=["mt", "ribo", "hb"], inplace=True, log1p=True)
-매개변수 설명
qc_vars : qc 분석할 유전자 그룹 (mitochondria, ribosome, 혈색소)
inplace = True : 결과를 .obs나 .var에 직접 저장
log1p = True : log(1+x)변환을 수행하여 로그 스케일로 qc 값을 저장
-추가되는 주요 지표
.obs 세포별
n_genes_by_counts : 세포별 발현된 유전자 개수
total_counts : 세포별 총 UMI 카운트
pct_counts_mt : 미토콘드리아 유전자 비율
📌 Doublet 탐지 (w/t scrublet)https://github.com/swolock/scrublet/blob/master/examples/scrublet_basics.ipynb
import scrublet as scr # Scrublet 실행 scrub = scr.Scrublet(adata_pdo.layers['count'], expected_doublet_rate=0.06) # scrublet object (count matrix) doublet_scores, predicted_doublets = scrub.scrub_doublets(min_counts=2, min_cells=3, min_gene_variability_pctl=85, n_prin_comps=30) scrub.plot_histogram() scrub.set_embedding('UMAP', scr.get_umap(scrub.manifold_obs_, 10, min_dist=0.3)) scrub.plot_embedding('UMAP', order_points=True)
이 함수는 Scrublet을 사용하여 doublet을 탐지하고, adata_pdo.obs에 doublet score 및 doublet 예측값을 추가
각 세포에 대해 doublet score 을 계산하고 특정 threshold를 기준으로 doublet인지 아닌지(True/False) 예측
📌 정규화 & 로그 변환-anndata.X에 덮어씌워짐 (따라서 기존 값은 layer에 따로 저장해야 함)
sc.pp.normalize_total(adata_pdo, target_sum=1e4) sc.pp.log1p(adata_pdo)
sc.pp.normalize_total()
- 각 세포(cell)의 유전자 발현 총합이 10,000이 되도록 조정
10,000* (세포별 유전자 발현 값 / 해당 세포의 총 발현 값)
sc.pp.log1p()
- 로그 변환 (log1p = log(1 + x))을 적용하여 발현값의 스케일을 조정
📌 HVG selectionsc.pp.highly_variable_genes()
sc.pp.highly_variable_genes(adata_pdo, n_top_genes=2000, batch_key="sample") sc.pp.highly_variable_genes(adata_pdo, min_mean=0.0125, min_disp=0.5, batch_key = 'batch')
- 유전자 변이(분산) 계산
- 유전자의 평균 발현량과 변이를 계산
- 각 유전자의 분산을 정규화하여 비교 가능하게 함 - 각 샘플(batch)별 변이 계산
- batch_key="sample"을 지정하면, sample 그룹별로 변이를 따로 계산
- 즉, 각 샘플별로 top 2000개를 선정 후, 모든 샘플을 고려하여 최종적으로 2000개 선택 - Highly Variable Gene (HVG) 선택
- 상위 n_top_genes=2000개 유전자를 adata.var['highly_variable'] = True로 표시
- 선택되지 않은 유전자는 False로 저장
변이성의 최소 기준값을 정해 고변이 유전자를 선택함.
min_mean=0.0125: 최소 평균 발현량 (너무 낮은 발현량을 가지는 유전자 제외)
min_disp=0.5: 최소 분산(표준화된 변이성) 기준 (이보다 작은 값은 제외)
batch_key="batch"을 기준으로 batch correction을 적용함.
즉, 고정된 개수가 아니라, 변이성이 특정 기준 이상인 유전자만 선택됨.
✅ 장점
변이성이 기준 이상인 유전자만 선택하므로, 특정 실험 조건에서 중요할 가능성이 높은 유전자를 자동으로 필터링할 수 있음.HVG 선택 이후 - - - - - - - - - - - - - - - - - - - - - - - - - -
1. 특정 요인의 영향 제거 ( sc.pp.regress_out() )
- 총 발현량 및 미토콘드리아 비율의 영향 제거2. 데이터 스케일 ( sc.pp.scale() )
- 모든 유전자의 변동성이 비슷한 수준으로 정규화
3. 이후 umap, clustering.. 진행
📌 Batch Effect 제거Batch 효과란?
실험 조건, 장비, 시간 등의 기술적 요인으로 발생하는 비생물학적 변이
여러 실험 데이터를 통합, 비교분석 시에 필요
- Harmony, BBKNN, ComBat, SCTransform, MNN-correct, Scanorama 등의 방법을 사용할 수 있음
# [1] Harmony import scanpy as sc import harmonypy as hm # obs의 sample에 근거하여 pca 값을 재구성 adata_harmony.obsm["X_pca_harmony"] = hm.run_harmony( adata_harmony.obsm['X_pca'],adata_harmony.obs, "sample").Z_corr.T # [2] BBKNN import bbknn bbknn.bbknn(adata_bbknn, batch_key="sample") # BBKNN 적용 (PCA 변경 없이 KNN 그래프 수정) # [3] Combat from combat.pycombat import pycombat sc.pp.combat(adata_combat, key="sample_id") # adata.X의 값을 바꿈
✅ 1. Harmony를 이용한 Batch Effect 제거
Harmony는 PCA 공간에서 batch effect를 조정하여 샘플 간 클러스터가 더 섞이도록 보정, 빠르고 효과적
: pca 공간에서 clustering을 수행하고, 각 cluster 내에서 batch 간 차이를 최소화하는 선형 변환을 계산
=> (클러스터링-선형 변환)을 수렴할 때까지 반복
- 새로운 batch-corrected PCA(X_pca_harmony)를 반환 PCA 값 변경✅ 2. BBKNN (Batch-Balanced KNN) 이용
BBKNN은 기존 KNN 그래프를 batch-aware 방식으로 보정
: 각 batch 내에서 knn을 찾고, batch 간 knn을 찾아 연결하고, batch-aware한 knn 그래프 구성
BBKNN은 batch effect를 줄이면서도 local structure를 유지하는 방식
-.obsp["distances"] 및 .obsp["connectivities"]가 변경됨 PCA 값 유지, KNN 수정
✅ 3. ComBat (Combat) 이용
ComBat은 batch effect를 제거하는 통계적 방법
ComBat은 batch effect를 강력하게 제거하지만, 생물학적 변이를 너무 강하게 조정할 수도 있음
-adata.X 를 변경 count matrix 값 변경
Harmony 빠르고 효과적인 보정 PCA 공간에서 batch effect 조정 대부분의 scRNA-seq 데이터 BBKNN Graph-based batch effect 제거 KNN 그래프 보정 후 UMAP 수행 Local structure 유지 필요할 때 ComBat 통계적 보정 PCA 후 batch effect 조정 강력한 batch effect 제거 필요할 때 ✔ 추천 방법:
- 샘플 간 batch effect가 크다면 Harmony or BBKNN을 우선 적용
- 강력한 보정이 필요하면 ComBat
📌 차원축소 & 클러스터링 : PCA / KNN / UMAPimport igraph sc.pp.pca(adata_pdo_hvg) sc.pp.neighbors(adata_pdo_hvg) sc.tl.leiden(adata_pdo) # clustering sc.pl.umap(adata_pdo_hvg, color="leiden", legend_loc="on data") ## (참고) KNN 시의 기본 설정 변경 sc.pp.neighbors(adata_pdo_hvg, n_neighbors=20, metric="cosine") print(adata_pdo_hvg.uns["neighbors"]) {'connectivities_key': 'connectivities', 'distances_key': 'distances', 'params': {'n_neighbors': 15, 'method': 'umap', 'metric': 'euclidean'}}
sc.pp.pca()
- 데이터의 차원 축소
sc.pp.neighbors()
- single-cell 데이터에서 KNN(최근접 이웃) 그래프를 계산하는 함수
- 결과는 .obsp (sparse matrix)와 .uns (metadata dictionary)에 저장
1️⃣ .obsp["distances"]
- KNN 그래프에서 유사도(거리) 행렬을 저장
- 값이 작을수록 가까운 이웃을 의미
2️⃣ .obsp["connectivities"]
- KNN 그래프에서 연결 행렬(인접 행렬)을 저장합니다.
- 1에 가까울수록 강한 연결을 의미
3️⃣ .uns["neighbors"]
- KNN 그래프의 주요 정보(설정값)를 저장
sc.tl.leiden()
- PCA 및 KNN 그래프를 기반으로 single-cell RNA 데이터의 클러스터링을 수행하는 함수
*anndata 객체의 view
- AnnData 객체에서 .X, .obs, .var 등을 부분적으로 참조하는 상태로,
원본 데이터를 직접 수정하지 않고 메모리를 절약하는 방식. - 즉, 새로운 복사본을 만들지 않고 기존 데이터의 일부를 "참
set 자료형의 합집합
1. 파이프 연산자 (a|b)
2. .union 사용
'Bio-info > analysis' 카테고리의 다른 글
single cell analysis - after cell type annotation (0) 2025.03.05 single cell 분석 - cluster 개수 정하기 (0) 2025.03.05 single cell - spatial transcription analysis (0) 2023.03.29 GSEA 분석 (0) 2023.03.10 - 유전자 변이(분산) 계산