ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • single-cell analysis
    Bio-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 selection

    sc.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 / UMAP

     

    import 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
Designed by Tistory.