Intrinsic analysis with SenID

This tutorial demonstrates how to identify intrinsic senescence-associated transcriptional dynamics using Monod inference within SenID.

We use scRNA-seq of damaged lung tissue from 18-month-old mice, originally generated in Reyes et al. (2022). In this study, senescent cells were labelled using GFP markers of p16^INK4a^, a common senescence marker. The authors then performed FACS prior to sequencing to generate GFP+ and GFP- scRNA-seq datasetes.

We re-aligned the data using kb-python to generate unspliced and spliced counts, and re-annotated the data based on spliced expression using a procedure similar to the scANVI tutorial that uses the Tabula Muris Senis dataset as a reference.

Load the data

from pathlib import Path
import scanpy as sc
import senid as sid

adata = sc.read_h5ad("reyes22_old_unspliced.h5ad")

We will analyze intrinsic dynamic changes between GFP-positive senescent cells and GFP-negative per cell type using Monod. We therefore need to stratify the data by cell type and GFP status.

Create output directories

output_dir = Path("intrinsic_outputs")
output_dir.mkdir(exist_ok=True)

Generate loom objects

SenID partitions cells by cell type and condition before preparing loom files for Monod inference. Here, partition_key is used to split by cell type, and comparison_key is the key to split cell-type-specific populations into GFP+ and GFP- subsets. This step generates a list of all files that are to be used for Monod inference.

cell_groups = sid.it.generate_loom_objects(
    adata,
    dataset_key="reyess2_old",
    partition_key="prediction_scanvi",
    comparison_key="GFP",
    output_directory=output_dir,
    min_cells=100,
    return_groups=True,
)

Prepare Monod inference files

sid.it.prepare_files_for_inference(
    dataset_key="reyes22_old",
    output_directory=output_dir,
    cell_groups=cell_groups,
)

This step prepares input matrices and metadata required for Monod.


Run Monod inference

sid.it.run_monod_inference(
    dataset_key="reyes22_old",
    output_directory=output_dir,
    cell_groups=cell_groups,
)

This step estimates transcriptional dynamics for each cell group.

Depending on dataset size, this may require substantial compute time.


Process Monod fits

sid.it.process_monod_fits(
    dataset_key="reyes22_old",
    output_directory=output_dir,
    cell_groups=cell_groups,
)

This step extracts interpretable transcriptional dynamics statistics from the raw Monod outputs.


Identify differential transcriptional dynamics

de_results = sid.it.get_monod_de_genes(
    dataset_key="reyes22_old",
    output_directory=output_dir,
    comparison_1="GFPPos",
    comparison_2="GFPNeg",
)

This function identifies genes exhibiting differential transcriptional dynamics between conditions.


Save outputs

de_results.to_csv(
    output_dir / "intrinsic_differential_dynamics.csv",
    index=False,
)