シーケンス型 空間トランスクリプトーム:空間ドメイン同定

Spatial transcriptome
📚 この記事について
組織の領域を教師なしで切り出す工程を扱います。シーケンス型では、空間を入れる前から発現クラスタがドメインに近いという事情があります。そのうえで、空間を入れて何が加わるのかを整理します。
🔙 前の記事:シーケンス型 空間トランスクリプトーム:segmentation-free 解析
🔜 次の記事:シーケンス型 空間トランスクリプトーム:空間可変遺伝子(SVG)
📌 前提正規化とクラスタリング細胞型を割り当てる(全体像)

空間トランスクリプトーム解析(spatial transcriptomics)のうちシーケンス型(Visium・Stereo-seq など NGS で読み出す方式)は、1つのフィーチャに複数の細胞が入っています。この事実が、空間ドメイン同定の意味を変えます。発現でクラスタリングした時点で、すでに「その場所が何か」を表すまとまりが出ているからです。空間を入れることで何が加わるのかを、はっきりさせておく必要があります。

1. 発現クラスタが、すでにドメインに近い


図:1フィーチャが混合なので、発現クラスタはすでにドメインに近い
図:1フィーチャが混合なので、発現クラスタはすでにドメインに近い

1観測が1細胞のとき、発現クラスタは細胞型を表します。だから組織の領域は、別に求める必要がありました。

シーケンス型のマルチセルレジームでは違います。1フィーチャの発現は、その場所にいる細胞たちの混合です。つまり発現クラスタは、最初から「その場所が何か」を表しています

python
import scanpy as sc
import squidpy as sq

# 空間を使わないクラスタリング。これが比較の基準になる
sc.pp.pca(adata, n_comps=30)
sc.pp.neighbors(adata)
sc.tl.leiden(adata, resolution=1.0, key_added="expr_only", flavor="igraph")

# 組織の上に描く。ここで既に層構造が見えていることが多い
sq.pl.spatial_scatter(adata, color="expr_only")
# 見えているなら、空間を足して何が加わるのかを意識して比べる
💡 空間を入れて何が加わるのか
加わるのは「隣り合う場所は似ているはずだ」という制約です。発現だけのクラスタは、隣り合うフィーチャがばらばらの色になることがあります。空間を入れると、これがまとまった領域になります。ただしまとまること自体は、正しさの証拠ではありません。空間を使わない結果を基準として残し、何が変わったかを必ず比べてください。

2. 正規化の選択が、ここで結果を変える


図:正規化の選択が、ドメイン同定の精度を変える
図:正規化の選択が、ドメイン同定の精度を変える

前処理の記事で見たことが、ここで効いてきます。総カウントには細胞密度という組織の情報が入っています(Bhuva et al., Genome Biology, 2024)。消してしまえば、ドメインを分ける手がかりも減ります。

同研究では、ライブラリサイズを明示的に補正すると空間ドメイン同定の精度(ARI)がむしろ下がりました。空間を考慮した正規化(SpaNorm)は、技術的な変動と生物学的な変動を分けたうえで前者だけを消すので、ドメインの情報を保てます(Salim et al., Genome Biology, 2025)。

python
import numpy as np

# 正規化を変えて、ドメイン同定の結果を比べる
#   生カウントを layers に残してあるから、ここで選び直せる
variants = {}

# 1. 対数正規化(既定)
ad1 = adata.copy()
ad1.X = ad1.layers["counts"].copy()
sc.pp.normalize_total(ad1); sc.pp.log1p(ad1)
variants["lognorm"] = ad1

# 2. 正規化しない(総カウントの情報をそのまま残す)
ad2 = adata.copy()
ad2.X = np.log1p(ad2.layers["counts"].toarray())
variants["raw_log"] = ad2

