MERFISH_aging

[1]:
import warnings
warnings.filterwarnings("ignore")
import MENDER
import scanpy as sc
import pandas as pd
import numpy as np
from sklearn.metrics import *
import matplotlib.pyplot as plt

[2]:
## load the data using pysodb, please install pysodb in advance [https://pysodb.readthedocs.io/en/latest/]

import pysodb
sodb = pysodb.SODB()
adata_dict = sodb.load_dataset('Allen2022Molecular_aging')

load experiment[MsBrainAgingSpatialDonor_10_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_10_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_10_2] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_11_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_11_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_11_2] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_12_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_12_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_1_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_2_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_2_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_3_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_3_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_4_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_4_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_4_2] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_5_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_5_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_5_2] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_6_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_6_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_6_2] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_7_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_7_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_7_2] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_8_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_8_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_8_2] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_9_0] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_9_1] in dataset[Allen2022Molecular_aging]
load experiment[MsBrainAgingSpatialDonor_9_2] in dataset[Allen2022Molecular_aging]
[3]:
# prepare input data

# specify slice_id and ground truth
adata_list = []
for si in adata_dict.keys():
    adata = adata_dict[si]
    adata.obs['slice_id'] = si
    adata_list.append(adata)
adata_raw = adata_list[0].concatenate(adata_list[1:])
adata_raw.obs['slice_id'] = adata_raw.obs['slice_id'].astype('category')
adata_raw.obs['gt'] = adata_raw.obs['tissue'].astype('category')
adata_raw.obs['ct'] = adata_raw.obs['clust_annot'].astype('category')




[4]:
batch_obs = 'slice_id'
gt_obs = 'gt'

[5]:
# run MENDER

import time
time_st = time.time()
# input parameters of MENDER
scale = 6
radius = 15

# estimate number of domains
n_cls = np.unique(adata_raw.obs[gt_obs]).shape[0]




adata = adata_raw.copy()


# main body of MENDER
msm = MENDER.MENDER(
    adata,
    batch_obs = batch_obs,
    # determine which cell state to use
    # we use the cell state got by Leiden
    ct_obs='ct',
    random_seed=0
)


# set the MENDER parameters


msm.prepare()
msm.set_MENDER_para(
    # default of n_scales is 6
    n_scales=scale,

    # for single cell data, nn_mode is set to 'radius'
    nn_mode='radius',

    # default of n_scales is 15 um (see the manuscript for the analysis).
    # MENDER also provide a function 'estimate_radius' for estimating the radius
    nn_para=radius,

)
# construct the context representation
msm.run_representation_mp(
    200
    # the number of processings
)

# set the spatial clustering parameter
# positive values for the expected number of domains
# negative values for the clustering resolution
# msm.run_clustering_normal(n_cls)

# using this res, the output is 8 domains
msm.run_clustering_normal(-0.)


time_cost = time.time()-time_st


