Pseudobulk transformation in single-cell RNA-seq data analysis: what it is and why it matters
- 7 days ago
- 5 min read
If you're getting started with single-cell RNA-seq, you've probably come across pseudobulk transformation, one step before performing differential expression (DE) analysis. However, many beginners may be unsure what pseudobulk transformation is or why it's needed. In this blog, we will share with you the basics of pseudobulk, including what it is, where it fits into the analysis pipeline, why it's important, and a simple overview of how it's generated.

Before You Start...
If you’re new to the space, or want a more structured foundation, we’ve created a beginner-friendly e-book to guide you through the single-cell analysis workflow. It walks you step by step through the key stages of single-cell RNA-seq data analysis, helping you understand not just what to do, but why each step matters.
First of all: what is pseudobulk transformation?
Let’s kick off with the basics! - What actually is pseudobulk?
Pseudobulk transformation means converting a single-cell RNA-seq dataset into a count matrix grouped according to samples and cell types, so that we can compare cell-type-specific expressions between samples.

Why does it matter to have pseudobulk transformation?
Here you may wonder: What happens if we perform DE analysis directly on the single-cell data without pseudobulk transformation? As mentioned earlier, we want to understand how gene expression differs between samples. However, the original scRNA-seq dataset contains a count matrix where each row represents an individual cell. For example, if we have 3 biological samples and each sample contains approximately 5000 cells, we would have around 15000 cells in total.
This may appear to be a large number, but the differences between individual cells within each sample are quite limited because these cells are not independent from each other: They come from the same sample with the same environment, same genetic background and same experimental conditions, meaning that many of their expression patterns will be correlated. Therefore, if we perform DE analysis directly on this data, there will be two major problems.
First, from a statistical perspective, we may get false positive results because these data points are not independent observations providing us new and unique information. In doing so we are actually treating each of 15000 cells as an independent sample, thus artificially increasing the number of similar observations, which can eventually lead to very small p-values and an increased risk of identifying genes as differentially expressed when they are not truly different between populations.
Second, doing this also implies that we are performing DE analysis between 15,000 individual cells, while the biological question we actually want to answer is the difference between 3 biological samples.
That’s why pseudobulk transformation provides a solution by converting single-cell data into a sample-level format.
How do you do pseudobulk transformation in single-cell RNA-seq data analysis?
So, pseudobulk transformation basically helps us group cells according to samples. This is conducted after cell type annotation. If you are not familiar with the single-cell RNA-seq workflow and how to annotate cell types, you can check out our e-book on how to process single-cell RNA-seq data here: [Ebook] A Biologist's Guide to Single-Cell RNA-seq Data Analysis.
Essentially, we are taking the aggregate expression values for each sample within each cell type, and the workflow should come in this order:
Start with the single-cell count matrix
- Rows = genes
- Columns = cells
Each cell has metadata such as sample/donor, cell type, condition, batch, etc.
Assign cells to groups
Usually grouped by sample/donor + cell type.
For example: Donor 1 - T cells, Donor 2 - T cells, Donor 1 - B cells, etc.
The sample/donor should generally be the biological replicate.
Aggregate counts across cells
For each gene, aggregate the expression values of all cells belonging to the same group (e.g., sample/donor + cell type).
Depending on the workflow, choose an aggregation method:
Sum – adds expression counts across all cells in the group
Mean – calculates the average expression across cells in the group.
Median – calculates the median expression across cells, which can be less influenced by outlier cells.
This produces one representative expression profile for each sample–cell type group.
Create the pseudobulk count matrix
- Rows = genes
- Columns = sample–cell type groups
For example:
Donor 1 – T cell
Donor 2 – T cell
Donor 1 – B cell
Perform preprocessing steps (similarly to a bulk RNA-seq dataset)
Example steps include:
Filter low-quality groups or genes
Normalize/ transform the data
PCA
Clustering
Perform downstream analysis
Differential expression analysis with EdgeR/DESeq2, etc.
Enrichment analysis
And other analyses subject to study focus.
Technically, there are several packages available for performing pseudobulk transformation, such as AggregateExpression() in Seurat, the muscat package, and the scuttle package in Bioconductor.
Or if you are looking for a quick and easy way to run pseudobulk transformation, our team has developed C-DIAM Multi-omics Studio, an interactive SaaS (web-based) platform that supports end-to-end single-cell data analysis, from QC, preprocessing, batch effect correction to downstream analytics such as subclustering, cell type prediction, DE analysis and pseudobulk transformation - without the need for programming skills. If you are interested, you can explore the platform from the button below.
Some confusing questions we used to have about pseudobulk transformation!
Is pseudobulk the same as bulk RNA-seq?
Actually, not really. Bulk RNA-seq measures the average gene expression across all cells in a sample, regardless of cell type. In contrast, pseudobulk first uses clustering and cell type annotation to identify different cell types. Then, a specific cell type is selected, and the raw counts from that cell type are summed within each sample. The resulting sample-level data are then used for DE analysis.
Should we do sum aggregation or mean aggregation?
There have been some discussions on this before! Seemingly, there can be different options for us when aggregating the counts: mean/sum/median. However, sum aggregation tends to be the most used approach, because studies show that if you are running common tools like DESeq2/edgeR, summing raw counts would give the best performance.[1]
Meanwhile, mean aggregation seems to be an acceptable pairing for when you have log-normalized counts or when you have a tool that can be used with normalized input (e.g., Limma, ROTS). Alternatively, median aggregation can also be used instead of mean aggregation to reduce the impact of outliers on the aggregated values.
Why are raw counts required for pseudobulk transformation with DESeq2/edgeR?
DE analysis tools such as DESeq2 and edgeR are designed to have their built-in normalizing function, meaning they will need raw count inputs. Hence, if we take the mean expression value instead of the sum during pseudobulk aggregation, we change the nature of the data into a format that these DE tools are not designed to handle.
References
[1] Sini Junttila, Johannes Smolander, Laura L Elo, Benchmarking methods for detecting differential states between conditions from multi-subject single-cell RNA-seq data, Briefings in Bioinformatics, Volume 23, Issue 5, September 2022, bbac286, https://doi.org/10.1093/bib/bbac286






Comments