# scPTR **Single-Cell Post-Transcriptional Regulatory Decomposition** scPTR estimates per-cell, per-gene mRNA degradation rates from scRNA-seq spliced/unspliced counts and uses them as a primary analytical axis — complementary to RNA velocity. ## What scPTR does - **Degradation rate estimation**: Per-cell, per-gene gamma from kinetic steady-state relationships with kNN Gaussian-kernel smoothing - **Expression-invisible states**: Discovers cell subpopulations with distinct post-transcriptional programs undetectable by standard expression analysis - **Post-transcriptional velocity**: Neighbor-averaged gamma gradient that captures degradation dynamics orthogonal to RNA velocity - **RBP-target networks**: Library-size-corrected inference of RNA-binding protein regulatory networks with elastic net - **DeepPTR**: Structured VAE with a kinetic decoder that disentangles transcriptional and post-transcriptional latent spaces ## Installation ```bash pip install . ``` Optional dependencies: ```bash pip install ".[deep]" # PyTorch for DeepPTR pip install ".[datasets]" # Pooch for dataset downloads pip install ".[dev]" # pytest for testing ``` ## Quick start ```python import scptr # Load data with spliced/unspliced layers adata = scptr.read_h5ad("your_data.h5ad") # Preprocessing scptr.pp.filter_genes(adata) scptr.pp.normalize_layers(adata) scptr.pp.neighbors(adata) scptr.pp.smooth_layers(adata) # Estimate rates scptr.tl.estimate_beta(adata) scptr.tl.estimate_gamma(adata) # Downstream analysis scptr.tl.variance_decomposition(adata) scptr.tl.pt_states(adata) scptr.tl.pt_velocity(adata) scptr.tl.infer_network(adata) ``` ## Pipeline overview ``` Raw scRNA-seq (spliced + unspliced) -> Gene/cell filtering -> Library-size normalization (per layer) -> kNN graph + Gaussian smoothing -> Beta estimation (quantile regression on u/s phase portraits) -> Gamma estimation (gamma = beta * u / s, per cell per gene) -> Variance decomposition (transcriptional vs post-transcriptional) -> PT states (PCA + Leiden clustering in gamma-space) -> PT velocity (neighbor-averaged gamma gradient) -> RBP-target network inference (elastic net, library-size corrected) ``` ## Validation scPTR gamma estimates have been validated against: | Validation | Result | |------------|--------| | Published mRNA half-lives | ρ = −0.81 (sci-fate), −0.33 to −0.40 (10x developmental) | | Method comparison | Outperforms scVelo steady-state (−0.37) and velVI (−0.28) | | miRNA target enrichment | 59% of 215 families enriched (p = 4.7×10⁻⁶⁵) | | 3′ UTR sequence features | UTR length ρ = 0.34 (p < 10⁻²⁰⁰), AU content ρ = 0.30 | | DepMap CRISPR essentiality | Hub RBPs more essential (p = 6.4×10⁻⁵) | | Subsampling robustness | r > 0.97 at 20% subsampling | ## Key findings - **Expression-invisible states**: 3/8 pancreatic and 6/11 hippocampal cell types harbor post-transcriptional subpopulations undetectable by expression analysis (confirmed by zero-permutation control, ARI ≈ 0), enriched for ER stress/autophagy and synaptic plasticity pathways - **Temporal precedence**: degradation-rate changes precede expression changes for 54% of transition genes in pancreas (p < 10⁻⁵⁷) and 78% in dentate gyrus (p = 9.9×10⁻¹³) - **RBP networks**: library-size-corrected inference identifies essential hub regulators (HNRNPA1, YBX1, ELAVL1/HuR); neuroblastoma shows 66% stabilizing edges vs. destabilizing bias in developmental tissues ## Datasets Built-in dataset loaders (downloaded via Pooch): ```python adata = scptr.datasets.pancreas() # Mouse endocrinogenesis (3,696 cells) adata = scptr.datasets.dentate_gyrus() # Mouse hippocampal neurogenesis (2,930 cells) adata = scptr.datasets.sci_fate() # Human A549 dexamethasone response (7,404 cells) ``` ## Requirements - Python >= 3.9 - anndata >= 0.8, scanpy >= 1.9, numpy >= 1.21, scipy >= 1.7, numba >= 0.55 - Optional: torch >= 2.0 (DeepPTR), pooch >= 1.6 (datasets) ## Citation If you use scPTR, please cite: > scPTR: Decomposing Post-Transcriptional Regulation at Single-Cell Resolution (2026)