生信喵 发表于 2022-10-10 16:05:44

GSEA 富集分析

一、GSEA 简介
       Gene Set Enrichment Analysis (基因集富集分析)用来评估一个预先定义的基因集的基因在与表型相关度排序的基因表中的分布趋势,从而判断其对表型的贡献。其输入数据包含两部分,一是已知功能的基因集 (可以是 GO 注释、MsigDB 的注释或其它符合格式的基因集定义),一是表达矩阵,软件会对基因根据其于表型的关联度(可以理解为表达值的变化)从大到小排序,然后判断基因集内每条注释下的基因是否富集于表型相关度排序后基因表的上部或下部,从而判断此基因集内基因的协同变化对表型变化的影响。
      
       GSEA
GSWA 网站:http://www.gsea-msigdb.org/gsea/index.jsp
JavaGSEA:
http://www.gsea-msigdb.org/gsea/login.jsp;jsessionid=473B7BFEFD0F6DF30707EF9D51F73148
教程:https://enrichmentmap.readthedocs.io/en/docs-2.2/Tutorial_GSEA.html
https://baderlab.github.io/Cytoscape_workflows/EnrichmentMapPipeline/
案例数据:https://www.gsea-msigdb.org/gsea/datasets.jsp
注释文件下载:http://www.gsea-msigdb.org/gsea/msigdb/index.jsp

二、GSEA 原理
       给定一个排序的基因表 L 和一个预先定义的基因集 S (比如编码某个代谢通路的产物的基因,基因组上物理位置相近的基因,或同一 GO 注释下的基因),GSEA 的目的是判断 S 里面的成员 s 在 L 里面是随机分布还是主要聚集在 L 的顶部或底部。这些基因排序的依据是其在不同表型状态下的表达差异,若研究的基因集 S 的成员显著聚集在 L 的顶部或底部,则说明此基因集成员对表型的差异有贡献,也是我们关注的基因集。
      
       GSEA 原理
GSEA 计算中几个关键概念:
       1、计算富集得分 (ES, enrichment score). ES 反应基因集成员 s 在排序列表 L 的两端富集的程度。计算方式是,从基因集 L 的第一个基因开始,计算一个累计统计值。当遇到一个落在 s里面的基因,则增加统计值。遇到一个不在 s 里面的基因,则降低统计值。
       每一步统计值增加或减少的幅度与基因的表达变化程度(更严格的是与基因和表型的关联度,可能是 fold-change,也可能是 pearson corelation 值,后面有介绍几种不同的计算方式)是相关的,可以是线性相关,也可以是指数相关 (具体见后面参数选择)。富集得分 ES 最后定义为最大的峰值。正值 ES 表示基因集在列表的顶部富集,负值 ES 表示基因集在列表的底部富集。
       2、评估富集得分(ES)的显著性。通过基于表型而不改变基因之间关系的排列检验(permutation test)计算观察到的富集得分(ES)出现的可能性。若样品量少,也可基于基因集做排列检验,计算 p-value。
       3、多重假设检验校正。首先对每个基因子集 s 计算得到的 ES 根据基因集的大小进行标准化得到 Normalized Enrichment Score (NES)。随后针对 NES 计算假阳性率。(计算 NES 也有另外一种方法,是计算出的 ES 除以排列检验得到的所有 ES 的平均值)
       4、Leading-edge subset,对富集得分贡献最大的基因成员。

三、MSigDB
       MSigDB(Molecular Signatures Database)数据库是 GSEA 官方提供的基因列表数据库。
      
       MSigDB 数据库分类
目前 MSigDB 分为九个等级,分别为
       H:癌症特征基因集合,共 50 gene sets,最常用。
       C1:染色体位置基因集合,共 299 gene sets,用的很少。
       C2:包含了已知数据库,文献和专家支持的基因集信息,包含 5529 gene sets。
       C3:调控靶基因集合,包括 miRNA-target 以及转录因子-target 调控模式,3735 gene sets。
       C4:计算机软件预测出来的基因集合,主要是和癌症相关的基因,858 gene sets。
       C5:Gene Ontology 对应的基因集合,10192 gene sets。
       C6:致癌基因集合,大部分来源于 NCBI GEO 发表芯片数据,189 gene sets。
       C7:免疫相关基因集,4872 gene sets。
       C8:single cell identitiy gene sets, 302 gene sets
       MSgIDB 格式非常简单,里面是基因名字的一个列表,为 gmt 格式。