# それぞれでクラスタリングして、組織像と照らす
for name, ad in variants.items():
    sc.pp.pca(ad, n_comps=30)
    sc.pp.neighbors(ad); sc.tl.leiden(ad, resolution=1.0, flavor="igraph")
    adata.obs[f"dom_{name}"] = ad.obs["leiden"].values

sq.pl.spatial_scatter(adata, color=["dom_lognorm", "dom_raw_log"])
💡 前処理で生カウントを残しておいた理由が、ここにある
正規化は不可逆な操作です。生カウントを layers に残しておけば、この段階で選び直せます。正規化を変えて2通りのドメインを出し、どちらが組織像に合うかを見比べてください。「正規化するのが当たり前」という前提を、ここで疑う価値があります。

3. 何を追加の手がかりにするか


図:何を追加の手がかりにするか
図:何を追加の手がかりにするか
手がかり 考え方 代表 特徴
格子の構造 隣り合うフィーチャは似ている BayesSpace サブスポット解像度まで上げられる
組織の画像 見た目が似た場所は似ている SpaGCN H&E を入力に使う
近傍の発現 自分と近傍を1つの特徴にまとめる BANKSY 1つの値で細胞型とドメインを切り替える

BayesSpace(Zhao et al., Nature Biotechnology, 2021)は、格子状に並んだフィーチャの構造を前提に、近傍の情報でクラスタリングと解像度の向上を同時に行います。1つのスポットをさらに分割したサブスポット単位で領域を推定できるのが特徴です。

SpaGCN(Hu et al., Nature Methods, 2021)は、発現・空間座標に加えて組織の画像をグラフ畳み込みネットワークに入れます。画像に写る組織の見た目を手がかりとして使う点が、他と違います。

BANKSY(Singhal et al., Nature Genetics, 2024)は、自分の発現と近傍の発現を1つの特徴空間にまとめ、重みを1つのパラメータで調節します。小さくすれば細胞型に、大きくすれば組織ドメインに近づきます。

⚠️ 滑らかな領域は、どの手法でも必ず出てくる
空間の重みを上げれば、必ずまとまった領域が出ます。滑らかさは、正しさの証拠ではありません。空間を使わない結果と並べて、どこが変わり、それが組織像で説明できるかを確認してください。

4. デコンボリューションの割合を、入力にする


発現からドメインを求めるだけでなく、デコンボリューションで得た細胞型の割合を入力にする道もあります。「その場所にどの細胞型がどれだけいるか」で領域を分ける、という考え方です。

python
import pandas as pd

# デコンボリューションの割合を、そのまま入力にする道もある
#   「その場所にどの細胞型がどれだけいるか」で領域を分ける
prop = adata.obsm["cell_type_proportions"]
dom = sc.AnnData(prop.to_numpy())
dom.obs_names = adata.obs_names
dom.var_names = prop.columns

sc.pp.neighbors(dom, use_rep="X", n_neighbors=15)
sc.tl.leiden(dom, resolution=0.5, flavor="igraph")
adata.obs["dom_prop"] = dom.obs["leiden"].values

# 発現から求めたドメインと、割合から求めたドメインを比べる
from sklearn.metrics import adjusted_rand_score as ari
print("一致度:", round(ari(adata.obs["expr_only"], adata.obs["dom_prop"]), 3))
# 一致しないなら、どちらかが崩れている
💡 2つの結果が一致するかが、検証になる
発現から求めたドメインと、割合から求めたドメインが一致すれば、両方が信用できるということです。一致しないなら、どちらかが崩れています。デコンボリューションを疑うか、正規化や空間の重みを疑ってください。独立な2つの経路が同じ答えに至ることは、強い証拠になります。

5. ドメインを解釈する


python
# ドメインを、細胞型の組成で表す
prof = prop.copy()
prof["domain"] = adata.obs["dom_prop"].values
print(prof.groupby("domain").mean().round(2))

