シーケンス型 空間トランスクリプトーム:細胞型を割り当てる(全体像)─ 返ってくるのはラベルではなく割合

Spatial transcriptome
📚 この記事について
前処理が終わったフィーチャに、細胞型を割り当てる工程の全体像です。scRNA-seq のアノテーションと何が根本的に違うのか、どの手法を選ぶのか、結果をどう検証するのかを整理します。個別の手法は、ここから各記事へ分かれます。
🔙 前の記事:シーケンス型 空間トランスクリプトーム:正規化とクラスタリング
🔜 次の記事:シーケンス型 空間トランスクリプトーム:デコンボリューションの原理と手法分類
📌 前提scRNA-seq解析:細胞型アノテーション手法の全体像AnnData のデータ構造

空間トランスクリプトーム解析(spatial transcriptomics)のうちシーケンス型(Visium・Stereo-seq など NGS で読み出す方式)は、細胞型の割り当てが、scRNA-seq とはまったく別の問題になります。scRNA-seq では、1個の細胞に1つのラベルを付ければ終わりでした。シーケンス型では、1つのフィーチャに複数の細胞型が混ざっているので、返ってくるのはラベルではなく割合です。この違いは、下流解析のすべてに波及します。

1. 返ってくるのは、ラベルではなく割合


図:返ってくるのは、ラベルではなく割合
図:返ってくるのは、ラベルではなく割合

scRNA-seq のアノテーションは、クラスタに1つの名前を付ける作業でした。obs に文字列が1つ入って終わりです。

シーケンス型では、1つのフィーチャに対して「T細胞 0.4、腫瘍細胞 0.3、B細胞 0.2、線維芽細胞 0.1」というベクトルが返ります。obs ではなく obsm に、行列として入ります。

python
# デコンボリューションが返すのは、ラベルではなく行列
prop = adata.obsm["cell_type_proportions"]
print(prop.shape)      # (フィーチャ数, 細胞型の数)
print(prop.sum(axis=1)[:5])  # 各行の合計は 1

# 「最も多い細胞型」で代表させることはできるが、情報は捨てている
adata.obs["dominant"] = prop.idxmax(axis=1)

# 割合をそのまま組織の上に描くほうが、情報を失わない
for ct in prop.columns[:4]:
    adata.obs[ct] = prop[ct].values
sq.pl.spatial_scatter(adata, color=list(prop.columns[:4]), shape=None)
⚠️ 「最も多い細胞型」で代表させると、情報を捨てることになる
割合ベクトルから最大値の細胞型を取り出して obs に入れれば、scRNA-seq と同じように扱えます。実際、そうしている解析をよく見ます。しかしこれは、0.4 と 0.3 の差しかないフィーチャを、0.9 と 0.05 のフィーチャと同じ扱いにする操作です。「腫瘍と免疫細胞が混ざり合う境界領域」という、空間データでいちばん面白い場所の情報が、まさにここで消えます。可能なかぎり、割合のまま下流に渡してください。

2. 3つのルート ─ 解析単位で決まる


どの手法を使うかは、解析単位で決まります。前処理の段階で単位が決まっていれば、ここは自動的に定まります。

解析単位 1フィーチャの中身 手法 返るもの
55 µm スポット(Visium) 1〜10 細胞 デコンボリューション 細胞型ごとの割合、または細胞数
10 µm ビーズ(Curio Seeker) 1〜2 細胞 ダブレット分離(RCTD の doublet モード) 1〜2 個の細胞型
再構成した細胞(bin2cell / CellBin) 1 細胞(+混入) 参照ベースのアノテーション 1つのラベル(ただし混入は残る)
粗いビン(8 µm / bin50) 数細胞 デコンボリューション 割合
⚠️ 細胞に組み立てても、混入はなくならない
bin2cell や CellBin で細胞に組み立てた場合、「もう1細胞なのだから scRNA-seq と同じ」と考えたくなります。しかし、セグメンテーションは完璧ではありません。隣の細胞の転写産物が混ざり込むこと(spillover)は必ず起きます。組み立てた細胞に対しても、混合を明示的に扱う手法が有効な場面があります。「細胞に組み立てたから、混合の問題は終わった」とは考えないでください。

3. 割合か、絶対量か ─ 見落とされやすい違い


