Jeason
1583字约5分钟
2024-04-16
这是一个经典的单细胞分析流程,主要分为以下几个步骤:
在正式分析之前,关于实验问题的探讨是很有必要的,最重要的一个就是技术的选择:
每种方法都有优劣(Mereu et al. 2019; Ziegenhain et al. 2017),目前以10X为代表的droplet-based方法由于高通量和低细胞成本成为了约定俗成的技术;Plate-based方法可以捕获其他的一些表型信息(如细胞形态),另外可以根据实验目的进行调整,灵活性比较好;Read-based方法可以覆盖全转录本,在分析可变剪切、外显子突变等方面很有用;UMI-based方法可以减轻PCR扩增偏差。
下一个问题就是:到底要捕获多少细胞?测序要测多深?
答案很清晰: As much as you can afford to spend.
再补充一下这个答案就是:想要发现罕见细胞类群,就要多获得细胞;想要探索潜在的微小差异,就要加大测序深度。目前常用的droplet-based仪器可以捕获1万到10万细胞,测序深度是每个细胞1000到10000 UMIs,在经济条件一定的前提下,它们之间一般是成反比。另外它还要权衡高细胞捕获通量和影响捕获效率的“双细胞比例”。
实验设计和常规转录组类似,也是要考虑一个实验条件下多个生物重复,而且实验条件最好不要混杂批次。需要注意的是:生物重复不是指的单个细胞,而是指的提供细胞的供体(donors)或者细胞培养体系(cultures)
和常规转录组一样,单细胞转录组也是需要得到表达矩阵,才能进行下游分析。表达矩阵包含的信息就是:每个细胞中比对到每个基因的UMIs或者reads数。有一点需要注意:它的定量方法和具体的实验技术相关
CellRanger
软件,基于STAR比对到参考基因组,然后统计每个基因的UMIs数量alevin
):不需要比对参考基因组,节省时间、内存scPipe
包:提供了一套综合的分析流程,利用 Rsubread
比对,然后统计每个基因的UMIs数量scruff
包可以专门分析multiplexed:翻译叫做”多路复用“,即:large numbers of libraries to be pooled and sequenced simultaneously during a single run,可以节省成本和时间
定量结束后,一般是先导入表达矩阵然后创建一个 SingleCellExperiment
对象(例如:read.table() + SingleCellExperiment()
)。除此以外,还有一些特定的文件格式需要用特定的包,比如DropletUtils可以分析10X数据,tximport/tximeta
可以分析pseudo-alignment数据
需要注意的点:
colData
中^ERCC
在行名中进行正则匹配,但是这时要小心,因为ERCC基因家族在人类基因组注释中确实存在,很有可能将真的基因作为外源转录本进行分析。这个问题可以通过将表达矩阵的行名设置为Ensembl,或Entrez来解决用 scRNAseq
包的droplet-based的视网膜数据【Macosko et al. (2015)】进行演示。
library(scRNAseq)
sce <- MacoskoRetinaData()
# Quality control.
library(scater)
is.mito <- grepl("^MT-", rownames(sce))
qcstats <- perCellQCMetrics(sce, subsets=list(Mito=is.mito))
filtered <- quickPerCellQC(qcstats, percent_subsets="subsets_Mito_percent")
sce <- sce[, !filtered$discard]
# Normalization.
sce <- logNormCounts(sce)
# Feature selection.
library(scran)
dec <- modelGeneVar(sce)
hvg <- getTopHVGs(dec, prop=0.1)
# Dimensionality reduction.
set.seed(1234)
sce <- runPCA(sce, ncomponents=25, subset_row=hvg)
sce <- runUMAP(sce, dimred = 'PCA', external_neighbors=TRUE)
# Clustering.
g <- buildSNNGraph(sce, use.dimred = 'PCA')
colLabels(sce) <- factor(igraph::cluster_louvain(g)$membership)
# Visualization.
plotUMAP(sce, colour_by="label")