1. 简介
SCENIC(single-cell regulatory network inference and clustering)是一个基于共表达和motif分析,计算单细胞转录组数据基因调控网络重建以及细胞状态鉴定的方法。
2017年发表在Nature Methods杂志上的SCENIC算法,利用单细胞RNA-seq数据,同时进行基因调控网络重建和细胞状态鉴定,应用于肿瘤和小鼠大脑单细胞图谱数据,提出并证明了顺式调控网络分析能够用于指导转录因子和细胞状态的鉴定。
SCENIC通过使用生物学驱动的features自动清除肿瘤样本特异性等批次效应。
有一些文章写的挺好的,在这里汇总一下:
https://www.cnblogs.com/raisok/p/12425225.html
https://www.jianshu.com/p/cd967c449177
https://cloud.tencent.com/developer/article/1692240
2. 原理
GRN(gene regulatory network)基因调控网络包括TF(transcription factor转录因子)、cofactor(共调因子)与其调节的target gene 组成,决定了某个状态下的细胞的转录状态。SCENIC流程包括三步骤:
(1)使用GENIE3或GRNBoost (Gradient Boosting) 基于共表达推断转录因子与候选靶基因之间的共表达模块。
(2)由于GENIE3模型只是基于共表达,会存在很多假阳性和间接靶标,为了识别直接结合靶标(direct-binding targets),使用RcisTarget对每个共表达模块进行顺式调控基序(cis-regulatory motif)分析。进行TF-motif富集分析,识别直接靶标。(仅保留具有正确的上游调节子且显著富集的motif modules,并对它们进行修剪以除去缺乏motif支持的间接靶标。)这些处理后的每个TF及其潜在的直接targets gene被称作一个调节子(regulon);
(3)使用AUCell算法对每个细胞的每个regulon活性进行打分。对于一个regulon来说,比较细胞间的AUCell 得分可以鉴定出哪种细胞有显著更高的subnetwork活性。结果生成一个二进制的regulon活性矩阵(binarized activity matrix),这将确定Regulon在哪些细胞中处于“打开”状态。
补充:
蛋白质中功能的基本单元是domain,是一种特殊的三维结构,不同结构的domain与其他分子特异性结合从而发挥功能。与此类似,转录因子在于DNA序列结合时,其结合位点的序列也由于一定的特异性,不同转录因子结合的DNA序列的模式是不同的。为了更好的描述结合位点序列的模式,科学家们提出了motif的概念。
2.1 GENIE3
GENIE3是一种从基因表达量数据推断基因调控网络的方法。它训练预测数据集中每个基因表达的随机森林模型,并使用TF的表达作为输入。然后使用不同的模型来得出TF的权重,并测量它们各自的相关性以预测每个靶基因的表达。
GENIE3的输入为表达矩阵,最好使用gene-summarized counts(可能是也可能不是UMIs)。其他单位,比如counts,TPM和FPKM/RPKM也可以。但是要注意第一步的网络相关分析基于共表达,一些作者建议也可以使用within-sample normalization比如TPM。
GENIE3的输出是一个带有基因、潜在调节因子以及IM(importance measure)的表。IM代表了TF(input gene)在预测靶标时的权重。作者探索了几种确定阈值的方法,最终选择为每个TF建立多个潜在靶标基因集:(1)设置几个IM阈值(IM>0.001 and IM >0.005)
(2)选取每个TF的前50哥靶标targets
(3)每个target gene保留top5,10,50个TFs,然后按TF分开。
在以上结果中,只有IM>0.001的links被算入。
每个基因集接着被分为positive- and negetive-correlated targets来区分可能激活的和抑制的targets。(TF和潜在靶标的Spearman相关性计算)
最终,只有包含30个基因以上的基因集(TF共表达模型)被保留,用于下游分析。
2.2 RcisTarget
RcisTarget是i-cisTarget和iRegulon的motif富集框架的新R / Bioconductor实现。
RcisTarget从一个基因列表识别富集的TF-binding motifs和候选转录因子。主要有两步骤:
(1)选择在基因集中基因TSS(transcription start site)附近显著过表达的DNA motif。这一步通过在数据库中应用recovery-based method(基于恢复的方法)来实现的,该数据库包含每个motif的全基因组跨物种排名。保留注释到对应TF并且NES(normalized enrichment score)>3的motif。
(2)对于每一个motif和基因集,RcisTarget预测候选靶标基因,也就是基因集中排名领先的基因。这一步提供的结果跟i-cisTarget和iiRegulon相同。
为了构建最终的regulon,作者合并了每个TF module中预测的靶基因,这些基因显示了给定TF的任何motif的富集。但是在作者分析的数据中,这些modules数量很少而且motif富集很低。因此,最终决定从流程中去除对于直接表达的检测,只使用positive-correlated targets进行下游分析。
2.3 AUCell
对于一个给定的regulon,通过比较所有细胞间的AUCell(area under the recovery curve)打分值,我们可以识别哪些细胞具有更显著高的regulon活性。
输入为一个基因集,输出为基因集每个细胞的‘activity’。这些基因集即regulon,包含TFs和他们假定的的target。基于recovery analysis将根据表达水平将所有基因进行排序。AUC代表了与细胞内其他基因相比,特征基因中表达基因的比例及其相对表达值。AUCell使用AUC来计算输入基因集的关键子集是否在每个细胞的排名顶部都得到了富集。将输出一个每个基因集在每个细胞的AUC score矩阵。
通过卡阈值得到的二元活性矩阵使矩阵维数减少(可理解为只有 0|1,on|off),对于下游分析很有用。 例如,基于regulon二元活性矩阵的聚类,可以根据某个调控子网络(regulon)的活性来识别细胞群类型和细胞状态。由于regulon是整体评分的,而不是使用单个基因的表达,因此这种方法对于个别基因的dropouts很有效。
3. 分析方法-R版
3.1 输入
单细胞RNA-seq表达矩阵
每列对应于样品(细胞),每行对应一个基因。基因ID应该是gene-symbol并存储为rownames (尤其是基因名字部分是为了与RcisTarget数据库兼容);
表达数据是Gene的reads count。根据作者的测试,提供原始的或Normalized UMI count,无论是否log转换,或使用TPM值,结果相差不大,但是不推荐TPM。
在进行GENIE3分析前要对数据进行过滤:
(1)过滤基因:对每个基因的总reads数进行过滤,去除最可能不可信的只提供噪音的基因。具体的值取决于数据,文章中用到3 UMI counts × 30 (1% of cells) = minimum 90 counts per gene
(2)过滤基因:在多少细胞中被检测到。去除只在一个活少量细胞中表达的基因,如果这些基因正好在一个细胞中集合,将获得很大的权重。推荐1%。
3.2 分析步骤
官方github教程
3.2.1 加载R包
library(foreach)
library(SCENIC)
library(Seurat)
library(GENIE3)
library(AUCell)
library(RcisTarget)
library(loomR)
3.2.2 下载数据库
比如说创建一个cisTarget_databases目录,然后根据对应物种下载相应的数据库文件到目录下。下面示例为用R下载,也可以wget等其他方法。
### 准备工作:下载评分数据库
dbFiles <- 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")
## mc9nr: Motif collection version 9: 24k motifs
download.file(dbFiles[1],"SCENIC/cisTarget_databases/mm9-500bp-upstream-7species.mc9nr.feather")
download.file(dbFiles[2],"SCENIC/cisTarget_databases/mm9-tss-centered-10kb-7species.mc9nr.feather")
3.2.3 导入数据
根据不同的数据类型有不同的导入方式,官方教程都有写,这里针对seurat对象导入。
### 导入单细胞数据
## 准备表达量矩阵
exprMat <- pt@assays$RNA@counts
exprMat <- as.matrix(exprMat)
##准备细胞meta信息
cellInfo <- data.frame(pt@meta.data)
colnames(cellInfo)[which(colnames(cellInfo)=="orig.ident")] <- "sample"
colnames(cellInfo)[which(colnames(cellInfo)=="seurat_clusters")] <- "cluster"
colnames(cellInfo)[which(colnames(cellInfo)=="sub_type")] <- "celltype"
cellInfo <- cellInfo[,c("sample","cluster","celltype","Group")]
saveRDS(cellInfo, file="int/cellInfo.Rds")
### Initialize settings 初始设置,导入评分数据库
scenicOptions <- initializeScenic(org="mgi",
dbDir="cisTarget_databases",
nCores=10)
scenicOptions@inputDatasetInfo$cellInfo <- "int/cellInfo.Rds"
saveRDS(scenicOptions, file="int/scenicOptions.Rds")
scenicOptions <- initializeScenic()这一步的参数解释:
dbDir 为存放数据库的目录
nCores 为分析使用的线程,要考虑服务器配置情况设置
3.2.4 共表达网络计算
使用GENIE3计算转录因子与每个基因的相关性,消耗资源非常大。我进行测试时两万五细胞三万基因的小鼠单细胞转录组数据跑了7天,到现在还没结束。处理大数据集的时候会非常非常慢,作者提出了两种解决办法:
(1)GENIE推断共表达module时抽取少量细胞计算,在计算regulon活性(AUCell)时,使用所有细胞计算;
(2)采用python版本的SCENIC,具体步骤下面会说到。
我还是使用了最基础的,而不是作者建议的方法。
##==转录调控网络推断==##
## 基因过滤,minCountsPerGene和minSamples采用默认参数
# 过滤标准是基因表达量之和>细胞数*3%,且在1%的细胞中表达
genesKept <-geneFiltering(exprMat, scenicOptions, minCountsPerGene = 3 * 0.01 *ncol(exprMat), minSamples =ncol(exprMat) * 0.01)
exprMat_filtered <- exprMat[genesKept,]
## 计算相关性矩阵
runCorrelation(exprMat_filtered, scenicOptions)
## TF-Targets相关性回归分析
exprMat_filtered_log <- log2(exprMat_filtered+1)
runGenie3(exprMat_filtered_log, scenicOptions) ## 这一步跑了七天
runGenie3会在int目录产生不少结果文件:
· 1.2_corrMat.Rds 基因间相关性矩阵;
· 1.3_GENIE3_weightMatrix_part_1.Rds GENIE3中间结果,矩阵格式,有好多个,比如我这次分析,产生了10个;
· 1.4_GENIE3_linkList.Rds GENIE3的最终结果,是把1.3那一堆文件合并在一起了。文件有三列:
TF为转录因子名称,
Target为潜在靶基因的名称,
weight时TF与Target之间的相关性权重。
3.2.5 Step1 - 推断共表达模块
GENIE3计算了转录因子与每个基因的相关性,接下来需要过滤掉低相关性的组合,形成共表达基因集。作者尝试了多种过滤标准,没有发现一种最佳策略,所以推荐6种都用,这六种分别为:
· w001:以每个TF为核心保留weight>0.001的基因形成共表达模块;
· w005:以每个TF为核心保留weight>0.005的基因形成共表达模块;
· top50:以每个TF为核心保留weight值top50的基因形成共表达模块;
· top5perTarget:每个基因保留weight值top5的TF得到精简的TF-Target关联表,然后把基因分配给TF构建共表达模块;
· top10perTarget:每个基因保留weight值top10的TF得到精简的TF-Target关联表,然后把基因分配给TF构建共表达模块;
· top50perTarget:每个基因保留weight值top50的TF得到精简的TF-Target关联表,然后把基因分配给TF构建共表达模块;
# 推断共表达模块
runSCENIC_1_coexNetwork2modules(scenicOptions)
结果文件为1.6_tfModules_asDF.Rds,四列:
method为6种过滤方法
corr为runCorrelation(exprMat_filtered, scenicOptions)得到的结果,1代表激活,-1代表抑制,0代表中性。SCENIC只会采用值为1,即激活的数据用于后续分析。
3.2.6 Step2 - Motif验证共表达模块
上一步找到了每个转录因子强相关的靶基因,这一步要修建共表达模块形成有生物学意义的调控单元(regulons)。
对每个共表达模块进行motif富集分析,保留显著富集的motif;这一步依赖gene-motif评分数据库,行为基因,列为motif,值为排名,也就是我们下载的cisTarget数据库。
使用数据库对motif进行TF注释,得到高可信度、低可信度。数据库直接注释和同源基因推断的TF为高可信度,使用motif序列相似性注释的TF为低可信度结果。
用保留的motif对共表达模块里的基因进行打分(依据cisTarget数据库),识别显著高分的基因(理解为motif里这些基因的TSS很近)。
删除共表达模块中与motif评分不高的基因,剩下的基因集被称为调控单元(regulon)。
## 推断转录调控单元regulon
runSCENIC_2_createRegulons(scenicOptions) # Toy run settings
# 可以通过coexMethod调整使用的过滤方法,默认6中方法都做
# 如果做测试可以只选择几种方法减少计算量
output/Step2_MotifEnrichment.tsv,有motifDb geneSet motif NES AUC highlightedTFs TFinDB TF_highConf TF_lowConf nEnrGenes rankAtMax enrichedGenes,这11列。
· geneSet: Name of the gene set
· motif: ID of the motif
· NES: Normalized enrichment score of the motif in the gene-set
· AUC: Area Under the Curve (used to calculate the NES)
· TFinDB: Indicates whether the highlightedTFs are included within the high confidence annotation (two asterisks) or low confidence annotation (one asterisk).
· TF_highConf: Transcription factors annotated to the motif according to ‘motifAnnot_highConfCat’.
· TF_lowConf: Transcription factors annotated to the motif according to ‘motifAnnot_lowConfCat’.
· enrichedGenes: Genes that are highly ranked for the given motif.
· nErnGenes: Number of genes highly ranked
· rankAtMax: Ranking at the maximum enrichment, used to determine the number of enriched genes.
output/Step2_regulonTargetsInfo.tsv
最终的regulon文件,将第一个文件的数据整合在了一起,表头含义如下:
· TF:转录因子名称
· gene:TF靶基因名称
· nMotif:靶基因在数据库的motif数量
· bestMotif:最显著富集的motif名称
· NES:标准富集分数,分值越高越显著
· highConfAnnot:是不是高可信注释
· Genie3Weight:TF与靶基因的相关性权重
Step2_MotifEnrichment_preview.html
3.2.7 Step3 - Regulon活动评分与可视化
一个regulon=一个TF与其Target gene的基因集,regulon的名称有两种写法:
· TF名称+extended+靶基因数目:转录因子与所有靶基因组成的基因调控网络
· TF名称+靶基因数目:转录因子与高可信靶基因(即highConfAnnot=TRUE的基因)组成的基因调控网络
AUCell对每个regulon在各个细胞中的活性进行评分。评分的基础是基因表达值,分数越高代表基因集的激活程度越高。这一步要用所有细胞做计算。
##==regulon活性评分与可视化==##
##regulons计算AUC值并进行下游分析
exprMat_all <- as.matrix(scRNA@assays$RNA@counts)
exprMat_all <- log2(exprMat_all+1)
runSCENIC_3_scoreCells(scenicOptions, exprMat=exprMat_all)
3.2.8 Step4 - 生成二进制的regulon活性矩阵
runSCENIC_4_aucell_binarize(scenicOptions)
3.3 结果可视化
SCENIC通过几个step即可绘制一些默认的图片
3.3.1 Regulon Activity heatmap
step3有所有regulon在细胞的AUCscore热图Step3_RegulonActivity_heatmap.pdf
3.3.2 Binary Regulon Activity Heatmap
step4则生成多个热图Step4_BinaryRegulonActivity_Heatmap*
3.3.3 Cell-type specific regulators (RSS)
**Cell-type specific**regulators (based on the **Regulon Specificity Score (RSS)**proposed by *Suo et al.* for the Mouse Cell Atlas in 2018).Useful for big analysis with many cell types, to identify the cell-type specific regulons.
当细胞种类比较多时可以用RSS来识别细胞类型特异性regulons
regulonAUC <-loadInt(scenicOptions, "aucell_regulonAUC")
cellInfo1 <- readRDS("cellInfo1.rds")
rss <- calcRSS(AUC=getAUC(regulonAUC), cellAnnotation=cellInfo1[colnames(regulonAUC), "type"])
rssPlot <-plotRSS(rss) #大小 rss评分,颜色 Z-score
rssPlot$plot
得到热点图,颜色深浅代表z-score值,点的大小代表RSS评分。
然后就可以挑选各个细胞类型代表性regulon绘制热图等等啦。
绘制过程中我发现有一个点就是,根据regulon list提取到norm的AUCscore之后,再scale(计算z-score)比直接计算所有regulons的z-score再提取,绘制效果要好。数据好的话,可以得到下图这样的结果啦。
4. 分析方法-Python版
同样不介绍安装步骤,可查看官方说明。
如果服务器配置了docker的话直接用docker比较简便,拉一个镜像就行了:
docker pull aertslab/pyscenic:0.10.0
这里主要记录一下分析方法。
4.1 输入文件准备
以下是官方教程用到的文件:
(1)表达量文件,cellinfo
### 导入单细胞数据
## 准备表达量矩阵
exprMat <- epi@assays$RNA@counts
exprMat <- t(as.matrix(exprMat))
write.csv(exprMat,"expr.csv")
(2)cisTarget数据下载
从数据库下载,我做的是人的
wget https://resources.aertslab.org/cistarget/databases/homo_sapiens/hg38/refseq_r80/mc9nr/gene_based/hg38__refseq-r80__10kb_up_and_down_tss.mc9nr.feather .
wget https://resources.aertslab.org/cistarget/databases/homo_sapiens/hg38/refseq_r80/mc9nr/gene_based/hg38__refseq-r80__500bp_up_and_100bp_down_tss.mc9nr.feather .
(3)motif数据下载
wget https://resources.aertslab.org/cistarget/motif2tf/motifs-v9-nr.hgnc-m0.001-o0.0.tbl
(4)需要手动处理的tf名称列表
需要自己处理一下数据库文件来生成,作者也提供了处理方法;官方也提供了人和小鼠的所有TFs列表
BASEFOLDER_NAME = '../resources/'
MOTIFS_HGNC_FNAME = os.path.join(BASEFOLDER_NAME, 'motifs-v9-nr.hgnc-m0.001-o0.0.tbl')
df_motifs_hgnc = pd.read_csv(MOTIFS_HGNC_FNAME, sep='\t')
hs_tfs = df_motifs_hgnc.gene_name.unique()
with open(OUT_TFS_HGNC_FNAME, 'wt') as f:
f.write('\n'.join(hs_tfs) + '\n')
len(hs_tfs)
4.2 分析步骤
尝试了jupyter教程,很奇怪同样的环境命令行都可以加载,但是jupyter无法加载scenic下的一个包。
尝试了命令行方式运行,也很奇怪有报错。
最后用docker运行成功,可能对环境的要求比较复杂吧。
4.2.1 grn
输入文件为表达量文件,这里要注意表达量矩阵expr.csv 为cell x gene,即行名为基因,列名为细胞barcode。
输出文件为expr_mat.adjacencies.tsv。
分析主要耗费的时间在这一步,我测的两万多细胞跑了15h左右。
docker run -it -d --rm -v/xxxxx/SCENICanalysis/:/data aertslab/pyscenic pyscenic grn --num_workers 30 -o /data/malignant.out/expr_mat.adjacencies.tsv /data/expr.csv /data/hg38/hs_hgnc_tfs.txt
4.2.2 ctx
这里用到了数据库文件,expr.csv,和上一步的结果文件。
输出文件为regulons.csv。
docker run -it -d --rm -v/xxxxx/SCENICanalysis/:/data aertslab/pyscenic pyscenic ctx --num_workers 30/data/epi.out/expr_mat.adjacencies.tsv /data/hg38/hg38__refseq-r80__500bp_up_and_100bp_down_tss.mc9nr.feather /data/hg38/hg38__refseq-r80__10kb_up_and_down_tss.mc9nr.feather --annotations_fname/data/hg38/motifs-v9-nr.hgnc-m0.001-o0.0.tbl --expression_mtx_fname/data/expr.csv --modedask_multiprocessing --output /data/epi.out/regulons.csv
4.2.3 aucell
输入文件为上一步的结果文件regulons.csv,和表达量文件expr.csv。
输出为auc打分结果auc_mtx.csv。
docker run -it -d --rm -v/xxxxx/SCENICanalysis/:/data aertslab/pyscenic pyscenic aucell /data/expr.csv /data/epi.out/regulons.csv -o/data/epi.out/auc_mtx.csv --num_workers 30
5. 结果展示方式
Construction of a human cell landscape at single-cell level