Source code for spatialtis.spatial.autocorr

import numpy as np
import pandas as pd
from anndata import AnnData
from spatialtis_core import spatial_autocorr as autocorr
from typing import Literal

from spatialtis.abc import AnalysisBase
from spatialtis.utils import doc, options_guard


[docs]@doc def spatial_autocorr( data: AnnData, method: Literal["moran_i", "geary_c"] = "moran_i", pval: float = 0.05, two_tailed: bool = True, layer_key: str = None, export_key: str = "spatial_autocorr", **kwargs, ): """Spatial auto-correlation for every marker. Measure the correlation of marker expression with spatial locations. - **Moran's I** is more for global spatial autocorrelation. - **Geary's C** is more for local spatial autocorrelation. Parameters ---------- data : {adata} method : {'moran_i', 'geary_c'}, default: 'moran_i' pval : {pval} two_tailed : bool, default: True If True, p-value is two-tailed. layer_key : {layer_key} export_key : {export_key} **kwargs : {analysis_kwargs} See Also -------- :class:`spatialtis.somde` """ method = options_guard(method, ['moran_i', 'geary_c']) ab = AnalysisBase(data, method=method, display_name="Spatial auto-correlation", export_key=export_key, **kwargs) track_ix = [] results_data = [] for roi_name, labels, neighbors, markers, exp in ab.iter_roi( fields=['neighbors', 'exp'], layer_key=layer_key ): results = autocorr( exp.astype(np.float64), neighbors, labels=labels, two_tailed=two_tailed, pval=pval, method=method, ) results = np.hstack([markers.reshape(-1, 1), results]) track_ix += [roi_name for _ in range(len(markers))] results_data.append(results) ab.result = pd.concat( [ pd.DataFrame(data=track_ix, columns=ab.exp_obs), pd.DataFrame( data=np.concatenate(results_data), columns=["marker", "pattern", "index_value", "pval"], ), ], axis=1, )