R语言分析7:GSEA分析(Gene Set Enrichment Analysis)

定义:GSEA(Gene Set Enrichment Analysis)是一种基于基因集的富集分析方法, 用来评估一个预先定义的基因集的基因在与表型相关度排序的基因表中的分布趋势,从而判断其对表型的贡献

基本原理: 使用预定义的基因集 (可以是GO注释、MsigDB的注释或其它符合格式的基因集定义),将基因按照在两类样本中的差异表达程度排序,然后检验预先设定的基因集合是否在这个排序表的顶端或者底端富集。基因集合富集分析检测基因集合而不是单个基因的表达变化,因此可以包含这些细微的表达变化,预期得到更为理想的结果

与GO\KEGG差异基因富集分析区别:差异基因富集分析是先筛选差异基因,再判断差异基因在哪些注释的通路存在富集;这涉及到阈值的设定,存在一定主观性并且只能用于表达变化较大的基因,即我们定义的显著差异基因。而GSEA则不局限于差异基因,从基因集的富集角度出发,理论上更容易囊括细微但协调性的变化对生物通路的影响

GSEA-1

🌟 GSEA中关键概念
1)ES(Enrichment Score):富集得分 ES反应基因集成员s在排序列表L的两端富集的程度。计算方式是,从基因集L的第一个基因开始,计算一个累计统计值。当遇到一个落在s里面的基因,则增加统计值。遇到一个不在s里面的基因,则降低统计值。 每一步统计值增加或减少的幅度与基因的表达变化程度(fold-change值)是相关的。富集得分ES最后定义为最大的峰值。正值ES表示基因集在列表的顶部富集,负值ES表示基因集在列表的底部富集。 p-value用来评估富集得分(ES)的显著性,通过排列检验 (permutation test)计算观察到的富集得分(ES)出现的可能性。
2)NES(Normalized Enrichment Score):标准化富集得分 每个基因子集s计算得到的ES根据基因集的大小进行标准化得到标准化富集得分Normalized Enrichment Score (NES)。随后会针对NES计算假阳性率FDR。
3)Leading-edge subset:领头基因亚集 对富集贡献最大的基因成员
一般认为|NES|>1,p-value<0.05,FDR<0.25的通路是显著富集的。 |NES|值越大,FDR值就越小,说明分析的结果可信度越高。

🌟 MSigDB数据库是GSEA官网提供的基因集数据库,其中包含了9种人的分类模式:
H:包含了由多个已知的基因集构成的超基因集,每个H 类别的基因集都对应多个基础的其他类别的基因集
C1:包含人类每条染色体上的不同cytoband区域对应的基因集合。根据不染色体编码进行二级分类
C2:包含了在线通路数据库、PubMed 出版物和领域专家知识的精选基因集
C3:基于对 miRNA 种子序列和预测的转录因子结合位点的基因靶点预测的调控靶基因组
C4:包含了计算机软件预测出来的基因集合,主要是和癌症相关的基因
C5:包含了由相同GO术语注释的基因集
C6:包含了致癌特征基因集:直接从来自癌症基因扰动的微阵列基因表达数据中定义
C7:包含了免疫特征基因集:代表免疫系统内的细胞状态和扰动
C8:包含了细胞类型特征基因组:从人体组织单细胞测序研究中确定的簇标记中收集

1. 使用\color{green}{fgsea}包进行GSEA分析

1.1 读取差异表达的数据

# 加载所需的R包
library(fgsea)          # GSEA分析主程序
library(data.table)     # 数据处理
library(ggplot2)        # 画图处理
library(dplyr)          # 数据处理
library(msigdb)         # 包含基因集合,通常和GSEA分析共同使用
library(GSEABase)       # 可以提供GSEA基础结构和函数,也会被其他包调用


# 读取差异表达的数据,做排序和权重(一般是根据log2FC来作为排序依据)
head(DEG_DESeq2)
##              baseMean log2FoldChange     lfcSE      stat       pvalue         padj
## VCX2         4.848175       4.720165 0.6353906  7.428762 1.096188e-13 2.998016e-12
## AL590681.1   7.142233       4.616208 0.5637220  8.188803 2.638373e-16 9.854187e-15
## LINC00383    9.759471       4.402470 0.4719261  9.328727 1.071498e-20 6.688977e-19
## CARTPT     130.886246       4.301951 0.3291537 13.069734 4.903700e-39 4.891201e-36
## CLDN6      736.600962       4.240786 0.3126447 13.564236 6.525606e-42 1.443294e-38
## GAGE2A       9.285152       4.182749 0.7523736  5.559404 2.706976e-08 3.263125e-07

