介绍

tradeSeq是一个R包,允许分析基因表达沿轨迹。虽然它已被开发并应用于单细胞rna测序(scRNA-seq)数据,但其适用性不仅限于此,还允许分析例如沿轨迹或批量RNA-seq时间序列数据集的单细胞ATAC-seq数据。对于数据集中的每个基因,tradeSeq拟合广义加法模型(GAM)mgcvR包。然后,通过评估拟合的GAM模型参数的对比,可以对GAM进行统计推断,帮助解释复杂的数据集。所有有关tradeSeq我们的预印本中描述了模型和统计测试(@VandenBerge2019a)

在这个小插图中,我们分析来自(@Paul2015)。一个SingleCellExperiment对象提供的数据tradeSeq包,可以如下所示检索。数据和UMAP降维是通过以下方法得到的单片眼镜3小插图

安装

要安装包,只需运行

如果(!requireNamespace("BiocManager", quiet = TRUE)) {install.packages("BiocManager")} BiocManager::install("tradeSeq")

或者,开发版本可以从GitHub安装https://github.com/statOmics/tradeSeq

加载数据

库(tradeSeq)库(RColorBrewer)库(singlecel实验)库(slingshot) #再现性rng版本(“3.5.0”)调色板(brewer. exe)pal(8, "Dark2")) data(countMatrix, package = "tradeSeq") counts <- as.matrix(countMatrix) rm(countMatrix) data(crv, package = "tradeSeq") data(celltype, package = "tradeSeq")

我们为这个数据集找到了两个谱系。轨迹可以使用plotGeneCount函数,使用群集标签或单元格类型为单元格着色。

plotGeneCount(曲线= crv,簇=细胞类型,标题= "着色的细胞类型")

选择K:更深入地研究从的输出evaluateK

本文采用负二项式广义可加性模型(NB-GAM)框架tradeSeq使每个家族中的每个基因表达顺畅。平滑函数可以分解为一组基函数,这些基函数在结点(通常简称为结)处连接在一起。

理想情况下,应该选择结的数量来达到最优的偏方差平衡,以获得更平滑的结果,其中一个解释表达式数据中的尽可能多的可变性,只有几个回归系数。为了指导这一选择,我们使用赤池信息标准(AIC)开发了诊断图。实现了evaluateK函数tradeSeq。该函数以表达式计数矩阵和轨迹信息作为输入,轨迹信息可以是aSlingshotDataSet,或伪时间矩阵和来自任何轨迹推断对象的单元级权重。函数提供了要计算的节的范围论点。最小允许结数为3 \ \ ()。虽然最大结数没有界限,但通常有趣的范围是在附近3 \ \ ()\ (10 \)节。的evaluateK函数将适合某些随机基因子集的NB-GAM模型,由ngen参数,在提供的结的范围内,并返回与每个结数相匹配的每个基因的AIC。使用不同的种子对其进行多次评估通常是一个好主意set.seed函数),以检查结果是否可在不同的基因亚群中重现。

默认情况下,evaluateK输出诊断图,这将有助于确定适当的结数。如果你想使用不同的诊断图来选择结数时,拟合平滑器,你可以禁用绘图选项,并将AIC值存储在一个对象中。

下面,我们使用Slingshot对象来运行该函数。

###基于Slingshot对象set.seed(6) icMat <- evaluateK(counts = counts, sds = crv, k=3:7, nGenes = 100, verbose =FALSE, plot = TRUE) print(icMat[1:2,]) ###任何轨迹推理方法的下游使用伪时间和细胞权重set.seed(7) pseudotime <- slingPseudotime(crv, na=FALSE) cellWeights <- slingCurveWeights(crv) icMat2 <- evaluateK(counts = counts, pseudotime = pseudotime, cellWeights = cellWeights, k=3:7, nGenes = 100, verbose =FALSE, plot = TRUE)

