この記事のゴール
1つの液滴に2細胞が入って「1個の細胞」として記録されてしまったダブレットを、普通のPCで動く scrublet で見つけて除き、後の解析が惑わされないようにすること。
0. ダブレットとは/なぜ問題なのか
10x などの液滴法では、確率的に2つ以上の細胞が同じ液滴に入ることがあります。これがダブレット(doublet、2細胞)/マルチプレット(multiplet、3細胞以上)です。2細胞の発現が1つのバーコードに混ざって記録されるため、実在しない発現プロファイルが生まれます。
たとえば T細胞と B細胞が1つの液滴に入ると、両方のマーカー遺伝子が同時に検出される細胞ができます。これは実在しないのに、クラスタリングで「新しい細胞型」として現れ、解析を惑わせます。具体的には、
- 存在しない「中間的な細胞型」のクラスタを作る
- 細胞型アノテーションや差次的発現遺伝子(DEG、differentially expressed genes)解析を歪める
一般に、たくさんの細胞を詰め込むほどダブレット率は上がります(例:数%〜10%超)。
💡 見つけやすいダブレット・見つけにくいダブレット
– ヘテロタイプ(heterotypic)=違う細胞型どうし:混ざるとプロファイルが大きく変わるので見つけやすい
– ホモタイプ(homotypic)=同じ細胞型どうし:同じ細胞型を2つ足しても1細胞とほぼ同じプロファイルになり、区別する手がかりが無いので検出できない
現在の手法はおもにヘテロタイプを検出し、ホモタイプは取りこぼします。「全部は除けない」前提で使います。
1. いつ・どの単位で検出するか(原則:サンプルごと)
⚠️ 落とし穴:複数サンプルを混ぜてから検出してはいけない
多くの手法は「人工的にダブレットを作って比較」します(次節)。複数サンプルを混ぜたデータでこれをやると、サンプル間の差をダブレットと誤認しやすくなります。ダブレットは各サンプルの中で起きる現象なので、サンプルごとに検出するのが鉄則です(Heumos et al., 2023)。
scrublet は scVI(single-cell variational inference)などを必要とせず単独で動くので、統合の前に、QC 直後のサンプルごとに実行できます(これが GPU 不要で手軽な理由です)。
2. scrublet で検出する
仕組み
scrublet は、次の手順でダブレットらしさを数値化します(Wolock et al., 2019)。
- 手元の細胞をランダムに2個ずつ足し合わせ、人工的なダブレットを大量に生成する(シミュレーション)
- 観測された各細胞が、その人工ダブレットにどれだけ似ているかを k近傍(kNN、k-nearest neighbors:近いものを探す方法) で評価し、ダブレットスコアにする
- スコアの分布は、通常二峰性(シングレットの山とダブレットの山)になる。閾値で右側をダブレットと判定する
深層学習を使わず高速で、Scanpy に sc.pp.scrublet として組み込まれています。
コード(サンプルごとに実行)
各サンプルに対して scrublet を回し、ダブレットの印(スコアと判定)を付けます。
pythonimport scanpy as sc
# adatas: {サンプル名: QC済みAnnData}(QCの記事の出力)をサンプルごとに処理
for label, a in adatas.items():
sc.pp.scrublet(a, random_state=0) # obs に doublet_score / predicted_doublet を付与
n_dbl = int(a.obs["predicted_doublet"].sum())
print(f"[{label}] predicted doublets: {n_dbl} / {a.n_obs}")
# 例:1サンプルでダブレットを除去
a = adatas["Ctrl1"]
a_singlet = a[~a.obs["predicted_doublet"]].copy()
print("除去後:", a_singlet.n_obs)
💡 自動判定(predicted_doublet)を鵜呑みにしない
predicted_doublet(True/False)は、scrublet が自動で引いた閾値の結果です。スコアのヒストグラムを描いて、山が2つ(シングレットの山とダブレットの山)に分かれているかを確認するのがおすすめ。分かれていなければ、閾値を手動で調整するか、他の手法と突き合わせます。
スコアのヒストグラムは次のように描いて確認できます。
pythonimport matplotlib.pyplot as plt
plt.hist(a.obs["doublet_score"], bins=50)
plt.xlabel("doublet score"); plt.ylabel("cells"); plt.show()
📌 除去のしすぎに注意
除去後に、本物の希少な細胞型まで一緒に消えていないかを確認します。クラスタが不自然に減っていないか、目で点検してください。
3. もう一方の選択肢:AI 手法の SOLO(GPU 必須)
ダブレット検出にはもう一つ、scVI を土台にした深層学習手法 SOLO があります(詳細は別記事 ダブレット検出:SOLO(GPU必須のAI手法) で解説)。scVI を統合に使っているなら、その資産をそのまま活かせますが、GPU が必要です。
📌 どちらを選ぶか(詳しくは 全体像の記事)
– GPU が無い・手早く・統合前に検出したい → 本記事の scrublet
– すでに scVI を組んでいる(GPU 利用) → SOLO(別記事)
– 重要な解析では2手法を併用し、両方がダブレットと判定した細胞だけを優先的に除く保守的な運用も有効です(Xi & Li, 2021)。
まとめ
- ダブレットは「存在しない中間細胞型」を生む人工物(2細胞が1つのバーコードに記録された偽物)。サンプルごとに検出するのが原則。
- scrublet は単独・高速・普通のPCで完結。統合の前に実行できる。仕組みは「人工ダブレットを作り、それへの近さでスコア化 → 二峰性の分布を閾値で分ける」。
- 自動判定は万能でない(スコア分布を目で確認)、ホモタイプは取りこぼす、除去しすぎに注意。
- GPU が使え scVI を組んでいるなら SOLO(別記事) も選択肢。
次の記事:正規化・特徴選択・次元削減・クラスタリング — きれいな細胞集団が揃ったら、正規化・HVG・次元削減・クラスタリングを整理します。
関連記事
- 📖 scRNA-seqの前処理 入門 ─ 全体像と進め方 … このシリーズの全体像(ハブ)
- 📖 データの読み込みと品質管理(QC) … 前提(入力データ)
- 📖 サンプル統合:Harmony(古典) / 📖 scVI(AI) … 統合(前の段階)
- 📖 ダブレット検出:SOLO(AI・GPU) … 本記事の対になる手法
- 📖 正規化・特徴選択・次元削減・クラスタリング … 次の段階
- 📖 AnnDataのデータ構造 / 📖 scvi-tools の全体像 … 土台・AI手法の地図
参考文献
- Wolock, S. L., Lopez, R., & Klein, A. M. (2019). Scrublet: Computational Identification of Cell Doublets in Single-Cell Transcriptomic Data. Cell Systems, 8(4), 281–291. doi:10.1016/j.cels.2018.11.005
- 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


コメント