default number of process is 200
total batch: 31, running batch MsBrainAgingSpatialDonor_10_0
scale 0, median #cells per radius (r=15): 2.0
scale 1, median #cells per radius (r=15): 3.0
scale 2, median #cells per radius (r=15): 5.0
scale 3, median #cells per radius (r=15): 7.0
total batch: 31, running batch MsBrainAgingSpatialDonor_10_1
scale 4, median #cells per radius (r=15): 8.0
scale 0, median #cells per radius (r=15): 1.0
scale 5, median #cells per radius (r=15): 10.0
scale 1, median #cells per radius (r=15): 3.0
total batch: 31, running batch MsBrainAgingSpatialDonor_10_2
scale 2, median #cells per radius (r=15): 4.0
scale 0, median #cells per radius (r=15): 2.0
scale 3, median #cells per radius (r=15): 6.0
scale 1, median #cells per radius (r=15): 3.0
scale 4, median #cells per radius (r=15): 8.0
total batch: 31, running batch MsBrainAgingSpatialDonor_11_0
scale 2, median #cells per radius (r=15): 5.0
scale 0, median #cells per radius (r=15): 1.0
scale 5, median #cells per radius (r=15): 9.0
scale 3, median #cells per radius (r=15): 7.0
scale 1, median #cells per radius (r=15): 2.0
scale 4, median #cells per radius (r=15): 8.0
scale 2, median #cells per radius (r=15): 4.0
total batch: 31, running batch MsBrainAgingSpatialDonor_11_1
scale 3, median #cells per radius (r=15): 6.0
scale 5, median #cells per radius (r=15): 10.0
scale 4, median #cells per radius (r=15): 7.0
scale 0, median #cells per radius (r=15): 1.0
scale 5, median #cells per radius (r=15): 9.0
total batch: 31, running batch MsBrainAgingSpatialDonor_11_2
scale 1, median #cells per radius (r=15): 2.0
scale 0, median #cells per radius (r=15): 1.0
scale 1, median #cells per radius (r=15): 2.0
scale 2, median #cells per radius (r=15): 4.0
scale 2, median #cells per radius (r=15): 4.0
scale 3, median #cells per radius (r=15): 6.0
scale 3, median #cells per radius (r=15): 6.0
scale 4, median #cells per radius (r=15): 7.0
total batch: 31, running batch MsBrainAgingSpatialDonor_12_0
scale 5, median #cells per radius (r=15): 9.0
scale 4, median #cells per radius (r=15): 7.0
total batch: 31, running batch MsBrainAgingSpatialDonor_12_1
scale 0, median #cells per radius (r=15): 2.0
scale 0, median #cells per radius (r=15): 2.0
scale 5, median #cells per radius (r=15): 9.0
scale 1, median #cells per radius (r=15): 3.0
scale 1, median #cells per radius (r=15): 3.0
scale 2, median #cells per radius (r=15): 5.0
total batch: 31, running batch MsBrainAgingSpatialDonor_1_0
scale 2, median #cells per radius (r=15): 5.0
total batch: 31, running batch MsBrainAgingSpatialDonor_2_0
scale 3, median #cells per radius (r=15): 7.0
scale 0, median #cells per radius (r=15): 1.0
scale 3, median #cells per radius (r=15): 7.0
scale 0, median #cells per radius (r=15): 2.0
total batch: 31, running batch MsBrainAgingSpatialDonor_2_1
scale 4, median #cells per radius (r=15): 9.0
scale 1, median #cells per radius (r=15): 3.0
scale 4, median #cells per radius (r=15): 9.0
scale 1, median #cells per radius (r=15): 3.0
scale 0, median #cells per radius (r=15): 2.0
scale 2, median #cells per radius (r=15): 5.0
scale 5, median #cells per radius (r=15): 11.0
scale 5, median #cells per radius (r=15): 11.0
total batch: 31, running batch MsBrainAgingSpatialDonor_3_0
scale 2, median #cells per radius (r=15): 5.0
scale 3, median #cells per radius (r=15): 7.0
total batch: 31, running batch MsBrainAgingSpatialDonor_3_1
scale 1, median #cells per radius (r=15): 3.0
scale 0, median #cells per radius (r=15): 2.0
scale 3, median #cells per radius (r=15): 7.0
scale 0, median #cells per radius (r=15): 2.0
scale 4, median #cells per radius (r=15): 9.0
scale 1, median #cells per radius (r=15): 3.0
scale 2, median #cells per radius (r=15): 5.0
total batch: 31, running batch MsBrainAgingSpatialDonor_4_0
scale 1, median #cells per radius (r=15): 3.0
scale 4, median #cells per radius (r=15): 9.0
scale 0, median #cells per radius (r=15): 1.0
scale 5, median #cells per radius (r=15): 12.0
scale 2, median #cells per radius (r=15): 5.0
scale 2, median #cells per radius (r=15): 5.0
scale 1, median #cells per radius (r=15): 3.0
scale 3, median #cells per radius (r=15): 8.0
total batch: 31, running batch MsBrainAgingSpatialDonor_4_1
scale 2, median #cells per radius (r=15): 5.0
scale 5, median #cells per radius (r=15): 11.0
scale 3, median #cells per radius (r=15): 7.0
scale 3, median #cells per radius (r=15): 7.0
scale 0, median #cells per radius (r=15): 2.0
scale 3, median #cells per radius (r=15): 7.0
scale 1, median #cells per radius (r=15): 3.0
scale 4, median #cells per radius (r=15): 9.0
scale 4, median #cells per radius (r=15): 9.0
scale 4, median #cells per radius (r=15): 10.0
total batch: 31, running batch MsBrainAgingSpatialDonor_4_2
scale 4, median #cells per radius (r=15): 9.0
scale 2, median #cells per radius (r=15): 5.0
scale 5, median #cells per radius (r=15): 11.0
scale 0, median #cells per radius (r=15): 2.0
scale 3, median #cells per radius (r=15): 7.0
scale 5, median #cells per radius (r=15): 10.0
scale 1, median #cells per radius (r=15): 3.0
scale 5, median #cells per radius (r=15): 12.0
total batch: 31, running batch MsBrainAgingSpatialDonor_5_0
scale 4, median #cells per radius (r=15): 9.0
scale 5, median #cells per radius (r=15): 12.0
scale 2, median #cells per radius (r=15): 5.0
scale 0, median #cells per radius (r=15): 2.0
scale 5, median #cells per radius (r=15): 11.0
scale 1, median #cells per radius (r=15): 3.0
scale 3, median #cells per radius (r=15): 7.0
total batch: 31, running batch MsBrainAgingSpatialDonor_5_1
scale 2, median #cells per radius (r=15): 5.0
scale 4, median #cells per radius (r=15): 9.0
scale 0, median #cells per radius (r=15): 2.0
scale 3, median #cells per radius (r=15): 7.0
scale 1, median #cells per radius (r=15): 3.0
scale 5, median #cells per radius (r=15): 11.0
scale 4, median #cells per radius (r=15): 9.0
scale 2, median #cells per radius (r=15): 5.0
total batch: 31, running batch MsBrainAgingSpatialDonor_5_2
scale 5, median #cells per radius (r=15): 11.0
scale 3, median #cells per radius (r=15): 7.0
scale 0, median #cells per radius (r=15): 2.0
scale 1, median #cells per radius (r=15): 3.0
scale 4, median #cells per radius (r=15): 9.0
scale 2, median #cells per radius (r=15): 5.0
scale 5, median #cells per radius (r=15): 11.0
total batch: 31, running batch MsBrainAgingSpatialDonor_6_0
scale 3, median #cells per radius (r=15): 7.0
scale 0, median #cells per radius (r=15): 2.0
scale 4, median #cells per radius (r=15): 9.0
total batch: 31, running batch MsBrainAgingSpatialDonor_6_1
scale 1, median #cells per radius (r=15): 3.0
scale 5, median #cells per radius (r=15): 11.0
scale 0, median #cells per radius (r=15): 2.0
scale 2, median #cells per radius (r=15): 5.0
scale 1, median #cells per radius (r=15): 3.0
scale 2, median #cells per radius (r=15): 5.0
total batch: 31, running batch MsBrainAgingSpatialDonor_6_2
scale 3, median #cells per radius (r=15): 7.0
scale 3, median #cells per radius (r=15): 7.0
scale 0, median #cells per radius (r=15): 2.0
scale 4, median #cells per radius (r=15): 9.0
scale 1, median #cells per radius (r=15): 3.0
scale 4, median #cells per radius (r=15): 8.0
scale 2, median #cells per radius (r=15): 5.0
scale 5, median #cells per radius (r=15): 11.0
total batch: 31, running batch MsBrainAgingSpatialDonor_7_0
scale 5, median #cells per radius (r=15): 10.0
scale 3, median #cells per radius (r=15): 7.0
scale 0, median #cells per radius (r=15): 2.0
scale 4, median #cells per radius (r=15): 8.0
scale 1, median #cells per radius (r=15): 3.0
total batch: 31, running batch MsBrainAgingSpatialDonor_7_1
scale 5, median #cells per radius (r=15): 10.0
scale 2, median #cells per radius (r=15): 5.0
scale 0, median #cells per radius (r=15): 2.0
scale 3, median #cells per radius (r=15): 7.0
scale 1, median #cells per radius (r=15): 3.0
total batch: 31, running batch MsBrainAgingSpatialDonor_7_2
scale 4, median #cells per radius (r=15): 9.0
scale 2, median #cells per radius (r=15): 5.0
scale 0, median #cells per radius (r=15): 2.0
scale 3, median #cells per radius (r=15): 7.0
scale 5, median #cells per radius (r=15): 11.0
scale 1, median #cells per radius (r=15): 3.0
total batch: 31, running batch MsBrainAgingSpatialDonor_8_0
scale 4, median #cells per radius (r=15): 9.0
scale 2, median #cells per radius (r=15): 5.0
scale 0, median #cells per radius (r=15): 2.0
scale 5, median #cells per radius (r=15): 11.0
scale 3, median #cells per radius (r=15): 7.0
total batch: 31, running batch MsBrainAgingSpatialDonor_8_1
scale 1, median #cells per radius (r=15): 3.0
scale 4, median #cells per radius (r=15): 9.0
scale 0, median #cells per radius (r=15): 2.0
scale 2, median #cells per radius (r=15): 5.0
scale 5, median #cells per radius (r=15): 11.0
scale 1, median #cells per radius (r=15): 3.0
total batch: 31, running batch MsBrainAgingSpatialDonor_8_2
scale 3, median #cells per radius (r=15): 7.0
scale 2, median #cells per radius (r=15): 5.0
scale 0, median #cells per radius (r=15): 2.0
scale 3, median #cells per radius (r=15): 7.0
scale 4, median #cells per radius (r=15): 9.0
total batch: 31, running batch MsBrainAgingSpatialDonor_9_0
scale 1, median #cells per radius (r=15): 3.0
scale 0, median #cells per radius (r=15): 2.0
scale 4, median #cells per radius (r=15): 9.0
scale 2, median #cells per radius (r=15): 5.0
scale 5, median #cells per radius (r=15): 11.0
scale 1, median #cells per radius (r=15): 3.0
total batch: 31, running batch MsBrainAgingSpatialDonor_9_1
scale 5, median #cells per radius (r=15): 11.0
scale 3, median #cells per radius (r=15): 7.0
scale 2, median #cells per radius (r=15): 5.0
scale 0, median #cells per radius (r=15): 2.0
scale 4, median #cells per radius (r=15): 9.0
scale 3, median #cells per radius (r=15): 7.0
scale 1, median #cells per radius (r=15): 3.0
total batch: 31, running batch MsBrainAgingSpatialDonor_9_2
scale 4, median #cells per radius (r=15): 8.0
scale 5, median #cells per radius (r=15): 11.0
scale 0, median #cells per radius (r=15): 2.0
scale 2, median #cells per radius (r=15): 5.0
scale 5, median #cells per radius (r=15): 10.0
scale 1, median #cells per radius (r=15): 3.0
scale 3, median #cells per radius (r=15): 7.0
scale 2, median #cells per radius (r=15): 5.0
scale 4, median #cells per radius (r=15): 9.0
scale 3, median #cells per radius (r=15): 7.0
scale 4, median #cells per radius (r=15): 9.0
scale 5, median #cells per radius (r=15): 11.0
scale 5, median #cells per radius (r=15): 11.0
[8]:
msm.run_clustering_normal(-0.5)

