轉(zhuǎn)錄因子 (transcription factors, TFs) 是直接作用于基因組魂那,與特定DNA序列結(jié)合 (TFBS/motif) 蛾号,調(diào)控DNA轉(zhuǎn)錄過程的一類蛋白質(zhì)。轉(zhuǎn)錄因子可以調(diào)節(jié)基因組DNA開放性涯雅、募集RNA聚合酶進(jìn)行轉(zhuǎn)錄過程鲜结、募集輔助因子調(diào)節(jié)特定的轉(zhuǎn)錄階段,調(diào)控諸多生命進(jìn)程活逆,諸如免疫反應(yīng)精刷、發(fā)育模式等。因此蔗候,分析轉(zhuǎn)錄因子表達(dá)及其調(diào)控活性對(duì)于解析復(fù)雜生命活動(dòng)具有重要意義怒允。
了解轉(zhuǎn)錄因子對(duì)于了解細(xì)胞的功能及生命活動(dòng)有重要作用。傳統(tǒng)的轉(zhuǎn)錄因子分析大多是對(duì)已知轉(zhuǎn)錄因子的表達(dá)和未知蛋白的轉(zhuǎn)錄因子預(yù)測(cè)分析锈遥,涉及活性分析的極少纫事,而轉(zhuǎn)錄因子活性是其發(fā)揮作用的關(guān)鍵指標(biāo)。
因此所灸,今天想給大家介紹的就是一款可以分析轉(zhuǎn)錄因子活性的軟件SCENIC[2]丽惶,這款軟件是基于單細(xì)胞轉(zhuǎn)錄組數(shù)據(jù)開發(fā)的,可以解析單個(gè)細(xì)胞中轉(zhuǎn)錄因子活性爬立。對(duì)于單細(xì)胞轉(zhuǎn)錄組而言蚊夫,轉(zhuǎn)錄因子活性差異不僅為細(xì)胞異質(zhì)性研究帶來了新的思路,同時(shí)還可以從轉(zhuǎn)錄因子入手快速解析關(guān)鍵的分析調(diào)控機(jī)制懦尝。
SCENIC是2017年11月發(fā)表在 Nature Methods 期刊的一種單細(xì)胞轉(zhuǎn)錄因子分析方法,也是目前進(jìn)行單細(xì)胞轉(zhuǎn)錄因子分析的主流軟件壤圃,該軟件在進(jìn)行數(shù)據(jù)分析的同時(shí)也能得到可視化結(jié)果圖陵霉。另外,SCENIC是一款開源軟件伍绳,可以免費(fèi)下載使用踊挠,目前軟件有R和python兩個(gè)版本,每個(gè)版本都配備了詳細(xì)的使用說明(軟件官網(wǎng)https://scenic.aertslab.org/)冲杀。但有一點(diǎn)需要特別注意效床,該軟件是有物種限制的,目前只能分析人权谁、小鼠和果蠅的數(shù)據(jù)剩檀,具體限制原因,我們?cè)诤竺娴姆治鲈碇薪視詞
一旺芽、原理介紹
SCENIC就是一個(gè)常見的沪猴、基于單細(xì)胞轉(zhuǎn)錄組數(shù)據(jù)分析轉(zhuǎn)錄因子活性辐啄、基因調(diào)控網(wǎng)路的工具。SCENIC的分析主要分為三步运嗜,
- 第一步通過基因之間的共表達(dá)壶辜,找到可能的轉(zhuǎn)錄因子;
- 第二步是進(jìn)行轉(zhuǎn)錄因子-motif的富集分析并找到對(duì)應(yīng)的靶基因(調(diào)控組regulon)担租;
- 第三步是對(duì)調(diào)控組的活躍程度進(jìn)行評(píng)分砸民;
第一步由 GENIE3 包或 GRNBoost 實(shí)現(xiàn)。
GENIE3 (GEne NetworkInference with Ensemble of trees) 奋救,基于樹的基因網(wǎng)絡(luò)推理岭参,是一種從基因表達(dá)數(shù)據(jù)推斷基因調(diào)控網(wǎng)絡(luò)的方法[3]。軟件以單細(xì)胞基因表達(dá)量矩陣為輸入文件菠镇,以每個(gè)目標(biāo)基因 (gene) 為輸出冗荸,以轉(zhuǎn)錄因子 (TF) 為輸入,構(gòu)建P個(gè)隨機(jī)森林樹(P=矩陣中基因數(shù)量)利耍,并計(jì)算每個(gè)TF與gene之間的重要性評(píng)分 (IM) 蚌本,最終可以獲得TF-genes共表達(dá)模塊。最后刪除IM低于閾值的基因關(guān)系隘梨,過濾基因數(shù)低于50的模塊程癌。
GENIE3用轉(zhuǎn)錄因子的表達(dá)量,通過訓(xùn)練隨機(jī)森林(random forest)模型來預(yù)測(cè)各基因的表達(dá)量轴猎,從而得到轉(zhuǎn)錄因子在預(yù)測(cè)每個(gè)基因轉(zhuǎn)錄時(shí)的權(quán)重嵌莉。這個(gè)權(quán)重反映了轉(zhuǎn)錄因子對(duì)于預(yù)測(cè)基因轉(zhuǎn)錄水平的相關(guān)性。相關(guān)性越高捻脖,則代表基因更有可能是該轉(zhuǎn)錄因子的靶基因锐峭。
隨機(jī)森林是由多個(gè)決策樹形成的分類器,它通過有放回的抽樣訓(xùn)練出多個(gè)決策樹可婶,再以決策樹結(jié)果中的眾數(shù)為最終的結(jié)果沿癞。更詳細(xì)的解釋,可見:https://zhuanlan.zhihu.com/p/57965634
GENIE3的輸入為基因表達(dá)矩陣矛渴,可以是UMI椎扬、TPM,或者FPKM/RPKM具温。而GENIE3的輸出為基因蚕涤、可能參與該基因的轉(zhuǎn)錄因子,以及它們的該轉(zhuǎn)錄因子的重要性(importance measure, IM)铣猩,即其在預(yù)測(cè)基因轉(zhuǎn)錄水平時(shí)的權(quán)重揖铜。只有當(dāng)權(quán)重高于0.001時(shí),該轉(zhuǎn)錄因子才被認(rèn)為是可能參與該基因調(diào)控的轉(zhuǎn)錄因子剂习。
因?yàn)殡S機(jī)森林需要進(jìn)行多次抽樣蛮位,訓(xùn)練出多個(gè)決策樹较沪,當(dāng)數(shù)據(jù)量很大時(shí),這一步非呈剩花時(shí)間尸曼,因此針對(duì)較大的數(shù)據(jù),第一步可以用GRNBoost萄焦,它使用了梯度提升算法控轿,在訓(xùn)練新的決策樹時(shí),會(huì)提高上一個(gè)決策樹出錯(cuò)的樣本比例拂封,以針對(duì)模型預(yù)測(cè)欠缺的地方進(jìn)行優(yōu)化茬射。
第二步由 RcisTarget 包實(shí)現(xiàn)。
它的主要作用在于通過一個(gè)基因列表冒签,找到富集的轉(zhuǎn)錄因子及轉(zhuǎn)錄因子結(jié)合模序(motif)在抛,即可能的轉(zhuǎn)錄因子結(jié)合位點(diǎn)的模板序列。
它通過兩步進(jìn)行萧恕。
- 首先刚梭,它找到基因列表里基因的轉(zhuǎn)錄起始位點(diǎn)(transcript ion start site, TSS)。并找出轉(zhuǎn)錄起始位點(diǎn)周圍高頻出現(xiàn)的DNA motif票唆。它會(huì)搜尋一個(gè)包含了跨物種基因組范圍內(nèi)各motif信息的數(shù)據(jù)庫(kù)朴读,篩選出和目標(biāo)轉(zhuǎn)錄因子相關(guān)聯(lián)的、標(biāo)準(zhǔn)化富集指數(shù)(normalised enrichment score, NES)高于3.0的motif走趋。
- 接著衅金,針對(duì)每一組motif和基因列表,RcisTarget會(huì)預(yù)測(cè)可能的目標(biāo)基因簿煌。目標(biāo)基因?yàn)榛蛄斜碇蓄A(yù)測(cè)結(jié)果排序靠前的基因氮唯。所有motif共有的目標(biāo)基因加上與之對(duì)應(yīng)的轉(zhuǎn)錄因子,即為調(diào)控組regulon姨伟。
第三步由AUCell實(shí)現(xiàn)您觉,它能找到每個(gè)細(xì)胞中一組基因的活躍程度。
在這,SCENIC通過AUCell計(jì)算regulon的活躍程度。AUCell計(jì)算曲線下的面積(area under recovery curve, AUC)琳轿,依據(jù)每個(gè)基因的表達(dá)水平篙议,來計(jì)算出regular的活躍程度。各基因根據(jù)基因表達(dá)水平在x軸排序來繪制曲線诚啃。因此AUC反映了在每個(gè)細(xì)胞中給定的一組基因相對(duì)于其它基因的表達(dá)水平淮摔。
通過AUCell,我們能得到一個(gè)矩陣始赎,包含每組regulon在每個(gè)細(xì)胞內(nèi)相對(duì)于其它基因的表達(dá)水平和橙,即它們的活躍程度仔燕。通過這一個(gè)矩陣,我們可以對(duì)細(xì)胞進(jìn)行聚類魔招,也可以看不同細(xì)胞類型中都有什么regulon是活躍的晰搀。
總之,SCENIC在R 中實(shí)現(xiàn)基于三個(gè)R包:
1.GENIE3:推斷基因共表達(dá)網(wǎng)絡(luò)
2.RcisTarget:用于分析轉(zhuǎn)錄因子結(jié)合motif
3.AUCell:用于鑒定scRNA-seq數(shù)據(jù)中具有活性基因集(基因網(wǎng)絡(luò))的細(xì)胞
a 使用GENIE3或GRNBoost推斷轉(zhuǎn)錄因子與候選靶基因之間的共表達(dá)模塊办斑。RcisTarget可識(shí)別那些調(diào)節(jié)子的結(jié)合基序在目標(biāo)基因中顯著富集的模塊外恕。并創(chuàng)建僅具有直接target的調(diào)節(jié)單元。AUCell對(duì)每個(gè)細(xì)胞中每個(gè)調(diào)節(jié)單元的活性進(jìn)行評(píng)分乡翅,從而產(chǎn)生活性矩陣鳞疲。細(xì)胞狀態(tài)基于調(diào)節(jié)子網(wǎng)絡(luò)的共有的活性。
b SCENIC在小鼠大腦數(shù)據(jù)上的結(jié)果; 聚類標(biāo)簽的顏色對(duì)應(yīng)主調(diào)節(jié)子蠕蚜。
c 顯示了文獻(xiàn)(A)證實(shí)的轉(zhuǎn)錄因子或具有MGI(B)的腦表型的轉(zhuǎn)錄因子尚洽,以及豐富的DNA基序。
d 活性矩陣上得到的t-SNE靶累。每個(gè)細(xì)胞標(biāo)記了最活躍的基因調(diào)節(jié)網(wǎng)絡(luò)的顏色腺毫。
e 此數(shù)據(jù)集上不同聚類方法的準(zhǔn)確性。
原文:https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5937676/
以上是SCENIC的算法概述
二尺铣、pySCENIC python版本分析
適用背景
單細(xì)胞轉(zhuǎn)錄組調(diào)控網(wǎng)絡(luò)分析是單細(xì)胞轉(zhuǎn)錄組分析內(nèi)容的高級(jí)分析之一拴曲。R的SCENIC基于AUCell,RcisTarget和GENIE3三個(gè)包進(jìn)行分析凛忿,所以要先安裝這些依賴包澈灼,而pySCENIC則已經(jīng)封裝好,直接用pip安裝即可店溢。只用SCENIC或pySCENIC也可以單獨(dú)完成分析叁熔,但R語言運(yùn)行起來很慢,pySCENIC可以有效提升分析速度床牧,還用SCENIC是因?yàn)榭梢暬肦語言會(huì)簡(jiǎn)單一些荣回。
1. 軟件安裝
創(chuàng)建一個(gè)環(huán)境,安裝Python和R
conda create -n pyscenic
conda activate pyscenic
conda install r-base=4.2.1
conda install python=3.9.13
### Python安裝pyscenic
pip install pyscenic -i https://mirrors.aliyun.com/pypi/simple/
pip install pandas -i https://mirrors.aliyun.com/pypi/simple/
pip install scanpy -i https://mirrors.aliyun.com/pypi/simple/
pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/
pip install loompy -i https://mirrors.aliyun.com/pypi/simple/
R安裝SCENIC
if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
BiocManager::install(c("AUCell", "RcisTarget","GENIE3"))
if (!requireNamespace("devtools", quietly = TRUE)) install.packages("devtools")
devtools::install_github("aertslab/SCENIC")
這樣就配置好基本環(huán)境了戈咳,接下來是安裝R包心软,確保以下需要library的包就可以。
library(Seurat) #
library(SCopeLoomR) #
library(AUCell) #
library(SCENIC) #
library(dplyr) #
library(KernSmooth) #
library(RColorBrewer) #
library(plotly) #
library(BiocParallel) # BiocManager
library(optparse) #
可以先用BiocManager::install() 安裝著蛙,如果安裝不了删铃,谷歌搜一下conda install [package name](百度搜不出來,不推薦)就能找到conda 安裝這個(gè)包的官網(wǎng)踏堡,雖然conda很萬能猎唁,但是慢啊,BiocManager::install會(huì)快很多顷蟆。當(dāng)然還有一些包是裝不了诫隅,需要用devtools安裝腐魂,例如SCopeLoomR,那哪些包要用devtools裝呢逐纬?一般BiocManager::install和conda裝不了的包就極大概率要用devtools裝了蛔屹,所以直接搜這個(gè)包的GitHub或官網(wǎng),例如谷歌搜SCopeLoomR GitHub风题,GitHub里面說明需要這樣安裝:
devtools::install_github("aertslab/SCopeLoomR")
用devtools重裝又各種報(bào)錯(cuò)判导,缺失某個(gè)包,缺失某個(gè)動(dòng)態(tài)庫(kù)……反正各種缺失沛硅,沒辦法眼刃,只能缺什么裝什么了,而且裝devtools的時(shí)候就很容易報(bào)錯(cuò)摇肌,建議先用conda安裝以下包和動(dòng)態(tài)庫(kù)再安裝SCopeLoomR:
conda install -c anaconda git
conda install -c anaconda hdf5
conda install -c conda-forge libgit2
conda install -c conda-forge r-ragg
conda install -c conda-forge r-xml
再在R里運(yùn)行:
devtools::install_github("aertslab/SCopeLoomR")
2.以人為例分析
2.1 從Seurat 對(duì)象生成loom文件
只需要使用build_loom函數(shù)擂红,在get_count_from_seurat.R文件后面添加幾行代碼即可。
get_count_from_seurat.R文件內(nèi)容如下:
library(optparse)
op_list <- list(
make_option(c("-i", "--inrds"), type = "character", default = NULL, action = "store", help = "The input of Seurat RDS",metavar="rds"),
make_option(c("-d", "--ident"), type = "character", default = NULL, action = "store", help = "The sample Ident of Seurat object",metavar="idents"),
make_option(c("-s", "--size"), type = "integer", default = NULL, action = "store", help = "The sample size of Seurat object",metavar="size"),
make_option(c("-l", "--label"), type = "character", default = "out", action = "store", help = "The label of output file",metavar="label"),
make_option(c("-a", "--assay"), type = "character", default = "Spatial", action = "store", help = "The assay of input file",metavar="assay")
)
parser <- OptionParser(option_list = op_list)
opt = parse_args(parser)
assay <- opt$assay
library(Seurat)
obj <- readRDS(opt$inrds)
if (!is.null(opt$ident)) {
Idents(obj) <- opt$ident
size=opt$size
if (!is.null(size)) {
obj <- subset(x = obj, downsample = opt$size)
}
saveRDS(obj,"subset.rds")
}
if (is.null(opt$label)) {
label1 <- 'out'
}else{
label1 <- opt$label
}
library(SCopeLoomR)
outloom <- paste0(label1,".loom")
build_loom(file.name = outloom,dgem = obj@assays[[assay]]@counts)
write.table(obj@meta.data,'metadata_subset.xls',sep='\t',quote=F)
使用方法:
-i
:輸入Seurat對(duì)象的RDS文件
-d
:隨機(jī)取樣分組的列名围小,例如groups昵骤,如果不賦值則表示不隨機(jī)取樣,使用全部細(xì)胞
-s
:隨機(jī)取樣的大小肯适,例如20变秦,因?yàn)檫@里用的是pbmc_small,所以設(shè)置小一點(diǎn)框舔,實(shí)際情況可能需要設(shè)置大一點(diǎn)
-l
:輸出文件的標(biāo)簽蹦玫,默認(rèn)為out,
-a
:使用的Seurat對(duì)象assay,默認(rèn)為Spatial刘绣。
Rscript get_count_from_seurat.R \
-i test.rds \
-d groups \
-s 20 \
-l out \
-a Spatial
需要注意的是樱溉,新腳本添加了assay這個(gè)參數(shù),默認(rèn)為Spatial纬凤,因?yàn)樽罱谟门芸臻g組數(shù)據(jù)福贞,如果要應(yīng)用到單細(xì)胞需要改為RNA。
2.2 運(yùn)行SCENIC的python版本停士,pyscenic
pyscenic的配置文件在官方提供的網(wǎng)站可以找到挖帘,需要三個(gè)文件:
1、TF列表文件:此處 或 此處
人的列表文件:https://github.com/aertslab/pySCENIC/blob/master/resources/hs_hgnc_tfs.txt-
2恋技、數(shù)據(jù)庫(kù)feather文件肠套,需注意版本問題,一個(gè)是 pySCENIC < 0.12.0 和ctxcore < 0.2.0軟件版本需要進(jìn)到old文件夾猖任,8月份最近的更新,另一個(gè)則是基因組版本瓷耙,以及數(shù)據(jù)庫(kù)來源的版本: 鏈接
人的feather文件:
https://resources.aertslab.org/cistarget/databases/old/homo_sapiens/hg19/refseq_r45/mc9nr/gene_based/hg19-tss-centered-10kb-10species.mc9nr.feather 3朱躺、motif2tf數(shù)據(jù)庫(kù)tbl文件: 鏈接
人的文件:
https://resources.aertslab.org/cistarget/motif2tf/motifs-v9-nr.hgnc-m0.001-o0.0.tbl
以上文件選取僅供參考刁赖,實(shí)際情況可能需要選擇不同文件。SCENIC的標(biāo)準(zhǔn)流程分為3步长搀,
第一步利用GENIE3構(gòu)建轉(zhuǎn)錄因子與基因的調(diào)控網(wǎng)絡(luò)宇弛,
第二步利用RcisTarget驗(yàn)證轉(zhuǎn)錄因子與基因的調(diào)控網(wǎng)絡(luò)的真實(shí)性;
第三步計(jì)算AUC曲線篩選調(diào)控網(wǎng)絡(luò)源请。
pyscenic_from_loom.sh文件代碼如下:
#default value
input_loom=out.loom
n_workers=20
#help function
function usage() {
echo -e "OPTIONS:\n-i|--input_loom:\t input loom file"
echo -e "-n|--n_workers:\t working core number"
echo -e "-h|--help:\t Usage information"
exit 1
}
#get value
while getopts :i:n:h opt
do
case "$opt" in
i) input_loom="$OPTARG" ;;
n) n_workers="$OPTARG" ;;
h) usage ;;
:) echo "This option -$OPTARG requires an argument."
exit 1 ;;
?) echo "-$OPTARG is not an option"
exit 2 ;;
esac
done
#需要更改路徑
tfs=hs_hgnc_tfs.txt
feather=hg19-tss-centered-10kb-7species.mc9nr.feather
tbl=motifs-v9-nr.hgnc-m0.001-o0.0.tbl
pyscenic=/app/bin/pyscenic
# grn
$pyscenic grn \
--num_workers $n_workers \
--output grn.tsv \
--method grnboost2 \
$input_loom $tfs
# cistarget
$pyscenic ctx \
grn.tsv $feather \
--annotations_fname $tbl \
--expression_mtx_fname $input_loom \
--mode "dask_multiprocessing" \
--output ctx.csv \
--num_workers $n_workers \
--mask_dropouts
# AUCell
$pyscenic aucell \
$input_loom \
ctx.csv \
--output aucell.loom \
--num_workers $n_workers
使用方法:
-i枪芒,輸入的loom文件,例如第二步生成的out.loom
-n谁尸,運(yùn)行線程數(shù)舅踪,設(shè)置越大越快,根據(jù)實(shí)際情況設(shè)置
sh pyscenic_from_loom.sh -i out.loom -n 10
2.3 計(jì)算 RSS
此步驟的作用是通過計(jì)算RSS值找到細(xì)胞類型的特異TF良蛮。
calcRSS_by_scenic.R文件代碼如下:
library(optparse)
op_list <- list(
make_option(c("-l", "--input_loom"), type = "character", default = NULL, action = "store", help = "The input of aucell loom file",metavar="rds"),
make_option(c("-m", "--input_meta"), type = "character", default = NULL, action = "store", help = "The metadata of Seurat object",metavar="idents"),
make_option(c("-c", "--celltype"), type = "character", default = NULL, action = "store", help = "The colname of metadata to calculate RSS",metavar="lab
el")
)
parser <- OptionParser(option_list = op_list)
opt = parse_args(parser)
library(Seurat)
library(SCopeLoomR)
library(AUCell)
library(SCENIC)
library(dplyr)
library(KernSmooth)
library(RColorBrewer)
library(plotly)
library(BiocParallel)
loom <- open_loom(opt$input_loom)
regulons_incidMat <- get_regulons(loom, column.attr.name="Regulons")
regulons <- regulonsToGeneLists(regulons_incidMat)
regulonAUC <- get_regulons_AUC(loom,column.attr.name='RegulonsAUC')
regulonAucThresholds <- get_regulon_thresholds(loom)
close_loom(loom)
meta <- read.table(opt$input_meta,sep='\t',header=T,stringsAsFactor=F)
cellinfo <- meta[,c(opt$celltype,"nFeature_RNA","nCount_RNA")]
colnames(cellinfo)=c('celltype', 'nGene' ,'nUMI')
cellTypes <- as.data.frame(subset(cellinfo,select = 'celltype'))
selectedResolution <- "celltype"
sub_regulonAUC <- regulonAUC
rss <- calcRSS(AUC=getAUC(sub_regulonAUC),
cellAnnotation=cellTypes[colnames(sub_regulonAUC),
selectedResolution])
rss=na.omit(rss)
try({
rssPlot <- plotRSS(rss)
save(regulonAUC,rssPlot,regulons,file='regulon_RSS.Rdata')
})
saveRDS(rss,paste0(celltype,"_rss.rds"))
使用示例:
-i抽碌,第三步得到aucell.loom文件
-m,第一步得到的metadata_subset.xls文件
-c决瞳,計(jì)算RSS的分組列
Rscript calcRSS_by_scenic.R -l aucell.loom -m metadata_subset.xls -c groups
運(yùn)行后生成regulon_RSS.Rdata和groups_rss.rds文件
export HDF5_USE_FILE_LOCKING=FALSE
在終端輸入[1]:
export HDF5_USE_FILE_LOCKING=FALSE
若想總是生效货徙,將上面這條加入環(huán)境變量文件 ~/.bashrc 中,即可皮胡。
Ref:
https://github.com/aertslab/pySCENIC
Tutorial — pySCENIC latest documentation
https://zhuanlan.zhihu.com/p/434003188
http://www.reibang.com/p/d6feefe70513/
SCENIC | 從單細(xì)胞數(shù)據(jù)推斷基因調(diào)控網(wǎng)絡(luò)和細(xì)胞類型_生信寶典的博客-CSDN博客
SCENIC: 單細(xì)胞RNA-seq數(shù)據(jù)推斷基因調(diào)控網(wǎng)絡(luò)和細(xì)胞功能聚類 - 簡(jiǎn)書 (jianshu.com)
http://www.reibang.com/p/c47332b880aa?v=1671031123892
[scRNA-seq]單細(xì)胞轉(zhuǎn)錄因子分析——SCENIC實(shí)操示例scenic分析小L的生信筆記的博客-CSDN博客
單細(xì)胞轉(zhuǎn)錄因子分析之SCENIC流程 - 知乎 (zhihu.com)
單細(xì)胞SCENIC分析原理和流程介紹 - 簡(jiǎn)書 (jianshu.com)
SCENIC單細(xì)胞轉(zhuǎn)錄因子調(diào)控網(wǎng)絡(luò)分析_基因cell信息 (sohu.com)
單細(xì)胞SCENIC分析——尋找驅(qū)動(dòng)基因 - 騰訊云開發(fā)者社區(qū)-騰訊云 (tencent.com)
Seurat_Satija - 簡(jiǎn)書 (jianshu.io)
https://blog.csdn.net/weixin_40594350/article/details/125493430
http://www.reibang.com/p/bd0df23fbd60