イメージング型 空間トランスクリプトーム:パネル制約下でのアノテーション ─ 分けられない型は、まとめる

Spatial transcriptome
📚 この記事について
セグメンテーションが済んだ細胞に、細胞型を割り当てる工程を扱います。デコンボリューションは要りませんが、代わりにパネルという制約が効いてきます。何が分けられて何が分けられないのかを、先に見極める方法を説明します。
🔙 前の記事:イメージング型 空間トランスクリプトーム:細胞レベルの QC と正規化
🔜 次の記事:イメージング型 空間トランスクリプトーム:ニッチ・近傍解析
📌 前提scRNA-seq解析:細胞型アノテーション手法の全体像細胞レベルの QC と正規化

空間トランスクリプトーム解析(spatial transcriptomics)のうちイメージング型(Xenium・CosMx・MERSCOPE など顕微鏡で1分子ずつ数える方式)は、セグメンテーションが済めば1細胞に1ラベルを付ける問題になり、デコンボリューションは要りません。scRNA-seq のアノテーション手法が、ほぼそのまま使えます。ただし1つだけ、決定的な制約があります。参照は全転写産物を持っているのに、手元にはパネルの遺伝子しかないということです。

1. パネルが、結果の解像度を決める


図:参照は全転写産物、手元はパネルだけ
図:参照は全転写産物、手元はパネルだけ

参照 scRNA-seq には2万以上の遺伝子があります。手元のデータには数百から数千。使えるのは、両方にある遺伝子だけです。

python
import scanpy as sc
import numpy as np

# 最初にやること:参照とパネルの共通遺伝子を数える
common = adata.var_names.intersection(ref.var_names)
print("パネル:", adata.n_vars)
print("参照:", ref.n_vars)
print("共通:", len(common))

# 共通に入らなかったパネル遺伝子を確認する
#   参照側に無いなら、その遺伝子は型付けに使えない
missing = set(adata.var_names) - set(ref.var_names)
print("参照に無いパネル遺伝子:", sorted(missing)[:20])
⚠️ 参照の解像度ではなく、パネルの解像度が上限になる
参照が細かく細胞型を分けていても、その分け方を支えるマーカーがパネルに無ければ、同じ細分はできません。参照が「CD4 T細胞」と「CD8 T細胞」を分けていても、パネルに CD4 も CD8A も入っていなければ、どんな手法を使ってもその2つは分けられません。手法の問題ではなく、データに情報が無いという問題です。

2. 走らせる前に、何が分けられるかを確かめる


アノテーションを走らせてから「この型は怪しい」と悩むより、先に何が分けられるかを確認するほうが早く済みます。

python
# 分けたい細胞型のマーカーが、パネルに入っているかを先に確かめる
targets = {
    "CD4 T細胞": ["CD4", "IL7R"],
    "CD8 T細胞": ["CD8A", "GZMK"],
    "制御性T細胞": ["FOXP3", "IL2RA"],
    "B細胞": ["MS4A1", "CD79A"],
}

for ct, genes in targets.items():
    have = [g for g in genes if g in adata.var_names]
    mark = "分けられる" if have else "分けられない"
    print("%-12s %s  %s" % (ct, mark, have))

# 「分けられない」と出た型は、上位の型にまとめる
# 分ける根拠が無いまま細分すると、境界はノイズで決まる
💡 この確認は、パネル設計の段階でやるのが本筋
本来は、実験を計画する段階で「見分けたい細胞型のマーカーがパネルに入っているか」を確認すべきです。既製パネルを使うなら遺伝子リストを見て、カスタムパネルを設計するなら分けたい型から逆算して選びます。解析の段階では、もう選び直せません。これから実験する人には、この確認を強く勧めてください。

3. 分けられない型は、まとめる


図:分けられない型は、無理に分けない
図:分けられない型は、無理に分けない

パネルに分ける根拠が無いのに細分すると、その境界はノイズで決まります。実行するたびに、あるいは解像度を変えるたびに、細胞がどちらに入るかが変わる。そのラベルを使った下流の結論も、当然揺れます。

python
# 分けられない型を、上位の型にまとめる
merge = {
    "CD4 T細胞": "T細胞",
    "CD8 T細胞": "T細胞",
    "制御性T細胞": "T細胞",
}
adata.obs["celltype_coarse"] = (
    adata.obs["celltype"].astype(str).replace(merge)
)

# 粗い型と細かい型の両方を持っておき、下流で使い分ける
print(adata.obs["celltype_coarse"].value_counts())