# ドメインごとの特徴遺伝子
sc.tl.rank_genes_groups(adata, groupby="dom_prop", method="wilcoxon")
sc.pl.rank_genes_groups_dotplot(adata, n_genes=5)

# 解像度を振って、ドメインの数と組織像の対応を見る
for res in [0.3, 0.5, 0.8]:
    sc.tl.leiden(dom, resolution=res, key_added=f"d{res}", flavor="igraph")
    adata.obs[f"d{res}"] = dom.obs[f"d{res}"].values
sq.pl.spatial_scatter(adata, color=["d0.3", "d0.5", "d0.8"], ncols=3)
  • 細胞型の組成で表す。「このドメインは腫瘍 60%・線維芽細胞 25%」のように。
  • 特徴遺伝子を出す。ドメイン間で差のある遺伝子を見る。
  • 組織像と重ねる。病理学的な構造と対応しているかを、目で確かめる。
  • 解像度を振る。ドメインの数に正解は無い。既知の構造が1つのまとまりとして出る値を選ぶ。
⚠️ ドメインの数に正解は無い
解像度を上げれば、ドメインは細かく分かれます。組織学的に意味のある境界に対応しているかで判断してください。可能なら病理の専門家に見てもらうのが確実です。自分で判断するなら、既知の構造(層、腺管、腫瘍巣)が1つのドメインとして出てくる解像度を選びます。

6. チェックリスト


  • 空間を使わないクラスタリングを、基準として残した
  • 空間を入れて何が変わったかを、並べて比べたか
  • 正規化を変えて、ドメインがどう変わるかを見たか
  • デコンボリューションの割合からもドメインを出して、一致を確認したか
  • ドメインを細胞型の組成で表したか
  • 組織像と重ねて、既知の構造と対応するか確かめたか
  • 解像度を振って、意味のある境界が出る値を選んだか

まとめ


  • シーケンス型では、発現クラスタがすでにドメインに近い。1フィーチャが混合だから。
  • 空間を入れて加わるのは「隣り合う場所は似ている」という制約。まとまること自体は正しさの証拠ではない。
  • 正規化の選択が、ドメイン同定の精度を変える。ライブラリサイズを強く補正すると精度が下がる(Bhuva et al., 2024)。
  • 生カウントを残しておけば、この段階で正規化を選び直せる
  • 追加の手がかりは3つ。格子の構造(BayesSpace)、組織の画像(SpaGCN)、近傍の発現(BANKSY)。
  • デコンボリューションの割合からもドメインを出せる。発現からの結果と一致すれば、強い検証になる。
  • ドメインの数に正解は無い。組織学的に意味のある境界かで判断する。

関連記事


参考文献


  • Zhao, E., Stone, M. R., Ren, X., et al. (2021). Spatial transcriptomics at subspot resolution with BayesSpace. Nature Biotechnology, 39(11), 1375–1384. doi:10.1038/s41587-021-00935-2
  • Hu, J., Li, X., Coleman, K., et al. (2021). SpaGCN: integrating gene expression, spatial location and histology to identify spatial domains and spatially variable genes by graph convolutional network. Nature Methods, 18(11), 1342–1351. doi:10.1038/s41592-021-01255-8
  • Singhal, V., Chou, N., Lee, J., et al. (2024). BANKSY unifies cell typing and tissue domain segmentation for scalable spatial omics data analysis. Nature Genetics, 56(3), 431–441. doi:10.1038/s41588-024-01664-3
  • 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
  • Salim, A., Bhuva, D. D., Chen, C., et al. (2025). SpaNorm: spatially-aware normalization for spatial transcriptomics data. Genome Biology, 26, 109. doi:10.1186/s13059-025-03565-y
  • 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
  • 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
  • Marconato, L., Palla, G., Yamauchi, K. A., et al. (2025). SpatialData: an open and universal data framework for spatial omics. Nature Methods, 22(1), 58–62. doi:10.1038/s41592-024-02212-x
  • 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をコピーしました