内容

1简介

本小插图将演示完整的单细胞谱系分析工作流程,特别强调谱系重建和伪时间推断的过程。我们将利用弹弓(Street et al. 2017)并展示如何在广泛的设置中应用它。

的目标弹弓就是用细胞群来揭示整体结构并将这种结构转化为平滑的谱系由一维变量表示,称为"伪时间"我们提供了以无监督或半监督的方式学习集群关系的工具,并构建了表示每个谱系的平滑曲线,以及每个步骤的可视化方法。

1.1概述

最小的投入弹弓是表示降维空间中的单元格的矩阵和集群标签的向量。有了这两个输入,我们可以:

  • 通过在集群上构建最小生成树(MST)来识别全局谱系结构getLineages函数。
  • 通过拟合同时发生的主曲线来构造平滑谱系和推断伪时间变量getCurves函数。
  • 使用内置的可视化工具评估每个步骤的输出。

1.2数据集

在这个小插图中,我们将使用两个模拟数据集。第一个(称为“单轨迹”数据集)是在下面生成的,它被设计为代表一个单一谱系,其中三分之一的基因与过渡相关。该数据集将包含在SingleCellExperiment对象(Lun和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),# late activation matrix(rep(exp(atan((1:300)-200)/50), ncol = 300, byrow = TRUE), # transient matrix(rep(exp(atan(c((1:100)/33, rep(3,100), (100:1)/33)),50), ncol = 300, byrow = TRUE)) counts <- apply(means,2,function(cell_means){total <- rnbinom(1, mu = 7500, size = 4) r多om(1, total, cell_means)}) rownames(counts) <- paste0('G', 1:50 0) colnames(counts) <- paste0('c',1:300) sce <- singlecellexperexperiment (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) #集群标签的向量
## [1] 140

2上游分析

2.1基因的筛选

要开始分析单一谱系数据集,我们需要降低数据的维数,并过滤掉无信息的基因是典型的第一步。这将大大提高下游分析的速度,同时将信息损失保持在最低限度。

在基因筛选步骤中,我们保留了任何在至少足够多的细胞中表达的基因,以组成一个集群,使它们成为潜在的有趣的细胞类型标记基因。我们将这个最小簇大小设置为10个细胞,并定义一个基因为“稳健表达”,如果它有至少3个读取的模拟计数。

#过滤基因到潜在的细胞类型标记#至少M (15) reads在至少N(15)个细胞中geneFilter <- apply(assays(sce)$counts,1,function(x){sum(x >= 3) >= 10}) sce <- sce[geneFilter,]

2.2归一化

在大多数RNA-Seq分析管道中,另一个重要的早期步骤是选择归一化方法。这使我们可以从数据中去除不必要的技术或生物影响,如批次、测序深度、细胞周期效应等。在实践中,比较各种标准化技术并根据不同的评价标准比较它们是有价值的,为此我们推荐司康饼(科尔和里索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)

2.3降维

的基本假设弹弓转录相似的细胞在某些降维空间中会彼此靠近。由于我们在构建谱系和测量伪时间时使用欧氏距离,因此数据的低维表示非常重要。

对于这个任务有许多可用的方法,我们将有意避免确定哪一种方法是“最佳”的问题,因为这可能取决于数据类型、收集方法、上游计算选择和许多其他因素。我们将演示两种降维方法:主成分分析(PCA)和统一流形近似和投影(UMAP),通过uwot包)。

在执行PCA时,我们不根据基因的方差来缩放基因,因为我们不相信所有的基因都具有相同的信息量。我们想要在表达稳健的,高度可变的基因中找到信号,而不是通过在基因之间施加相等的方差来抑制这个信号。在绘图时,我们确保设置了纵横比,这样就不会扭曲感知到的距离。

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)

2.4聚类细胞

最后的输入弹弓是单元格的群集标签向量。如果没有提供,弹弓将数据作为单一的聚类,拟合一个标准的主曲线。然而,我们建议即使在只期望单一谱系的数据集中也要对细胞进行聚类,因为这样可以潜在地发现新的分支事件。

在此步骤中确定的集群将用于确定底层谱系的全局结构(即它们的数量、它们何时相互分支,以及这些分支事件的大致位置)。这与聚类单细胞数据的典型目标不同,后者是识别数据集中存在的所有生物相关细胞类型。例如,当确定全局谱系结构时,不需要区分未成熟和成熟神经元,因为这两种细胞类型可能属于谱系的同一段。

在我们的分析中,我们实现了两种聚类方法,它们同样假设低维空间中的欧氏距离反映细胞之间的生物差异:高斯混合建模和\ (k \)则。前者是在mclust(Scrucca et al. 2016)并以一种基于贝叶斯信息准则(BIC)的自动确定聚类数量的方法为特色。

