本插图将演示一个完整的单细胞谱系分析工作流程,特别强调谱系重建和伪时间推断的过程。我们将利用弹弓
于(Street et al. 2017)并展示它如何在广泛的环境中应用。
的目标弹弓
就是利用细胞簇来揭示整体结构,并将这种结构转换成由一维变量表示的平滑谱系,称为“伪时间”。我们提供了以无监督或半监督方式学习聚类关系的工具,并构建代表每个谱系的平滑曲线,以及每个步骤的可视化方法。
最小的输入弹弓
表示降维空间中的单元格的矩阵和簇标签的向量。有了这两个输入,我们:
getLineages
函数。getCurves
函数。在这个小插图中,我们将使用两个模拟数据集。第一个数据集(称为“单轨迹”数据集)生成于下面,旨在表示一个单一谱系,其中三分之一的基因与过渡相关。该数据集将包含在SingleCellExperiment
对象(Lun and Risso 2017)并将用于演示一个完整的“从开始到结束”工作流。
#生成合成计数数据代表一个血统意味着< - rbind (# non-DE基因矩阵(代表(代表(c(0.1, 0.5, 1、2、3),每个= 300),100),ncol = 300, byrow = TRUE), #早期失活矩阵(代表(exp(每股(((300:1)-200)/ 50)),50),ncol = 300, byrow = TRUE), #晚期失活矩阵(代表(exp(每股(((300:1)-100)/ 50)),50),ncol = 300, byrow = TRUE), #早期激活矩阵(代表(exp(每股(((施用)-100)/ 50)),50),ncol = 300, byrow = TRUE),#延迟激活矩阵(rep(exp(atan((1:300)-200)/50),50), ncol = 300, byrow = TRUE), #瞬态矩阵(rep(exp(atan(c((1:100)/33, rep(3100), (100:1)/33)),50), ncol = 300, byrow = TRUE)) counts <- apply(means,2,function(cell_means){total <- rnbinom(1, mu = 7500, size = 4) r多项(1,total, cell_means)}) rownames(counts) <- paste0('G', 1:50 50) colnames(counts) <- paste0('c',1:300) sce <- singlecel实验(assays = List(counts = counts))
第二个数据集(“分岔”数据集)包括一个坐标矩阵(就像通过PCA、ICA、扩散映射等获得的一样)以及由\ (k \)——集群。这个数据集代表了一个分叉的轨迹,它将允许我们演示一些额外的功能弹弓
。
library(slingshot, quiet = FALSE) data("slingshotExample") rd <- slingshotExample$rd cl <- slingshotExample$cl dim(rd) #表示降维空间中的单元格的数据
## [1] 140 2
长度(cl) #簇标签向量
140
要开始分析单一谱系数据集,我们需要降低数据的维数,过滤掉无信息的基因是典型的第一步。这将大大提高下游分析的速度,同时将信息损失降至最低。
对于基因过滤步骤,我们保留了在至少足够多的细胞中稳健表达的任何基因,以构成一个集群,使它们成为潜在的有趣的细胞类型标记基因。我们将这个最小簇大小设置为10个细胞,并将一个基因定义为“稳健表达”,如果它具有至少3个reads的模拟计数。
#过滤基因到潜在的细胞类型标记#至少M(15)读取至少N(15)个细胞geneFilter <- apply(assays(sce)$counts,1,function(x){sum(x >= 3) >= 10}) sce <- sce[geneFilter,]
在大多数RNA-Seq分析管道中另一个重要的早期步骤是标准化方法的选择。这使我们能够从数据中去除不需要的技术或生物伪影,如批处理、测序深度、细胞周期效应等。在实践中,比较各种归一化技术并按照不同的评估标准进行比较是有价值的,为此我们推荐司康饼
包(Cole and Risso 2018)。我们还注意到,这些步骤的顺序可能会根据方法的选择而改变。ZINB-WaVE(Risso et al. 2018)在考虑技术变量和MNN的同时进行维数降低(Haghverdi et al. 2018)修正了降维后的批量效果。
由于我们使用的是模拟数据,所以不需要担心批量效应或其他潜在的混杂因素。因此,我们将继续进行完全分位数归一化,这是一种完善的方法,它迫使每个细胞具有相同的表达值分布。
FQnorm <- function(counts){rk <- apply(counts,2,rank,ties.method='min')计数。年代或t <- apply(counts,2,sort) refdist <- apply(counts.sort,1,median) norm <- apply(rk,2,function(r){ refdist[r] }) rownames(norm) <- rownames(counts) return(norm) } assays(sce)$norm <- FQnorm(assays(sce)$counts)
的基本假设弹弓
转录相似的细胞会在某个降维空间中彼此靠近。由于我们使用欧几里得距离来构建谱系和测量伪时间,因此对数据进行低维表示非常重要。
有许多方法可用于此任务,我们将有意避免确定哪个是“最佳”方法的问题,因为这可能取决于数据类型、收集方法、上游计算选择和许多其他因素。我们将演示两种降维方法:主成分分析(PCA)和统一流形近似和投影(UMAP),通过uwot
包)。
在进行主成分分析时,我们不根据基因的方差对基因进行缩放,因为我们不相信所有的基因都具有相同的信息量。我们想要在稳定表达的,高度可变的基因中找到信号,而不是通过在基因中强制相同的方差来抑制这个信号。在绘图时,我们确保设置长宽比,以免扭曲感知的距离。
Pca <- prcomp(t(log1p(assays(sce)$norm)),量表。= FALSE) rd1 < - pca $ x[1:2]阴谋(rd1坳= rgb(0, 0, 0, 0。5)pch = 16, asp = 1)
库(uwot)
##加载所需的包:矩阵
## ##附件:《黑客帝国》
下面的对象从“package:S4Vectors”中屏蔽:## ## expand
rd2 <- uwot::umap(t(log1p(assays(sce)$norm)) colnames(rd2) <- c('UMAP1', 'UMAP2') plot(rd2, col = rgb(0,0,0,.5), pch=16, asp =1)
我们将把这两种降维都加到SingleCellExperiment
对象,但继续我们的分析集中在PCA结果。
reducedDims(sce) <- SimpleList(PCA = rd1, UMAP = rd2)
最终的输入弹弓
是单元格的群集标签向量。如果没有提供,弹弓
将数据视为单个簇并拟合标准主曲线。然而,我们建议即使在只有单一谱系的数据集中也要对细胞进行聚类,因为这样可以潜在地发现新的分支事件。
在此步骤中确定的集群将用于确定底层谱系的全局结构(即它们的数量,它们何时从另一个分支,以及这些分支事件的大致位置)。这与聚类单细胞数据的典型目标不同,后者是识别数据集中存在的所有生物学相关的细胞类型。例如,在确定全局谱系结构时,不需要区分未成熟和成熟神经元,因为两种细胞类型大概都属于谱系的同一段。
对于我们的分析,我们实现了两种聚类方法,它们同样假设低维空间中的欧几里得距离反映细胞之间的生物学差异:高斯混合建模和\ (k \)则。前者是在mclust
包(scucca et al. 2016)并具有基于贝叶斯信息准则(BIC)确定聚类数量的自动化方法。
library(mclust, quiet = TRUE)
##“mclust”软件包5.4.10版本##输入“citation(“mclust”)”用于在出版物中引用此R软件包。
## ##附加包:“mclust”
以下对象从“package:mgcv”中屏蔽:## ## mvn
cl1 <- Mclust(rd1)$classification colData(sce)$GMM <- cl1 library(RColorBrewer) plot(rd1, col = brewer.pal(9,"Set1")[cl1], pch=16, asp =1)
而\ (k \)-means没有类似的功能,我们已经在(Street et al. 2017)同时主曲线的鲁棒性很强\ (k \),所以我们选择a\ (k \)任意的4个。如果这个值太低,我们可能会错过一个真正的分支事件,如果它太高或有大量的小簇,我们可能会开始看到虚假的分支事件。
cl2 <- kmeans(rd1, centers = 4)$cluster colData(sce)$kmeans <- cl2 plot(rd1, col = brew .pal(9,"Set1")[cl2], pch=16, asp =1)
现在,我们已经有了运行所需的一切弹弓
在我们的模拟数据集上。这是一个两步过程,包括使用基于聚类的最小生成树(MST)识别全局谱系结构,并拟合同步主曲线来描述每个谱系。
命令可以分别运行这两个步骤getLineages
而且getCurves
函数,或者与包装器函数一起,弹弓
(推荐)。我们将使用包装器函数对单轨迹数据集进行分析,但稍后将在分叉数据集上演示各个函数的用法。
的弹弓
包装器函数在一次调用中执行轨迹推断的两个步骤。必要的输入是一个降维的坐标矩阵和一组聚类标签。这些可以是单独的对象,在单轨迹数据的情况下,可以是包含在SingleCellExperiment
对象。
运行弹弓
利用主成分分析产生的降维和高斯混合建模识别的聚类标签,我们将做以下工作:
sce <- slingshot(sce, clusterLabels = 'GMM', reducedDim = 'PCA')
如上所述,如果没有提供聚类结果,则假设所有细胞都是同一聚类的一部分,将构造一条曲线。如果没有提供降维,弹弓
将使用返回的列表的第一个元素reducedDims
。
输出为SingleCellExperiment
对象与弹弓
结果合并。所有的结果都存储在PseudotimeOrdering
对象中添加的colData
的原始对象,并可以访问colData (sce)美元弹弓
。此外,所有推断的伪时间变量(每个沿袭一个)都被添加到colData
,分别。提取全部弹弓
结果在单个对象中,我们可以使用作为。PseudotimeOrdering
或作为。SlingshotDataSet
函数,取决于我们想要的形式。PseudotimeOrdering
对象是的扩展SummarizedExperiment
对象,它们是灵活的容器,对大多数目的都很有用。SlingshotDataSet
对象主要用于可视化,因为包中包含了几种绘图方法。下面,我们用伪时间着色的点来可视化单轨迹数据的推断谱系。
总结(sce slingPseudotime_1美元)
最小第一曲,中位数,平均第三曲,最大值。## 0.000 8.631 21.121 21.414 34.363 43.185
library(grDevices) colors <- colorrampalalette(啤酒厂。pal(11,'Spectral')[-6])(100) plotcol <- colors[cut(sce$slingPseudotime_1, breaks=100)] plot(reducedDims(sce)$PCA, col= plotcol, pch=16, asp =1) lines(SlingshotDataSet(sce), lwd=2, col='black')
我们还可以看到基于簇的最小生成树最初是如何估计谱系结构的类型
论点。
plot(reducedDims(sce)$PCA, col = brewery .pal(9,'Set1')[sce$GMM], pch=16, asp =1) lines(SlingshotDataSet(sce), lwd=2, type = 'lineages', col = 'black')
在运行弹弓
在美国,我们经常对寻找在发育过程中改变表达的基因感兴趣。,我们将演示这种类型的分析tradeSeq
包(Van den Berge et al. 2020)。
对于每个基因,我们将使用负二项噪声分布拟合一个通用加性模型(GAM)来模拟基因表达和伪时间之间(潜在的非线性)关系。然后,我们将测试表达式和伪时间之间的显著关联associationTest
。
库(tradeSeq) #适合负二项式GAM sce <- fitGAM(sce) #测试动态表达式ATres <- associationTest(sce)
然后,我们可以根据p值挑选出最重要的基因,并用热图将它们在发育过程中的表达可视化。这里我们使用了前250个最动态表达的基因。
topgenes <- rownames(ATres[order(ATres$pvalue),])[1:250] pst。ord <- order(sce$slingPseudotime_1, na。last = NA)热数据<- assays(sce)$counts[topgenes, pst.]heatclus <- sce$GMM[pst.]奥德] heatmap(log1p(heatdata), Colv = NA, ColSideColors = brewer.pal(9,"Set1")[heatclus])
的一些附加功能,并提供进一步的细节弹弓
包中。我们将使用包含的slingshotExample
用于说明目的的数据集。此数据集旨在表示低维空间中的单元格,并附带一组由\ (k \)——集群。而不是构造一个完整的SingleCellExperiment
对象,它需要基因级数据,我们将直接使用坐标的低维矩阵,并提供簇标签作为附加参数。
的getLineages
函数以an作为输入n
\ \(\倍)p
矩阵和向量的聚类结果的长度n
。它使用最小生成树(MST)映射相邻集群之间的连接,并通过这些表示谱系的连接标识路径。这个函数的输出是aPseudotimeOrdering
包含输入以及推断的MST(由igraph
对象)和谱系(集群名称的有序向量)。
这种分析可以以完全无监督的方式进行,也可以通过指定已知的起始点和终点集群以半监督的方式进行。如果我们不指定起点,弹弓
基于简约性选择一个,在分裂之前最大化谱系之间共享的集群数量。如果没有分割或多个集群产生相同的简约分数,则任意选择起始集群。
在我们的模拟数据中,弹弓
选择集群1作为起始集群。然而,我们通常建议基于先验知识(样本收集时间或已建立的基因标记)来指定初始聚类。该规范对如何构造MST没有影响,但它将影响如何构造分支曲线。
lin1 <- getLineages(rd, cl, start. lin1)Clus = '1') lin1
##类:pseudotimeorders ## dim: 140 2 ##元数据(3):lineages mst slingParams ## pathStats(2):伪时间权重## cellnames(140): cell-1 cell-2…cell-139 cell-140 ## cellData names(2): reducedDim clusterLabels ## pathnames(2): Lineage1 Lineage2 ## pathData names(0):
plot(rd, col = brewery .pal(9,"Set1")[cl], asp = 1, pch = 16) lines(SlingshotDataSet(lin1), lwd = 3, col = 'black')
在这一步,弹弓
还允许指定已知端点。当MST构建时,指定为终端单元状态的集群将被限制为只有一个连接。,则为叶节点)。这个约束可能会影响树的其他部分的绘制方式,如在下一个示例中所示,我们将Cluster 3指定为端点。
lin2 <- getLineages(rd, cl, start. lin2)Clus = '1',结束。clus = '3') plot(rd, col = brewery .pal(9,"Set1")[cl], asp = 1, pch = 16) line (SlingshotDataSet(lin2), lwd = 3, col = 'black', show。约束= TRUE)
这种类型的监督对于确保结果与先前的生物学知识一致是有用的。具体来说,它可以防止已知的终端细胞命运被归类为短暂状态。
还有一些我们可以传递的附加参数getLineages
为了更好的控制:
dist.method
指定如何计算群集之间距离的字符。默认值为“弹弓”
,它使用聚类中心之间的距离,由它们的完整联合协方差矩阵归一化。在存在小簇的情况下(单元格少于数据的维数),这将自动切换到使用对角联合协方差矩阵。其他选项包括简单的
(欧氏),scaled.full
,scaled.diag
,的内容
(相互最近邻的距离)。ω
粒度参数,允许用户设置连接距离的上限。它表示每个真实的星团和人工星团之间的距离.OMEGA
集群,在装配MST后被移除。这对于识别不属于任何谱系的异常群集或分离不同的轨迹非常有用。这可能是一个数字参数或逻辑值。值为真正的
表示的启发式\ \ (1.5)(无监督MST的中值边长)
应该用,暗示最大允许距离会是多少3 \ \ ()乘以这个距离。构造MST后,getLineages
在树中标识要指定为谱系的路径。在此阶段,沿袭将由一组有序的集群名称组成,从根集群开始,以叶集群结束。的输出getLineages
是一个PseudotimeOrdering
它保存了所有的输入以及谱系的列表以及关于它们如何构造的一些附加信息。对象的输入getCurves
函数。
为了模拟沿着这些不同谱系的发展,我们将用函数构造平滑曲线getCurves
。使用基于所有单元格的平滑曲线消除了单元格投影到分段线性轨迹顶点的问题,并使弹弓
聚类结果对噪声有较强的鲁棒性。
为了建立平稳的血统,getCurves
遵循一个迭代过程,类似于主要曲线提出的(哈斯蒂和斯图茨尔1989)。当只有一个谱系时,所得到的曲线只是穿过数据中心的主曲线,只需要做一个调整:初始曲线是用簇中心之间的线性连接构造的,而不是数据的第一个主成分。这种调整增加了稳定性,通常会加速算法的收敛。
当有两个或多个血统时,我们在算法中添加一个额外的步骤:平均共享细胞附近的曲线。这两种谱系在尚未分化的细胞上应该相当一致,因此在每次迭代中,我们对这些细胞附近的曲线进行平均。这增加了算法的稳定性,并产生平滑的分支谱系。
crv1 <- getCurves(lin1) crv1 . txt
##类:pseudotimeorders ## dim: 140 2 ##元数据(4):lineages mst slingParams曲线## pathStats(2):伪时间权重## cellnames(140): cell-1 cell-2…cell-139 cell-140 ## cellData names(2): reducedDim clusterLabels ## pathnames(2): Lineage1 Lineage2 ## pathData names(0):
plot(rd, col = brewery .pal(9,"Set1")[cl], asp = 1, pch = 16) lines(SlingshotDataSet(crv1), lwd = 3, col = 'black')
的输出getCurves
是已更新的PseudotimeOrdering
现在它包含了同步的主曲线和关于它们如何拟合的附加信息。的slingPseudotime
函数提取每个谱系中每个单元格的伪时间值矩阵,使用NA
未分配给特定谱系的单元格的值。的slingCurveWeights
函数提取一个类似的权重矩阵,将每个单元格分配给一个或多个谱系。
对象可以访问曲线对象slingCurves
函数,该函数将返回principal_curve
对象。这些对象由以下插槽组成:
年代
:构成曲线的点的矩阵。这些对应于数据点的正交投影。奥德
:可用于将细胞沿曲线排列的指标,这些指标基于细胞的投影。λ
:沿曲线从开始到每个单元投影的弧长。方法返回这些值的矩阵slingPseudotime
函数。dist_ind
:数据点与其在曲线上的投影之间距离的平方。经销
:投影距离平方和。w
:沿此谱系的权重向量。明确归属于这一谱系的细胞的重量为1
,而分配给其他谱系的细胞的重量为0
。单元格的权重可以是1
(或非常接近1)对于多个血统,如果他们在分支事件之前被定位。方法返回这些值的矩阵slingCurveWeights
函数。对于大型数据集,我们强烈建议使用approx_points
参数与弹弓
(或getCurves
).这允许用户指定曲线的分辨率。唯一点的数目)。虽然MST构造是在集群上运行的,但随着数据集规模的增长,迭代地将所有点投影到一条或多条曲线上的过程可能会变得计算负担很大。出于这个原因,我们设置为的默认值approx_points
要么\ (150 \)或数据集中的单元格数,以较小者为准。这将大大降低探索性分析的计算成本,同时对所得到的轨迹影响最小。
对于最大程度的“密集”曲线,设置approx_points = FALSE
,并且曲线上的点将与数据集中的单元格数量相同。然而,请注意迭代曲线拟合过程中的每个投影步骤现在都有与之成比例的计算复杂度\ (n ^ 2 \)(\ (n \)是单元格的数量)。在分支谱系存在的情况下,这些密集的曲线也会影响曲线平均和收缩的复杂性。
我们推荐的值为\ (100 \)-\ (200 \)的默认值\ (150 \)。注意,在曲线上限制唯一点的数量是可行的不对唯一伪时间值的数量施加类似的限制,如下所示。即使有一个不切实际的低值\ (5 \)为approx_points
,我们仍然可以从伪时间值中看到一个全色梯度:
sce5 <- slingshot(sce, clusterLabels =' GMM', reducedDim =' PCA', approx_points = 5) colors <- colorRampPalette(啤酒器.pal(11,'Spectral')[-6])(100) plotcol <- colors[cut(sce5$slingPseudotime_1, breaks=100)] plot(reducedDim (sce5)$PCA, col= plotcol, pch=16, asp =1) lines(SlingshotDataSet(sce5), lwd=2, col='black')
在某些情况下,我们感兴趣的是识别多个不相交的轨迹。Slingshot在最初的MST构造中通过引入一个名为ω
。这个人工聚类与每个真实聚类之间有固定长度的间隔,这意味着任何两个真实聚类之间的最大距离是这个长度的两倍。实际上,这设置了MST中允许的最大边长的限制。设置= TRUE
将实现一个经验规则,其中最大允许的边长等于3 \ \ ()乘以没有人工聚类构造的MST的中位数边缘长度(注意:这相当于说的默认值omega_scale
是\ \ (1.5)).
rd2 <- rbind(rd, cbind(rd[,2]-12, rd[,1]-6)) cl2 <- c(cl, cl + 10) pp2 <- slingshot(rd2, cl2, omega = TRUE, start。clus = c(1,11)) plot(rd2, pch=16, asp =1, col= c(brew .pal(9,"Set1"), brew .pal(8,"Set2"))[cl2]) lines(SlingshotDataSet(ptp), type =' l', lwd=2, col='black')
安装MST后,弹弓
继续拟合同时主曲线,每条轨迹分别处理。
plot(rd2, pch=16, asp =1, col= c(brew .pal(9,“Set1”),brew .pal(8,“Set2”))[cl2]) lines(SlingshotDataSet(ptp), lwd=2, col='black')
sessionInfo ()
## R version 4.2.0 Patched (2022-06-02 r82447) ##平台:x86_64-pc-linux-gnu(64位)##运行在:Ubuntu 20.04.4 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.16-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.16-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_GB LC_COLLATE= c# # [5] LC_MONETARY=en_US。utf - 8 LC_MESSAGES = en_US。UTF-8 ## [7] LC_PAPER=en_US。UTF-8 LC_NAME= c# # [9] LC_ADDRESS=C lc_phone = c# # [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基本包:## [1]stats4 stats graphics grDevices utils datasets methods ##[8]基础## ##其他附加包:# # # # [1] mclust_5.4.10 uwot_0.1.11 [3] Matrix_1.4-1 mgcv_1.8-40 # # [5] nlme_3.1 - 158 RColorBrewer_1.1-3 # # [7] slingshot_2.5.2 TrajectoryUtils_1.5.0 # # [9] princurve_2.1.6 SingleCellExperiment_1.19.0 # # [11] SummarizedExperiment_1.27.1 Biobase_2.57.1 # # [13] GenomicRanges_1.49.0 GenomeInfoDb_1.33.3 # # [15] IRanges_2.31.0 S4Vectors_0.35.1 # # [17] BiocGenerics_0.43.0 MatrixGenerics_1.9.0 # # [19] matrixStats_0.62.0 BiocStyle_2.25.0 # # # #通过加载一个名称空间(而不是附加):## [11] zlibbioc_1.43.0 codetools_0.2-18 ## [13] evaluate_0.15 knitr_1.39 ## [15] fastmap_1.1.0 highr_0.9 ## [17] Rcpp_1.0.8.3 BiocManager_1.30.18 ## [19] DelayedArray_0.23.0 magick_2.7.3 ## [21] jsonlite_1.8.0 XVector_0.37.0 ## [23] RSpectra_0.16-1 FNN_1.1.3.1 ## [25] digest_0.6.29 stringi_1.7.6 ## [27] bookdown_0.27[37] sparseMatrixStats_1.9.0 rmarkdown_2.14 ## [39] R6_2.5.1 igraph_1.3.2 ## [41] compiler_4.2.0 ## [41] sass_0.4.1 RCurl_1.98-1.7 ## [33] pkgconfig_2.0.3 DelayedMatrixStats_1.19.0 ##[41]编译er_4.2.0
科尔、迈克尔和戴维·里索,2018年。Scone:规范化表达式数据的单单元概述。
哈格威尔第,拉莉,亚伦·t·l·伦,迈克尔·d·摩根,约翰·c·马里奥尼,2018。“单细胞rna测序数据中的批量效应可以通过匹配相互最近邻来纠正。”生物科技Nat。》。36(5): 421-27。https://doi.org/10.1038/nbt.4091。
特雷弗·哈斯蒂和沃纳·斯图茨尔,1989年。“主曲线。”美国统计协会杂志84(406): 502-16。
伦、亚伦和大卫·里索,2017年。singlecelexperiment: S4类单cell数据。
Risso, Davide, Fanny Perraudeau, Svetlana Gribkova, Sandrine Dudoit和Jean-Philippe Vert。2018。“从单细胞RNA-Seq数据中提取信号的通用而灵活的方法。”自然通讯9: 284。https://doi.org/10.1038/s41467-017-02554-5。
scucca, Luca, Michael Fop, Thomas Brendan Murphy, Adrian E. Raftery, 2016。mclust 5:使用高斯有限混合模型的聚类、分类和密度估计。R期刊8(1): 205-33。
斯特里特,凯利,达维德·里索,拉塞尔·B·弗莱彻,迪亚·达斯,约翰·恩盖,尼尔·优素福,伊丽莎白·珀多姆和桑德琳·杜多特。2017。弹弓:单细胞转录组学的细胞谱系和伪时间推断bioRxiv。https://doi.org/10.1101/128843。
Van den Berge, Koen, Hector Roux de Bézieux, Kelly Street, Wouter Saelens, Robrecht Cannoodt, Yvan Saeys, Sandrine Dudoit, Lieven Clement. 2020。“基于轨迹的单细胞测序数据差异表达分析”自然通讯11(1): 1201。https://doi.org/10.1038/s41467-020-14766-3。