clusterProfiler R package

clusterProfiler : universal enrichment tool for functional and comparative study

一、介绍

对于clusterProfiler包中文件的学习。

Gene Ontology (GO)

从下面三个方面来介绍基因功能。

  1. MF: Molecular Function ,基因产物的分子活性;
  2. CC: Cellular Component,基因产物活跃的地方;
  3. BP: Biological Process,由基因产物组成的pathways and larger processes;

KEGG

反映的是molecular interaction and reaction networks。这些pathway涵盖了广泛的生化过程,可分为7大类:新陈代谢,遗传和环境信息处理,细胞过程,生物系统,人类疾病和药物开发。

GO和KEGG最常用于功能分析。其他基因集包括Disease Ontology (DO), Disease Gene Network (DisGeNET), wikiPathways, Molecular Signatures Database (MSigDb).

二、功能富集分析方法

Over Representation Analysis (ORA)

基因列表是否在已知生物学功能或过程中过度表达(=富集)。可以通过超几何分布来计算p值。

p=1?i=1k?1(Mi)(N?Mn?i)(Nn)p=1-\displaystyle\sum_{i=1}^{k-1} \frac{{M \choose i}{N-M \choose n-i}}{{N \choose n}}

p=1?i=1∑k?1?(nN?)(iM?)(n?iN?M?)?
n:gene list; N:背景基因数(gene expression profile); M:感兴趣的gene set; k:gene set与gene list共有的基因

假设我们在微阵列研究中检测到17,980个基因,并且有57个基因被差异表达。 在差异表达的基因中,有28个被注释为基因集。

1
2
3
d <- data.frame(gene.not.interest=c(2613, 15310), gene.in.interest=c(28, 29))
row.names(d) <- c("In_category", "not_in_category")
d
1
2
3
##                 gene.not.interest gene.in.interest
## In_category                  2613               28
## not_in_category             15310               29

可以使用超几何分布来评估25个基因的overlap是否在基因集中过表达。对应于Fisher’s exact test的one-sided版本。

1
fisher.test(d, alternative = "greater")
1
2
3
4
5
6
7
8
9
10
11
##
##  Fisher's Exact Test for Count Data
##
## data:  d
## p-value = 1
## alternative hypothesis: true odds ratio is greater than 1
## 95 percent confidence interval:
##  0.110242      Inf
## sample estimates:
## odds ratio
##  0.1767937

Gene Set Enrichment Analysis(GSEA)

可确定先验定义的一组基因是否在两个生物学状态(例如表型)之间显示出统计学上显着的一致差异。它能帮助生物学家在两种不同的生物学状态 (biological states)中,判断某一组有特定意义的基因集合的表达模式更接近于其中哪一种。

GSEA也可以用于发现两组样本从表达或其它度量水平分别与哪些特定生物学意义的基因集有显著关联,或者发现哪些基因集的表达模式或其他模式更接近于表型A、哪些更接近于表型B。这些特定的基因集合可以从GO、KEGG、Reactome、hallmark或MSigDB等基因集中获取,其中MSigDB数据库整合了上述所有基因集。研究者也可自定义gene set (即新发现的基因集或其它感兴趣的基因的集合)。

GSEA分析似乎与GO分析类似但又有所不同。GO富集分析是先筛选差异基因,再判断差异基因在哪些注释的通路存在富集,实则是对一部分基因的分析 (忽略差异不显著的基因),而GSEA是从全体基因的表达矩阵中找出具有协同差异 (concordant differences)的基因集,故能兼顾差异较小的基因。因此二者的应用场景略有区别。另外GO富集是定性的分析,GSEA考虑到了表达或其它度量水平的值的影响。另外,对于时间序列数据或样品有定量属性时,GSEA的优势会更明显,不需要每个分组分别进行富集,直接对整体进行处理。可以类比于之前的WGCNA分析。