# 空間の上で、粗い型が組織構造と対応するかを確認する
sq.pl.spatial_scatter(adata, color="celltype_coarse", shape=None)
💡 粗い型で確実な結果のほうが、価値がある
「T細胞が腫瘍の辺縁に集まっていた」という確実な結論と、「CD8 T細胞が腫瘍の辺縁に集まっていた(ただし CD4 との区別は不安定)」という揺れる結論では、前者のほうが役に立ちます。どの解像度で語るかを、パネルを見てから決めてください。粗い型と細かい型の両方を obs に持っておけば、下流で使い分けられます。
💡 パネルが大きければ、細分できる
6種類のがんでプラットフォームを比較した研究(Cervilla et al., Genome Biology, 2026)は、パネルの拡大が細胞型アノテーションを改善し、免疫細胞のより深い細分を可能にしたと報告しています。一方で、同じ研究は検出効率が下がりスパース性が高くなることも示しました。細分できる型が増えても、1細胞あたりの分子は薄くなる。パネルの大きさは、この2つの綱引きで決まります。

4. ラベル転移を走らせる


手法自体は scRNA-seq のアノテーションと同じです。自動アノテーションなら CellTypist、深層生成モデルを使うなら scANVI(Xu et al., Molecular Systems Biology, 2021)が候補です。

python
import celltypist

# 参照とパネルを、共通遺伝子にそろえてから学習する
ref_c = ref[:, common].copy()
ad_c  = adata[:, common].copy()

# 参照側も同じ前処理にそろえる
for ad in (ref_c, ad_c):
    ad.X = ad.layers["counts"].copy()
    sc.pp.normalize_total(ad, target_sum=1e4)
    sc.pp.log1p(ad)

# 共通遺伝子だけで学習したモデルを作る
model = celltypist.train(
    ref_c, labels="cell_type", n_jobs=8, feature_selection=False,
)
pred = celltypist.annotate(ad_c, model=model, majority_voting=True)
adata.obs["celltype"] = pred.predicted_labels["majority_voting"].values
adata.obs["celltype_conf"] = pred.probability_matrix.max(axis=1).values
⚠️ 参照側も、共通遺伝子だけで学習し直す
全転写産物で学習したモデルを、パネルのデータに当てるのは誤りです。モデルが使っている遺伝子の多くが、手元のデータに存在しないからです。参照を共通遺伝子に絞ってから、学習し直してください。既成の学習済みモデルを使う場合も、そのモデルが使う遺伝子がパネルにどれだけ含まれるかを確認してください。含有率が低ければ、そのモデルは使えません。
💡 確信度を obs に残す
多くの手法は、ラベルと一緒に確信度を返します。これを obs に残しておくと、確信度の低い細胞が組織のどこにあるかを地図にできます。特定の領域に固まっているなら、そこには参照に無い細胞型がいるか、セグメンテーションが崩れています。散らばっているなら、パネルの情報量の限界です。

5. 検証 ─ 3つの見方で確かめる


図:アノテーションを、3つの見方で検証する
図:アノテーションを、3つの見方で検証する

自動アノテーションが返したラベルを、そのまま信じてはいけません。この方式では、3つ目の検証が加わります。

python
import squidpy as sq

# 検証1:マーカーを UMAP に投影する
markers = ["EPCAM", "PTPRC", "CD3D", "MS4A1", "CD68", "COL1A1"]
markers = [g for g in markers if g in adata.var_names]
sc.pl.umap(adata, color=markers + ["celltype"], ncols=3)

# 検証2:同じマーカーを、組織の上に投影する
sq.pl.spatial_scatter(adata, color=markers, shape=None, ncols=3)

# 検証3:型ごとに、排他的マーカーの共発現を数える
adata.obs["impure"] = impure_flag   # 前記事で作った印
print(adata.obs.groupby("celltype")["impure"].mean().sort_values())
# 特定の型で高いなら、その型は混入でできている疑いがある

6. 検証1 ─ マーカーを UMAP に投影する


これは 細胞型アノテーションのすべての手法に共通する、省略できない工程です。マーカー遺伝子の発現を UMAP に投影すると、3つのことが分かります。

  • 他のクラスタも、同じマーカーを発現していないか。していれば、そのマーカーは特異的でないか、ラベルが誤っている。
  • そのクラスタの全体で発現しているか、一部だけか、それとも弱いか。一部だけなら、そのクラスタはさらに細かい型を含んでいる。
  • 複数のクラスタにまたがって発現しているマーカーはないか。あれば、そのマーカーで分けようとした型は分けられていない。
