delnx.tl.groupedΒΆ

delnx.tl.grouped(func, adata, group_key, min_samples=2, multitest_method='fdr_bh', verbose=True, **kwargs)[source]ΒΆ

Run a DE function separately for each group and combine results.

Thin orchestrator that subsets adata by each unique value of adata.obs[group_key], calls func on each subset, and re-corrects p-values across all groups.

Parameters:
  • func (Callable[..., DataFrame]) – DE function with signature func(adata, **kwargs) -> pd.DataFrame. The returned DataFrame must contain a pval column. Works with de(), rank_de(), or any custom function (e.g., a lambda wrapping nb_fit() + nb_test()).

  • adata (AnnData) – Annotated data object.

  • group_key (str) – Column in adata.obs defining groups (e.g., "cell_type").

  • min_samples (int (default: 2)) – Minimum observations per group to run the analysis. Groups with fewer observations are skipped with a warning.

  • multitest_method (str (default: 'fdr_bh')) – Method for multiple testing correction across all groups (see statsmodels.stats.multipletests()).

  • verbose (bool (default: True)) – Whether to print progress messages.

  • **kwargs – Passed through to func.

Return type:

DataFrame

Returns:

pd.DataFrame Combined results with an additional group column. The padj column is re-computed across all groups.

Examples

Per-cell-type logistic regression:

>>> results = dx.tl.grouped(dx.tl.de, adata, group_key="cell_type",
...                         condition_key="treatment", reference="control",
...                         contrast="treatment[T.drugA]")

Per-cell-type rank-based markers:

>>> results = dx.tl.grouped(dx.tl.rank_de, adata, group_key="cell_type", condition_key="treatment")

Per-cell-type negative binomial DE:

>>> def nb_de(adata, **kw):
...     fit = dx.tl.nb_fit(adata, **kw)
...     return dx.tl.nb_test(adata, fit)
>>> results = dx.tl.grouped(nb_de, adata, group_key="cell_type", condition_key="treatment")