手法によって、返ってくるものの意味が違います。ここは選択の分かれ目です。

図:割合だけでは、細胞密度の違いが消える
図:割合だけでは、細胞密度の違いが消える

割合(proportion)を返す手法では、各フィーチャの値の合計が 1 になります。細胞が 2 個しかない場所と、20 個詰まっている場所が、まったく同じ「0.5 / 0.5」になります。細胞密度の情報が、正規化されて消えます。

絶対量(abundance)を返す手法──代表は cell2location(Kleshchevnikov et al., Nature Biotechnology, 2022)──は、細胞型ごとの細胞数そのものを推定します。2 個の場所は (1, 1)、20 個の場所は (10, 10)。密度の違いが残ります。

python
# cell2location は、細胞型ごとの「細胞数」を推定する
abund = adata.obsm["q05_cell_abundance_w_sf"]
print(abund.iloc[:3])
#          T細胞   B細胞   腫瘍細胞
# spot_1    1.2     0.4      1.1
# spot_2   10.3     3.8     10.5

# 割合に直すこともできるが、逆はできない
prop = abund.div(abund.sum(axis=1), axis=0)

# 「そこに何個の細胞がいるか」を問うなら、絶対量のまま扱う
adata.obs["n_cells_total"] = abund.sum(axis=1).values
sq.pl.spatial_scatter(adata, color="n_cells_total", shape=None)
💡 前処理で見た話と、まっすぐ繋がる
総カウントには「そこにいる細胞の数」という生物学が入っている、というのが正規化の記事で見た話でした(Bhuva et al., Genome Biology, 2024)。割合だけを返す手法は、その情報を最後にもう一度捨てることになります。「どの領域に、どの細胞型が、どれだけ集積しているか」を問うなら、絶対量を推定する手法を選んでください。逆に、組成の比較だけが目的なら、割合で十分です。

4. 参照 scRNA-seq が、結果の天井を決める


デコンボリューションは、参照にある細胞型の中から割り当てます。参照にない細胞型は、どうなるのか。

図:参照にない細胞型は、消えるのではなく、別の型として現れる
図:参照にない細胞型は、消えるのではなく、別の型として現れる

消えるのではありません。いちばん近い別の型に押し込まれます。組織にマクロファージがいるのに参照に入っていなければ、そのシグナルは T細胞や腫瘍細胞として計上されます。結果として、いるはずのない場所に、いるはずのない細胞型が出ます

参照の問題 何が起きるか
細胞型が欠けている いちばん近い別の型に押し込まれる。偽の空間パターンが出る
解像度が粗い(T細胞としかない) CD4 / CD8 / 制御性 T細胞 は区別できない
別の組織・別の条件から取った 発現プロファイルがずれ、割り当てが systematically 偏る
プラットフォームが違う 検出される遺伝子セットが違う。共通遺伝子だけで推定することになる
⚠️ FFPE のデータに、新鮮凍結の参照を使うとき
Visium の FFPE 系(CytAssist、Visium HD)はプローブ捕捉で、対象はヒト・マウスのタンパク質コード遺伝子に限られます。一方、参照に使う scRNA-seq は多くの場合 poly-A 捕捉です。検出される遺伝子セットが違うので、デコンボリューションに使える遺伝子は、両者の共通部分だけになります。参照側で細胞型を分けていたマーカーが、空間側のプローブセットに無い、ということが実際に起こります。共通遺伝子の数を、必ず数えてください。

STdeconvolve の論文(Miller et al., Nature Communications, 2022)も、参照とST データが異なる摂動を受けている場合、その転写の違いがデコンボリューションの精度と生物学的解釈に影響する、と指摘しています。

5. 参照がないときは ─ 参照フリーという選択肢


適切な参照が存在しないことは、珍しくありません。非モデル生物、稀な組織、既知の細胞型で説明できない病態。

STdeconvolve(Miller et al., Nature Communications, 2022)は、参照なしでデコンボリューションを行います。自然言語処理で使われる潜在ディリクレ配分(LDA)を土台にした教師なし手法で、過分散な遺伝子を選び、フィーチャの中に潜む「トピック」を推定します。

論文の評価では、適切な参照がある場合には参照ベースの手法と同等、適切な参照がない場合には参照ベースを上回りうるとされています。

