File size: 1,764 Bytes
925ee3b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | """Rank genes by differential gamma across PT states."""
from __future__ import annotations
import numpy as np
import pandas as pd
from anndata import AnnData
from .._constants import GAMMA, PT_STATE
from .._utils import get_layer, require_layers, require_obs, log_params
def rank_pt_genes(
adata: AnnData,
groupby: str = PT_STATE,
method: str = "t-test",
n_genes: int = 100,
) -> pd.DataFrame:
"""Rank genes by differential degradation rate across groups.
Uses scanpy's ``rank_genes_groups`` on the gamma matrix.
Parameters
----------
adata
Annotated data matrix with ``gamma`` layer and group labels.
groupby
Column in ``adata.obs`` defining groups.
method
Statistical test: ``'t-test'``, ``'wilcoxon'``, etc.
n_genes
Number of top genes to return per group.
Returns
-------
DataFrame with ranked genes per group.
"""
import scanpy as sc
require_layers(adata, GAMMA)
require_obs(adata, groupby)
gamma = get_layer(adata, GAMMA)
# Temporary AnnData for ranking
gamma_adata = AnnData(X=gamma.copy())
gamma_adata.obs_names = adata.obs_names.copy()
gamma_adata.var_names = adata.var_names.copy()
gamma_adata.obs[groupby] = adata.obs[groupby].values
sc.tl.rank_genes_groups(
gamma_adata,
groupby=groupby,
method=method,
n_genes=n_genes,
)
# Store results back
adata.uns["rank_pt_genes"] = gamma_adata.uns["rank_genes_groups"]
# Build a summary DataFrame
result = sc.get.rank_genes_groups_df(gamma_adata, group=None)
log_params(adata, "rank_pt_genes", {
"groupby": groupby,
"method": method,
"n_genes": n_genes,
})
return result
|