理论上gsea或者gsva这样的给基因集合打分的算法需要的仅仅是全部的基因的排序,这个排序指标可以是差异分析后的变化倍数,也可以仅仅是每个样品的全部基因的表达量排序。但是在单细胞表达量矩阵里面有一个问题,就是每个细胞里面的全部基因90%都是0,所以它排序就很麻烦,表达量都是0的那些基因理论上是同一个顺序是并列的倒数第一名。所以,我们不是很建议在单细胞表达量矩阵的层面做gsea或者gsva这样的给基因集合打分,有其它更好的算法推荐,比如 addmodulescore,ucell,aucell等等。
如果一定要做gsea或者gsva这样的给基因集合打分,也有几个补救措施,比如把单细胞表达量矩阵进行缺失值插补,或者把单细胞表达量矩阵构建成为metacell矩阵。不过,最简单的方法是把单细胞表达量矩阵按照各个亚群来进行表达量平均,我们以大家熟知的pbmc3k数据集为例,大家先安装这个数据集对应的包 SeuratData
,并且对它进行降维聚类分群,参考前面的例子:人人都能学会的单细胞聚类分群注释 ,而且每个亚群找高表达量基因,都存储为Rdata文件。标准代码是:
library(SeuratData) #加载seurat数据集
getOption('timeout')
options(timeout=10000)
#InstallData("pbmc3k")
data("pbmc3k")
sce <- pbmc3k.final
library(Seurat)
table(Idents(sce))
DimPlot(sce,label = T)
av <-AverageExpression(sce ,
assays = "RNA")
av=av[[1]]
cg=names(tail(sort(apply(av, 1, sd)),1000))
pheatmap::pheatmap(cor(av[cg,]))
可以得到如下所示的各个单细胞亚群的表达量相关性:
各个单细胞亚群的表达量相关性
可以很清晰看到血小板和淋巴系免疫细胞,髓系免疫细胞的区分是非常明显的。
我们拿到了全部的基因在全部的单细胞亚群的表达量矩阵后,就可以在每个细胞亚群内部进行基因排序后的gsea分析啦。
全部的基因在全部的单细胞亚群的表达量矩阵
全部的基因在全部的单细胞亚群的表达量矩阵,如下所示,可以类比成bulk表达量矩阵, 一般来说做的是ssGSEA分析,我们同样的使用msigdbr
包里面的基因列表吧。然后做GSEA分析我使用了clusterProfiler
包的GSEA函数,全部的代码如下所示:
library(GSVA)
library(GSEABase)
library(msigdbr)
library(clusterProfiler)
all_gene_sets = msigdbr(species = "Homo sapiens",
category='H')
msigdbr_collections()
all_gene_sets = msigdbr(species = "Homo sapiens",
category = "C2", subcategory = "CP:REACTOME" )
# geneList = av[,1]
gl = apply(av, 2, function(geneList){
geneList=sort(geneList,decreasing = T)
print(head(geneList))
print(tail(geneList))
geneList=geneList[geneList>0.1]
egmt <- GSEA(geneList, TERM2GENE= all_gene_sets[,c('gs_name','gene_symbol')] ,
minGSSize = 20,
pvalueCutoff = 1,
verbose=FALSE)
head(egmt)
egmt@result
gsea_results_df <- egmt@result
return(gsea_results_df)
})
path = unique(all_gene_sets$gs_name)
es.max <- do.call(cbind,
lapply(gl, function(x){
x[path,'enrichmentScore']
}))
rownames(es.max) = path
head(es.max)
es.max=na.omit(es.max)
pheatmap::pheatmap(es.max,show_colnames =T,show_rownames = F)
但是结果有点诡异,首先就是全部的gsea结果都是正值,没有负值,其次就是除了血小板其它单细胞亚群过于类似,如下所示:
其它单细胞亚群过于类似
我简单挑选了一下各个单细胞亚群特异性的结果,代码如下所示:
#每个单细胞亚群的特异性top5基因集的 富集分析结果
library(dplyr)
df = do.call(rbind,
lapply(1:ncol(es.max), function(i){
dat= data.frame(
path = rownames(es.max),
cluster = colnames(es.max)[i],
sd.1 = es.max[,i], #每一列原值
sd.2 = apply(es.max[,-i], 1, median) #除当列以外每行的中位值
)
}))
df$fc = df$sd.1 - df$sd.2#两值相减,变化越大说明越有意义(从中挑出top5)
top5 <- df %>% group_by(cluster) %>% top_n(5, fc)#找出每个细胞类型的前五个通路
n=es.max[unique(top5$path),]
rownames(n)
rownames(n)[grepl('FGFR',rownames(n))]
rownames(n)=gsub('REACTOME_','',rownames(n))
rownames(n)=substring(rownames(n),1,30)
pheatmap::pheatmap(n,show_rownames = T)
也是很诡异,如下所示:
B细胞和DC都富集到了抗原提呈通路
可以看到,B细胞和DC都富集到了抗原提呈通路,符合。然后两个单核细胞不知道为什么富集到了高尔基体,可能是我生物学不达标无法理解。总体来说,就是很难理解为什么这个GSEA分析结果都是正值,没有负值。
实际上我给大家写的GEO数据库挖掘的标准代码教程里面是有根据MSIGDB数据库的gmt文件来做 GSEA分析的,那个结果就每次都是比较合情理 :
library(ggplot2)
library(clusterProfiler)
library(org.Hs.eg.db)
### 对 MigDB中的全部基因集 做GSEA分析。
# http://www.bio-info-trainee.com/2105.html
# http://www.bio-info-trainee.com/2102.html
{
load(file = 'anno_DEG.Rdata')
geneList=DEG$logFC
names(geneList)=DEG$symbol
geneList=sort(geneList,decreasing = T)
# 选择gmt文件(MigDB中的全部基因集)
d='../MsigDB/symbols'
# 需要自己下载 gmt文件 哦
gmts <- list.files(d,pattern = 'all')
gmts
#GSEA分析
library(GSEABase) # BiocManager::install('GSEABase')
## 下面使用lapply循环读取每个gmt文件,并且进行GSEA分析
## 如果存在之前分析后保存的结果文件,就不需要重复进行GSEA分析。
f='gsea_results.Rdata'
if(!file.exists(f)){
gsea_results <- lapply(gmts, function(gmtfile){
# gmtfile=gmts[2]
geneset <- read.gmt(file.path(d,gmtfile))
print(paste0('Now process the ',gmtfile))
egmt <- GSEA(geneList, TERM2GENE=geneset, verbose=FALSE)
head(egmt)
# gseaplot(egmt, geneSetID = rownames(egmt[1,]))
return(egmt)
})
# 上面的代码耗时,所以保存结果到本地文件
save(gsea_results,file = f)
}
load(file = f)
#提取gsea结果,熟悉这个对象
gsea_results_list<- lapply(gsea_results, function(x){
cat(paste(dim(x@result)),'\n')
x@result
})
gsea_results_df <- do.call(rbind, gsea_results_list)
gseaplot(gsea_results[[2]],'KEGG_CELL_CYCLE')
gseaplot(gsea_results[[2]],'FARMER_BREAST_CANCER_CLUSTER_6')
gseaplot(gsea_results[[5]],'GO_CONDENSED_CHROMOSOME_OUTER_KINETOCHORE')
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有