单细胞转录组高级分析五:GSEA与GSVA分析
The following article is from 生信会客厅 Author Kinesin
上期专题我们介绍了单细胞转录组数据的基础分析,然而那些分析只是揭开了组织异质性的面纱,还有更多的生命奥秘隐藏在数据中等待我们发掘。本专题将介绍一些单细胞转录组的高级分析内容:多样本批次校正、转录因子分析、细胞通讯分析、基因集变异分析和更全面的基因集富集分析。不足之处请大家批评指正,欢迎添加Kinesin微信交流探讨!
GSEA与GSVA简介
基因集的概念
MSigDB基因集数据库
1. H:hallmark gene sets
特征基因集,由定义生物状态和进程的marker基因组成。
2. C1:positional gene sets
位置基因集,包含人类每条染色体上的不同cytoband区域对应的基因集合。
3. C2:curated gene sets
代谢通路基因集,包含KEGG, Reactome, BioCarta数据库,以及文献和专家支持的基因集信息。
4. C3:motif gene sets
靶基因集,包含了miRNA靶基因集和转录因子调控基因集两大类。
5. C4:computational gene sets
计算基因集,计算机软件预测出来的基因集,主要是和癌症相关的基因。
6. C5:GO gene sets
基因本体基因集,包含了Gene Ontology对应的基因集合。
7. C6:oncogenic signatures
癌症扰动基因集,来源于药物处理肿瘤后基因差异表达数据,包含已知条件处理后基因表达量发生变化的基因。
8. C7:immunologic signatures
免疫基因集,包含了免疫系统功能相关的基因集合。
GSEA的分析原理
基因集A富集分析时,小人从基因列表的左端走到右端,每经过一个蓝色基因扣分,每遇到一个黄色基因加分,扣分时与FC无关,加分时考虑FC的权重。基因集A最终的富集分数(ES)是小人曾经得过的最高/低分,实际公式比这复杂,但基本理念如此。
采用置换检验计算基因集A的显著性,即p值。
基因集A富集分析完成后,按上述同样的方法完成基因集B、C直至所有输入基因集的分析。所有需要富集分析的基因集都计算ES和p值之后,将ES转换为标准富集分数(NES),并计算校正后p值。
A GSEA overview illustrating the method. (A) An expression dataset sorted by correlation with phenotype, the corresponding heat map, and the ‘‘gene tags,’’ i.e., location of genes from a set S within the sorted list. (B) Plot of the running sum for S in the dataset, including the location of the maximum enrichment score (ES) and the leading-edge subset.
GSEA的安装与使用
##R语言准备gsea输入文件
library(Seurat)
library(tidyverse)
library(GSEA)
dir.create("GSEA")
dir.create("GSEA/input")
dir.create("GSEA/output")
scRNA <- readRDS("scRNA.rds")
#提取HNC01TIL和Tonsil2的T细胞做富集分析
tmp <- subset(tmp, subset = (tmp$orig.ident=='HNC01TIL'|tmp$orig.ident=='Tonsil2')&tmp$celltype_Monaco=='T cells')
sub.cells <- rownames(tmp)
scRNAsub <- subset(scRNA, cells=sub.cells)
expr <- GetAssayData(scRNAsub, slot = 'counts')
expr <- data.frame(NAME=rownames(expr), Description=rep('na', nrow(expr)), expr, stringsAsFactors=F)
write('#1.2', "GSEA/input/expr.gct", ncolumns=1)
write(c(nrow(expr),(ncol(expr)-2)), "GSEA/input/expr.gct", ncolumns=2, append=T, sep='\t')
write.table(expr, "GSEA/input/expr.gct", row.names=F, sep='\t', append=T, quote=F)
line.1 <- c((ncol(expr)-2), 2, 1)
tmp <- table(scRNAsub@meta.data$orig.ident)
line.2 <- c("#", names(tmp))
line.3 <- c(rep(names(tmp)[1],tmp[1]), rep(names(tmp)[2],tmp[2]))
write(line.1, 'GSEA/input/group.cls', ncolumns=length(line.1), append=T, sep='\t')
write(line.2, 'GSEA/input/group.cls', ncolumns=length(line.2), append=T, sep='\t')
write(line.3, 'GSEA/input/group.cls', ncolumns=length(line.3), append=T, sep='\t')
分组cls文件内容节选
得到上面的gct和cls文件,再加上基因集数据库gmt文件,就可以进行GSEA分析了。建议在java版本上运行,官方的R包太简陋了,java版上的好多功能都不支持。
R语言版代码与结果展示
##安装官方R包GSEA
library(devtools)
install_github("GSEA-MSigDB/GSEA_R")
#gs.db参数对应的是基因集数据文件,这里只对kegg收录的基因集做了分析
GSEA::GSEA("GSEA/input/expr.gct", "GSEA/input/group.cls",
gs.db="~/database/GSEA/c2.cp.kegg.v7.1.symbols.gmt", output.directory="GSEA/output/")
分析得到的结果很多,分为结果总览,分组概况,以及各个基因集的富集情况详细。这里展示NES分数最高的通路的富集结果:
上图对应数据
#以下命令在linux环境中运行,windows环境用gsea-cli.bat代替gsea-cli.sh
bash gsea-cli.sh GSEA -res ~/project/2020/2007_10xDemo2/GSEA/input/expr.gct \
-cls ~/project/2020/2007_10xDemo2/GSEA/input/group.cls#HNC01TIL_versus_Tonsil2 \
-gmx ~/project/2020/2007_10xDemo2/GSEA/input/c2.cp.kegg.v7.1.symbols.gmt \
-collapse false \
-out ~/project/2020/2007_10xDemo2/GSEA/out/
GSVA的安装与使用
#从bioconductor安装
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("GSVA")
#或者从github安装
library(devtools)
install_github("rcastelo/GSVA")
library(Seurat)
library(GSVA)
library(tidyverse)
##创建gmt文件转list函数
gmt2list <- function(gmtfile){
sets <- as.list(read_lines(gmtfile))
for(i in 1:length(sets)){
tmp = str_split(sets[[i]], '\t')
n = length(tmp[[1]])
names(sets)[i] = tmp[[1]][1]
sets[[i]] = tmp[[1]][3:n]
rm(tmp, n)
}
return(sets)
}
#读取基因集数据库
s.sets = gmt2list("GSEA/input/c2.cp.kegg.v7.1.symbols.gmt")
#读取表达矩阵
scRNA <- readRDS("scRNA.rds")
# 随机提取1000个细胞演示GSVA,非常规操作
# tmp <- sample(colnames(scRNA),1000) %>% sort()
# scRNA <- scRNA[,tmp]
expr <- as.matrix(scRNA@assays$RNA@counts)
meta <- scRNA@meta.data[,c("seurat_clusters", "celltype_Monaco")]
es.matrix = gsva(expr, s.sets, kcdf="Poisson")
write.table(es.matrix, 'GSVA/gsva.xls', row.names=T, col.names=NA, sep='\t')
library(pheatmap)
library(patchwork)
#绘制热图
pheatmap(es.matrix, show_rownames=1, show_colnames=0, annotation_col=meta,
fontsize_row=5, filename='GSVA/gsva_demo.png', width=15, height=12)
#挑选感兴趣的基因集绘制featureplot
es <- data.frame(t(es.matrix),stringsAsFactors=F)
scRNA <- AddMetaData(scRNA, es)
p1 <- FeaturePlot(scRNA, features = "KEGG_PRIMARY_BILE_ACID_BIOSYNTHESIS", reduction = 'tsne')
p2 <- FeaturePlot(scRNA, features = "KEGG_ETHER_LIPID_METABOLISM", reduction = 'tsne')
p3 <- FeaturePlot(scRNA, features = "KEGG_RIBOSOME", reduction = 'tsne')
p4 <- FeaturePlot(scRNA, features = "KEGG_ASTHMA", reduction = 'tsne')
plotc = (p1|p2)/(p3|p4)
ggsave('GSVA/featureplot_demo.png', plotc, width = 10, height = 8)
随意挑了几个基因集展示gsva富集分数
References
获取帮助
本教程的目的在于把常用的单细胞分析流程串起来,适合有一定R语言基础的朋友参考。分析原理和代码我没有详细解释,官网有详细的教程和权威的解释,翻译好的中文教程也有多个版本,有兴趣的可以搜索一下。如果您学习本教程有一定困难,可以点击 “阅读原文” 找到作者联系方式,获取帮助。
如果你对单细胞转录组研究感兴趣,但又不知道如何入门,也许你可以关注一下下面的课程
生信爆款入门-第8期(线上直播4周,马拉松式陪伴,带你入门)你的生物信息入门课
数据挖掘学习班第6期(线上直播3周,马拉松式陪伴,带你入门) 医学生/医生首选技能提高课
生信技能树的2019年终总结 你的生物信息成长宝藏
看完记得顺手点个“在看”哦!
长按扫码可关注