前两天介绍了一个开发中的单细胞数据分析相关R包,内置了,4(热图,气泡图,upset图,堆叠条形图)+4(密度散点图,半小提琴,山峦图,密度热图)美图,见 8种方法可视化你的单细胞基因集打分 ,蛮多小伙伴留言想问一下到底什么是基因集打分,正好学徒投稿了她自己的理解,借花献佛分享给大家。
下面周文丽的投稿
参考素材见:GSEA 算法
GSEA分析一文就够(单机版+R语言版)
GSEA的统计学原理试讲
该算法最初开发是受microarray RNA数据驱动,旨在解释基因组数据,获得相较于单个基因更加深入的生物学见解。
基于差异基因分析存在的缺陷:
GSEA vs. DEGs
总的来说,GSEA富集分析有以下三个要点:
L = {g1, g2, g3, g4, …… gN}
;【可根据研究需要,制定个性化排序方案,如基于与兴趣TF的相关性。】ES的数学计算过程如下:
总的原则:看某个基因集S的基因在L上随机分布 or 分布在顶部 or 分布在尾部。【为GSEA算法的核心,数学原理见下】
初始统计量x
, 沿着排序列表从top→bottom遍历每个基因,遇到属于基因集S的基因,则x = x+ai
;若遇到不属于基因S的基因j,则x = x - aj
…… 直到遍历所有基因。【注意:a的值取决于基因i或基因j与分组性状的关联程度,关联越大,则a越大;反之,则越小】。ES即为该过程中的x的最大取值,对应加权的Kolmogorov-Smirnov样的统计量(ref7)。图例:①Phit= 基因集S中的加权和,Pmiss = 非基因集S中的加权和。②ES = Phit - Pmiss
。②
对应ai部分。p代表加权,若p=0,则公式简化为标准的Kolmogorov-Smirnov统计量;若p=1,则Phit的分母为基因集S中所有基因与性状的关联强度之和,基因集S中每个基因与该性状的关联都对该和进行标准化处理。【r代表基因与兴趣性状之间的关联强度,可以由FC等来评估】
S1:基因集S1主要分布在排序列表的top端,ES分值较高,p值显著;
S2:基因集S2在排序列表中随机分布,ES值低,p值不显著;
S3:基因集S3非随机分布,但也并不在top or bottom呈现集中分布模式,ES值较高,但p值不显著。
因此,富集分析的结果结果,要综合考虑p值及ES值两个指标。
R包:clusterProfiler,需要自己做完差异分析,得到deg这个数据库,它有一列是logFC,有一列是基因的名字(这里举例是symbols),然后就可以无缝运行下面的代码啦!
我的示例的deg来源于单细胞分析的FindMarkers函数,代码如下;
Idents(sce)='singleR'
deg=FindMarkers(object = sce, ident.1 = 'Fibroblasts',
ident.2 = 'Fibroblasts activated',
min.pct = 0.01, logfc.threshold = 0.01,
thresh.use = 0.99)
head(deg)
在msigdb数据库网页可以下载全部的基因集,我这里方便起见,仅仅是下载 h.all.v7.2.symbols.gmt文件:
### 对 MsigDB中的全部基因集 做GSEA分析。
# http://www.bio-info-trainee.com/2105.html
# http://www.bio-info-trainee.com/2102.html
# https://www.gsea-msigdb.org/gsea/msigdb
# https://www.gsea-msigdb.org/gsea/msigdb/collections.jsp
{
geneList= deg$avg_logFC
names(geneList)= toupper(rownames(deg))
geneList=sort(geneList,decreasing = T)
head(geneList)
library(ggplot2)
library(clusterProfiler)
library(org.Hs.eg.db)
#选择gmt文件(MigDB中的全部基因集)
gmtfile ='MSigDB/symbols/h.all.v7.2.symbols.gmt'
# 31120 个基因集
#GSEA分析
library(GSEABase) # BiocManager::install('GSEABase')
geneset <- read.gmt( gmtfile )
length(unique(geneset$term))
egmt <- GSEA(geneList, TERM2GENE=geneset,
minGSSize = 1,
pvalueCutoff = 0.99,
verbose=FALSE)
head(egmt)
egmt@result
gsea_results_df <- egmt@result
rownames(gsea_results_df)
write.csv(gsea_results_df,file = 'gsea_results_df.csv')
library(enrichplot)
gseaplot2(egmt,geneSetID = 'HALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION',pvalue_table=T)
gseaplot2(egmt,geneSetID = 'HALLMARK_MTORC1_SIGNALING',pvalue_table=T)
}
Gene set enrichment analysis: A knowledge-based approach for interpreting genome-wide expression profiles
Aravind Subramanian, Pablo Tamayo, Vamsi K. Mootha, Sayan Mukherjee, Benjamin L. Ebert, Michael A. Gillette, Amanda Paulovich, Scott L. Pomeroy, Todd R. Golub, Eric S. Lander, Jill P. Mesirov Proceedings of the National Academy of Sciences Oct 2005, 102 (43) 15545-15550; DOI: 10.1073/pnas.0506580102