I wish to perform differential expression analysis for cluster-specific gene expression in single-cell data (with a tool such as MAST or SCDE).

I have data for 3 biological replicates. I performed analysis on 10x data with cellranger and have filtered out cells with low UMIs. I have corrected for batch effects and identified clusters by performing graph-based clustering on the UMAP projections.

As I understand it, the components from batch effect correction algorithms are only intended to be used for the purpose of plotting and clustering. They are not to be used for analysis of individual gene expression or differential expression. This has been stated unequivocally by the original authors of MNN and CCA batch correction algorithms.

I have derived a UMI count matrix for each sample which corrects for amplification bias. Differences between the cells and samples still persist in the raw data. These are obvious from the mean UMI counts to the UMAP of uncorrected data. The number of UMIs differs considerably between samples (batches) and individual cells within a sample (the total UMI per cell). The amount of data from each of the cells varies considerably. The read-depth between samples is also different. Therefore, I need a simple approach to correct for differences in read-depth, total UMI or sensitivity between cells.

Is it possible to normalise UMI counts between cells? Should UMI count data be treated differently to reads per transcript in bulk RNA-Seq? Would it be more appropriate to do so at the level of individual cells or for batches across samples?


1 Answer 1


I would suggest using a likelihood ratio test for differential expression using logistic regression with batch as a latent variable. In Seurat you can do:

markers <- FindAllMarkers(object, test.use = 'LR', latent.vars = 'batch')

(change "object" and "batch" accordingly)

See https://www.biorxiv.org/content/early/2018/02/14/258566 from Lior Pachter's group for some more info on the LR test.

  • $\begingroup$ Thanks, Tim. I was considering to use Seurat. Do I need to normalise the data before doing this or does the ScaleData function take care of that for you? $\endgroup$
    – Tom Kelly
    Dec 29, 2018 at 1:25
  • $\begingroup$ You will need to log-normalize the UMI counts, you don't need to run ScaleData if you've already found your clusters using the batch-corrected data $\endgroup$
    – TimStuart
    Dec 31, 2018 at 0:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.