# 得到一个排序权重变量,一维有名称变量,后续分析要用
FCgenelist <- DEG_DESeq2$log2FoldChange                 # 把数值保存到一维向量中
names(FCgenelist) <- row.names(DEG_DESeq2)          # 对一维向量数值命名

1.2 准备基因集

# 获取msigdb数据集, 指定物种和基因标识符类型 ,如果第一次运行会下载一个大的缓存
msigdb.hs  <-  getMsigdb(org = 'hs',id = c("SYM", "EZID"))

# 追加KEGG集合(默认的msigdb没有KEGG)
msigdb.hs  <-  appendKEGG(msigdb.hs)

# 如果想查看集合,或者集合的子集可以使用以下函数
listCollections(msigdb.hs)
# [1] "c1" "c2" "c3" "c4" "c5" "c6" "c7" "c8" "h" 
listSubCollections(msigdb.hs)
##  [1] "CGP"             "CP:BIOCARTA"     "CP:PID"          "CP"              "CP:WIKIPATHWAYS" "MIR:MIRDB"      
##  [7] "MIR:MIR_Legacy"  "TFT:GTRD"        "TFT:TFT_Legacy"  "CGN"             "CM"              "HPO"            
## [13] "IMMUNESIGDB"     "VAX"             "CP:REACTOME"     "GO:BP"           "GO:CC"           "GO:MF"          
## [19] "CP:KEGG" 

# 这里使用msigdb 的"h"子集
hallmarks  <-  subsetCollection(msigdb.hs, 'h')

# 获取基因集合
msigdb_ids <- geneIds(hallmarks)

1.3 富集分析并作图

# 富集分析
fgseaRes <- fgsea(pathways = msigdb_ids, 
                  stats = FCgenelist,
                  eps = 0.0,
                  minSize = 15,
                  maxSize = 500)

head(fgseaRes[order(pval), ])
##                                       pathway        pval       padj   log2err        ES      NES size                              leadingEdge
## 1:                   HALLMARK_APICAL_JUNCTION 0.003223129 0.04512381 0.4317077 0.3835874 1.964507   36    CLDN6,ACTG2,ACTN2,FLNC,MYL9,CNTN1,...
## 2:                        HALLMARK_MYOGENESIS 0.012002671 0.07468170 0.3807304 0.2827196 1.723659   70      CASQ2,ACTN2,DES,MYH11,LDB3,PYGM,...
## 3:                      HALLMARK_ADIPOGENESIS 0.016003222 0.07468170 0.3524879 0.4362824 1.781732   18 ADIPOQ,FABP4,MYLK,HSPB8,CIDEA,SORBS1,...
## 4:                 HALLMARK_KRAS_SIGNALING_UP 0.029782360 0.10423826 0.2820134 0.3568450 1.667048   27 SNAP25,NAP1L2,CIDEA,PCP4,CPE,SPARCL1,...
## 5: HALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION 0.128258603 0.33939394 0.1221079 0.2263475 1.352838   64      SFRP1,MYLK,MYL9,TAGLN,MGP,CRLF1,...
## 6:                       HALLMARK_COAGULATION 0.145454545 0.33939394 0.1238422 0.3165289 1.319653   19        APOA1,TF,FGG,LEFTY2,APOC3,FGA,...

# 绘制富集图
plotEnrichment(msigdb_ids[["HALLMARK_APICAL_JUNCTION"]],
               FCgenelist) + labs(title="HALLMARK APICAL JUNCTION")

# 筛选最top的几个通路并绘制富集图
topPathwaysUp <- fgseaRes[ES > 0][head(order(pval), n = 10), pathway]
topPathwaysDown <- fgseaRes[ES < 0][head(order(pval), n = 10), pathway]
topPathways <- c(topPathwaysUp, rev(topPathwaysDown))

