Comparison of clusterProfiler and GSEA-P

Thanks @mevers for raising the issue to me and his efforts in benchmarking clusterProfiler.

He pointed out two issues:

  • outputs from gseGO and GSEA-P are poorly overlap.
  • pvalues from gseGO are generally smaller and don’t show a lot of variation

For GSEA analysis, we have two inputs, a ranked gene list and gene set collections.

First of all, the gene set collections are very different. The GMT file used in his test is, which is a tiny subset of GO CC, while clusterProfiler used the whole GO CC corpus.

use simplify to remove redundancy of enriched GO terms

To simplify enriched GO result, we can use slim version of GO and use enricher function to analyze.

Another strategy is to use GOSemSim to calculate similarity of GO terms and remove those highly similar terms by keeping one representative term. To make this feature available to clusterProfiler users, I develop a simplify method to reduce redundant GO terms from output of enrichGO function.

data(geneList, package="DOSE")
de <- names(geneList)[abs(geneList) > 2]
bp <- enrichGO(de, ont="BP")

[Bioc 32] NEWS of my BioC packages

In BioC 3.2 release, all my packages including GOSemSim, clusterProfiler, DOSE, ReactomePA, and ChIPseeker switch from Sweave to R Markdown for package vignettes.


To make it consistent between GOSemSim and clusterProfiler, ‘worm’ was deprecated and instead we should use ‘celegans’. As usual, information content data was updated.

functional enrichment analysis with NGS data

I found a Bioconductor package, seq2pathway, that can apply functional analysis to NGS data. It consists of two components, seq2gene and gene2pathway. seq2gene converts genomic coordination to genes while gene2pathway performs functional analysis at gene level.

I think it would be interesting to incorporate seq2gene with clusterProfiler. But it fail to run due to it call absolute path of python installed in the author’s computer.

functional enrichment for GTEx paper

The ENCODE consortium has recently published a great paper on Gene Expression from the GTEx dataset. A criticism raised on pubpeer is that the gene ontology enrichment analysis was done with DAVID which has not been updated in the last five years.

The result is shown below:

dotplot for enrichment result

This is a feature request from clusterProfiler user. It’s similar to what I implemented in clusterProfiler for comparing biological themes. For comparing different enrichment results, the x-axis represent different gene clusters while for a single enrichment result, the x-axis can be gene count or gene ratio. This is actually similar to traditional barplot, with dot position as bar height and dot color as bar color. But dotplot can represent one more feature nicely by dot size and it can be a good alternative to barplot.

use clusterProfiler as an universal enrichment analysis tool

clusterProfiler supports enrichment analysis of both hypergeometric test and gene set enrichment analysis. It internally supports Gene Ontology analysis of about 20 species, Kyoto Encyclopedia of Genes and Genomes (KEGG) with all species that have annotation available in KEGG database, DAVID annotation (only hypergeometric test supported), Disease Ontology and Network of Cancer Genes (via DOSE for human) and Reactome Pathway (via ReactomePA for several species). This is still not enough for users may want to analyze their data with unsupported organisms, slim version of GO, novel functional annotation (eg GO via blastgo and KEGG via KAAS), unsupported ontology/pathway or customized annotation.

clusterProfiler provides enricher function for hypergeometric test and GSEA function for gene set enrichment analysis that are designed to accept user defined annotation. They accept two additional parameters TERM2GENE and TERM2NAME. As indicated in the parameter names, TERM2GENE is a data.frame with first column of term ID and second column of corresponding mapped gene and TERM2NAME is a data.frame with first column of term ID and second column of corresponding term name. TERM2NAME is optional.

[Bioc 31] NEWS of my BioC packages


GOSemSim was first implemented in 2008 and published in Bioinformatics in 2010. It’s now a mature package with no bugs found in the past half year. Only vignette and Information content data were updated.

DAVID functional analysis with clusterProfiler

clusterProfiler was used to visualize DAVID results in a paper published in BMC Genomics.

Some users told me that they may want to use DAVID at some circumstances. I think it maybe a good idea to make clusterProfiler supports DAVID, so that DAVID users can use visualization functions provided by clusterProfiler.

gene = names(geneList)[abs(geneList) > 2]
david = enrichDAVID(gene = gene, idType="ENTREZ_GENE_ID", 
listType="Gene", annotation="KEGG_PATHWAY")

> summary(david)
               ID            Description GeneRatio  BgRatio       pvalue
hsa04110 hsa04110             Cell cycle     11/68 125/5085 4.254437e-06
hsa04114 hsa04114         Oocyte meiosis     10/68 110/5085 1.119764e-05
hsa03320 hsa03320 PPAR signaling pathway      7/68  69/5085 2.606715e-04
             p.adjust qvalue                                             geneID
hsa04110 0.0003998379     NA 9133/4174/890/991/1111/891/7272/8318/4085/983/9232
hsa04114 0.0005261534     NA    9133/5241/51806/3708/991/891/4085/983/9232/6790
hsa03320 0.0081354974     NA                 4312/2167/5346/5105/3158/9370/9415
hsa04110    11
hsa04114    10
hsa03320     7

There are only 5085 human genes annotated by KEGG, this is due to out-of-date DAVID data.

KEGG enrichment analysis with latest online data using clusterProfiler

KEGG.db is not updated since 2012. The data is now pretty old, but many of the Bioconductor packages still using it for KEGG annotation and enrichment analysis. As pointed out in ‘Are there too many biological databases’, there is a problem that many out of date biological databases often don’t get offline. This issue also exists in web-server or software that using out-of-date data. For example, the WEGO web-server stopped updating GO annotation data since 2009, and WEGO still online with many people using it. The biological story may changed totally if using a recently updated data. Seriously, We should keep an eye on this issue.

Now enrichKEGG function is reloaded with a new parameter use_internal_data. This parameter is by default setting to FALSE, and enrichKEGG function will download the latest KEGG data for enrichment analysis. If the parameter use_internal_data is explicitly setting to TRUE, it will use the KEGG.db which is still supported but not recommended. With this new feature, supported species is unlimited if only there are KEGG annotations available in KEGG database. You can access the full list of species supported by KEGG via: Now the organism parameter in enrichKEGG should be abbreviation of academic name, for example ‘hsa’ for human and ‘mmu’ for mouse. It accepts any species listed in In the current release version of clusterProfiler (in Bioconductor 3.0), enrichKEGG supports about 20 species, and the organism parameter accept common name of species, for instance “human” and “mouse”. For these previously supported species, common name is also supported. So that you script is still working with new version of clusterProfiler. For other species, common name is not supported, since I don’t want to maintain such a long mapping list with many species have no common name available and it may also introduce unexpected bugs.