当我们得到差异的探针或者差异的甲基化区域之后,通常都会分析这些差异区域对应的基因是否在特定功能上有富集。在ChAMP
中,通过champ.GSEA
函数来实现功能富集分析。
用法示例:
myNorm <- champ.norm() myDMP <- champ.DMP() myDMR <- champ.DMR() myGSEA <- champ.GSEA()
在ChAMP
中,提供了两种富集分析的方法:
- fisher
- gometh
champ.GSEA
默认对差异CpG位点和差异甲基化区域对应的基因做富集分析,采用的方式是Fisher exact test
, 分析的是Gene Set
来自MSigDB
。
富集分析早已经是研究基因功能的常用工具之一了,那么对于甲基化芯片的富集分析和传统的富集分析有没有不一样的地方呢?
Gene Set
,叫做基因集合,本质上是一系列具有相同功能的基因构成的集合,比如某一条代谢通路,在该代谢通路中有很多的基因,位于同一条pathway下的基因就构成了一个基因集合。
基因集合中最基本的元素是一个一个的基因,而芯片中,我们直接得到的是差异的探针或者差异的区域,首先需要将探针或者区域映射到基因上,在映射的过程中,我们必须考虑到一个因素,基因和探针之间的关系。大部分的基因具有多个CpG位点,会对应多个探针ID。比如基因A上有50个差异CpG位点,基因B上具有2个CpG位点,很明显二者是有很大差别的,如果只考虑基因,那么A和B就是相同的,都是差异探针对应的基因。所以需要将基因对应的CpG位点考虑进来,gometh
算法将基因覆盖的CpG位点个数作为基因的长度,用来矫正P值。
GSEA 结果如下:
str(myGSEA) List of 2 $ DMP:’data.frame’: 666 obs. of 9 variables: ..$ Gene_List: Factor w/ 8338 levels “3_5_CYCLIC_NUCLEOTIDE_PHOSPHODIESTERASE_ACTIVITY”,..: 355 822 1359 7228 3732 14 364 350 2564 3656 … ..$ nList : num [1:666] 1118 2485 1972 1426 102 … ..$ nRep : num [1:666] 1026 2267 1768 1172 98 … ..$ fRep : num [1:666] 0.918 0.912 0.897 0.822 0.961 … ..$ nOVLAP : int [1:666] 190 329 268 194 39 251 157 161 28 165 … ..$ OR : num [1:666] 2.37 1.81 1.88 2.05 6.59 … ..$ P.value : num [1:666] 2.55e-21 4.41e-18 4.35e-17 2.76e-16 4.91e-16 … ..$ adjPval : num [1:666] 2.13e-17 1.84e-14 1.21e-13 5.76e-13 8.18e-13 … ..$ Genes : Factor w/ 6617 levels “A2M”,”A2M ACVRL1 ACVR1 IL12RB2 TNFRSF1B IL2RA”,..: 1604 5352 2139 2554 4011 5150 2711 519 2708 6157 … $ DMR:’data.frame’: 115 obs. of 9 variables: ..$ Gene_List: Factor w/ 8338 levels “3_5_CYCLIC_NUCLEOTIDE_PHOSPHODIESTERASE_ACTIVITY”,..: 350 7089 246 2061 355 1206 2564 361 3653 7228 … ..$ nList : num [1:115] 1062 148 212 201 1118 … ..$ nRep : num [1:115] 964 137 194 183 1026 … ..$ fRep : num [1:115] 0.908 0.926 0.915 0.91 0.918 … ..$ nOVLAP : int [1:115] 44 21 23 22 43 22 15 29 19 37 … ..$ OR : num [1:115] 7.69 25.32 19.04 19.22 6.94 … ..$ P.value : num [1:115] 1.77e-21 4.04e-21 1.99e-20 1.04e-19 1.43e-19 … ..$ adjPval : num [1:115] 1.47e-17 1.69e-17 5.53e-17 2.16e-16 2.39e-16 … ..$ Genes : Factor w/ 1432 levels “ADCYAP1”,”ADCYAP1 BOLL VAX1 NKX2-3 PRDM14 DBX1 ALX1 PRRT1 RFX4 HOXD4 TNXB LBX1”,..: 446 985 348 984 239 117 387 1321 39 1294 ..
默认对DMP和DMR对应的基因都是富集分析,所以结果是一个长度为2的列表,第一个列表是DMP富集分析的结果,第二个列表是DMR富集分析的结果,每个富集结果是一个data.frame
对象。
每列的含义如下:
*Gene_list
MSigDB
数据库中定义的基因集合
- nList 每个基因集合包括的基因个数
- nRep 基因集合的基因与所有输入的gene list 中overlap的基因个数
- fRep overla的基因的比例
- nOVLAP 位于该基因集合下的基因与输入的gene list 中overlap的个数
- OR 费舍尔精确检验的odds ratio
- Pvalue
单尾
fisher exact test
检验的p值,具体代码如下 listPV.v_2 <- t(apply(fisher.lm_2,1,function(x) unlist(fisher.test(matrix(x,2,2),alternative=”greater”)[c(1,3)]))) - adjPval 多重假设检验校正之后的P值,默认采用”BH”方法
- Genes
gene symbol, 个数和
nOVLAP
相同
需要注意一点,对于fRep
< 0.6 的基因集合,会过滤掉。官方是这样解释的 remove lists with less than 60% representation on array
。
ChAMP
中提供的富集分析并不是我们常说的GO/KEGG 富集分析,有很多的R包,比如clusterProfiler
, 都可以用来做GO/KEGG富集分析,但是都不会考虑基因对应的CpG位点个数,这也算是一个小的遗憾。如果要做GO/KEGG 富集分析,同时又要考虑CpG位点个数,就必须考虑`missMethyl`包。