plotGseaTable(msigdb_ids[topPathways], 
              FCgenelist, 
              fgseaRes, 
              gseaParam = 0.5)

# 只展示独立的通路,可以使用collapsePathways函数去冗余
collapsedPathways <- collapsePathways(fgseaRes[order(pval)][1:20], msigdb_ids, FCgenelist)
mainPathways <- fgseaRes[pathway %in% collapsedPathways$mainPathways][order(-NES), pathway]
plotGseaTable(msigdb_ids[mainPathways], 
              FCgenelist, 
              fgseaRes, 
              gseaParam = 0.5)

# 以文本格式保存结果
fwrite(fgseaRes, file = "fgseaRes.txt", sep = "\t", sep2 = c("", " ", ""))
GSEA-2

2. 使用\color{green}{clusterProfiler}包进行GSEA分析

2.1 富集分析

# 加载所需的R包
library(org.Hs.eg.db) # human的OrgDB
library(clusterProfiler)

# ID转化
gene_entrezid <- bitr(geneID = rownames(DEG_DESeq2), 
                      fromType = "SYMBOL", 
                      toType = "ENTREZID", # 转成ENTREZID
                      OrgDb = "org.Hs.eg.db"
)

head(gene_entrezid)
##      SYMBOL  ENTREZID
## 1      VCX2     51480
## 3 LINC00383 103689913
## 4    CARTPT      9607
## 5     CLDN6      9074
## 6    GAGE2A    729447
## 8     XAGE5    170627

gene_entrezid$logFC <- DEG_DESeq2$log2FoldChange[match(gene_entrezid$SYMBOL, rownames(DEG_DESeq2))]
genelist = gene_entrezid$logFC
names(genelist) = gene_entrezid$ENTREZID 

library(msigdbr)

m_t2g <- msigdbr(species = "Homo sapiens", category = "H") %>% 
  dplyr::select(gs_name, entrez_gene)
head(m_t2g)
## # A tibble: 6 × 2
##   gs_name               entrez_gene
##   <chr>                       <int>
## 1 HALLMARK_ADIPOGENESIS          19
## 2 HALLMARK_ADIPOGENESIS       11194
## 3 HALLMARK_ADIPOGENESIS       10449
## 4 HALLMARK_ADIPOGENESIS          33
## 5 HALLMARK_ADIPOGENESIS          34
## 6 HALLMARK_ADIPOGENESIS          35

gsea_res <- GSEA(genelist, 
                 TERM2GENE = m_t2g,
                 minGSSize = 10,
                 maxGSSize = 500,
                 pvalueCutoff = 1,
                 pAdjustMethod = "BH"
)
## preparing geneSet collections...
## GSEA analysis...
## leading edge analysis...
## done...

# 第一个条目的所有基因
gsea_res[[gsea_res$ID[[1]]]]

2.2 可视化

2.2.1 峰峦图(X轴是核心基因的表达倍数变化,正值表示上调,负值表示下调)

library(enrichplot)
library(ggplot2)

ridgeplot(gsea_res,
          showCategory = 20,
          fill = "pvalue", #填充色 "pvalue", "p.adjust", "qvalue" 
          core_enrichment = TRUE,#是否只使用 core_enriched gene
          label_format = 30,
          orderBy = "NES",
          decreasing = FALSE
) +
  theme(axis.text.y = element_text(size=8))

2.2.2 gseadist(展示基因集的logFC分布)

ids <- gsea_res@result$ID[1:5]

gseadist(gsea_res,
         IDs = ids,
         type = "density" # boxplot
) +
  theme(legend.direction = "vertical")
GSEA-3

2.2.3 gsearank(展示基因的排序以及富集分数的变化)

gsearank(gsea_res,
         geneSetID = 1 # 要展示的基因集
)

2.2.4 gseaplot

gseaplot函数可以画两个图:ES或者ranked-gene-list,通过参数by设置,默认是两个图都画出来,如果by="runningScore",则是画出ES的图,如果是by = "preranked",则是画出ranked gene list的图

gseaplot(gsea_res, geneSetID = 1, by = "runningScore", 
              title = gsea_res$Description[1])

