Source code for spateo.tools.cci_fdr
"""
Companion functions for cell-cell communication inference analyses
"""
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
import numpy as np
import pandas as pd
[docs]def fdr_correct(
pvals: pd.DataFrame,
corr_method: str,
corr_axis: Literal["interactions", "clusters"] = "clusters",
alpha: float = 0.05,
) -> pd.DataFrame:
"""
Correct p-values for FDR along specific axis in `pvals`.
Args:
pvals : pd.DataFrame
corr_method : str
Correction method, should be one of the options in :func `statsmodels.stats.multitest.multipletests`
(listed below for reference):
- Named methods:
- bonferroni
- sidak
- holm-sidak
- holm
- simes-hochberg
- hommel
- Abbreviated methods:
- fdr_bh: Benjamini-Hochberg correction
- fdr_by: Benjamini-Yekutieli correction
- fdr_tsbh: Two-stage Benjamini-Hochberg
- fdr_tsbky: Two-stage Benjamini-Krieger-Yekutieli method
corr_axis : str
Either "interactions" or "clusters"- specifies whether the dataframe given to 'pvals' corresponds to
samples or interactions. If 'interactions', will need to transpose the array first before performing
multiple hypothesis correction.
"""
from pandas.core.arrays.sparse import SparseArray
from statsmodels.stats.multitest import multipletests
def fdr(pvals: pd.Series) -> SparseArray:
_, qvals, _, _ = multipletests(
np.nan_to_num(pvals.values, copy=True, nan=1.0),
method=corr_method,
alpha=alpha,
is_sorted=False,
returnsorted=False,
)
qvals[np.isnan(pvals.values)] = np.nan
return SparseArray(qvals, dtype=qvals.dtype, fill_value=np.nan)
if corr_axis == "clusters":
# clusters are in columns
pvals = pvals.apply(fdr)
elif corr_axis == "interactions":
pvals = pvals.T.apply(fdr).T
else:
raise NotImplementedError(f"FDR correction for `{corr_axis}` is not implemented.")
return pvals