scATAC-seq の次元削減とクラスタリング ─ なぜ PCA ではないのか

scATAC-seq
📚 この記事について
ほぼ二値・超スパースな行列を、細胞のまとまりが見える低次元表現に変える工程です。ツールごとに手法が違う点を正確に押さえます。
🔙 前の記事scATAC-seq のピークコール
🔜 次の記事scATAC-seq の統合・バッチ補正
📌 前提タイル行列の作成と特徴選択(select_features)が済んでいること

scATAC-seq(single-cell ATAC-seq/核を使う場合は snATAC-seq)の次元削減では、疎で二値的な行列を低次元に圧縮してクラスタリングします。scRNA-seqではPCA→UMAPで次元削減しますが、scATAC-seqではPCAを行いません。ここでは「なぜ PCA を使わないのか」と、ツールごとの違いを正確に押さえます。

1. なぜ PCA をそのまま使わないのか


scATAC-seq の行列は値がほぼ 0/1 で極端に疎です。この形に PCA を当てると、第1軸が細胞型ではなくシーケンス深度(総フラグメント数)を拾ってしまい、さらに中心化でスパース性が壊れて計算も重くなります。そこで scATAC-seqでは、疎で二値的な行列に合った別の次元削減を使います。

2. 3ツールのアプローチは似て非なるもの


このscATAC-seqの次元削減工程は一般に「TF-IDF/LSI」と呼ばれますが、ツールごとに中身が違います。ここは正確に区別しておくと後で混乱しません。

ツール 重み付け 次元削減 性質
Signac TF-IDF SVD(=LSI) 線形
ArchR TF-IDF 反復LSI 線形・反復
SnapATAC2 IDF spectral embedding 非線形・matrix-free

Signac と ArchR は LSI(TF-IDF で重み付け → SVD で圧縮)系です。一方 SnapATAC2 は、IDF で重み付けした後に spectral embedding(スペクトル埋め込み) という非線形の次元削減を使います。目的は同じ(疎な行列を低次元にする)ですが、アルゴリズムが異なります(SnapATAC2:Zhang et al., Nature Methods, 2024/LSIの起源:Cusanovich et al., Science, 2015)。

💡 spectral embedding とは
セル間の類似度からグラフを作り、その構造(グラフラプラシアンの固有ベクトル)から低次元表現を得る手法です。SVDのような線形の圧縮ではなく非線形で、cosine距離を使う実装は細胞数に対して線形時間でスケールします。これが SnapATAC2 の高速・大規模の理由です。

3. 深度成分の扱いは「ツールで違う」


⚠️ 第1成分を落とすのは LSI(Signac / ArchR)の話
LSI では第1成分がシーケンス深度と強く相関しやすく、除外するのが慣例です。しかし SnapATAC2 の spectral embedding は各成分を固有値で重み付けするため、手動で第1成分を落とす操作は基本的に不要です。「第1成分を除外」を SnapATAC2 にそのまま持ち込まないよう注意してください。

4. クラスタリングまでの流れ


次元削減さえ済めば、その後は scRNA-seq とほぼ同じです。低次元表現から KNN グラフを作り、Leiden でクラスタリングし、UMAP で可視化します。

図:タイル行列 → spectral embedding → KNN → Leiden → UMAP の流れ
図:タイル行列 → spectral embedding → KNN → Leiden → UMAP の流れ

5. コード:SnapATAC2


python
# 前提:add_tile_matrix → select_features 済み

# 1. スペクトル埋め込み(次元削減)→ obsm['X_spectral']
snap.tl.spectral(data)

# 2. KNNグラフ → Leiden クラスタリング(obs['leiden'])
snap.pp.knn(data)
snap.tl.leiden(data)

# 3. UMAPで可視化
snap.tl.umap(data)
snap.pl.umap(data, color="leiden")

結果は obsm['X_spectral'](次元削減後の表現)、obs['leiden'](クラスタ)、obsm['X_umap'](可視化座標)に入ります。この leiden クラスタが、次のピークコールや細胞型アノテーションの単位になります。

6. 注意点


  • select_features を先に:spectral は選択済みの特徴量を使うので、add_tile_matrix → select_features → spectral の順で。
  • クラスタの粗さは resolution で調整tl.leidenresolution を上げると細かく、下げると粗く分かれます。
  • 成分数(n_comps):既定でおおむね十分ですが、大きなデータでは増やすと分離が良くなることがあります。
  • UMAPは可視化専用:クラスタリングは UMAP座標ではなく、KNNグラフ(=X_spectral由来)で行います。UMAP上の見た目だけで判断しないこと。

まとめ


  • ほぼ二値・超スパースなので PCAは不向き。ATAC専用の次元削減を使う。
  • Signac/ArchR=LSI(線形)/SnapATAC2=spectral embedding(非線形)。目的は同じでも中身が違う。
  • 「第1成分を落とす」は LSI の話。SnapATAC2 では不要。
  • 次元削減後は KNN → Leiden → UMAP で、RNAとほぼ同じ。

関連記事


参考文献


  • Cusanovich, D. A., Daza, R., Adey, A., et al. (2015). Multiplex single-cell profiling of chromatin accessibility by combinatorial cellular indexing. Science, 348(6237), 910–914. doi:10.1126/science.aab1601
  • Zhang, K., Zemke, N. R., Armand, E. J., & Ren, B. (2024). A fast, scalable and versatile tool for analysis of single-cell omics data. Nature Methods, 21(2), 217–227. doi:10.1038/s41592-023-02139-9
  • Traag, V. A., Waltman, L., & van Eck, N. J. (2019). From Louvain to Leiden: guaranteeing well-connected communities. Scientific Reports, 9, 5233. doi:10.1038/s41598-019-41695-z

コメント

タイトルとURLをコピーしました