gseaplot(gsea_res, geneSetID = 1, by = "preranked", 
              title = gsea_res$Description[1]) + 
  theme(plot.title = element_text(size = 10, color = "blue"))

# 如果两个子图都画的话返回的是一个ggplist对象,此时如果要修改图形细节,可以使用取子集的方法提取其中的子图形,此时的子图形是ggplot对象,又可以使用ggplot2语法修改了
p <- gseaplot(gsea_res, geneSetID = 1, title = gsea_res$Description[1])
p

#取子集进行修改
p[[1]] <- p[[1]]+theme(plot.title = element_text(size = 6))
p
GSEA-4

2.2.5 gseaplot2

# 默认subplots = 1:3,把3个图放一起
gseaplot2(gsea_res,geneSetID = 1,title = "title",
          subplots = 1:3,
          base_size = 10)

gseaplot2(gsea_res, geneSetID = 1, subplots = 1)
gseaplot2(gsea_res, geneSetID = 1, subplots = 1:2)

#把entrezid变为symbol
gsea_res_symbol <- setReadable(gsea_res, "org.Hs.eg.db", "ENTREZID")

p <- gseaplot2(gsea_res_symbol,geneSetID = 1,
               title = gsea_res_symbol$Description[1])

p[[1]] <- p[[1]]+
  theme(title = element_text(color = "red"))
p
GSEA-5

2.2.6 展示多条通路

tmp <- as.data.frame(gsea_res_symbol)
colnames(tmp)
##  [1] "ID"              "Description"     "setSize"         "enrichmentScore" "NES"             "pvalue"          "p.adjust"       
##  [8] "qvalues"         "rank"            "leading_edge"    "core_enrichment"

head(tmp,3)
##                                                ID              Description setSize enrichmentScore      NES     pvalue  p.adjust   qvalues
## HALLMARK_APICAL_JUNCTION HALLMARK_APICAL_JUNCTION HALLMARK_APICAL_JUNCTION      36       0.3629219 1.835884 0.01019684 0.2330426 0.2026457
## HALLMARK_MYOGENESIS           HALLMARK_MYOGENESIS      HALLMARK_MYOGENESIS      70       0.2692732 1.620309 0.02868852 0.2330426 0.2026457
## HALLMARK_ADIPOGENESIS       HALLMARK_ADIPOGENESIS    HALLMARK_ADIPOGENESIS      18       0.4200174 1.691056 0.03039686 0.2330426 0.2026457
##                          rank                   leading_edge
## HALLMARK_APICAL_JUNCTION  885 tags=53%, list=31%, signal=37%
## HALLMARK_MYOGENESIS       416 tags=29%, list=15%, signal=25%
## HALLMARK_ADIPOGENESIS     671 tags=50%, list=24%, signal=38%
##                                                                                                                          core_enrichment
## HALLMARK_APICAL_JUNCTION CLDN6/ACTG2/ACTN2/FLNC/MYL9/CNTN1/CADM3/CADM2/SPEG/CLDN11/CLDN19/NEXN/NEGR1/NRXN2/SLIT2/KRT31/ACTA1/NFASC/ACTC1
## HALLMARK_MYOGENESIS        CASQ2/ACTN2/DES/MYH11/LDB3/PYGM/MYLK/CASQ1/TAGLN/HSPB8/FHL1/SGCA/CRYAB/PTGIS/DTNA/SPEG/SORBS1/IGF1/TPM2/GNAO1
## HALLMARK_ADIPOGENESIS                                                              ADIPOQ/FABP4/MYLK/HSPB8/CIDEA/SORBS1/SPARCL1/RETN/OMD

p <- gseaplot2(gsea_res, geneSetID = 1:6)
p

p[[1]] <- p[[1]] + scale_color_viridis_d(labels = c("aaa","bbb","ccc","ddd","eee","fff"))+
  geom_hline(yintercept = 0,color = "grey75", linewidth = 0.8, linetype = 2)+
  theme(legend.position = "top", legend.direction = "horizontal")
p[[2]] <- p[[2]] + scale_color_viridis_d()
p[[3]] <- p[[3]] + geom_hline(yintercept = 0, color = "steelblue", linewidth = 0.5, linetype = 2)
p
GSEA-6
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容