S
spatial-transcriptomics-tutorials-with-omicverse
spatial-transcriptomics-tutorials-with-omicverse について
空間遺伝子発現データを扱う研究者向けの、OmicVerse 空間トランスクリプトーム解析スキルです。前処理、デコンボリューション、下流解析を API の案内とトラブルシューティングとともに扱います。
主な機能
- 01空間座標の検証と変換
- 02Visium HD の細胞セグメンテーション
- 03細胞種デコンボリューションの案内
- 04空間クラスタリングとスライス統合
- 05軌跡と細胞間コミュニケーション解析
- 06よくあるワークフローエラーの解決
活用シーン
- 01Visium HD データの前処理とセグメンテーション
- 02Tangram と cell2location のデコンボリューション比較
- 03組織スライスの統合とクラスタリング
- 04空間的な細胞間コミュニケーションの解析
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ omicverse/ omicverse --skill spatial-transcriptomics-tutorials-with-omicverseインストール後、Claude Code で/spatial-transcriptomics-tutorials-with-omicverseを入力して読み込まれたか確認します。
同梱ファイルreference.md
詳細
OmicVerse による空間トランスクリプトミクス
このスキルでは、前処理、デコンボリューション、下流解析の 3 段階に分けて空間解析のワークフローを解説します。各段階では、重要な関数呼び出し、パラメーターのガイダンス、よくある落とし穴を取り上げます。
防御的な検証:空間座標を必ず最初に確認する
空間操作を行う前に、空間座標が存在し、数値型であることを必ず確認してください。
# Required check before spatial analysis
assert 'spatial' in adata.obsm, \
"Missing adata.obsm['spatial']. Load with ov.io.spatial.read_visium() or set manually."
# Cast to float64 to prevent coordinate precision issues during rotation/cropping
adata.obsm['spatial'] = adata.obsm['spatial'].astype('float64')
ステージ 1:前処理
座標の切り抜き、回転、位置合わせ
Visium データを読み込み、領域の選択と位置合わせのために空間座標を操作します。
import scanpy as sc, omicverse as ov
ov.plot_set()
adata = sc.datasets.visium_sge(sample_id="V1_Breast_Cancer_Block_A_Section_1")
library_id = list(adata.uns['spatial'].keys())[0]
# Cast coordinates before manipulation
adata.obsm['spatial'] = adata.obsm['spatial'].astype('float64')
# Crop to region of interest
adata_crop = ov.space.crop_space_visium(adata, crop_loc=(0, 0), crop_area=(1000, 1000),
library_id=library_id, scale=1)
# Rotate and auto-align
adata_rot = ov.space.rotate_space_visium(adata, angle=45, library_id=library_id)
ov.space.map_spatial_auto(adata_rot, method='phase')
# For manual refinement: ov.space.map_spatial_manual(adata_rot, ...)
Visium HD の細胞セグメンテーション
cellpose を使用して Visium HD のビンを細胞にセグメント化します。
adata = ov.space.read_visium_10x(path="binned_outputs/square_002um/",
source_image_path="tissue_image.btf")
ov.pp.filter_genes(adata, min_cells=3)
ov.pp.filter_cells(adata, min_counts=1)
# H&E-based segmentation
adata = ov.space.visium_10x_hd_cellpose_he(adata, mpp=0.3, gpu=True, buffer=150)
# Expand labels to neighboring bins
ov.space.visium_10x_hd_cellpose_expand(adata, labels_key='labels_he',
expanded_labels_key='labels_he_expanded', max_bin_distance=4)
# Gene-expression-driven seeds
ov.space.visium_10x_hd_cellpose_gex(adata, obs_key="n_counts_adjusted", mpp=0.3, sigma=5)
# Merge labels and aggregate to cell-level
ov.space.salvage_secondary_labels(adata, primary_label='labels_he_expanded',
secondary_label='labels_gex', labels_key='labels_joint')
cdata = ov.space.bin2cell(adata, labels_key='labels_joint')
ステージ 2:デコンボリューション
重要な API リファレンス:メソッドの選択
# CORRECT — Tangram: method passed to deconvolution() call
decov_obj = ov.space.Deconvolution(adata_sc=sc_adata, adata_sp=sp_adata,
celltype_key='Subset', result_dir='result/tangram')
decov_obj.preprocess_sc(max_cells=5000)
decov_obj.preprocess_sp()
decov_obj.deconvolution(method='tangram', num_epochs=1000)
# CORRECT — cell2location: method passed at INIT time
cell2_obj = ov.space.Deconvolution(adata_sc=sc_adata, adata_sp=sp_adata,
celltype_key='Subset', result_dir='result/c2l',
method='cell2location')
cell2_obj.deconvolution(max_epochs=30000)
cell2_obj.save_model('result/c2l/model')
注:cell2location では、method パラメーターは deconvolution() の呼び出し時ではなく、初期化時に設定します。Tangram では、deconvolution() に渡します。
Starfysh によるアーキタイプ型デコンボリューション
from omicverse.external.starfysh import AA, utils, plot_utils
visium_args = utils.prepare_data(adata_path="data/counts.h5ad",
signature_path="data/signatures.csv",
min_cells=10, filter_hvg=True, n_top_genes=3000)
adata, adata_normed = visium_args.get_adata()
aa_model = AA.ArchetypalAnalysis(adata_orig=adata_normed)
aa_model.fit(k=12, n_init=10)
visium_args = utils.refine_anchors(visium_args, aa_model, add_marker=True)
model, history = utils.run_starfysh(visium_args, poe=False, n_repeat=5, lr=5e-3, max_epochs=500)
ステージ 3:下流解析
空間クラスタリング
# GraphST + mclust
ov.utils.cluster(adata, use_rep='graphst|original|X_pca', method='mclust', n_components=7)
# STAGATE
ov.utils.cluster(adata, use_rep='STAGATE', method='mclust', n_components=7)
# Merge small clusters
ov.space.merge_cluster(adata, groupby='mclust', resolution=0.5)
アルゴリズムの選択:GraphST と STAGATE には、事前計算された潜在空間が必要です。空間を考慮した埋め込みを使わずに標準的なクラスタリングを行う場合は、Leiden/Louvain を直接使用してください。
複数スライスの統合(STAligner)
import anndata as ad
Batch_list = [ov.read(p) for p in slice_paths]
adata_concat = ad.concat(Batch_list, label='slice_name', keys=section_ids)
STAligner_obj = ov.space.pySTAligner(adata=adata_concat, batch_key='slice_name',
hidden_dims=[256, 64], use_gpu=True)
STAligner_obj.train_STAligner_subgraph(nepochs=800, lr=1e-3)
STAligner_obj.train()
adata_aligned = STAligner_obj.predicted()
sc.pp.neighbors(adata_aligned, use_rep='STAligner')
空間軌跡
SpaceFlow — 疑似空間マップ:
sf_obj = ov.space.pySpaceFlow(adata)
sf_obj.train(spatial_regularization_strength=0.1, num_epochs=300, patience=50)
sf_obj.cal_pSM(n_neighbors=20, resolution=1.0)
STT — 遷移ダイナミクス:
STT_obj = ov.space.STT(adata, spatial_loc='xy_loc', region='Region', n_neighbors=20)
STT_obj.stage_estimate()
STT_obj.train(n_states=9, n_iter=15, weight_connectivities=0.5)
細胞間コミュニケーション(COMMOT + FlowSig)
df_cellchat = ov.external.commot.pp.ligand_receptor_database(species='human', database='cellchat')
df_cellchat = ov.external.commot.pp.filter_lr_database(df_cellchat, adata, min_expr_frac=0.05)
ov.external.commot.tl.spatial_communication(adata, lr_database=df_cellchat,
distance_threshold=500, result_prefix='cellchat')
# FlowSig network
adata.layers['normalized'] = adata.X.copy()
ov.external.flowsig.tl.construct_intercellular_flow_network(
adata, commot_output_key='commot-cellchat',
flowsig_output_key='flowsig-cellchat', edge_threshold=0.7)
構造層(GASTON)とスライスの位置合わせ(SLAT)
GASTON — アイソデプスの推定:
gas_obj = ov.space.GASTON(adata)
A = gas_obj.prepare_inputs(n_pcs=50)
gas_obj.load_rescale(A)
gas_obj.train(hidden_dims=[64, 32], dropout=0.1, max_epochs=2000)
gaston_isodepth, gaston_labels = gas_obj.cal_iso_depth(n_layers=5)
SLAT — スライス間の位置合わせ:
from omicverse.external.scSLAT.model import Cal_Spatial_Net, load_anndatas, run_SLAT, spatial_match
Cal_Spatial_Net(adata1, k_cutoff=20, model='KNN')
Cal_Spatial_Net(adata2, k_cutoff=20, model='KNN')
edges, features = load_anndatas([adata1, adata2], feature='DPCA', check_order=False)
embeddings, *_ = run_SLAT(features, edges, LGCN_layer=5)
best, index, distance = spatial_match(embeddings, adatas=[adata1, adata2])
トラブルシューティング
- 回転後に
ValueError: spatial coordinates out of boundsが発生する:rotate_space_visiumを呼び出す前に、adata.obsm['spatial']をfloat64にキャストしてください。整数座標は三角関数による回転時に精度が失われます。 - メモリエラーにより Cellpose のセグメンテーションが失敗する:大きな
.btf画像には、backend='tifffile'を使用して画像をメモリマップしてください。GPU メモリが不足する場合は、bufferパラメーターを小さくしてください。 - Tangram/cell2location で遺伝子 ID の重複チェックに失敗する:
preprocess_sc/preprocess_spを呼び出す前に、adata_scとadata_spの識別子(ENSEMBL と遺伝子シンボル)を統一してください。重複しない遺伝子は除外してください。 mclustクラスタリングエラーが発生する:rpy2と R のmclustパッケージが必要です。R バインディングを利用できない場合は、method='louvain'またはmethod='leiden'に切り替えてください。- STAligner/SpaceFlow の埋め込みが 1 点に収束する:
adata.obsm['spatial']が存在し、座標が適切なスケールであることを確認してください。学習率(lr=5e-4を試してください)と正則化の強さを調整してください。 - FlowSig が空のネットワークを返す:Moran's I によるフィルタリングの前に、空間近傍グラフを作成してください。ネットワークが疎すぎる場合は、ブートストラップの回数を増やすか、
edge_thresholdを下げてください(0.5 を試してください)。 - GASTON の学習中に
RuntimeErrorが発生する:書き込み可能なout_dirパスを指定してください。PyTorch の非決定性により実行ごとに結果が異なる場合があります。再現性を確保するには、torch.manual_seed()を設定してください。 - SLAT の位置合わせで品質の低いマッチが多く発生する:
k_cutoffの値を大きくして空間グラフを再生成してください。low_quality_indexフラグを確認し、距離スコアが高い細胞をフィルタリングしてください。 - STT のパスウェイエンリッチメントが失敗する:遺伝子セットをダウンロードするには、
gseapyがネットワークに接続できる必要があります。ov.utils.geneset_prepare()で遺伝子セットをローカルにキャッシュし、その辞書を直接渡してください。
依存関係
- コア:
omicverse、scanpy、anndata、squidpy、numpy、matplotlib - セグメンテーション:
cellpose、opencv-python/tifffile、オプションの GPU 対応 PyTorch - デコンボリューション:
tangram-sc、cell2location、pytorch-lightning。Starfysh にはtorch、scikit-learnが必要です - 下流解析:
scikit-learn、commot、flowsig、gseapy、torch ベースのモジュール(STAligner、SpaceFlow、GASTON、SLAT)
使用例
- 「Visium スライドをトリミングして回転し、HD データに対して cellpose セグメンテーションを実行して、細胞レベルの AnnData に集約してください。」
- 「リンパ節の空間データを Tangram と cell2location でデコンボリューションし、割合を比較して、細胞種マップをプロットしてください。」
- 「3 つの DLPFC スライスを STAligner で統合し、STAGATE でクラスタリングして、COMMOT+FlowSig で細胞間コミュニケーションを推定してください。」
参考資料
- すぐにコピー&ペーストできるコマンド:
reference.md
コメント
Markdown 対応