Gene Set Enrichment Analysis (基因集富集分析)用来评估一个预先定义的基因集的基因在与表型相关度排序的基因表中的分布趋势,从而判断其对表型的贡献。其输入数据包含两部分,一是已知功能的基因集 (可以是GO注释、MsigDB的注释或其它符合格式的基因集定义),一是表达矩阵 (也可以是排序好的列表),软件会对基因根据其与表型的关联度(可以理解为表达值的变化)从大到小排序,然后判断基因集内每条注释下的基因是否富集于表型相关度排序后基因表的上部或下部,从而判断此基因集内基因的协同变化对表型变化的影响。

基因根据其表型排名。 给定先验定义的一组基因S,GSEA的目标是确定S的成员是随机分布在整个排名基因列表(L)中还是主要在顶部或底部找到 。

GSEA方法包含三个关键要素:
1.enrichment score (ES)的计算:富集得分(ES)表示集合S在排名列表L的顶部或底部过度表达的程度。

得分通过从上到下遍历列表计算。当遇到S中的基因时,会增加running-sum statistic,当没有遇到时,会减小。变化的幅度取决于gene statistics,比如基因与表型的相关性。

ES为random walk中maximum deviation from zero,对应于a weighted Kolmogorov-Smirnov-like statistic。

2.ES显着性水平的估计:使用置换检验计算ES的p值。 具体来说,我们置换了基因列表L的基因标签,并针对置换后的数据重新计算了该基因集的ES,从而为ES生成了null distribution。 然后相对于该null distribution计算观察到的ES的p值。

3.多重假设检验的校正:当评估整个基因集时,DOSE调整估计的显着性水平以考虑多重假设检验,并且还为FDR control计算q值。

Leading edge analysis and core enriched genes

Leading edge analysis报告:
1.Tags:指示有助于富集得分的基因的百分比
2.List:指示在列表中获得富集得分的位置
3.Signal:指示富集信号强度

DOSE 支持leading edge analysis,并且可以报告core enriched genes in GSEA analysis.

三、Gene Ontology Analysis

Entrez ID实际上是指的Entrez gene ID,是对应于染色体上一个gene location的。每一个发现的基因都会被编制一个统一的编号,而Entrez ID是指的来自于NCBI旗下的Entrez gene数据库所使用的编号。每个基因的编号具有唯一性,包括不同种属生物间的同源基因编号也不相同。

有多个entrez ID对应一个symbol的现象出现,但是没有一个symbol对应多个entrez ID的现象。而且entrez ID也会过期!

Ensembl ID,其所代表的是在Ensembl数据库中对基因的命名:
1.ENS是固定字符,表示这是一个Ensembl ID。默认物种是人,如果是小鼠的话则以ENSMUS开头
2.G表示该id指的是一个基因,E for exon,** FM** for protein family, G for gene,** GT** for gene tree, P for protein, R for regulatory feature and T for transcript.
3. .4为版本号,表示其在Ensembl数据中进行了4次变更

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
## Gene Ontology Analysis

library(clusterProfiler)
library(org.Hs.eg.db)
data(geneList, package="DOSE") #12495
head(geneList)
# 4312     8318    10874    55143    55388      991
# 4.572613 4.514594 4.418218 4.144075 3.876258 3.677857

##########################################
## Biological Id TRanslator
gene <- names(geneList)[abs(geneList) > 2]
gene.df <- bitr(gene, fromType = "ENTREZID",
                toType = c("ENSEMBL", "SYMBOL"),
                OrgDb = org.Hs.eg.db)
head(gene.df)
#   ENTREZID      NSEMBL    SYMBOL
# 1     4312 ENSG00000196611   MMP1

##########################################
## Functional Profile of a gene set at specific GO level
ggo <- groupGO(gene     = gene,
               OrgDb    = org.Hs.eg.db,
               ont      = "CC",
               level    = 3,
               readable = TRUE)
# [1] "ID"          "Description" "Count"       "GeneRatio"   "geneID"

##########################################
## GO over-representation test ####
ego <- enrichGO(gene          = gene,
                universe      = names(geneList),
                OrgDb         = org.Hs.eg.db,
                ont           = "CC",
                pAdjustMethod = "BH",
                pvalueCutoff  = 0.01,
                qvalueCutoff  = 0.05,
                readable      = TRUE)