输出图形被组织成四个面板。左边的面板为我们想要计算的每个结数绘制了一个箱线图。所绘制的值是一个基因在特定结值处的AIC与该基因在评估的所有结上的平均AIC的偏差。通常情况下,AIC值在低节数时略高,我们预计它们会随着节数的增加而降低。中间的两个面板描绘了所有基因AIC的平均下降。左中面板简单地绘制了平均AIC,而右中面板绘制了最低节数时AIC相对于平均AIC的变化(这里是3节,也可以从图中看到,因为相对AIC等于\ [1 \))。最后,右边的面板只绘制了AIC值在评估的结数上发生显著变化的基因子集。在这里,显著变化被定义为至少绝对值的变化\ [2 \),但可以使用aicDiff参数evaluateK。对于基因子集,将显示一个条形图,显示在特定结值处具有最低AIC的基因的数量。

中间的面板显示,如果结数增加超过AIC水平下降\ (6 \),我们会选择这个结的数量来适应tradeSeq模型。

拟合加法模型

在确定了适当的结数之后,我们可以为每个基因匹配NB-GAM。在内部,tradeSeq建立在mgcv封装通过拟合添加剂模型使用gam函数。核心拟合功能,fitGAM,将使用三次样条作为基函数,并试图确保每个谱系将在一个更平滑的结点结束。默认情况下,我们允许\ (6 \)每个血统的节,但这可以改变nknots论点。结数越多,灵活性就越大,但也会增加过拟合的风险。

默认情况下,GAM模型使用负二项分布为每个谱系估计一个更平滑的谱系。如果您希望允许其他固定效果(例如,批处理效果),则需要一个额外的模型矩阵,通常使用model.matrix功能,可提供的U论点。在我们的预印本中描述了统计模型的精确模型定义(@VandenBerge2019a)。我们使用有效库大小,用TMM估计(@Robinson2010),作为模型中的偏移量。方法允许用户定义的偏移量,从而允许替代抵消论点。

类似于evaluateK, fitGAM可以取aSlingshotDataSet对象作为输入(sds参数),或伪时间和单元格级权重的矩阵(拟时间cellWeights参数)。默认情况下,返回的对象是SingleCellExperiment对象,该对象包含模型拟合的所有基本输出。注意,还可以通过设置请求更广泛的输出sce = FALSE,但内存效率低得多,请参阅下面“tradeSeq列表输出”小节。

因为单元格是根据它们的权重分配到谱系的,所以的结果fitGAM是随机的。虽然这在实践中对整体结果的影响有限,但因此鼓励用户使用set.seed运行前的功能fitGAM确保他们分析的可重复性。

下面,我们将展示提供所需输入的两种方法fitGAM:任何轨迹推断方法的下游和的下游弹弓。若要使用进度条跟踪进度,请设置verbose = TRUE

###基于Slingshot对象set.seed(6) sce <- fitGAM(counts = counts, sds = crv, nknots = 6, verbose = FALSE) ###使用伪时间和细胞权重set.seed(7)伪时间<- slingPseudotime(crv, na = FALSE) cellWeights <- slingCurveWeights(crv) sce <- fitGAM(counts = counts, pseudotime = pseudotime, cellWeights = cellWeights, nknots = 6, verbose = FALSE)的任何轨迹推断方法的下游

向模型中添加协变量

对于某些数据集,向模型中添加协变量是有用的,例如批量效应。方法创建设计矩阵可以实现这一点model.matrix函数,并将其作为fitGAM使用U论点。下面,我们从模型中引入人工批效应,就好像数据来自两个不同的批次。

batch <- factor(rep(c("A", "B"), each = ncol(counts)/2)) U <- model.matrix(~batch) sceBatch <- fitGAM(counts = counts, U = U, sds = crv, nknots = 6, verbose = FALSE)

并行计算

如果要分析大型数据集,fitGAM可能要跑一段时间。我们已经实现了使用并行化的支持BiocParallel,可通过设置激活平行= TRUE。方法提供并行化选项BPPARAM参数,如下所示。

BPPARAM <- BiocParallel:: BPPARAM () BPPARAM #列出当前选项
##类:multicorepam ## bpisup: FALSE;bpnworkers: 4;bptasks: 0;BPJOB: BPJOB ## bplog: FALSE;bpthreshold:信息;bpstopOnError: TRUE ## bpRNGseed:bptimeout: NA;bpprogressbar: FALSE ## bpexportglobals: TRUE;bpexportvariables:错误;bpforceGC:真实; bpfallback: TRUE ## bplogdir: NA ## bpresultdir: NA ## cluster type: FORK
BPPARAM$workers <- 2 #使用2个核心sce <- fitGAM(counts = counts, pseudotime = pseudotime, cellWeights = cellWeights, nknots = 6, verbose = FALSE, parallel=TRUE, BPPARAM = BPPARAM)