[6]:
print(f'cost {time_cost} s for {adata_raw.shape[0]} cells')
cost 748.213137626648 s for 378918 cells
[ ]:

[7]:
# the plot function has two parameters
# obs: the observation to plot
# gt_obs: the ground truth observation to compute NMI and ARI, can be set to None if not available
msm.output_cluster_all(obs='MENDER',obs_gt=gt_obs)
print('MENDER prediction')
_images/MERFISH_aging_9_0.png
MENDER prediction
_images/MERFISH_aging_9_2.png
_images/MERFISH_aging_9_3.png
_images/MERFISH_aging_9_4.png
_images/MERFISH_aging_9_5.png
_images/MERFISH_aging_9_6.png
_images/MERFISH_aging_9_7.png
_images/MERFISH_aging_9_8.png
_images/MERFISH_aging_9_9.png
_images/MERFISH_aging_9_10.png
_images/MERFISH_aging_9_11.png
_images/MERFISH_aging_9_12.png
_images/MERFISH_aging_9_13.png
_images/MERFISH_aging_9_14.png
_images/MERFISH_aging_9_15.png
_images/MERFISH_aging_9_16.png
_images/MERFISH_aging_9_17.png
_images/MERFISH_aging_9_18.png
_images/MERFISH_aging_9_19.png
_images/MERFISH_aging_9_20.png
_images/MERFISH_aging_9_21.png
_images/MERFISH_aging_9_22.png
_images/MERFISH_aging_9_23.png
_images/MERFISH_aging_9_24.png
_images/MERFISH_aging_9_25.png
_images/MERFISH_aging_9_26.png
_images/MERFISH_aging_9_27.png
_images/MERFISH_aging_9_28.png
_images/MERFISH_aging_9_29.png
_images/MERFISH_aging_9_30.png
_images/MERFISH_aging_9_31.png
_images/MERFISH_aging_9_32.png
[9]:
# the plot function has two parameters
# obs: the observation to plot
# gt_obs: the ground truth observation to compute NMI and ARI, can be set to None if not available