四、输入文件
       GSEA 分析一般需要三种文件,分别是基因表达文件,是一个矩阵格式,扩展名可以是*gct,*res,*pcl 或者*txt。第二个是分组信息,需要手工填写,扩展名为*.cls。最后就是注释文件,为 gmt 或者 gmx 格式,可以直接从 MSigDB(Molecular Signatures Database)数据库下载,也可以自己准备。
详细文件格式见下面链接:

https://software.broadinstitute.org/cancer/software/gsea/wiki/index.php/Data_formats之前的推文也有介绍,详细参考:
https://mp.weixin.qq.com/s/l-oFTtSqCjHp94LcZu2N_g
五、利用 R 实现 GSEA
       虽然 GSEA 客户端可以非常方便的完成 GSEA 的分析,但 JAVA 版的 GSEA 软件图形输出格式是 png 格式,图片分辨率较低,不方便编辑,所以,也可以使用 R 包进行 GSEA 分析。能做GSEA 分析的 R 包有很多,例如 clusterProfiler,GSEAbase,fgsea 等。
library(GSEABase)
library(clusterProfiler)
library(org.Hs.eg.db)

#使用示例基因排序列表,之前的差异分析结果,这里就不分享了,大家跑下之前的示例RNAseq差异表达就行
x <- read.csv("res.csv",row.names = 1)
head(x)

geneList <- x$log2FoldChange
names(geneList) <- toupper(rownames(x))
geneList <- sort(geneList, decreasing = T)
head(geneList)
names(geneList) <- mapIds(org.Hs.eg.db, keys=names(geneList), column="SYMBOL", keytype="ENSEMBL",multiVals = "first")
head(geneList)
#去除NA
geneList <- geneList[!is.na(names(geneList))]#20505

#读取gmt文件,从官网下载
gmtfile <- "msigdb.v2022.1.Hs.symbols.gmt"
geneset <- read.gmt(gmtfile)

#GSEA分析
egmt <- GSEA(geneList, TERM2GENE = geneset, minGSSize = 1, pvalueCutoff = 0.99, verbose = F)
egmt <- GSEA(geneList, TERM2GENE = geneset, minGSSize = 1, pvalueCutoff = 0.05, verbose = F, eps=0)
#查看结果
gsea.out.df <- egmt@result
View(head(gsea.out.df))
gsea.out.df$ID

#绘制GSEA图
library(enrichplot)
options(repr.plot.width=6,repr.plot.height=4)
gseaplot2(egmt, geneSetID = "CHEN_LVAD_SUPPORT_OF_FAILING_HEART_UP", pvalue_table = T)      
       GSEA 可视化
library(msigdbr)
library(fgsea)
library(tidyverse)
library(clusterProfiler)
library(org.Hs.eg.db)

## 预定义基因集
mdb_c2 <- msigdbr(species = "Homo sapiens")
mdb_c2
mdb_kegg = mdb_c2
mdb_kegg

fgsea_sets <- mdb_kegg %>% split(x = .$gene_symbol, f = .$gs_name)
fgsea_sets

#读取基因差异表达文件
x <- read.csv("res.csv",row.names = 1)
head(x)

#基因按logFC排序
rownames(x)
x$genes <- mapIds(org.Hs.eg.db, keys=rownames(x), column="SYMBOL", keytype="ENSEMBL",multiVals = "first")
x <- na.omit(x)
gene_log2 <- x %>% arrange(desc(log2FoldChange)) %>% dplyr::select(genes,log2FoldChange)

generanks<- deframe(gene_log2)
generanks

#fgsea分析
fgseaRes <- fgsea(pathways = fgsea_sets,
                  stats = generanks,
                  minSize=15,
                  maxSize=500,
                  nperm=10000)

#fgsea绘图
plotEnrichment(fgsea_sets[["KEGG_P53_SIGNALING_PATHWAY"]],generanks) +
labs(title="KEGG_P53_SIGNALING_PATHWAY")

页: [1]
查看完整版本: GSEA 富集分析