library(mclust, quiet = TRUE)
##输入'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 \)是任意的。如果这个值太低,我们可能会错过一个真正的分支事件;如果这个值太高或有大量的小簇,我们可能会开始看到虚假的分支事件。

cl2 <- kmeans(rd1, centers = 4)$cluster colData(sce)$kmeans <- cl2 plot(rd1, col = beer .pal(9,"Set1")[cl2], pch=16, asp =1)

3.使用弹弓

现在,我们有了运行所需的一切弹弓在我们的模拟数据集中。这是一个两步过程,包括使用基于聚类的最小生成树(MST)识别全局谱系结构和拟合同步的主曲线来描述每个谱系。

可以分别运行这两个步骤getLineages而且getCurves函数,或者与包装器函数一起,弹弓(推荐)。我们将使用包装器函数来分析单一轨迹数据集,但稍后将在分叉数据集上演示单个函数的用法。

弹弓包装器函数在一次调用中执行轨迹推断的两个步骤。必要的输入是一个降维矩阵的坐标和一组聚类标签。这些可以是单独的对象,如果是单轨迹数据,则可以是包含在SingleCellExperiment对象。

运行弹弓利用PCA产生的降维和高斯混合模型识别的聚类标签,我们将做以下工作:

sce <- slingshot(sce, clusterLabels = 'GMM', reducedDim = 'PCA')

如前所述,如果没有提供聚类结果,则假定所有单元格都属于同一聚类,将构建一条曲线。如果没有提供降维,弹弓将使用?返回的列表的第一个元素reducedDims

输出是SingleCellExperiment对象与弹弓结果合并。所有的结果都存储在一个PseudotimeOrdering对象,该对象被添加到colData的原始对象,并可以通过colData (sce)美元弹弓.此外,将所有推断的伪时间变量(每个沿袭一个)添加到colData,分别。提取所有弹弓的结果,我们可以使用作为。PseudotimeOrdering作为。SlingshotDataSet函数,这取决于我们想要它的形式。PseudotimeOrdering对象是的扩展SummarizedExperiment对象,它们是用于大多数用途的灵活容器。SlingshotDataSet对象主要用于可视化,因为包中包含了几个绘图方法。下面,我们用伪时间着色的点可视化了单轨迹数据的推断沿袭。

总结(sce slingPseudotime_1美元)
##最小1曲,中值平均3曲,最大值。## 0.000 8.631 21.121 21.414 34.363 43.185
library(grDevices) colors <- colorrampalette (beer .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')

4下游分析

4.1识别时间动态基因

在运行弹弓在美国,我们经常对寻找在发育过程中改变其表达的基因感兴趣。,我们将演示这种类型的分析tradeSeq(Van den Berge等,2020年)

对于每个基因,我们将拟合一个通用的加性模型(GAM),使用负二项噪声分布来模拟基因表达和伪时间之间(潜在的非线性)的关系。然后,我们将测试表达式和伪时间之间的显著关联associationTest

库(tradeSeq) # fit负二项式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) heatdata <- assays(sce)$counts[topgenes, pst。heatclus <- sce$GMM[pst;奥德] heatmap(log1p(heatdata), Colv = NA, ColSideColors = brewer.pal(9,"Set1")[heatclus])

5详细的弹弓功能

在这里,我们将提供进一步的详细信息并着重介绍弹弓包中。我们将使用包含的slingshotExample用于说明目的的数据集。该数据集设计用于表示低维空间中的细胞,并附带由生成的一组集群标签\ (k \)——集群。而不是建构一个完整的SingleCellExperiment对象,它需要基因级数据,我们将直接使用坐标的低维矩阵,并提供集群标签作为附加参数。

5.1识别全球谱系结构

getLineages函数以an作为输入n\ \(\倍)p矩阵和向量的聚类结果的长度n.它使用最小生成树(MST)映射相邻集群之间的连接,并通过这些连接标识代表谱系的路径。这个函数的输出是aPseudotimeOrdering包含输入和推断的MST(由igraph对象)和谱系(集群名称的有序向量)。

通过指定已知的初始和终端点簇,可以以完全无监督的方式或半监督的方式执行此分析。如果我们不指定起点,弹弓根据简约性选择一个,在拆分前最大化谱系之间共享的集群数量。如果没有拆分或多个集群产生相同的简约性评分,则任意选择起始集群。

在我们的模拟数据中,弹弓选择集群1作为起始集群。然而,我们通常建议基于先验知识(样本收集时间或已建立的基因标记)来指定初始聚类。该规范对如何构造MST没有影响,但会影响如何构造分支曲线。

lin1 <- getLineages(rd, cl, start. lin1)Clus = '1') lin1
## class: pseudotimeordered ## dim: 140 2 ## metadata(3): lineages mst slingParams ## pathStats(2): pseudotime weights ## 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 = brewer.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 = brewer.pal(9,"Set1")[cl], asp = 1, pch = 16) lines(SlingshotDataSet(lin2), lwd = 3, col = 'black',显示。constraints = TRUE)