msm.output_cluster_all(obs=gt_obs,obs_gt=None)
print('ground truth')
_images/MERFISH_aging_10_0.png
ground truth
_images/MERFISH_aging_10_2.png
_images/MERFISH_aging_10_3.png
_images/MERFISH_aging_10_4.png
_images/MERFISH_aging_10_5.png
_images/MERFISH_aging_10_6.png
_images/MERFISH_aging_10_7.png
_images/MERFISH_aging_10_8.png
_images/MERFISH_aging_10_9.png
_images/MERFISH_aging_10_10.png
_images/MERFISH_aging_10_11.png
_images/MERFISH_aging_10_12.png
_images/MERFISH_aging_10_13.png
_images/MERFISH_aging_10_14.png
_images/MERFISH_aging_10_15.png
_images/MERFISH_aging_10_16.png
_images/MERFISH_aging_10_17.png
_images/MERFISH_aging_10_18.png
_images/MERFISH_aging_10_19.png
_images/MERFISH_aging_10_20.png
_images/MERFISH_aging_10_21.png
_images/MERFISH_aging_10_22.png
_images/MERFISH_aging_10_23.png
_images/MERFISH_aging_10_24.png
_images/MERFISH_aging_10_25.png
_images/MERFISH_aging_10_26.png
_images/MERFISH_aging_10_27.png
_images/MERFISH_aging_10_28.png
_images/MERFISH_aging_10_29.png
_images/MERFISH_aging_10_30.png
_images/MERFISH_aging_10_31.png
_images/MERFISH_aging_10_32.png
[ ]: