| name | bio-de-results |
| description | Extract, filter, annotate, and export differential expression results from DESeq2 or edgeR. Use for identifying significant genes, applying multiple testing corrections, adding gene annotations, and preparing results for downstream analysis. Use when filtering and exporting DE analysis results. |
| tool_type | r |
| primary_tool | DESeq2 |
DE Results
Extract, filter, and export differential expression results.
Required Libraries
library(DESeq2)
library(dplyr)
Extracting DESeq2 Results
res <- results(dds)
res <- results(dds, alpha = 0.05)
res <- lfcShrink(dds, coef = 'condition_treated_vs_control', type = 'apeglm')
res_df <- as.data.frame(res)
res_df$gene <- rownames(res_df)
Extracting edgeR Results
results <- topTags(qlf, n = Inf)$table
results$gene <- rownames(results)
Filtering Significant Genes
By Adjusted P-value
sig_genes <- subset(res, padj < 0.05)
sig_genes <- subset(results, FDR < 0.05)
sig_genes <- res_df %>%
filter(padj < 0.05) %>%
arrange(padj)
By Fold Change
sig_genes <- subset(res, padj < 0.05 & abs(log2FoldChange) > 1)
up_genes <- subset(res, padj < 0.05 & log2FoldChange > 1)
down_genes <- subset(res, padj < 0.05 & log2FoldChange < -1)
Combined Filters
sig_genes <- res_df %>%
filter(padj < 0.01,
abs(log2FoldChange) > 1,
baseMean > 10) %>%
arrange(padj)
Ordering Results
res_ordered <- res[order(res$padj), ]
res_ordered <- res[order(abs(res$log2FoldChange), decreasing = TRUE), ]
res_ordered <- res[order(res$baseMean, decreasing = TRUE), ]
sig_ordered <- res_df %>%
filter(padj < 0.05) %>%
arrange(desc(abs(log2FoldChange)))
Summary Statistics
summary(res)
n_tested <- sum(!is.na(res$padj))
n_sig <- sum(res$padj < 0.05, na.rm = TRUE)
n_up <- sum(res$padj < 0.05 & res$log2FoldChange > 0, na.rm = TRUE)
n_down <- sum(res$padj < 0.05 & res$log2FoldChange < 0, na.rm = TRUE)
cat(sprintf('Tested: %d genes\n', n_tested))
cat(sprintf n_sig
catsprintf n_up
catsprintf n_down
summarydecideTestsqlf
Adding Gene Annotations
From Bioconductor Annotation Package
library(org.Hs.eg.db)
res_df$symbol <- mapIds(org.Hs.eg.db,
keys = rownames(res_df),
column = 'SYMBOL',
keytype = 'ENSEMBL',
multiVals = 'first')
res_df$entrez <- mapIds(org.Hs.eg.db,
keys = rownames(res_df),
column = 'ENTREZID',
keytype = 'ENSEMBL',
multiVals = 'first')
res_df$description <- mapIds(org.Hs.eg.db,
keys = rownames(res_df),
column = 'GENENAME',
keytype
multiVals
From BioMart
library(biomaRt)
mart <- useMart('ensembl', dataset = 'hsapiens_gene_ensembl')
annotations <- getBM(
attributes = c('ensembl_gene_id', 'external_gene_name', 'description'),
filters = 'ensembl_gene_id',
values = rownames(res_df),
mart = mart
)
res_annotated <- merge(res_df, annotations,
by.x = 'row.names', by.y = 'ensembl_gene_id',
all.x = TRUE)
From Custom File
gene_info <- read.csv('gene_annotations.csv')
res_annotated <- merge(res_df, gene_info, by = 'gene', all.x = TRUE)
Exporting Results
To CSV
write.csv(res_df, file = 'deseq2_all_results.csv', row.names = FALSE)
sig_genes <- res_df %>% filter(padj < 0.05)
write.csv(sig_genes, file = 'deseq2_significant.csv', row.names = FALSE)
To Excel
library(openxlsx)
wb <- createWorkbook()
addWorksheet(wb, 'All Results')
writeData(wb, 'All Results', res_df)
addWorksheet(wb, 'Significant')
writeData(wb, 'Significant', sig_genes)
addWorksheet(wb, 'Up-regulated')
writeData(wb, 'Up-regulated', up_genes)
addWorksheet(wb, 'Down-regulated')
writeData(wb, 'Down-regulated', down_genes)
saveWorkbook(wb, 'de_results.xlsx', overwrite = TRUE)
Gene Lists for Pathway Analysis
sig_gene_list <- rownames(subset(res, padj < 0.05))
write.table(sig_gene_list, file = 'significant_genes.txt',
quote = FALSE, row.names = FALSE, col.names = FALSE)
gsea_input <- res_df %>%
filter(!is.na(log2FoldChange)) %>%
select(gene, log2FoldChange) %>%
arrange(desc(log2FoldChange))
write.table(gsea_input, file = 'gsea_input.rnk',
sep = '\t', quote = FALSE, row.names col.names
Comparing Results Between Methods
deseq2_sig <- rownames(subset(deseq2_res, padj < 0.05))
edger_sig <- rownames(subset(edger_results, FDR < 0.05))
common <- intersect(deseq2_sig, edger_sig)
deseq2_only <- setdiff(deseq2_sig, edger_sig)
edger_only <- setdiff(edger_sig, deseq2_sig)
cat(sprintf('DESeq2 significant: %d\n', length(deseq2_sig)))
cat(sprintf('edgeR significant: %d\n', length(edger_sig)))
cat(sprintf('Common: %d\n', length(common
catsprintf deseq2_only
catsprintf edger_only
libraryVennDiagram
venn.diagram
x DESeq2 deseq2_sig edgeR edger_sig
filename
fill
Multiple Testing Correction
library(IHW)
res_ihw <- results(dds, filterFun = ihw)
res_df$padj_bonferroni <- p.adjust(res_df$pvalue, method = 'bonferroni')
res_df$padj_bh <- p.adjust(res_df$pvalue, method = 'BH')
res_df$padj_fdr <- p.adjust(res_df$pvalue, method = 'fdr')
Handling NA Values
sum(is.na(res$padj))
res_complete <- res[!is.na(res$padj), ]
res[which(is.na(res$pvalue) & res$baseMean > 0), ]
Quick Reference: Result Columns
DESeq2
| Column | Description |
|---|
baseMean | Mean normalized counts |
log2FoldChange | Log2 fold change |
lfcSE | Standard error of LFC |
stat | Wald statistic |
pvalue | Raw p-value |
padj | Adjusted p-value (BH) |
edgeR
| Column | Description |
|---|
logFC | Log2 fold change |
logCPM | Average log2 CPM |
F | Quasi-likelihood F-statistic |
PValue | Raw p-value |
FDR | False discovery rate |
Related Skills
- deseq2-basics - Run DESeq2 analysis
- edger-basics - Run edgeR analysis
- de-visualization - Visualize results
- pathway-analysis - Use gene lists for enrichment