只适合一小部分基因

它可能只适合NB-GAM的一个基因子集,但使用跨所有基因的信息来执行归一化。可以使用基因论点fitGAM,它接受一个数值向量,指定模型应拟合的计数矩阵的行。

sce25 <- fitGAM(counts = counts, pseudotime = pseudotime, cellWeights = cellWeights, nknots = 6, verbose = FALSE, genes = 1:25)

零通货膨胀

这个数据集由UMI统计组成,我们不认为零通胀是一个大问题。然而,我们也允许通过提供观察级权重来拟合零膨胀负二项式(ZINB) GAMsfitGAM使用权重论点。的权重必须对应于一个计数属于ZINB分布的计数分量的后验概率(@VandenBerge2018)。原则上,这些权重可以用任何选择的方法来计算。的ZINB-WavE装饰图案方法计算这些值zinbwave包中。

小数据集或零膨胀数据集的收敛问题

如果您正在处理具有有限数量单元格的数据集,或者您正在合并零膨胀权重,则NB-GAMs可能难以拟合,正如运行时的警告所指出的那样fitGAM。在这种情况下,如果您允许在GAM拟合中进行更多的迭代,情况可能会有所改善。这可以用控制的观点fitGAM

库(mgcv)
##加载所需的包:nlme
## ##附加包:'nlme'
##以下对象从'package:IRanges'中屏蔽:## ##崩溃
这是mgcv 1.8-41。对于概述,键入“help("mgcv-package")”。
control <- gamam .control() control$maxit <- 1000 #设置最大迭代次数为1K #传递到fitGAM的控制参数,如下所示:# gamList <- fitGAM(counts = counts, # pseudotime = slingPseudotime(crv, na = FALSE), # cellWeights = slingCurveWeights(crv), # control = control)

tradeSeq列表输出

的输出fitGAM如果有一个固定了会不一样吗sce = FALSE,内存效率较低。而不是SingleCellExperiment对象时,它将返回一个全部拟合的列表mgcv模型。上面讨论的大多数函数与列表输出的工作原理完全相同。但是,列表输出功能稍微大一些,在这里我们讨论一些仅在列表输出中可用的功能。

gamList <- fitGAM(counts, pseudotime = slingPseudotime(crv, na = FALSE), cellWeights = slingCurveWeights(crv), nknots = 6, sce = FALSE)

首先,可以通过请求模型的摘要来研究模型的结果。

总结(gamList[[“Irf8”]])
## ##族:负二项式(2.221)##链接函数:log ## ##公式:## y ~ -1 + U + s(t1, by = l1, bs = "cr", id = 1, k = nknots) + ## s(t2, by = l2, bs = "cr", id = 1, k = nknots) +偏移量(offset) ## ##参数系数:##估计Std.误差z值Pr(>|z|) ## U -10.0555 0.5408 -18.59 <2e-16 *** ##——##符号。代码:0 '***' 0.001 '**' 0.01 '*' 0.05 '。' 0.1 ' ' 1 ## ##平滑项的近似意义:## edf Ref.df Chi。qp -value ## s(t1):l1 5.698 5.956 589.260 < e-16 *** # s(t2):l2 3.387 3.819 9.329 0.0454 * ##——##符号。代码:0 '***' 0.001 '**' 0.01 '*' 0.05 '。' 0.1 ' ' 1 ## ##排名:12/13 ## R-sq.(adj) = 0.533偏差解释= 64% ## -REML = 2027.4规模est = 1 n = 2660