⚠️ dotplot だけで済ませない
dotplot は「割り当て済みのグループごとの平均」を見ています。割り当てが間違っていれば、間違いを裏付ける図が出るだけです。グループ分けを前提としない、生の分布を見てください。

7. 検証2 ─ 組織の上に投影する


空間データには、scRNA-seq に無い検証手段があります。組織像です。上皮マーカーが上皮の領域に、免疫マーカーが免疫浸潤の領域に出ていれば、型付けは組織構造と整合しています。

⚠️ 組織学的にありえない場所に型が出たら
たとえば、上皮にしかないはずの型が間質のクラスタで光る。こういうときは、まず切り方を疑ってください。この方式では、混入は実験由来ではなく計算由来です。輪郭を広げすぎたことや、細胞が密に詰まった領域での取り違えが典型的な原因です。アノテーションのパラメータを触る前に、細胞レベルの QC(面積・分子数・面積あたりの分子数)に戻って確認します。

8. 検証3 ─ 排他的マーカーの共発現を、型ごとに数える


これは、この方式に固有の検証です。セグメンテーション手法の選び方で使った純度の指標を、細胞型ごとに集計します

観察 疑うもの 対応
特定の型で不純な細胞が多い その型は混入でできている その型のラベルを信用しない
面積の大きい細胞に集中している 広げすぎ 切り方を見直す
組織の特定の領域に集中している その領域で切り方が崩れている 領域ごと除外を検討
全体に薄く散らばっている 許容範囲のことが多い そのまま進んでよい
💡 混入は計算由来なので、直せる
scRNA-seq のダブレットは実験の産物なので、検出して捨てるしかありません。この方式の混入はセグメンテーションの産物なので、切り直せば直せます。「不純な細胞が多い」という観察は、捨てるための情報であると同時に、切り方を改善するための情報でもあります。

9. アノテーション完了チェック


  • 参照とパネルの共通遺伝子の数を確認したか
  • 分けたい型のマーカーがパネルにあるかを先に確かめたか
  • 参照を共通遺伝子に絞ってから学習し直したか
  • 確信度を obs に残し、低い細胞の場所を地図にしたか
  • マーカーを UMAP に投影して確かめたか
  • 同じマーカーを組織の上に投影したか
  • 排他的マーカーの共発現を型ごとに集計したか
  • 分けられない型をまとめた
  • 粗い型と細かい型の両方を obs に持っているか

まとめ


  • セグメンテーションが済めばデコンボリューションは要らない。代わりにパネルという制約が効く。
  • 参照の解像度ではなく、パネルの解像度が上限。パネルに無いマーカーで分けようとしても、どんな手法でも分けられない。
  • 走らせる前に、何が分けられるかを確認する。本来はパネル設計の段階でやるべき確認。
  • 分けられない型は、まとめる。根拠の無い細分は、境界がノイズで決まり、下流の結論が揺れる。
  • パネルを大きくすれば細分できるが、検出効率は下がる(Cervilla et al., 2026)。
  • 参照は共通遺伝子に絞ってから学習し直す。既成モデルは含有率を確認する。
  • 検証は3つ。UMAP への投影組織の上への投影排他的マーカーの共発現を型ごとに集計
  • 3つ目はこの方式に固有。混入は計算由来なので、切り直せば直せる

関連記事


参考文献


  • Domínguez Conde, C., Xu, C., Jarvis, L. B., et al. (2022). Cross-tissue immune cell analysis reveals tissue-specific features in humans. Science, 376(6594), eabl5197. doi:10.1126/science.abl5197
  • Xu, C., Lopez, R., Mehlman, E., et al. (2021). Probabilistic harmonization and annotation of single-cell transcriptomics data with deep generative models. Molecular Systems Biology, 17(1), e9620. doi:10.15252/msb.20209620
  • Cervilla, S., Grases, D., Perez, E., et al. (2026). A technical comparison of spatial transcriptomics platforms across six cancer types. Genome Biology, 27, 22. doi:10.1186/s13059-026-03937-y
  • Janesick, A., Shelansky, R., Gottscho, A. D., et al. (2023). High resolution mapping of the tumor microenvironment using integrated single-cell, spatial and in situ analysis. Nature Communications, 14(1), 8353. doi:10.1038/s41467-023-43458-x
  • Petukhov, V., Xu, R. J., Soldatov, R. A., et al. (2022). Cell segmentation in imaging-based spatial transcriptomics. Nature Biotechnology, 40(3), 345–354. doi:10.1038/s41587-021-01044-w
  • 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
  • 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
  • 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をコピーしました