这种类型的监督对于确保结果与先前的生物学知识一致是有用的。具体来说,它可以防止已知的终端细胞命运被归类为暂时状态。

还有一些我们可以传递的附加参数getLineages为了更好的控制:

  • dist.method指定应如何计算群集之间的距离的字符。默认值为“弹弓”,它使用聚类中心之间的距离,由它们的完整的联合协方差矩阵归一化。在存在小簇(单元格少于数据的维度)的情况下,这将自动切换到使用对角关节协方差矩阵。其他选项包括简单的(欧氏),scaled.fullscaled.diag,的内容(彼此最近邻的距离)。
  • ω粒度参数,允许用户设置连接距离的上限。它表示每个真实集群和人工集群之间的距离.OMEGA集群,在安装MST后移除。这对于识别不属于任何谱系的异常群或分离不同的轨迹非常有用。这可能是一个数字参数或一个逻辑值。的值真正的的启发式\ \ (1.5)(无监督MST的中位边长)应该用,暗示最大允许的距离会是多少3 \ \ ()乘以这个距离。

构建MST后,getLineages在树中标识要指定为谱系的路径。在这个阶段,沿袭将由一组有序的集群名称组成,从根集群开始,以叶集群结束。的输出getLineages是一个PseudotimeOrdering它包含所有的输入以及一个谱系列表和一些关于它们是如何构造的附加信息。对象的输入getCurves函数。

5.2构建平滑曲线和排序单元格

为了沿着这些不同的谱系建模发展,我们将用函数构造光滑的曲线getCurves.使用基于所有单元格的平滑曲线消除了单元格投影到分段线性轨迹顶点上的问题弹弓聚类结果对噪声具有较强的鲁棒性。

为了建立流畅的血统,getCurves采用的迭代过程类似于中所示的主曲线(hasttie and Stuetzle 1989).当只有一个分支时,得到的曲线只是通过数据中心的主曲线,只需要进行一个调整:初始曲线是用簇中心之间的线性连接构造的,而不是数据的第一个主成分。这种调整增加了稳定性,通常加速了算法的收敛。

当有两个或两个以上的谱系时,我们在算法中增加了一个额外的步骤:平均共享细胞附近的曲线。这两个谱系在尚未分化的细胞上应该相当一致,所以在每次迭代中,我们对这些细胞附近的曲线取平均值。这增加了算法的稳定性,并产生平滑的分支谱系。

crv1 <- getCurves(lin1) crv1
## class: pseudotimeordered ## dim: 140 2 ## metadata(4): lineages mst slingParams curves ## pathStats(2): pseudotime weights ## 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函数。

5.3在大型数据集上运行Slingshot

对于大型数据集,我们强烈建议使用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(breer .pal(11,'Spectral')[-6])(100) plotcol <- colors[cut(sce5$slingPseudotime_1, breaks=100)] plot(reducedDims(sce5)$PCA, col= plotcol, pch=16, asp =1) lines(SlingshotDataSet(sce5), lwd=2, col='black')

5.4多个轨迹

在某些情况下,我们感兴趣的是识别多个不相交的轨迹。在最初的MST构造中,Slingshot通过引入一个名为ω.这个人工聚类与每个真实聚类之间用固定的长度隔开,这意味着任何两个真实聚类之间的最大距离是这个长度的两倍。实际上,这设置了MST中允许的最大边长限制。设置= TRUE将实现一个经验规则,其中最大允许的边长等于3 \ \ ()乘以没有人工聚类构造的MST的中位边缘长度(注意:这相当于说omega_scale\ \ (1.5)).

rd2 <- rbind(rd, cbind(rd[,2]-12, rd[,1]-6)) cl2 <- c(cl, cl + 10) p2 <- slingshot(rd2, cl2, omega = TRUE, start.)clus = c(1,11)) plot(rd2, pch=16, asp =1, col= c(brewery .pal(9,"Set1"), brewery .pal(8,"Set2"))[cl2]) lines(SlingshotDataSet(p2), type =' l', lwd=2, col='black')

安装MST后,弹弓继续像往常一样拟合同步的主曲线,每个轨迹分别处理。

