Package: maxspin
Maxspin (maximization of spatial information) is an information theoretic
approach to quantifying the degree of spatial organization in spatial
transcriptomics (or other spatial omics) data.InstallationThe python package can be installed with:pipinstallmaxspinBasic UsageThis package operates onAnnDataobjects from theanndatapackage.We assume the existence of a spatial neighborhood graph. A simple and effective
way of doing this is Delaunay triangulation, for example usingsquidpy.importsquidpyassqsq.gr.spatial_neighbors(adata,delaunay=True,coord_type="generic")Spatial information can then be measured using thespatial_informationfunction.frommaxspinimportspatial_informationspatial_information(adata,prior=None)This adds aspatial_informationcolumn to thevarmetadata.Similarly, pairwise spatial information can be computed withpairwise_spatial_information. This function will test every pair of genes,
which is pretty impractical for large numbers of genes, so it's a good idea to
subset theAnnDataobject before calling this.frommaxspinimportpairwise_spatial_informationpairwise_spatial_information(adata,prior=None)For a more detailed example, check out thetutorial.Interpreting the spatial information scoreThe method compute a score for every cell/spot that's in[0,1], like a
correlation but typically much smaller, and sums them to arrive at a spatial
information score that is then in[0, ncells]. It's possible to normalize for
the number of cells by just dividing, but by default a pattern involving more
cells is considered more spatially coherent, hence the sum.NormalizationThere are different ways spatial information can be computed. By default, no
normalization is done and spatial information is computed on absolute counts.
Uncertainty is incorporated using a Gamma-Poisson model.Ifprior=Noneis used, the method makes no attempt to account for estimation
uncertainty and computes spatial information directly on whatever is inadata.X.The recommended way to runspatial_informationis with some kind of normalized
estimate of expression with some uncertainty estimation. There are two
recommended ways of doing this: SCVI and Vanity.SCVISCVIis a convenient and versatile probabilistic
model of sequencing experiments, from which we can sample from the posterior to
get normalized point estimates with uncertainty.Using Maxspin with SCVI looks something like this:importscviimportnumpyasnpfrommaxspinimportspatial_informationscvi.model.SCVI.setup_anndata(adata)model=scvi.model.SCVI(adata,n_latent=20)# Sample log-expression values from the posterior.posterior_samples=np.log(model.get_normalized_expression(return_numpy=True,return_mean=False,n_samples=20,library_size="latent"))adata_scvi=adata.copy()adata_scvi.X=np.mean(posterior_samples,axis=0)adata_scvi.layers["std"]=np.std(posterior_samples,axis=0)spatial_information(adata_scvi,prior="gaussian")Thetutorialhas
a more in depth example of using SCVI.VanityI developed the normalization methodvanityin part as convenient way to normalize spatial transcriptomics data in a way
that provides uncertainty estimates. The preferred way of running vanity + maxspin is then:frommaxspinimportspatial_informationfromvanityimportnormalize_vanitynormalize_vanity(adata)spatial_information(adata,prior="gaussian")Compared to SCVI, this model more aggressively shrinks low expression genes,
which might cause it to miss something very subtle, but is less likely to detect
spurious patterns.