associationTest,可以提取由mgcv使用getSmootherPvalues函数。这些p值来自于一个检验,该检验评估了零假设,即所有更平滑的系数都等于零。然而,请注意,他们的解释因此更加复杂。因此,一个特定基因的显著谱系可能是(A)与该基因的总体表达相比,该谱系的平均表达不同,或(b)沿该谱系的显著表达变化,即使均值相等,或(c)两者的组合。该函数提取由计算的p值mgcv从GAM,并将返回NA我们无法正确匹配的基因。类似地,可以使用getSmootherTestStats。由于该数据集被预先过滤为只包含相关基因,所有的p值(测试统计值)都将非常低(高)。注意,这些函数仅适用于的列表输出tradeSeq,而不是与SingleCellExperiment输出。因此,我们在这里不计算这些。

pvalLineage <- getSmootherPvalues(gamList) statLineage <- getSmootherTestStats(gamList)

此外,对于希望开发自己的测试的用户来说,列表输出也是一个很好的起点。在tradeSeq中已经实现了许多测试,但研究人员可能对当前实现可能无法解决的其他假设感兴趣。因此,我们欢迎在GitHub上对基于tradeSeq模型的新测试做出贡献。类似地,您还可以请求开发人员在tradeSeq中实现新的测试,最好通过添加2021欧洲杯体育投注开户GitHub存储库的一个问题。如果我们认为建议的测试是广泛适用的,我们将在tradeSeq中实现它。

会话

sessionInfo ()
## R版本4.2.1(2022-06-23)##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 20.04.5 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.16-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.16-bioc/R/lib/libRlapack。因此## ##随机数生成:## RNG:梅森- twister ## Normal:反转## Sample:舍入## ## 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 ## ## attached base packages: ## [1] stats4 stats graphics grDevices utils datasets methods ## [8] base ## ## other attached packages: ## [1] mgcv_1.8-41 nlme_3.1-160 ## [3] slingshot_2.6.0 TrajectoryUtils_1.6.0 ## [5] princurve_2.1.6 SingleCellExperiment_1.20.0 ## [7] SummarizedExperiment_1.28.0 Biobase_2.58.0 ## [9] GenomicRanges_1.50.0 GenomeInfoDb_1.34.0 ## [11] IRanges_2.32.0 S4Vectors_0.36.0 ## [13] BiocGenerics_0.44.0 MatrixGenerics_1.10.0 ## [15] matrixStats_0.62.0 RColorBrewer_1.1-3 ## [17] tradeSeq_1.12.0 knitr_1.40 ## ## loaded via a namespace (and not attached): ## [1] viridis_0.6.2 sass_0.4.2 edgeR_3.40.0 ## [4] jsonlite_1.8.3 viridisLite_0.4.1 splines_4.2.1 ## [7] bslib_0.4.0 assertthat_0.2.1 highr_0.9 ## [10] GenomeInfoDbData_1.2.9 yaml_2.3.6 pillar_1.8.1 ## [13] lattice_0.20-45 glue_1.6.2 limma_3.54.0 ## [16] digest_0.6.30 XVector_0.38.0 colorspace_2.0-3 ## [19] htmltools_0.5.3 Matrix_1.5-1 pkgconfig_2.0.3 ## [22] zlibbioc_1.44.0 scales_1.2.1 BiocParallel_1.32.0 ## [25] tibble_3.1.8 generics_0.1.3 farver_2.1.1 ## [28] ggplot2_3.3.6 cachem_1.0.6 pbapply_1.5-0 ## [31] cli_3.4.1 magrittr_2.0.3 evaluate_0.17 ## [34] fansi_1.0.3 tools_4.2.1 lifecycle_1.0.3 ## [37] stringr_1.4.1 munsell_0.5.0 locfit_1.5-9.6 ## [40] DelayedArray_0.24.0 compiler_4.2.1 jquerylib_0.1.4 ## [43] rlang_1.0.6 grid_4.2.1 RCurl_1.98-1.9 ## [46] igraph_1.3.5 bitops_1.0-7 labeling_0.4.2 ## [49] rmarkdown_2.17 gtable_0.3.1 codetools_0.2-18 ## [52] DBI_1.1.3 R6_2.5.1 gridExtra_2.3 ## [55] dplyr_1.0.10 fastmap_1.1.0 utf8_1.2.2 ## [58] stringi_1.7.8 parallel_4.2.1 Rcpp_1.0.9 ## [61] vctrs_0.5.0 tidyselect_1.2.0 xfun_0.34

参考文献