DESeq2 Tutorial

A description of Deseq2


Go to to chat with a life sciences focused ChatGPT.

DESeq2 is a powerful statistical package designed for analyzing count-based NGS (Next-Generation Sequencing) data, such as RNA-seq, ChIP-seq, and other forms of count data. Developed by Michael Love, Simon Anders, Wolfgang Huber, and colleagues, DESeq2 is part of the Bioconductor project, which provides tools for the analysis and comprehension of high-throughput genomic data.

The primary goal of DESeq2 is to identify differentially expressed genes by using a model based on the negative binomial distribution. This approach allows for the normalization of data, accounting for the effects of library size and RNA composition. DESeq2 is particularly well-suited for dealing with small sample sizes, and it provides methods for shrinkage estimation for dispersions and fold changes, which improves stability and interpretability of estimates, especially for datasets with few replicates.

DESeq2 is not only robust and reliable but also flexible, allowing users to fit complex experimental designs, including those with multiple factors and batch effects. It also includes several functions for exploratory data analysis and visualization, such as PCA (Principal Component Analysis) plots and heatmaps, which help in understanding the underlying structure and patterns in the data.


DESeq2 is available through the Bioconductor project, which means it can be installed using the BiocManager package in R. To install DESeq2, you'll need to have R installed on your computer. If you don't have R, you can download it from the Comprehensive R Archive Network (CRAN).

Once you have R installed, you can install DESeq2 by following these steps:

  1. Open R and install the BiocManager package by typing the following command into the R console:
  1. After installing BiocManager, you can use it to install DESeq2 with the following command:
  1. Once the installation is complete, you can load DESeq2 into your R session using the library function:

Now that DESeq2 is installed and loaded, you're ready to start analyzing your count data.

Quick Start

To begin using DESeq2, you'll need count data from an RNA-seq experiment and some information about the experimental design. The count data should be in the form of a matrix or a data frame, with rows representing genes and columns representing samples. The experimental design information is typically stored in a data frame with rows corresponding to samples and columns to variables such as conditions, batches, or other factors of interest.

Here's a quick example of how to create a DESeqDataSet object, which is the core data structure used by DESeq2:

# Assuming 'counts' is your count matrix and 'colData' is your sample information
dds <- DESeqDataSetFromMatrix(countData = counts,
                              colData = colData,
                              design = ~ condition)

In this example, condition is a column in colData that specifies the experimental condition for each sample. The design formula tells DESeq2 how to model the data.

Once you have a DESeqDataSet object, you can run the main DESeq2 analysis pipeline with a single function:

dds <- DESeq(dds)

This function will perform the differential expression analysis, including estimating size factors, estimating dispersions, and fitting the model.

After running the analysis, you can extract the results using the results function:

res <- results(dds)

The res object will contain the log2 fold changes, p-values, and adjusted p-values for each gene.

Code Examples Of Popular Commands

1. Data Preprocessing and Normalization

Before performing differential expression analysis, it's essential to preprocess and normalize the data. DESeq2 provides functions for filtering out low-count genes and normalizing counts using size factors.

# Filtering out genes with low counts
dds <- dds[rowSums(counts(dds)) > 10, ]

# Normalizing counts
dds <- estimateSizeFactors(dds)
normalized_counts <- counts(dds, normalized = TRUE)

2. Differential Expression Analysis

The core of DESeq2 is the differential expression analysis. The DESeq function fits a model for each gene and performs a Wald test to determine significant differences in expression.

dds <- DESeq(dds)

3. Extracting Results

After running the analysis, you can extract the results and order them by the p-value to identify the most significantly differentially expressed genes.

res <- results(dds)
resOrdered <- res[order(res$pvalue), ]

4. Adjusting for Multiple Testing

DESeq2 automatically adjusts p-values for multiple testing using the Benjamini-Hochberg procedure, which controls the false discovery rate (FDR). You can access the adjusted p-values in the results.


5. Visualizing Results

DESeq2 includes functions for visualizing results, such as MA plots and heatmaps. An MA plot shows the relationship between the magnitude of gene expression changes and the mean expression level.

plotMA(res, main="MA Plot", ylim=c(-2,2))

For heatmaps, you might want to use normalized counts and additional packages like pheatmap:

select <- order(rowMeans(counts(dds, normalized=TRUE)), decreasing=TRUE)[1:30]
pheatmap(log2(normalized_counts[select, ] + 1))

In this example, we're selecting the top 30 genes with the highest mean normalized counts and plotting a heatmap of their expression levels across samples.


DESeq2 is a comprehensive and widely-used package for analyzing count-based NGS data. It provides robust statistical methods for identifying differentially expressed genes and includes tools for data preprocessing, normalization, and visualization. With its flexibility and ease of use, DESeq2 is an essential tool for bioinformaticians and biologists alike.

Remember that while DESeq2 is powerful, proper experimental design and data quality are crucial for obtaining reliable results. Always ensure that your data meet the assumptions of the statistical models used by DESeq2, and consult the extensive documentation and vignettes provided by the Bioconductor project for best practices and advanced analysis techniques.

By following the steps outlined in this blog post, you should be well on your way to performing differential expression analysis with DESeq2 and uncovering the biological insights hidden within your count data.