この記事のゴール
1つの液滴に2細胞が入って「1個の細胞」として記録されたダブレットを、scVI を土台にした SOLO で見つけて除くこと。統合で scVI を使っているなら、その学習済みモデルをそのまま活かせます。
0. ダブレットとは/なぜ問題なのか
10x などの液滴法では、確率的に2細胞以上が同じ液滴に入ることがあります(ダブレット/マルチプレット)。2細胞の発現が1つのバーコードに混ざって記録されます。
たとえば T細胞と B細胞が混ざると、両方のマーカー遺伝子を持つ細胞ができます。これは実在しないのに、クラスタリングで「新しい細胞型」として現れ、細胞型アノテーションや差次的発現遺伝子(DEG、differentially expressed genes)解析を歪めます。
💡 見つけやすい・見つけにくいダブレット
違う細胞型どうし(ヘテロタイプ)は混ざるとプロファイルが大きく変わるので見つけやすい。同じ細胞型どうし(ホモタイプ)は1細胞とほぼ同じプロファイルになり、区別する手がかりが無いので取りこぼします。「全部は除けない」前提で使います。
⚠️ 原則:検出はサンプル(バッチ)ごと
ダブレットは各サンプルの中で起きる現象です。混ぜずに、バッチごとに検出します(Heumos et al., 2023)。SOLO は後述の restrict_to_batch でこれを担保します。
1. SOLO の前提と仕組み
📖 関連:土台の scVI のモデル全体像は scvi-tools の全体像、統合での使い方は サンプル統合:scVI を参照。本記事は SOLO の仕組みと、統合パイプラインでの使い方(オプション・落とし穴・scrublet との比較)を扱います。
仕組み
SOLO は、学習済みの scVI を土台に、「単一細胞かダブレットか」を見分ける分類器(ニューラルネット)を追加で学習させる手法です(Bernstein et al., 2020)。手順は次のとおりです。
- 観測細胞に加えて、カウント空間で人工的なダブレットを生成する(2細胞のカウントを足し合わせる)
- それらを学習済み scVI の潜在表現に写像する(バッチ補正済みの特徴空間)
- その潜在表現を入力に、シングレット vs ダブレットを判別する分類器を学習する
- 各細胞にダブレット確率が付き、閾値で判定する
scrublet との違いは、単純な距離(k近傍)ではなく、scVI が学習した潜在表現と専用の分類器を使う点です。潜在空間では、ダブレットは元になった細胞型の中間に位置しやすく、分類器はその領域を学習します。scVI を土台にするため GPU が前提です。
コード(バッチごとに実行)
「統合:scVI」で学習済みの scVI モデルを使い、バッチごとに SOLO を回して判定を集めます。
pythonimport scvi
import pandas as pd
def detect_doublets_solo(scvi_model, batches):
"""各バッチで SOLO を学習し、singlet/doublet 予測を結合して返す。"""
preds = []
for b in batches:
# ★ ダブレットはバッチ内現象なので restrict_to_batch でバッチごとに
solo = scvi.external.SOLO.from_scvi_model(scvi_model, restrict_to_batch=b)
solo.train()
p = solo.predict(soft=False) # 'singlet' / 'doublet'
p.index = p.index.str.replace(r"-0$", "", regex=True) # SOLO付与のサフィックス除去
preds.append(p)
return pd.concat(preds)
# 「統合:scVI」の記事で学習済みの scVI モデル(model)とバッチラベルを使う
solo_pred = detect_doublets_solo(model, batches=["Ctrl", "Treat"])
adata.obs["solo"] = solo_pred[adata.obs.index]
print(adata.obs["solo"].value_counts())
# singlet のみ残す
adata = adata[adata.obs["solo"] == "singlet"].copy()
print("除去後:", adata.n_obs)
📌 除去のあとは「やり直し」が望ましい
ダブレットを除くと細胞集団が変わるため、高変動遺伝子(HVG、highly variable genes)選択や次元削減が前の結果に引きずられます。生カウントから HVG → scVI を再実行すると、よりクリーンな結果が得られます。
2. GPU 環境について
SOLO は内部で scVI ベースのモデルを使うため、実用上 GPU が必須です。手元に GPU が無い場合は、統合(scVI)からこのステップまでを Google Colab(無料の GPU ランタイム)やクラウド GPU でまとめて実行するのが現実的です。GPU が使えないなら、普通のPCで完結する scrublet(別記事) を選んでください。
3. もう一方の選択肢:CPU で完結する scrublet
GPU が無い、または scVI を使わない場合は、単独で動く古典手法 scrublet(人工ダブレットを作って k近傍でスコア化)が手軽です(📖 詳しくは ダブレット検出:scrublet 記事)。統合の前に、サンプルごとに実行できます。
📌 どちらを選ぶか(詳しくは 全体像の記事)
– すでに scVI を組んでいる(GPU 利用) → 本記事の SOLO
– GPU が無い・手早く・統合前に検出したい → scrublet(別記事)
– 重要な解析では2手法を併用し、両方が doublet と判定した細胞だけを優先的に除く保守的な運用も有効です(Xi & Li, 2021)。
まとめ
- SOLO は学習済み scVI の潜在表現を特徴に、分類器(ニューラルネット)でダブレットを判別する。統合で scVI を使っているなら自然に繋がるが、GPU 必須。
restrict_to_batchでバッチごとに検出。除去のあとは生カウントからやり直し(HVG → scVI 再実行)が望ましい。- ホモタイプは取りこぼす、除去しすぎに注意。GPU が無いなら scrublet(別記事) を。
次の記事:正規化・特徴選択・次元削減・クラスタリング — きれいな細胞集団が揃ったら、正規化・HVG・次元削減・クラスタリングを整理します。
関連記事
- 📖 scRNA-seqの前処理 入門 ─ 全体像と進め方 … このシリーズの全体像(ハブ)
- 📖 サンプル統合:scVI(AI・GPU) … SOLO の土台(前の記事)
- 📖 ダブレット検出:scrublet(古典・CPU) … 本記事の対になる手法
- 📖 正規化・特徴選択・次元削減・クラスタリング … 次の段階
- 📖 AnnDataのデータ構造 / 📖 scvi-tools の全体像 … 土台・AI手法の地図
参考文献
- Bernstein, N. J., Fong, N. L., Lam, I., et al. (2020). Solo: Doublet Identification in Single-Cell RNA-Seq via Semi-Supervised Deep Learning. Cell Systems, 11(1), 95–101. doi:10.1016/j.cels.2020.05.010
- Xi, N. M., & Li, J. J. (2021). Benchmarking Computational Doublet-Detection Methods for Single-Cell RNA Sequencing Data. Cell Systems, 12(2), 176–194. doi:10.1016/j.cels.2020.11.008
- 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


コメント