Reference-based Simulation

In this tutorial, we performed reference-based simulation using Spider, which infers both the transition matrix and cell type proportions directly from the reference dataset. For our reference data, we employed single-cell resolution spatial transcriptomics data from the mouse visual cortex (available at https://www.starmapresources.com/data). This comprehensive dataset captured 1,549 cells representing 15 distinct cell types, which were rigorously identified through clustering analysis with carefully curated marker genes.

[1]:
import spider as sp
import scanpy as sc
import numpy as np
import matplotlib.pyplot as plt
import itertools
import anndata as ad
[2]:
sc.set_figure_params( color_map = 'viridis',figsize=(3,6))
[3]:
ref_path = "./Benchmark_datasets/"
[4]:
#choose cell_level data
ref_adata = sc.read(ref_path + "use_ref.h5ad")
[5]:
save_path = "./"
[6]:
Num_ct_sample = np.bincount(ref_adata.obs.label)
Num_celltype = len(Num_ct_sample)
real_celltype = np.unique(ref_adata.obs.celltype)
match_list = dict(zip(range(len(Num_ct_sample)),real_celltype))

Simulation using PSA function

[8]:
spider_adata = sp.PSA(grid_row=10, grid_col=10, adata=ref_adata,perturb=True,seed=2025)
[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.
/Users/era/anaconda3/envs/spider/lib/python3.9/site-packages/networkx/utils/backends.py:135: RuntimeWarning: networkx backend defined more than once: nx-loopback
  backends.update(_get_backends("networkx.backends"))
/Users/era/anaconda3/envs/spider/lib/python3.9/site-packages/networkx/utils/backends.py:135: RuntimeWarning: networkx backend defined more than once: nx-loopback
  backends.update(_get_backends("networkx.backends"))
/Users/era/anaconda3/envs/spider/lib/python3.9/site-packages/networkx/utils/backends.py:135: RuntimeWarning: networkx backend defined more than once: nx-loopback
  backends.update(_get_backends("networkx.backends"))
/Users/era/anaconda3/envs/spider/lib/python3.9/site-packages/networkx/utils/backends.py:135: RuntimeWarning: networkx backend defined more than once: nx-loopback
  backends.update(_get_backends("networkx.backends"))
[Parallel(n_jobs=4)]: Done   5 tasks      | elapsed:   14.4s
[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed:   15.6s
[Parallel(n_jobs=4)]: Done  17 tasks      | elapsed:   16.9s
[Parallel(n_jobs=4)]: Done  24 tasks      | elapsed:   18.2s
[Parallel(n_jobs=4)]: Done  33 tasks      | elapsed:   19.7s
[Parallel(n_jobs=4)]: Done  42 tasks      | elapsed:   21.9s
[Parallel(n_jobs=4)]: Done  53 tasks      | elapsed:   24.9s
[Parallel(n_jobs=4)]: Done  64 tasks      | elapsed:   27.4s
[Parallel(n_jobs=4)]: Done  77 tasks      | elapsed:   30.4s
[Parallel(n_jobs=4)]: Done  90 tasks      | elapsed:   33.8s
[Parallel(n_jobs=4)]: Done 100 out of 100 | elapsed:   35.7s finished
[9]:
spider_adata = sp.get_sim_cell_level_expr(celltype_assignment=np.array(spider_adata.obs.spider_simu.tolist()) ,
                                       adata=ref_adata,
                                       Num_celltype=len(Num_ct_sample),
                                       Num_ct_sample=Num_ct_sample,
                                       match_list=match_list,
                                       ct_key="celltype")
spider_adata.obs.index = [
    'cell' + str(j) for j in range(spider_adata.shape[0])
]

spider_adata.write_h5ad(save_path+ "/spider_perturb_simu_cell_level.h5ad")

[14]:
spider_adata.obs["x"] = spider_adata.obsm["spatial"][:,0]
spider_adata.obs["y"] = spider_adata.obsm["spatial"][:,1]
[15]:
sc.pl.scatter(spider_adata,color="celltype",x="x",y="y")
_images/Reference-based_simulation_12_0.png
[ ]:

[ ]: