相信很多专题应该已经讲过SCENIC的使用,这儿,针对我自己对SCENIC的学习使用,遇到的问题做一个详细的讲解说明,希望能对大家理解学习应用SCENIC起到一些帮助。
SCENIC (Single-Cell rEgulatory Network Inference and Clustering) 是从单细胞RNA数据推断基因调控网络及其相关细胞状态的工具。
作者将SCENIC应用于肿瘤和小鼠大脑单细胞图谱数据,证明了顺式调控网络分析能够有助于深入挖掘细胞异质性背后的生物学意义,并为疾病的诊断、治疗以及发育分化的研究提供有价值的线索。
SCENIC在2017年首先发表于nature methods,2020年又将流程整理后发表于nature protocls。有R版和python版本。
SCENIC: single-cell regulatory network inference and clustering https://www.nature.com/articles/nmeth.4463
A scalable SCENIC workflow for single-cell gene regulatory network analysis https://www.nature.com/articles/s41596-020-0336-2
这儿主要讲述的是R版(无论哪种语言,代码都可以copy到,重要的是理解做的意义)
作者提供了SCENIC 详细的工作流程:http://htmlpreview.github.io/?https://github.com/aertslab/SCENIC/blob/master/inst/doc/SCENIC_Running.html
构建基因调控网络gene regulatory network (GRN):
1),根据共表达确定每个 TF 的潜在靶基因:过滤表达式矩阵并运行 GENIE3/GRNBoost;
基于共表达推断转录因子与候选靶基因之间的共表达模块。
2),使用RcisTarget对每个共表达模块进行顺式调控基序(cis-regulatory motif)分析
3),使用AUCell算法对细胞中的regulon活性进行评分(计算 AUC)
4),根据regulons活性确定稳定的细胞状态并探索结果
简之,基于共表达和DNA模基序 (motif)分析推断基因调控网络 ,然后在每个细胞中分析网络活性以鉴定细胞状态。
安装相关包
可参照官网:http://htmlpreview.github.io/?https://github.com/aertslab/SCENIC/blob/master/inst/doc/SCENIC_Setup.html
if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
BiocManager::install(c("AUCell", "RcisTarget"))
BiocManager::install(c("GENIE3")) # Optional. Can be replaced by GRNBoost
BiocManager::install(c("zoo", "mixtools", "rbokeh"))
BiocManager::install(c("DT", "NMF", "ComplexHeatmap", "R2HTML", "Rtsne"))
BiocManager::install(c("doMC", "doRNG"))
if (!requireNamespace("devtools", quietly = TRUE)) install.packages("devtools")
devtools::install_github("aertslab/SCopeLoomR", build_vignettes = TRUE)
devtools::install_github("aertslab/SCENIC") ##导入SCENIC
#这儿我把SCENIC安装在服务器上,安装过程中,也遇到了好多错误,主要是一些包导入错误(主要是网络和环境引起的),把错误的包重新用conda进行安装,一定要耐心哦。
物种特异数据库(人,鼠,果蝇)
#RcisTarget 的物种特定数据库
dbFiles1 <- c("https://resources.aertslab.org/cistarget/databases/homo_sapiens/hg19/refseq_r45/mc9nr/gene_based/hg19-500bp-upstream-7species.mc9nr.feather",
"https://resources.aertslab.org/cistarget/databases/homo_sapiens/hg19/refseq_r45/mc9nr/gene_based/hg19-tss-centered-10kb-7species.mc9nr.feather")
#人, SCENIC 使用数据库对基因启动子(TSS 上游高达 500bp)和 TSS 周围 20kb (+/-10kbp) 中的motifs.
dbFiles2 <- c("https://resources.aertslab.org/cistarget/databases/mus_musculus/mm9/refseq_r45/mc9nr/gene_based/mm9-500bp-upstream-7species.mc9nr.feather",
"https://resources.aertslab.org/cistarget/databases/mus_musculus/mm9/refseq_r45/mc9nr/gene_based/mm9-tss-centered-10kb-7species.mc9nr.feather") #鼠
dbFiles3 <-c("https://resources.aertslab.org/cistarget/databases/drosophila_melanogaster/dm6/flybase_r6.02/mc8nr/gene_based/dm6-5kb-upstream-full-tx-11species.mc8nr.feather") #果蝇
dir.create("./SCENIC") #构建SCENIC分析文件夹
setwd("SCENIC")
dir.create("./SCENIC/cisTarget_databases")#构建数据库文件夹
setwd("cisTarget_databases")
for(featherURL in c(dbFiles1,dbFiles2,dbFiles3))
{
download.file(featherURL, destfile=basename(featherURL)) # saved in current dir
}
导入包,进行SEUNIC分析
这儿我们为了统一,也为了方便,还是使用之前简书提到的pbmc3k数据集,毕竟目前使用10x数据的人比较多。当然其它数据格式的导入作者也提供了代码接入。作者也提供了一个例子数据集作为输入,我在文章最后提供对应代码。
pbmc3k数据集相关下载,seurat聚类都可参照前面的简书:https://www.jianshu.com/p/adda4536b2cb
#导入相关R包
library(Seurat)
library(tidyverse)
library(patchwork)
library(SCENIC)
导入pbmc3k数据,并对细胞类型定义。(之前只是对pbmc3k数据进行了聚类,但是并未定义细胞类型,这儿对细胞类型进行定义)
pbmc <-readRDS("/home/wucheng/jianshu/function/data/pbmc.rds")
setwd("/home/wucheng/SCENIC/SCENIC_pbmc3k")
current.cluster.ids <- c(0:8)
new.cluster.ids <- c("Naive CD4 T", "CD14+ Mono", "Memory CD4 T", "B", "CD8 T", "FCGR3A+ Mono", "NK", "DC", "Platelet")
pbmc@meta.data$celltype <- plyr::mapvalues(x = pbmc@meta.data[,"seurat_clusters"], from = current.cluster.ids, to = new.cluster.ids)
head(pbmc@meta.data)
pdf(file="celltype_umap.pdf",width=10,height=10)
DimPlot(pbmc, reduction = "umap", group.by= "celltype",label = TRUE, pt.size = 0.5) + NoLegend()
dev.off()
准备细胞meta信息
cellInfo <- data.frame(pbmc@meta.data)
colnames(cellInfo)[which(colnames(cellInfo)=="orig.ident")] <- "sample"
colnames(cellInfo)[which(colnames(cellInfo)=="nFeature_RNA")] <- "nGene"
colnames(cellInfo)[which(colnames(cellInfo)=="nCount_RNA")] <- "nUMI"
colnames(cellInfo)[which(colnames(cellInfo)=="seurat_clusters")] <- "cluster"
colnames(cellInfo)[which(colnames(cellInfo)=="celltype")] <- "celltype"
cellInfo <- cellInfo[,c("sample","nGene","nUMI","cluster","celltype")]
saveRDS(scenicOptions, file="int/cellInfo.Rds")
#设置celltype颜色,也可不设置,使用默认颜色
colVars <- list(celltype=c("Naive CD4 T"="forestgreen", "CD14+ Mono"="darkorange", "Memory CD4 T"="magenta4",
"B"="hotpink", "CD8 T"="red3", "FCGR3A+ Mono"="skyblue", "NK"="darkblue", "DC"="yellow", "Platelet"="grey"))
colVars$celltype <- colVars$celltype[intersect(names(colVars$celltype), cellInfo$celltype)]
saveRDS(colVars, file="int/colVars.Rds")
初始化 SCENIC 设置,设置分析环境
org <- "hgnc" #mgi 代表鼠标,hgnc 代表人,dmel 代表苍蝇 ,我们这儿pbmc3k为人的,选择hgnc
dbDir <- "./SCENIC/cisTarget_databases" # RcisTarget databases location
myDatasetTitle <- "SCENIC example on pbmc3k" # choose a name for your analysis
data(defaultDbNames)
dbs <- defaultDbNames[[org]]
scenicOptions <- initializeScenic(org=org, dbDir=dbDir, dbs=dbs, datasetTitle=myDatasetTitle, nCores=10) #nCores=10,代表开启10个线程计算
scenicOptions@inputDatasetInfo$cellInfo <- "int/cellInfo.Rds"
scenicOptions@inputDatasetInfo$colVars <- "int/colVars.Rds"
saveRDS(scenicOptions, file="int/scenicOptions.Rds")
构建Co-expression network
exprMat <- as.matrix(pbmc@assays$RNA@counts) #准备表达矩阵,为了节省计算资源,随机只抽取部分细胞,计算共表达网络
genesKept <- geneFiltering(exprMat, scenicOptions=scenicOptions,minCountsPerGene=3*.01*ncol(exprMat),minSamples=ncol(exprMat)*.01) #基因过滤/选择,去除最有可能是噪音的基因
exprMat_filtered <- exprMat[genesKept, ]
dim(exprMat_filtered)
runCorrelation(exprMat_filtered, scenicOptions) ##计算相关性矩阵,1.2_corrMat.Rds:基因之间的相关性矩阵
根据表达数据推断潜在的转录因子靶标,使用 GENIE3 或 GRNBoost,GENIE3 非常耗时且计算量大(在 3-5k 单元的数据集上需要几个小时或几天的时间),GRNboost可在很短的时间内提供与 GENIE3 类似的结果,这儿使用的R,选择GENIC3
##GENIE3,GENIE3 的输入通常是一个表达式矩阵和一个候选调节器列表。
exprMat_filtered <- log2(exprMat_filtered+1) #完整矩阵
runGenie3(exprMat_filtered, scenicOptions, nParts = 10) #nParts参数,是把表达矩阵分成n份分开计算
#1.4,GENIE3_linkList.Rds:GENIE3最终结果,是把“1.3_”开头的文件合并在一起
运行到这儿,才进入SCENIC关键分析步骤
1. 获取共表达模块
2. 获取调节子(使用 RcisTarget):TF 基序分析)
3. 对细胞中的 GRN评分(使用 AUCell)
4. 根据 GRN 活动对细胞进行聚类
exprMat_log <- log2(exprMat+1) #log标准话原始矩阵
#scenicOptions <- readRDS("int/scenicOptions.Rds")
scenicOptions@settings$verbose <- TRUE
scenicOptions@settings$nCores <- 1
scenicOptions@settings$seed <- 123
scenicOptions <- runSCENIC_1_coexNetwork2modules(scenicOptions) #1. 获取共表达模块
scenicOptions <- runSCENIC_2_createRegulons(scenicOptions) #2. 获取regulons
#可使用参数coexMethod=c("top5perTarget"),coexMethod可供选择,作者尝试了多种策略过滤低相关性TF-Target,并建议是6种过滤标准都用,其实也并没有耗时多少。默认都计算。
#w001:以每个TF为核心保留weight>0.001的基因形成共表达模块;#w005,#top50
#top5perTarget:每个基因保留weight值top5的TF得到精简的TF-Target关联表,然后把基因分配给TF构建共表达模块;#top10perTarget;#top50perTarget
scenicOptions <- runSCENIC_3_scoreCells(scenicOptions, exprMat_log) #3. 对细胞中的 GRN(调节子)评分
saveRDS(scenicOptions, file="int/scenicOptions.Rds")
runSCENIC_4_aucell_binarize(scenicOptions, exprMat=exprMat_log)
运行完runSCENIC_2_createRegulons后产生:
output/Step2_MotifEnrichment.tsv
output/Step2_MotifEnrichment_preview.html
output/Step2_regulonTargetsInfo.tsv 文件
Step2_MotifEnrichment.tsv打开如下:
geneSet:基因集的名称;motif: motif ID,NES:基因集中motif的标准化富集分数;
AUC:曲线下面积(用于计算 NES); TFinDB:指示突出显示的TF是否包含在高置信度注释(两个星号)或低置信度注释(一个星号)中;TF_highConf:根据“motifAnnot_highConfCat”注释到motif的转录因子;TF_lowConf:根据“motifAnnot_lowConfCat”注释到motif的转录因子;richedGenes:在给定基序上排名较高的基因;nErnGenes:排名靠前的基因数量;rankAtMax:在最大富集处排序,用于确定富集基因的数量。
Step2_MotifEnrichment_preview.html
显著富集的motif注释信息,表头与上个文件相同。
Step2_regulonTargetsInfo.tsv
TF:转录因子名称;gene:TF靶基因名称;nMotif:靶基因在数据库的motif数量;bestMotif:最显著富集的motif名称
NES:标准富集分数,分值越高越显著;highConfAnnot:是不是高可信注释;Genie3Weight:TF与靶基因的相关性权重
运行完runSCENIC_3_scoreCells后,产生regulonAUC矩阵,可用热图展示,t-SNE图分别展示每个regulon的活性分布情况。
runSCENIC_4_aucell_binarize,是进行 二进制转换及衍生分析 ,这步可不做
这儿,也可使用GRNs在每个细胞中的活性得分,来对细胞进行聚类,或许会得到不一样的细胞状态分类
nPcs <- c(5,15,50)
scenicOptions@settings$seed <- 123 # same seed for all of them
# Run t-SNE with different settings:
fileNames <- tsneAUC(scenicOptions, aucType="AUC", nPcs=nPcs, perpl=c(5,15,50), onlyHighConf=TRUE, filePrefix="int/tSNE_oHC")
# Plot as pdf (individual files in int/):
pdf("int/AUC_tsne.pdf",width=10,height=10)
plotTsne_compareSettings(fileNames, scenicOptions, showLegend=FALSE, varName="celltype", cex=.5)
dev.off()
当然,其实分析到这儿还是有点懵,regulons可能需要进一步挑选,可视化,结合Seurat聚类结果分析比较简单且有实际意义
pbmc <-readRDS("/home/wucheng/jianshu/function/data/pbmc.rds") #导入pbmc3k数据
current.cluster.ids <- c(0:8)
new.cluster.ids <- c("Naive CD4 T", "CD14+ Mono", "Memory CD4 T", "B", "CD8 T", "FCGR3A+ Mono", "NK", "DC", "Platelet")
pbmc@meta.data$celltype <- plyr::mapvalues(x = pbmc@meta.data[,"seurat_clusters"], from = current.cluster.ids, to = new.cluster.ids)
head(pbmc@meta.data)
##导入原始regulonAUC矩阵,也就是运行完runSCENIC_3_scoreCells后产生的AUC矩阵,可以查看每个GRN在每个细胞中的AUC活性打分
setwd("/home/wucheng/SCENIC/SCENIC_pbmc3k")
AUCmatrix <- readRDS("int/3.4_regulonAUC.Rds")
AUCmatrix <- data.frame(t(AUCmatrix@assays@data@listData$AUC), check.names=F)
RegulonName_AUC <- colnames(AUCmatrix)
RegulonName_AUC <- gsub(' \\(','_',RegulonName_AUC) #把(替换成_
RegulonName_AUC <- gsub('\\)','',RegulonName_AUC) #把)去掉,最后如把 KLF3_extended (79g) 替换成KLF3_extended_79g
colnames(AUCmatrix) <- RegulonName_AUC
pbmcauc <- AddMetaData(pbmc, AUCmatrix) #把AUC矩阵添加到pbmc的metadata信息中
pbmcauc@assays$integrated <- NULL
saveRDS(pbmcauc,'pbmcauc.rds')
##导入二进制regulonAUC矩阵
BINmatrix <- readRDS("int/4.1_binaryRegulonActivity.Rds")
BINmatrix <- data.frame(t(BINmatrix), check.names=F)
RegulonName_BIN <- colnames(BINmatrix)
RegulonName_BIN <- gsub(' \\(','_',RegulonName_BIN)
RegulonName_BIN <- gsub('\\)','',RegulonName_BIN)
colnames(BINmatrix) <- RegulonName_BIN
pbmcbin <- AddMetaData(pbmc, BINmatrix)
pbmcbin@assays$integrated <- NULL
saveRDS(pbmcbin, 'pbmcbin.rds')
##利用Seurat可视化AUC
dir.create('scenic_seurat')
#FeaturePlot
GRNs <-intersect(colnames(AUCmatrix),colnames(BINmatrix))
for(i in 1:length(GRNs)){
p1 = FeaturePlot(pbmcauc, features=GRNs[i], label=T, reduction = 'umap')
p2 = FeaturePlot(pbmcbin, features=GRNs[i], label=T, reduction = 'umap')
p3 = DimPlot(pbmc, reduction = 'umap', group.by = "celltype", label=T)
plotc = p1|p2|p3
ggsave(paste("scenic_seurat/",GRNs[i],".png",sep=""), plotc, width=14 ,height=4)
}
可以发现,有一些转录因子行成的调控网络主要调控某些特异细胞类型,比如这儿的CEBPA。
#RidgePlot&VlnPlot ,和单细胞展示基因表达一样,这儿可以利用小提琴图展示GRNs的活性得分
for(i in 1:length(GRNs)){
p1 = RidgePlot(pbmcauc, features =GRNs[i], group.by="celltype") + theme(legend.position='none')
p2 = VlnPlot(pbmcauc, features =GRNs[i], pt.size = 0, group.by="celltype") + theme(legend.position='none')
plotc = p1 + p2
ggsave(paste("scenic_seurat/","Ridge-Vln_",GRNs[i],".png",sep=""),plotc, width=10, height=8)
}
当然也可以用热图可视化SCENIC结果
library(pheatmap)
cellInfo <- readRDS("int/cellInfo.Rds")
celltype = as.data.frame(subset(cellInfo,select = 'celltype'))
AUCmatrix <- t(AUCmatrix)
BINmatrix <- t(BINmatrix)
#挑选部分感兴趣的regulons
my.regulons <- intersect(rownames(AUCmatrix),rownames(BINmatrix))
myAUCmatrix <- t(AUCmatrix[rownames(AUCmatrix)%in%my.regulons,])
myBINmatrix <- t(BINmatrix[rownames(BINmatrix)%in%my.regulons,])
#使用regulon原始AUC值绘制热图
pdf("scenic_seurat/AUC_heatmap.pdf",width=10,height=20)
pheatmap(myAUCmatrix, show_colnames=F, annotation_col=celltype)
dev.off()
#使用regulon二进制AUC值绘制热图
pdf("scenic_seurat/BIN_heatmap.pdf",width=10,height=20)
pheatmap(myBINmatrix, show_colnames=F, annotation_col=celltype,color = colorRampPalette(colors = c("white","black"))(100))
dev.off()
如果觉得regulons太多了,有一些是没有意义的,可以使用RSS来识别挑选各个细胞类型代表性regulons,进行分析
regulonAUC <-loadInt(scenicOptions, "aucell_regulonAUC")
rss <- calcRSS(AUC=getAUC(regulonAUC), cellAnnotation=cellInfo[colnames(regulonAUC), "celltype"])
rssPlot <-plotRSS(rss) #大小 rss评分,颜色 Z-score
ggsave('int/rss.png', rssPlot$plot, width=5 ,height=20)
如果不想用pbmc3k数据,也可使用作者示例的小鼠大脑单细胞数据进行SCENIC分析
library(Seurat)
library(tidyverse)
library(patchwork)
library(SCENIC)
library(SCopeLoomR)
dir.create("./SCENIC_MouseBrain")
setwd("SCENIC_MouseBrain")
loomPath <- system.file(package="SCENIC", "examples/mouseBrain_toy.loom") ##作者提供的实例数据
loom <- open_loom(loomPath)
exprMat <- get_dgem(loom)
cellInfo <- get_cell_annotation(loom)
close_loom(loom)
dim(exprMat)
cellInfo <- data.frame(cellInfo)
cbind(table(cellInfo$CellType))
##初始化 SCENIC 设置
org <- "mgi" #mgi 代表鼠标,hgnc 代表人,dmel 代表苍蝇
dbDir <- "/home/wucheng/SCENIC/cisTarget_databases" # RcisTarget databases location
myDatasetTitle <- "SCENIC example on Mouse brain" # choose a name for your analysis
data(defaultDbNames)
dbs <- defaultDbNames[[org]]
scenicOptions <- initializeScenic(org=org, dbDir=dbDir, dbs=dbs, datasetTitle=myDatasetTitle, nCores=10)
scenicOptions@inputDatasetInfo$cellInfo <- "int/cellInfo.Rds"
scenicOptions@inputDatasetInfo$colVars <- "int/colVars.Rds"
saveRDS(scenicOptions, file="int/scenicOptions.Rds")
##构建Co-expression network
#1,根据表达数据推断潜在的转录因子靶标,使用 GENIE3 或 GRNBoost
#GENIE3 非常耗时且计算量大(在 3-5k 单元的数据集上需要几个小时或几天的时间)
#GRNboost可在很短的时间内提供与 GENIE3 类似的结果
#基因过滤/选择,去除最有可能是噪音的基因
genesKept <- geneFiltering(exprMat, scenicOptions=scenicOptions,minCountsPerGene=3*.01*ncol(exprMat),minSamples=ncol(exprMat)*.01)
runCorrelation(exprMat_filtered, scenicOptions) #GENIE3,GENIE3 的输入通常是一个表达式矩阵和一个候选调节器列表。
exprMat_filtered <- log2(exprMat_filtered+1)
runGenie3(exprMat_filtered, scenicOptions, nParts = 10)
#构建 GRN 并为其评分#1. 获取共表达模块
2. 获取调节子(使用 RcisTarget):TF 基序分析)
#识别细胞状态: 3. 对细胞中的 GRN(调节子)评分(使用 AUCell)
#4. 根据 GRN 活动对细胞进行聚类
exprMat_log <- log2(exprMat+1)
library(SCENIC)
scenicOptions <- readRDS("int/scenicOptions.Rds")
scenicOptions@settings$verbose <- TRUE
scenicOptions@settings$nCores <- 1
scenicOptions@settings$seed <- 123
scenicOptions <- runSCENIC_1_coexNetwork2modules(scenicOptions)
scenicOptions <- runSCENIC_2_createRegulons(scenicOptions, coexMethod=c("top5perTarget"))
scenicOptions <- runSCENIC_3_scoreCells(scenicOptions, exprMat_log)
saveRDS(scenicOptions, file="int/scenicOptions.Rds")
也可参照其他优质简书文章对SECNIC的理解,如下:
https://cloud.tencent.com/developer/article/1692240
https://www.jianshu.com/p/bd0df23fbd60
https://www.cnblogs.com/raisok/p/12425225.html
希望大家关注点赞,谢谢!!!!!!!!!!!!
有不清楚的可以一起探讨,谢谢!!!!