Gene set enrichment analysis, 基因集富集分析
1、算法思想
对某基因Knock down和WT做差异表达分析之后,得到差异表达基因list,按照某个统计量,比如fold change,从小到大排序,得到一个rank list,记录为L
假设某个通路的所有基因在L中随机分布,假如我们能观测到某通路的所有基因突然富集与L中的一端,计算其富集程度和统计显著性,如果小于某个cutoff,那么我们就可以拒绝原假设,认为该通路在L中富集,并且通过富集程度的打分,如果为正,则该通路倾向于在上调的基因中富集,如果为负,则该通路倾向于在下调的基因中富集。
在GSEA对应的软件中,用normalized enrichment score(NES)作为富集程度的度量,用p值和FDR作为统计显著性的度量,
收集的基因集的数据库叫做MSigDB;
特定的基因集合可以从GO、KEGG、Reactome、hallmark或MSigDB等基因集中获取,其中MSigDB数据库整合了上述所有基因集。研究者也可自定义gene set (即新发现的基因集或其它感兴趣的基因的集合)
H: hallmark gene sets (效应)特征基因集合,共50组;
C1: positional gene sets 位置基因集合,根据染色体位置,共326个;
C2: curated gene sets:(专家)共识基因集合,基于通路、文献等(包括KEGG);
C3: motif gene sets:模式基因集合,主要包括microRNA和转录因子靶基因两部分;
C4: computational gene sets:计算基因集合,通过挖掘癌症相关芯片数据定义的基因集合;
C5: GO gene sets:Gene Ontology 基因本体论(包括BP/CC/MF);
C6: oncogenic signatures:癌症特征基因集合,大部分来源于NCBI GEO 未发表芯片数据;
C7: immunologic signatures: 免疫相关基因集合。
2、与GO的区别
类似但又有所不同:GO分析更加依赖差异基因,实则是对一部分基因的分析 (忽略差异不显著的基因),而GSEA是从全体基因的表达矩阵中找出具有协同差异 (concordant differences)的基因集,故能兼顾差异较小的基因
GO富集是定性的分析,GSEA考虑到了表达或其它度量水平的值的影响。GSEA分析不需要指定阈值(p值或FDR)来筛选差异基因,在没有经验存在的情况下分析我们感兴趣的基因集,而这个基因集不一定是显著差异表达的基因。GSEA分析可以将那些GO/KEGG富集分信息中容易遗漏掉的差异表达不显著却有着重要生物学意义的基因包含在内。
另外,对于时间序列数据或样品有定量属性时,GSEA的优势会更明显,不需要每个分组分别进行富集,直接对整体进行处理。可以类比于WGCNA分析。
差异基因排序度量的选取
case-control样本而言(每个样本至少三个重复)
μ为均值, 为标准差
连续表型的样本,如时间序列表达谱,可以选下列统计量
Pearson 相关系数
Cosine
Manhattan measure
Euclidean measure
3、 GSEA计算中的几个关键概念
计算富集得分 (ES, enrichment score).
ES反应基因集成员s在排序列表L的两端富集的程度。计算方式是,从基因集L的第一个基因开始,计算一个累计统计值。当遇到一个落在s里面的基因,则增加统计值。遇到一个不在s里面的基因,则降低统计值
每一步统计值增加或减少的幅度与基因的表达变化程度(更严格的是与基因和表型的关联度,可能是fold-change,也可能是pearson corelation值)是相关的,可以是线性相关,也可以是指数相关
富集得分ES最后定义为最大的峰值。正值ES表示基因集在列表的顶部富集,负值ES表示基因集在列表的底部富集。
评估富集得分(ES)的显著性
通过基于表型而不改变基因之间关系的排列检验 (permutation test)计算观察到的富集得分(ES)出现的可能性。若样品量少,也可基于基因集做排列检验 (permutation test),计算p-value。
多重假设检验校正
首先对每个基因子集s计算得到的ES根据基因集的大小进行标准化得到Normalized Enrichment Score (NES)。随后针对NES计算假阳性率。(计算NES也有另外一种方法,是计算出的ES除以排列检验得到的所有ES的平均值)
Leading-edge subset,对富集得分贡献最大的基因成员,领头亚集
该处有3个统计值,tags=59%表示核心基因占该基因集中基因总数的百分比;list=21%表示核心基因占所有基因的百分比;signal=74%,将前两项统计数据结合在一起计算出的富集信号强度,计算公式如下:
其中n是列表中的基因数目,nh是基因集中的基因数目
4、结果解释
富集分析的图示,该图示分为三部分,在图中已做标记:
第一部分是Enrichment score折线图:显示了当分析沿着排名列表按排序计算时,ES值在计算到每个位置时的展示。最高峰处的得分 (垂直距离0.0最远)便是基因集的ES值。
第二部分,用线条标记了基因集合中成员出现在基因排序列表中的位置,黑线代表排序基因表中的基因存在于当前分析的功能注释基因集。leading edge subset 就是(0,0)到绿色曲线峰值ES出现对应的这部分基因。在ES图中出现领头亚集的形状,表明这个功能基因集在某处理条件下具有更显著的生物学意义
第三部分是排序后所有基因rank值得分布,热图红色部分对应的基因在NGT中高表达,蓝色部分对应的基因在DMT中高表达,每个基因对应的信噪比(Signal2noise,前面选择的排序值计算方式)以灰色面积图显展示。
一般认为|NES|>1,NOM p-val<0.05,FDR q-val<0.25的通路是显著富集的。
5、操作
南方医科大的余光创教授(人称Y叔)开发出了特别好用的进行各种富集分析的R包clusterProfiler,这个包里也集成了GSEA分析的功能,有两种算法可选,一种是Y叔自己写的DOSE包里的,根据GSEA原始文献的算法实现的函数 ,一种是俄国人开发的fgsea包实现的快速GSEA算法,默认为fgsea算法。
clusterProfiler
gsea.raw<-GSEA(geneList = gene_List.entrez,nPerm=1000,pvalueCutoff = 1,TERM2GENE=gene_set)
print(head(gsea.raw@result))
gsea.go<- gseGO(geneList = gene_List.entrez,ont="BP",OrgDb = org.Hs.eg.db,keyType = "ENTREZID",pvalueCutoff = 1,nPerm = 2)
print(head(gsea.go@result))
gsea.kegg<- gseKEGG(geneList = gene_List.entrez,organism = "hsa",keyType = "kegg",pvalueCutoff = 1,nPerm = 2)
print(head(gsea.kegg@result))
可视化
ridgeplot(Go_Reactomeresult, 10) # 输出前十个结果,查看terms对应基因的上下调方向
barplot() #图的呈现效果和常规GO分析一样
dotplot() #图的呈现效果和常规GO分析一样
cowplot::plot_grid(p1, p2, p3) # use plot_grid() to combine multiple plot in one figure.
cnetplot() # 获取不同富集terms间的共同基因,加上表达数据也可以看上或下调方向
heatplot() # 获取不同富集terms间的共同基因,加上表达数据也可以看上或下调方向
emapplot() # 不同terms之间的关系
compareCluster()
emapplot()
upsetplot() # 不同富集terms之间的共同基因
browseKEGG(kk, "hsa04934")
也可以绘制特定通路
pathview(gene.data = geneList,
pathway.id = "hsa04750", #上述结果中的hsa04750通路
species = "hsa",
limit = list(gene=max(abs(geneList)), cpd=1))
写在后面
图可以各种海量得画,终归是术,但要想给这些图一个有趣的灵魂,还需要设计出好的故事,修炼道的水准才能真正提高文章的质量~