Is it ever ok to use Seurat for clustering bulk samples?

I am looking at FPKM data from ~750 bulk RNA-seq samples generated using Cufflinks. As suggested for FPKM data, I manually input log transformed data to the @data slot [cd138_bm@data <- log([email protected] + 1)] and skip the NormalizeData() function. I then use functions FindVariableGenes, ScaleData, RunPCA, FindClusters, RunTSNE, FindAllMarkers in their usual ways to find clusters & cluster markers. My clustering results are quite reasonable, and reflect published work clustering similar samples.

What are the potential pitfalls of using these Seurat functions on bulk data? In FindAllMarkers, would you recommend I use the "negbinom" test? (currently using wilcox) Any other arguments you would recommend changing from the default?

  • 1
    $\begingroup$ Good question. I removed scrnaseq tag since you have bulk rna sequencing, if I misunderstood somehting, feel free to edit it back. $\endgroup$ Commented Oct 5, 2018 at 8:47
  • $\begingroup$ I also want to try this bulk analysis with seurat and I am interested in your methods. Did you publish this analysis already ? If it's fine, I would like to ask you get the papers you wrote ! $\endgroup$
    – ASE
    Commented Sep 26, 2019 at 3:28
  • $\begingroup$ I didn't publish, but I did use seurat on bulk and it worked great. $\endgroup$
    – R-Peys
    Commented Sep 27, 2019 at 4:11
  • $\begingroup$ It's a good question. I processed the sc-RNAseq data and generated some new markers based on gene expression value. In the subsequent analysis, I want to find differential markers in multiple clusters of my dataset based on seurat package. $\endgroup$ Commented Jun 7, 2023 at 12:34

2 Answers 2


I'm not sure Seurat is the best tool for this as it was developed for single cell RNA seq data and there are a few intricacies of that type of data that are very different from bulk RNA seq. For bulk there are really good packages available and corresponding workflows, e.g. limma, edgeR and DESeq2.

The main problems with Seurat for bulk RNA-seq:

  1. Seurat expects counts as input - FPKM are not counts nor are they log counts or log norm counts. It's a specific normalisation method that takes into account gene length and library size and breaks the link between gene counts and variance.
  2. Because of the distribution of reads from a single cell that you get from the sequencer Seurat scales all unique reads (i.e. UMIs) to 10,000 per cell and usually regresses out the nUMI count. Again, becuase you've got FPKMs this makes no sense.
  3. The other functions you can use on bulk data, i.e. tSNE, finding clusters and markers (which is essentially DGE analysis). The one thing to note for the latter is that again because you've got FPKMs they don't follow the negative binomial distribution. Your best bet is limma trend but I'm not sure it's included in Seurat.
  • $\begingroup$ You don't need to use Seurat's normalization. You can provide normalized counts or FPKMs and skip the normalization step. See this earlier discussion: bioinformatics.stackexchange.com/questions/5115/… $\endgroup$
    – burger
    Commented Oct 12, 2018 at 18:51
  • $\begingroup$ That's true but if you look at the original post, OP uses ScaleData, which scales already scaled FPKM values. Even though feeding bulk RNA seq FPKM values to a Seurat@data slot is essentially doable, you are still relying on the downstream processing steps that were designed for log-normalised count data to be meaningful for FPKM values and it's certainly not the case for the FindAllMarkers function. $\endgroup$
    – biomiha
    Commented Oct 13, 2018 at 8:49
  • $\begingroup$ There are a few issues on the Seurat GitHub that discuss importing TPM/FPKM values. The suggestions are always to just skip normalization and proceed normally. I haven't seen any concerns raised about FindAllMarkers. I don't mean to imply those concerns are not legitimate, but it's interesting they are not raised. $\endgroup$
    – burger
    Commented Oct 13, 2018 at 20:35

FYI - heard from the author of Seurat, see this github issue

His suggestion to use DESeq won't work in my case, because DESeq requires counts data which I don't have. But it is the green light to generally use the package on bulk data. I am using test.use = "wilcox" in FindMarkers() because it's non-parametric...

  • $\begingroup$ I would actually suggest limma-trend (not voom). Compared to a wilcox you'll gain a bit of statistical power due to the empirical bayes moderated t-test. $\endgroup$
    – biomiha
    Commented Oct 31, 2018 at 18:26

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.