plot(rd2, pch=16, asp =1, col= c(brewery .pal(9,"Set1"), brewery .pal(8,"Set2"))[cl2]) lines(SlingshotDataSet(p2), lwd=2, col='black')

6会话信息

sessionInfo ()
## R版本4.2.0 RC (22-04-19 r82224) ##平台:x86_64-pc-linux-gnu(64位)##运行在:Ubuntu 20.04.4 LTS ## ##矩阵产品:default ## BLAS: /home/biocbuild/bbs-3.15-bio /R/lib/libRblas. ##因此## LAPACK: /home/biocbuild/bbs-3.15-bio /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_TELEPHONE= c# [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基本包:## [1]stats4 stats graphics grDevices utils datasets methods ## [8] base ## ##其他附加的包:# # # # [1] mclust_5.4.9 uwot_0.1.11 [3] Matrix_1.4-1 mgcv_1.8-40 # # [5] nlme_3.1 - 157 RColorBrewer_1.1-3 # # [7] slingshot_2.4.0 TrajectoryUtils_1.4.0 # # [9] princurve_2.1.6 SingleCellExperiment_1.18.0 # # [11] SummarizedExperiment_1.26.0 Biobase_2.56.0 # # [13] GenomicRanges_1.48.0 GenomeInfoDb_1.32.0 # # [15] IRanges_2.30.0 S4Vectors_0.34.0 # # [17] BiocGenerics_0.42.0 MatrixGenerics_1.8.0 # # [19] matrixStats_0.62.0 BiocStyle_2.24.0 # # # #通过加载一个名称空间(而不是附加):# [1] xfun_0.30 bslib_0.3.1 ## [3] splines_4.2.0 lattice_0.20-45 ## [5] htmltools_0.5.2 yaml_2.3.5 ## [9] GenomeInfoDbData_1.2.8 stringr_1.4.0 ## [11] zlibbioc_1.42.0 codetools_0.2-18 ## [13] evaluate_0.15 knitr_1.38 ## [15] fastmap_1.1.0 highr_0.9 ## [17] Rcpp_1.0.8.3 BiocManager_1.30.17 ## [13] DelayedArray_0.22.0 magick_2.7.3 ## [21] jsonlite_1.8.0 XVector_0.36.0 ## [23] RSpectra_0.16-1 FNN_1.1.3 ## [25] digest_0.6.29 stringi_1.7.6 ## [27] bookdown_0.26# [29] bitops_1.0-7 magrittr_2.0.3 ## [33] sass_0.4.1 RCurl_1.98-1.6 ## [35] pkgconfig_2.0.3 DelayedMatrixStats_1.18.0 ## [37] sparseMatrixStats_1.8.0 rmarkdown_2.14 ## [39] R6_2.5.1 igraph_1.3.1 ## [41] compiler_4.2.0

参考文献

科尔、迈克尔和达维德·里索,2018年。Scone:规范化表达式数据的单细胞概述

哈格威尔第,Laleh, Aaron T. L. Lun, Michael D. Morgan和John C. Marioni. 2018。“单细胞rna测序数据中的批处理效应是通过匹配彼此最近邻来纠正的。”生物科技Nat。》。36(5): 421-27。https://doi.org/10.1038/nbt.4091

海斯蒂,特雷弗和沃纳·斯图茨勒,1989年。“主曲线。”美国统计协会杂志84(406): 502-16。

伦、亚伦和达维德·里索。2017。singlecel实验:单细胞数据的S4类

Risso, Davide, Fanny Perraudeau, Svetlana Gribkova, Sandrine Dudoit和Jean-Philippe Vert. 2018。从单细胞rna序列数据中提取信号的一种通用而灵活的方法。自然通讯9: 284。https://doi.org/10.1038/s41467-017-02554-5

斯克鲁卡,卢卡,迈克尔·弗普,托马斯·布伦丹·墨菲,阿德里安·e·拉斐尔,2016。mclust 5:使用高斯有限混合模型的聚类、分类和密度估计。R杂志8(1): 205-33。

Kelly Street, Davide Risso, Russell B Fletcher, Diya Das, John Ngai, Nir Yosef, Elizabeth Purdom和Sandrine Dudoit. 2017。弹弓:单细胞转录组学的细胞谱系和伪时间推断。bioRxivhttps://doi.org/10.1101/128843

Van den Berge, Koen, Hector Roux de Bézieux, Kelly Street, Wouter Saelens, Robrecht can面条,Yvan Saeys, Sandrine Dudoit和Lieven Clement. 2020。单细胞测序数据的基于轨迹的差分表达分析自然通讯11(1): 1201。https://doi.org/10.1038/s41467-020-14766-3