# [1] "ID"          "Description" "GeneRatio"   "BgRatio"     "pvalue"
# [6] "p.adjust"    "qvalue"      "geneID"      "Count"

# OrgDb支持的任何基因ID类型都可以直接用于GO分析中
ego2 <- enrichGO(gene         = gene.df$ENSEMBL,
                 OrgDb         = org.Hs.eg.db,
                 keyType       = 'ENSEMBL',
                 ont           = "CC",
                 pAdjustMethod = "BH",
                 pvalueCutoff  = 0.01,
                 qvalueCutoff  = 0.05)

# 通过使用参数read = TRUE或setReadable函数,可以将基因ID映射到基因Symbol
ego2 <- setReadable(ego2, OrgDb = org.Hs.eg.db)

##########################################
## drop specific GO terms or level
dropGO(x, level = NULL, term = NULL)

##########################################
## test GO at sepcific level
gofilter(x, level = 4)

##########################################
## reduce redundancy of enriched GO terms
# calculate semantic语义 similarity among GO terms and remove those highly similar terms by keeping one representative term
simplify(
  x,
  cutoff = 0.7,
  by = "p.adjust",
  select_fun = min,
  measure = "Wang",
  semData = NULL
)

##########################################
## GO Gene Set Enrichment Analysis
# 可以检测预定义集中所有基因以较小但协调的方式发生变化的情况。 由于很可能许多相关的表型差异由一组基因中的微小但一致的变化所体现
ego3 <- gseGO(geneList     = geneList,
              OrgDb        = org.Hs.eg.db,
              ont          = "CC",
              nPerm        = 1000,
              minGSSize    = 100,
              maxGSSize    = 500,
              pvalueCutoff = 0.05,
              verbose      = FALSE)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
## KEGG analysis

# 注释包KEGG.db自2012年以来未更新,函数中支持下载最新的在线KEGG数据以进行富集分析

library(clusterProfiler)
library(org.Hs.eg.db)
data(geneList, package="DOSE")
gene <- names(geneList)[abs(geneList) > 2]

###################################
### search kegg organism
ecoli <- search_kegg_organism('Escherichia coli', by='scientific_name')
## 'kegg.code', 'scientific_name' 'common_name'
dim(ecoli)
## [1] 65  3

###################################
### KEGG over-representation test
kk <- enrichKEGG(gene         = gene,
                 organism     = 'hsa',
                 pvalueCutoff = 0.05)
# keyType   :one of "kegg", 'ncbi-geneid', 'ncbi-proteinid' and 'uniprot'

# kegg ID是真核生物的entrezgene ID,而原核生物的是Locus ID。
# UniProt是 Universal Protein 的英文缩写,是信息最丰富、资源最广的蛋白质数据库。

###################################
### convert biological ID using KEGG API
eg2np <- bitr_kegg(gene, fromType='ncbi-geneid', toType="kegg",organism='hsa')

# ncbi-geneid   kegg   uniprot  ncbi-proteinid
#     10112    10112   O95235    NP_005724

###################################
### KEGG Gene Set Enrichment Analysis
kk2 <- gseKEGG(geneList     = geneList,
               organism     = 'hsa',
               nPerm        = 1000,
               minGSSize    = 120,
               pvalueCutoff = 0.05,
               verbose      = FALSE)

###################################
### KEGG Module over-representation test
# KEGG模块是手动定义的功能单元的集合。 在某些情况下,KEGG模块具有更直接的解释。
mkk <- enrichMKEGG(gene = gene,
                   organism = 'hsa')

###################################
### KEGG Module Gene Set Enrichment Analysis
mkk2 <- gseMKEGG(geneList = geneList,
                 organism = 'hsa')

reference

https://cloud.tencent.com/developer/article/1426130
https://www.jianshu.com/p/13c0a04fd507
https://yulab-smu.github.io/clusterProfiler-book/index.html