この記事のゴール
クラスタに依らず、細胞が使う「プログラム」(identity/activity)や遺伝子モジュールを取り出す考え方を理解し、cNMF と Hotspot を使い分けられること。
なぜクラスタリングだけでは足りないか
クラスタリングは各細胞を1つの型に割り当てます。しかし細胞は、細胞型を決めるプログラム(identity)と、状態を表すプログラム(activity:細胞周期・低酸素・刺激応答など)を同時に発現しえます。クラスタリングは identity は捉えても、重なり合う activity を分離できません。
💡 identity と activity
「この細胞は興奮性ニューロンで、いま細胞周期に入っていて、軽く低酸素応答もしている」――こうした重なりは、1細胞=1型のクラスタリングでは表せません。プログラム分解はこれを別々の成分として取り出します。
2つの捉え方
- cNMF(プログラム分解):発現行列を「プログラム(遺伝子の重み)× 細胞ごとの使用度」に分解。identity と activity のプログラムを取り出す。
- Hotspot(遺伝子モジュール):k-NN グラフ上で自己相関する(似た細胞どうしで揃って動く)遺伝子を集めてモジュールにする。
cNMF(プログラム分解)
cNMF はコンセンサス非負値行列分解です。発現行列を K 個のプログラム(GEP)と細胞ごとの使用度に分解します。NMF は実行ごとに解がぶれるため、多数回実行して統合(コンセンサス)し、安定なプログラムを得ます。
pythonfrom cnmf import cNMF
# 1) 準備:カウント行列(h5ad)と試す K の範囲を指定
cnmf_obj = cNMF(output_dir="./cnmf", name="run1")
cnmf_obj.prepare(counts_fn="counts.h5ad", components=[8, 10, 12], n_iter=100)
# 2) 多数回 NMF を実行 → 3) 統合 → 4) コンセンサス(K を選ぶ)
cnmf_obj.factorize(worker_i=0, total_workers=1)
cnmf_obj.combine()
cnmf_obj.k_selection_plot() # K 選択の目安を見る
usage, spectra, top_genes, _ = cnmf_obj.consensus(k=10, density_threshold=0.1)
# usage: 細胞 × プログラム使用度
# spectra: プログラム × 遺伝子(GEP)
🔧 環境メモ:pip install cnmf。入力は正規化前の生カウント(0 カウントの細胞・遺伝子は事前に除く)。K(プログラム数)の選択は再構成誤差や安定性の目安(k_selection_plot)で決めますが、やや主観的なので複数 K を見ます。得られたプログラムは機能エンリッチメントで意味づけします。
Hotspot(遺伝子モジュール)
Hotspot は、似た細胞どうしで揃って変動する遺伝子(自己相関の高い遺伝子)を見つけ、遺伝子モジュールにまとめます。細胞をクラスタリングせずにモジュールを得られます。
pythonimport hotspot
# k-NN グラフ上で自己相関する遺伝子 → モジュール
hs = hotspot.Hotspot(adata, model="danb", latent_obsm_key="X_scVI")
hs.create_knn_graph(n_neighbors=30)
hs_results = hs.compute_autocorrelations() # 情報量のある遺伝子
hs_genes = hs_results.index[hs_results.FDR < 0.05]
local_corr = hs.compute_local_correlations(hs_genes)
modules = hs.create_modules(min_gene_threshold=20, fdr_threshold=0.05)
🔧 環境メモ:pip install hotspot(hotspotsc)。model="danb" は生カウント向き。latent_obsm_key には統合表現(例:scVI 潜在空間)を渡すと、バッチに頑健なモジュールが得られます。
ツール早見表
| ツール | 言語 | 出力 | 特徴 |
|---|---|---|---|
| cNMF | Python | プログラム(GEP)+使用度 | identity/activity を分解・コンセンサスで安定 |
| Hotspot | Python | 遺伝子モジュール | グラフ自己相関・クラスタ不要 |
| WGCNA / hdWGCNA | R | 共発現モジュール | バルク由来・scRNA-seq 拡張あり |
| NMF(scikit-learn) | Python | 成分 | 単発 NMF(コンセンサスなし) |
落とし穴
⚠️ つまずきやすい点
– プログラム ≠ クラスタ:1細胞は複数プログラムを使う。割り当てではなく使用度で考える。
– K の選択(cNMF):主観が入る。複数 K を比較し、生物学的な解釈可能性で選ぶ。
– 確率的(cNMF):単発 NMF はぶれる。コンセンサスで安定化。
– 解釈にはエンリッチメント:プログラム・モジュールは遺伝子集合。機能エンリッチメントで意味づけする。
– グラフ依存(Hotspot):モジュールは k-NN グラフに依存。統合表現を使う。
– 前段の品質依存:低品質・ダブレット・バッチが残るとプログラムが汚れる。
まとめ
- クラスタリングは細胞を1つの型に割り当てるが、細胞は identity と activity のプログラムを同時に発現しうる。プログラム分解はこれを分離する。
- cNMF:発現をプログラム(GEP)× 使用度に分解。コンセンサスで安定化、K の選択に注意。
- Hotspot:グラフ自己相関で遺伝子モジュールを抽出。クラスタ不要。
- 得られたプログラム・モジュールは機能エンリッチメントで意味づけする。
次の記事:CNV 推定(文脈特化) — 主に腫瘍で、発現から大規模なコピー数異常を推定する方法に進みます。
関連記事
関連する手法・前後
- 📖 機能エンリッチメント:プログラム・モジュールの意味づけに使う
- 📖 遺伝子制御ネットワーク・転写因子活性(GRN):プログラムの背後の制御(前の記事)
- 📖 CNV 推定(文脈特化):次の記事
基盤・位置づけ
- 📖 scVI によるサンプル統合・バッチ補正:Hotspot が使う
X_scVI統合表現の作り方 - 📖 下流解析の全体像:下流解析全体の地図
参考文献
- Kotliar, D., Veres, A., Nagy, M. A., et al. (2019). Identifying gene expression programs of cell-type identity and cellular activity with single-cell RNA-Seq. eLife, 8, e43803. doi:10.7554/eLife.43803
- DeTomaso, D., & Yosef, N. (2021). Hotspot identifies informative gene modules across modalities of single-cell genomics. Cell Systems, 12, 446–456. doi:10.1016/j.cels.2021.04.005
- Langfelder, P., & Horvath, S. (2008). WGCNA: an R package for weighted correlation network analysis. BMC Bioinformatics, 9, 559. doi:10.1186/1471-2105-9-559
- Heumos, L., Schaar, A. C., Lance, C., et al. (2023). Best practices for single-cell analysis across modalities. Nature Reviews Genetics, 24, 550–572. doi:10.1038/s41576-023-00586-w


コメント