Differential Analysis
=====================


.. raw:: html

     <p style="margin:0.8em 0 1em; padding: 0.8em 1.2em; background: linear-gradient(135deg, rgba(139, 0, 0, 0.08) 0%, rgba(139, 0, 0, 0.03) 100%); border-left: 4px solid #8B0000; border-radius: 4px;">
       <strong>💡 Tip:</strong> Click the&nbsp;
       <span style="color:#8B0000;font-weight:bold;font-size:1.1em;">+</span>
       in the <em>first column</em> to expand detailed method descriptions.
     </p>

   <style>
   td.details-control { 
     width:20px; 
     text-align:center; 
     cursor:pointer;
     color: #8B0000;
     font-weight: bold;
     font-size: 1.2em;
   }
   td.details-control::before { content:'+'; }
   tr.shown td.details-control::before { content:'-'; }
   td.published { text-align:center; font-weight:bold; }
   .table-container { width:100%; overflow-x:auto; }
   a.github-link {
     display:inline-block; font-size:1.2em; vertical-align:middle; color:inherit;
   }
   a.github-link:hover { color:#8B0000; }
   
   /* Task and Model badges */
   .badge {
     display: inline-block;
     padding: 0.25em 0.6em;
     margin: 0.15em;
     font-size: 0.85em;
     font-weight: 500;
     line-height: 1;
     border-radius: 12px;
     white-space: nowrap;
   }
   
   .task-badge {
     background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     color: white;
     border: 1px solid rgba(102, 126, 234, 0.3);
   }
   
   .model-badge {
     background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
     color: white;
     border: 1px solid rgba(245, 87, 108, 0.3);
   }
   
   html[data-theme="light"] .task-badge {
     background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     box-shadow: 0 2px 4px rgba(102, 126, 234, 0.2);
   }
   
   html[data-theme="light"] .model-badge {
     background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
     box-shadow: 0 2px 4px rgba(245, 87, 108, 0.2);
   }
   
   /* Method name styling */
   td a[href*="doi.org"],
   td a[href*="nature.com"],
   td a[href*="biorxiv.org"],
   td a[href*="cell.com"] {
     font-weight: 600;
     color: #8B0000;
     text-decoration: none;
     transition: all 0.2s ease;
   }
   
   td a[href*="doi.org"]:hover,
   td a[href*="nature.com"]:hover,
   td a[href*="biorxiv.org"]:hover,
   td a[href*="cell.com"]:hover {
     color: #b30000;
     text-decoration: underline;
   }
   
   /* Published status icons */
   td.published {
     font-size: 1.2em;
   }
   
   /* Expandable description styling */
   .expanded-description {
     padding: 1em;
     background: rgba(139, 0, 0, 0.05);
     border-left: 3px solid #8B0000;
     line-height: 1.6;
     font-size: 0.95em;
   }
   
   html[data-theme="light"] .expanded-description {
     background: rgba(139, 0, 0, 0.03);
   }
   </style>

   <div class="table-container">
     <table id="methods-table" class="display" style="width:100%">
       <thead>
         <tr>
           <th></th><th>Method</th><th>Year</th><th>Task</th>
           <th>Model</th><th>Published</th><th>Code</th>
         </tr>
       </thead>
       <tbody>
         <tr data-description="Augur rank cell types by quantifying how accurately perturbation labels can be predicted from gene expression profiles using a random forest classifier (or regressor depending on the perturbation label). For each cell type, it repeatedly subsamples a fixed number of cells to mitigate biases from uneven cell numbers. It also employs a two-step feature selection procedure, first, identifying highly variable genes via local polynomial regression on the mean–variance relationship, and second, random downsampling. AUGUR then uses cross-validation to compute the area under the ROC curve (AUC) as a model performance metric that is used to quantify the perturbation effect on each cell type. It also provides (gene) feature importances. For multi-class or continous perturbations, cell-type effects (model performance) are measured using macro-averaged AUC or concordance correlation coefficient, respectively.">
           <td class="details-control"></td>
           <td><a href="https://www.nature.com/articles/s41587-020-0605-1#Abs1">AUGUR</a></td>
           <td>2020</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Perturbation Responsiveness</span><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Random Forrest</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://github.com/neurorestore/Augur" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="CellDrift fits a negative binomial GLM to scRNA-seq counts using cell type, perturbation, and their interaction as independent (predictor) variables, while also incorporating library size and batch effects. Pairwise contrast coefficients are then derived to quantify the difference between perturbed and control states across time points. These time series of contrast coefficients, representing the temporal trajectory of perturbation effects per gene, are subsequently analyzed using Fuzzy C-means clustering to group similar temporal patterns and Functional PCA to extract the dominant modes of temporal variance.">
           <td class="details-control"></td>
           <td><a href="https://academic.oup.com/bib/article/23/5/bbac324/6673850#373524408">CellDrift</a></td>
           <td>2022</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Generalised Linear Model</span><span class="badge model-badge">NB Likelihood</span><span class="badge model-badge">Functional PCA</span><span class="badge model-badge">Fuzzy Clustering</span><span class="badge model-badge">Time-resolved</span><span class="badge model-badge">Perturbation-Covariate Interactions</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://github.com/KANG-BIOINFO/CellDrift" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="LEMUR is a PCA based algorithm that defines condition dependent embedings to analyze differences in differentialy expressed genes across conditions. For each condition a separate embeding matrix is learned and reconstructed using a shared matrix. This is used to generate counterfactual estimates for each cell and condition, which is used to infer label-free DE genes and neighborhoods. ">
           <td class="details-control"></td>
           <td><a href="https://www.nature.com/articles/s41588-024-01996-0">LEMUR</a></td>
           <td>2025</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Seen Perturbation Prediction</span><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Multi-condition PCA</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://github.com/const-ae/pylemur" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="Memento is a differential expression framework that uses method-of-moments estimators under a multivariate hypergeometric model, where a gene’s mean is derived from Good-Turing corrected counts scaled by total cell counts. Differential variability is quantified as the variance remaining after accounting for mean-dependent effects (residual variance), while the covariance (pairwise association) between genes is estimated from the off-diagonal elements of the resulting variance-covariance matrix. Efficient permutation is achieved through a bootstrapping strategy that leverages the sparsity of unique transcript counts.">
           <td class="details-control"></td>
           <td><a href="https://www.cell.com/cell/fulltext/S0092-8674(24)01144-9">Memento</a></td>
           <td>2024</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Differential Analysis</span><span class="badge task-badge">Linear Gene Programmes</span><span class="badge task-badge">Feature Relationships</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Hypergeometric test</span><span class="badge model-badge">Probabilistic</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://github.com/yelabucsf/scrna-parameter-estimation" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="miloDE is a cluster-free framework for differential expression analysis in scRNA-seq data that builds on Milo. Similarly, MiloDE relies on pre-calculated latent representations to constructs overlapping neighborhoods on a kNN graph, now improved using a second-order approach to better capture local transcriptional similarity. Expression counts are aggregated within these neighborhoods and analyzed using edgeR’s generalised linear model framework, with dual corrections applied across genes and neighborhoods to control for multiple testing. Additionally, a post hoc neighborhood refinement step ensures complete cell coverage and computational efficiency.">
           <td class="details-control"></td>
           <td><a href="https://link.springer.com/article/10.1186/s13059-024-03334-3">MiloDE</a></td>
           <td>2024</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Generalised Linear Model</span><span class="badge model-badge">NB Likelihood</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://github.com/MarioniLab/miloDE" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="Mixscale extends Mixscape by converting the binary perturbed/non-perturbed assignment into a continuous perturbation score. As it&#39;s predecessor, it first identifies DE genes between gRNA-targeted and non-targeting control cells, then computes perturbation vector and projects each cell’s expression profile onto this vector to yield a quantitative score (computed independently per cell line). A weighted multivariate regression is then applied where each cell’s contribution is scaled according to its perturbation score, so that cells with weaker perturbation (and thus lower scores) have reduced influence on the model. This regression also incorporates covariates such as cell line identity and sequencing depth, and uses a leave-one-feature-out procedure.">
           <td class="details-control"></td>
           <td><a href="https://www.nature.com/articles/s41556-025-01622-z">Mixscale</a></td>
           <td>2025</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Differential Analysis</span><span class="badge task-badge">Perturbation Responsiveness</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Gaussian Mixture Model</span><span class="badge model-badge">Weighted multivariate regression</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://longmanz.github.io/Mixscale/" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="Perturbation Score (PS) quantifies single-cell responses to (&#34;dosage&#34;-informed) perturbations in three steps. First, a signature gene set is defined for each perturbation - either via differential expression or pre-defined gene sets. Second, scMAGeCK’s regression framework estimates gene-level coefficients (β) reflecting the average effect of each perturbation on its target genes. Third, a regularised regression model is fitted per cell to estimate a scalar PS [0-to-1], reflecting how well the cell’s gene expression profile matches the β-weighted perturbation signature. This is done through constrained optimisation, where scores are inferred only for cells annotated as receiving the perturbation.">
           <td class="details-control"></td>
           <td><a href="https://www.nature.com/articles/s41556-025-01626-9">Perturbation Score</a></td>
           <td>2025</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Perturbation Responsiveness</span><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Robust Rank Aggregate</span><span class="badge model-badge">Ridge Regression</span><span class="badge model-badge">Regularised Linear Models</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://github.com/davidliwei/PS" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="River identifies condition-relevant genes from spatial omics data across multiple slices or conditions. It learns gene expression and spatial coordinate embeddings using separate MLP-based encoders, which are then concatenated and used to predict condition labels. Spatial alignment is thus required as a preprocessing step. In a second step, River uses Integrated Gradients, DeepLift, and GradientShap to attribute model predictions to input genes at the cell level. These attribution scores are aggregated using rank aggregation to prioritize condition-relevant genes.">
           <td class="details-control"></td>
           <td><a href="https://www.biorxiv.org/content/10.1101/2024.08.04.606512v1.abstract">River</a></td>
           <td>2024</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Non-linear Classifier</span><span class="badge model-badge">Feature Attribution</span><span class="badge model-badge">Spatially-informed</span></div></td>


           <td class="published"><span style="color: #DC143C;">✗</span></td>
            <td><a href="https://github.com/C0nc/River" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="scCausalVI is a causality-aware generative model that disentangles inherent cellular heterogeneity from treatment-induced effects in perturbational single-cell RNA-seq data. It encodes structural causal model (SCM) principles into a deep variational inference framework, learning two distinct but interrelated latent factor sets: background factors capturing intrinsic cellular states and treatment effect factors encoding condition-specific transcriptional changes. A Squeeze-and-Excitation Networks (SENet) attention mechanism adaptively scales treatment effects per cell, enabling cell-state-specific response modeling at single-cell resolution. When batch information is available, scCausalVI simultaneously disentangles batch effects, treatment effects, and baseline cellular states in multi-source data integration. Through cross-condition in silico prediction, scCausalVI predicts gene expression profiles under hypothetical scenarios by intervening on condition assignments within the SCM. This enables identification of treatment-responsive cells via permutation-based significance testing, as well as identification of susceptible versus resistant subpopulations by computationally projecting treated cells back to untreated states. Downstream differential expression and pathway analyses on these virtual cells identified subpopulations reveal molecular signatures and regulatory mechanisms underlying differential cellular responses, facilitating the discovery of therapeutic targets and mechanistic drivers of disease susceptibility. ">
           <td class="details-control"></td>
           <td><a href="https://doi.org/10.1016/j.cels.2025.101443">scCausalVI</a></td>
           <td>2025</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Causal Structure</span><span class="badge task-badge">Unsupervised Disentanglement</span><span class="badge task-badge">Seen Perturbation Prediction</span><span class="badge task-badge">Context Transfer</span><span class="badge task-badge">Multi-component Disentanglement</span><span class="badge task-badge">Perturbation Responsiveness</span><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Variational Autoencoder</span><span class="badge model-badge">Structural Causal Model</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://github.com/ShaokunAn/scCausalVI" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="scDist is a statistical framework that uses linear mixed-effects models to estimate gene-level condition effects while accounting for individual and technical variability. In the model, baseline expression levels are first captured, and then a parameter representing the condition-induced change is estimated. The overall shift between conditions is quantified by computing the Euclidean distance between the condition-specific mean expression profiles - essentially, by taking the norm of the condition effect vector. This high-dimensional metric is then efficiently approximated in a lower-dimensional space via principal component analysis.">
           <td class="details-control"></td>
           <td><a href="https://www.nature.com/articles/s41467-024-51649-3">scDIST</a></td>
           <td>2024</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Perturbation Responsiveness</span><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Generalised Linear Model</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://github.com/phillipnicol/scDist" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="For each gene-gRNA pair, SCEPTRE fits a negative binomial regression where the response is the gene’s expression across cells and the predictors are binary indicator denoting gRNA presence, plus technical covariates. Concurrently, a logistic regression using the same technical factors estimates π - the probability of detecting the gRNA in a cell. In a conditional resampling step, gRNA assignments are independently redrawn per cell based on π, generating an empirical null distribution of z-scores; a skew‑t distribution is then fitted to this null to yield calibrated p‑values.">
           <td class="details-control"></td>
           <td><a href="https://link.springer.com/article/10.1186/s13059-021-02545-2">SCEPTRE</a></td>
           <td>2021</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Differential Analysis</span><span class="badge task-badge">Perturbation Responsiveness</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Conditional Resampling</span><span class="badge model-badge">Generalised Linear Model</span><span class="badge model-badge">NB Likelihood</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://github.com/Katsevich-Lab/sceptre" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="scMAGeCK is a framework with two modules: 1) scMAGeCK-RRA ranks cells by marker expression and uses rank aggregation, with a dropout filtering step, to detect enrichment of specific perturbations; 2) scMAGeCK-LR applies ridge regression on the expression matrix to compute the relevance of perturbations, including in cells with multiple perturbations. Both modules rely on permutation tests and Benjamini-Hochberg correction.">
           <td class="details-control"></td>
           <td><a href="https://link.springer.com/article/10.1186/s13059-020-1928-4#Sec10">scMAGeCK</a></td>
           <td>2020</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Robust Rank Aggregate</span><span class="badge model-badge">Ridge Regression</span></div></td>


           <td class="published"><span style="color: #2E8B57;">✓</span></td>
            <td><a href="https://bitbucket.org/weililab/scmageck/src/master/" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="Taichi identifies perturbation-relevant cell niches in spatial omics data without predefined spatial clustering. It first constructs spatially-informed embeddings using MENDER, which are then used in a logistic regression model to predict slice-level condition labels. Using the trained model each cell (niche) is assigned a probability of belonging to the condition group. These probabilities are clustered using k-means (k=2) to separate condition-relevant and control-like niches. Graph heat diffusion is applied to refine these labels by propagating information across spatially adjacent cells. Finally, a second k-means clustering step is performed on the diffused results to define the final niche segmentation.">
           <td class="details-control"></td>
           <td><a href="https://www.biorxiv.org/content/10.1101/2024.05.30.596656v1.abstract">Taichi</a></td>
           <td>2024</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Perturbation Responsiveness</span><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Graph Diffusion</span><span class="badge model-badge">K-means</span><span class="badge model-badge">Logistic Regression</span><span class="badge model-badge">Spatially-informed</span></div></td>


           <td class="published"><span style="color: #DC143C;">✗</span></td>
            <td><a href="https://github.com/C0nc/TAICHI" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
         <tr data-description="Vespucci builds on Augur, and similarly it trains a random forest classifier to predict perturbation labels based on gene expression but extends this to spatial barcodes, using cross-validation within small, neighbouring regions to compute the area under the ROC curve (AUC) as a measure of transcriptional separability per observation. To overcome the computational inefficiency of classification across all observations, Vespucci employs a meta-learning approach: it first performs exhaustive classification on a subset of barcodes, then trains a random forrest regression model on derived distance metrics (e.g., Pearson correlation, Spearman correlation) between all pairs of observations to impute AUCs across the full dataset. This is done by iteratively expanding the number of observations in the training set until convergence (according to prediction similarity to the previous iteration). Finally, perturbation-responsive genes are identified by splitting the data (using an independent set of observations) to avoid bias, then using negative binomial mixed models to link gene expression to AUC scores.">
           <td class="details-control"></td>
           <td><a href="https://www.biorxiv.org/content/10.1101/2024.06.13.598641v2.full">Vespucci</a></td>
           <td>2024</td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge task-badge">Perturbation Responsiveness</span><span class="badge task-badge">Differential Analysis</span></div></td>

           <td><div style="display: flex; flex-wrap: wrap; gap: 0.3em;"><span class="badge model-badge">Random Forrest</span><span class="badge model-badge">Spatially-Informed</span></div></td>


           <td class="published"><span style="color: #DC143C;">✗</span></td>
            <td><a href="https://github.com/neurorestore/Vespucci" class="github-link">
                  <i class="fab fa-github" aria-hidden="true"></i>
                  <span class="sr-only">GitHub</span>
                </a></td>
         </tr>
       </tbody>
     </table>
   </div>

.. raw:: html

   <script>
   jQuery(function($){
      $('#methods-table').DataTable({
        order:      [[2,'desc']],
        pageLength: 10,
        lengthMenu: [5,10,20,50,200],
        scrollX:    true,
        autoWidth:  false
      });
     $('#methods-table tbody').on('click','td.details-control',function(){
       var tr = $(this).closest('tr'),
           row = $('#methods-table').DataTable().row(tr);
       if(row.child.isShown()){
         row.child.hide(); tr.removeClass('shown');
       } else {
         row.child('<div class="expanded-description">'+tr.data('description')+'</div>').show();
         tr.addClass('shown');
       }
     });
   });
   </script>

