Source code for spatialtis.spatial.sv_gene
from collections import Counter
import numpy as np
import pandas as pd
from anndata import AnnData
from spatialtis_core import somde as smode_sv
from spatialtis.abc import AnalysisBase
from spatialtis.utils import doc
[docs]@doc
def somde(data: AnnData,
k: int = 20,
alpha: float = 0.5,
epoch: int = 100,
pval: float = 0.05,
qval: float = 0.05,
export_key: str = "sv_gene",
**kwargs, ):
"""This is a wrapper around somde
Parameters
----------
data : {adata}
k : int, default: 20
Number of SOM nodes.
alpha : float, default: 0.5
Parameters for generate pseudo gene expression.
epoch : int, default: 100
Number of epoch.
qval : float, default: 0.05
Threshold for qval.
pval : float, default: 0.05
Threshold for pval.
export_key : {export_key}
**kwargs : {analysis_kwargs}
"""
ab = AnalysisBase(data, display_name="SOMDE", export_key=export_key, **kwargs)
track_ix = []
results_data = []
for roi_name, markers, exp, points in ab.iter_roi(
fields=['exp', 'centroid'], desc="Spatial variable genes: SOMDE"
):
sv_genes = smode_sv(
pd.DataFrame(exp, index=markers, dtype=np.float32).fillna(0.0),
np.array(points, dtype=np.float32),
k=k, alpha=alpha, epoch=epoch, pval=pval, qval=qval
)
results_data.append(sv_genes)
track_ix.append(roi_name)
# a dict store all the markers
markers_dict = {k: 0 for k in ab.markers}
# unpack and merge to ensure every counter has the same markers
ab.result = pd.DataFrame(
data=[{**markers_dict, **Counter(i)} for i in results_data],
index=pd.MultiIndex.from_tuples(track_ix, names=ab.exp_obs),
)[ab.markers]