⚠️ 返ってくるのは「トピック」であって、名前のついた細胞型ではない
参照フリー手法の出力は、番号のついた潜在因子です。「これは T細胞だ」と判断するのは、あとから人間がやる作業になります。各トピックの上位遺伝子を見て、マーカーと照合して名前を付けます。つまり、手動アノテーションと同じ作業が、最後に残ります。また、細胞型の数(K)を先に決める必要があります。「参照が要らない」ことと「楽である」ことは、別です。

6. 手法の地図


手法 参照 返るもの 特徴
cell2location 必要 絶対量(細胞数) ベイズモデル。生のカウントを使う。細胞密度が残る
RCTD 必要 割合(重み) doublet / full / multi のモードをレジームで選ぶ
CARD 必要 割合 空間的に近いスポットの組成が似ることを利用する
SpatialDWLS 必要 割合 重み付き最小二乗を使う
Tangram 必要 対応づけ 細胞を空間に写像する。測っていない遺伝子の予測が得意
DestVI 必要 割合 scvi-tools 系。深層生成モデル
STdeconvolve 不要 トピックの割合 LDA ベース。K を先に決める。あとから名前を付ける

16 の手法を 45 の実データと 32 のシミュレーションで比較したベンチマーク(Li et al., Nature Methods, 2022)では、スポットのデコンボリューションでは cell2location・SpatialDWLS・RCTD が上位に、測っていない遺伝子の空間分布を予測する課題では Tangram・gimVI・SpaGE が上位でした。Spotless(Sang-aram et al., eLife, 2023)でも、RCTD と cell2location が総合的に上位に来ています。

用途が違えば、勝つ手法も違います。個々の手法の比較は次の記事で詳しく扱います。

7. 結果を検証する ─ マーカーを組織の上に投影する


デコンボリューションは、必ず何らかの答えを返します。参照が間違っていても、フィーチャの中身が想定と違っても、それらしい割合が返ってきます。だから、返ってきた結果を疑う工程が必ず要ります。

方法は1つです。マーカー遺伝子の発現を、そのまま組織の上に描く。そして、割り当てられた細胞型の分布と重なるかを見ます。

python
import scanpy as sc
import squidpy as sq

# 検証1:マーカーを「組織の上」に投影する
markers = {
    "T細胞": ["CD3D", "CD3E", "IL7R"],
    "B細胞": ["MS4A1", "CD79A"],
    "マクロファージ": ["CD68", "CD163"],
}
sq.pl.spatial_scatter(
    adata, color=["CD3D", "CD3E", "MS4A1", "CD68"],
    shape=None, ncols=2,
)

# 検証2:マーカーを UMAP に投影する(発現空間でも確かめる)
sc.pl.umap(adata, color=["CD3D", "CD3E", "MS4A1", "CD68", "leiden"], ncols=3)
# dotplot だけで済ませない。分布そのものを見る

見るべきことは3つです。

  • 他の領域も、同じマーカーを発現していないか。T細胞のマーカーが、T細胞がいないはずの領域でも高いなら、そのマーカーは特異的ではない。
  • その領域の全体で発現しているか、一部だけか、それとも弱いか。割り当てられた領域の一部でしかマーカーが出ていないなら、その領域は均一ではなく、さらに細かい構造を持っている可能性がある。
  • 複数の領域にまたがって発現しているマーカーはないか。あるなら、そのマーカーで区別しようとしていた細胞型は、分けられていない。

dotplot だけで済ませないでください。dotplot は「割り当て済みのグループごとの平均」を見ているので、割り当てが間違っていれば、間違いを裏付ける図が出るだけです。グループ分けを前提としない、生の分布を見てください。

python
import numpy as np

# 検証3:割り当てた細胞型と、マーカーの発現が一致しているか
for ct, genes in markers.items():
    if ct not in prop.columns:
        continue
    w = prop[ct].values
    hi = w > np.quantile(w, 0.9)   # その型が多い上位10%
    for g in genes:
        if g not in adata.var_names:
            continue
        x = adata[:, g].layers["lognorm"].toarray().ravel()
        print(ct, g, "高割合側の平均:", round(float(x[hi].mean()), 2),
              "それ以外:", round(float(x[~hi].mean()), 2))

# 高割合側でマーカーが高くなければ、その割り当ては信用できない
⚠️ 組織学的にありえない場所に、細胞型が出たら
たとえば、白質にしかないはずの細胞型が灰白質に出る。上皮にしかないはずの細胞型が間質に出る。こういう結果が出たときは、次の3つを疑ってください。(1) 参照に、その領域に本来いる細胞型が入っていない(欠けた型のシグナルが、近い型に押し込まれている)。(2) 隣接するフィーチャからの染み出し(spillover)(透過処理中の側方拡散、またはセグメンテーションの誤り)。(3) QC が甘い(組織検出の失敗や、技術由来の低カウント領域が残っている)。デコンボリューションのパラメータを触る前に、前処理に戻って確認してください。

8. このブロックの記事


まとめ


  • 返ってくるのはラベルではなく割合ベクトル。「最も多い細胞型」で代表させると、境界領域の情報が消える。
  • 割合か、絶対量か。割合だけでは細胞密度の違いが消える。cell2location は細胞数そのものを推定する。
  • 参照 scRNA-seq が結果の天井を決める。参照にない細胞型は消えるのではなく、いちばん近い別の型として現れる
  • FFPE のプローブ捕捉データに poly-A の参照を使うと、使える遺伝子は共通部分だけになる。共通遺伝子の数を必ず数える。
  • 参照がなければ STdeconvolve という道がある。ただし返るのはトピックであって、名前は自分で付ける。
  • 結果は必ず検証する。マーカーを組織の上と UMAP の両方に投影し、dotplot だけで済ませない。
  • 組織学的にありえない場所に細胞型が出たら、参照の欠落・spillover・QC の3つを疑い、前処理に戻る。

関連記事


参考文献


  • Kleshchevnikov, V., Shmatko, A., Dann, E., et al. (2022). Cell2location maps fine-grained cell types in spatial transcriptomics. Nature Biotechnology, 40(5), 661–671. doi:10.1038/s41587-021-01139-4
  • Cable, D. M., Murray, E., Zou, L. S., et al. (2022). Robust decomposition of cell type mixtures in spatial transcriptomics. Nature Biotechnology, 40(4), 517–526. doi:10.1038/s41587-021-00830-w
  • Miller, B. F., Huang, F., Atta, L., Sahoo, A., & Fan, J. (2022). Reference-free cell type deconvolution of multi-cellular pixel-resolution spatially resolved transcriptomics data. Nature Communications, 13(1), 2339. doi:10.1038/s41467-022-30033-z
  • Biancalani, T., Scalia, G., Buffoni, L., et al. (2021). Deep learning and alignment of spatially resolved single-cell transcriptomes with Tangram. Nature Methods, 18(11), 1352–1362. doi:10.1038/s41592-021-01264-7
  • Li, B., Zhang, W., Guo, C., et al. (2022). Benchmarking spatial and single-cell transcriptomics integration methods for transcript distribution prediction and cell type deconvolution. Nature Methods, 19(6), 662–670. doi:10.1038/s41592-022-01480-9
  • Sang-aram, C., Browaeys, R., Seurinck, R., & Saeys, Y. (2023). Spotless, a reproducible pipeline for benchmarking cell type deconvolution in spatial transcriptomics. eLife, 12, RP88431. doi:10.7554/eLife.88431
  • Bhuva, D. D., Tan, C. W., Salim, A., et al. (2024). Library size confounds biology in spatial transcriptomics data. Genome Biology, 25, 99. doi:10.1186/s13059-024-03241-7
  • Polański, K., Bartolomé-Casado, R., Sarropoulos, I., et al. (2024). Bin2cell reconstructs cells from high resolution Visium HD data. Bioinformatics, 40(9), btae546. doi:10.1093/bioinformatics/btae546
  • Wolf, F. A., Angerer, P., & Theis, F. J. (2018). SCANPY: large-scale single-cell gene expression data analysis. Genome Biology, 19, 15. doi:10.1186/s13059-017-1382-0
  • Palla, G., Spitzer, H., Klein, M., et al. (2022). Squidpy: a scalable framework for spatial omics analysis. Nature Methods, 19(2), 171–178. doi:10.1038/s41592-021-01358-2

コメント

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