SummarizedBenchmark
框架的介绍SummarizedBenchmark:介绍小插图,这个小插图提供了使用包执行基准测试比较的更详细的案例研究。比较方法的差异基因表达测试与RNA-seq数据的一个更复杂的例子被提出,并用于激励和演示的几个核心特征SummarizedBenchmark
的方法。SummarizedBenchmark包版本:2.16.0 "SummarizedBenchmark 2.16.0
在本案例研究中,我们假设读者熟悉案例中所介绍的材料SummarizedBenchmark:介绍小插图,以及在较小程度上的内容SummarizedBenchmark:类详细信息装饰图案。这两个小插图提供了对包的更高层次的介绍,如果可能的话,应该首先阅读。
我们使用来自(Soneson and Robinson 2016)来演示SummarizedBenchmark
软件包可用于差分表达式分析的基准测试方法。方法中实现的方法进行比较DESeq2,刨边机,limma包。模拟数据集包括6个样本,分别来自两个条件的3个重复。对于每个样本,转录水平表达为来自人类染色体1号(ensemble GRCh37.71)的15677个转录本的百万分转录本(TPM)值。关于数据的更完整的描述,包括如何生成数据的代码,可在的补充材料中找到(Soneson and Robinson 2016)在这里.我们提供包含这些计数和真实数据的预计算对象。对象如何生成的详细信息包含在附录在这篇短文的结尾。
## a1 a2 a3 b1 b2 ## enst00000367770 ## enst00000367771 558.834722 458.8887676 662.352695 5.299743 20.73813 ## enst00000367772 155.881534 110.603363685 183.417201 0.000000 0.00000 ## enst00000423670 11.809207 16.4752934 10.426669 20.392491 1.26733 ## enst00000423631 12.442872 13.4797855 4.781290 1.152118 20.50770 ## enst00000367770 16.64878100 ## enst00000367771 14.862318 ##Enst00000367772 0.000000 ## enst00000423670 7.546371 ## enst00000470238 815.123229 ## enst00000286031 5.760588
## # A tibble: 6 × 13 ## transcript status logFC…¹logFC avetpm length eff_l…²tpm1 tpm2 isopct1 ## ## 1 ENST0000036…1[3.38…4.17 0.225 2916 2771。]0.0237 0.427 0.00278 ## 2 enst0000036…1[3.38…5.25 3.20 2921 2776.]6.23 0.164 0.730 ## 3 ENST0000036…1 Inf Inf 0.817 3477 3332。1.63 0 0.192 ## 4 enst0000042…1[0.00…0.322 0.203 2077 1932.]0.181 0.226 0.0212 ## 5 enst0000047…1[3.38…4.07 4.08 1538 1393.]0.460 7.71 0.0540 ## 6 enst0000028…0[0.00…0 0.154 4355 4210.]0.154 0.154 0.0463 ## #…3个变量:isopct2 , gene , avetpm_cat ,和## #缩写变量名¹logFC_cat,²eff_length
我们通过创建我们的BenchDesign对象使用数据集。的BenchDesign可以初始化data.frame(如简介Vignette),或者更一般地,使用列表对象,或者可选地,不使用任何数据。在这个案例研究中,由于差分表达式的方法需要的不仅仅是表达式计数,例如实验设计,我们将数据集构造为一个列表,其中包含每个这些输入作为命名项。
缩放后的TPM值在传递给差分表达式方法之前被四舍五入。
在这里,我们简单地使用每个样本的条件来定义实验设计。设计矩阵存储为adata.frame,mycoldat
.
基准实验的数据对象现在是用计数和设计矩阵以及一些基本事实信息(“状态”:条件之间差异表达式的真实存在或不存在,以及“lfc”:条件之间预期的对数倍变化)构造的。
的BenchDesign是用数据作为唯一输入构造的。
为了简单起见,我们只比较每个方法在测试两个条件之间的差异表达式后返回的p值。然而,在本小插图的后面,我们还将展示如何在单个中比较多个指标(p值和对数倍变化)BenchDesign对象。
由于每个方法都需要运行多个步骤,因此我们为每个方法编写了两个包装器函数——一个函数首先返回主要分析结果,第二个函数从结果中提取p值。
函数(countData, colData, design, contrast) {DESeqDataSetFromMatrix(countDatacolData =colData,设计=设计)DESeq(dds)结果(dds,对比=对比)函数(x) {$pvalue函数(countData, group, design) {DGEList(countData组=集团)calcNormFactors(y)model.matrix(设计)estimateDisp(y, des)glmFit(y, des)glmLRT(健康,系数=2)函数(x) {$表格$PValue函数(countData, group, design) {DGEList(countData组=集团)calcNormFactors(y)model.matrix(设计)轰(y, des)易趣(lmFit(des), y)函数(x) {$p.value (,2]
双相障碍% > %调用addMethod(标签=“deseq2”,func =deseq2_run,帖子=deseq2_pv,params =rlang::、动荡频仍的(countData =cntdat,colData =coldat,设计=~条件下,对比=c(“条件”,“2”,“1”))% > %调用addMethod(标签=“磨边机”,func =edgeR_run,帖子=edgeR_pv,params =rlang::、动荡频仍的(countData =cntdat,组=coldat$条件下,设计=~coldat$条件)% > %调用addMethod(标签=“轰”,func =voom_run,帖子=voom_pv,params =rlang::、动荡频仍的(countData =cntdat,组=coldat$条件下,设计=~coldat$条件)
buildBench(双相障碍,truthCols =“状态”)
我们可以检查结果。
3.基准评价
通过运行上面的代码,三种差分表达式方法的结果(刨边机,limma轰,DESeq2将存储在SummarizedBenchmark
容器。下一步是定义度量来评估这三种方法的性能。这可以通过使用函数来完成addPerformanceMetric ()
,如前所述简介装饰图案。在这个包中,有几个通常用于评估方法的“默认”指标的实现。这个函数availableMetrics ()
返回一个data.frame这些指标。
# # 1 # #功能描述拒绝拒绝的# # 2 TPR真阳性率# # 3 # # TNR真阴性率4罗斯福错误发现率(估计)# # 5 FNR假阴性率# # 6相关皮尔逊相关# # 7 sdad标准差的绝对差# # 8 # #汉明汉明距离9 LPnorm L_ {p}规范# # 10 adjustedRandIndex调整兰德指数# # 1 # # requiresTruth假# # 2真# # 3真正的# # 4真正的# # 5真# # 6真正的# # 7真# # 8真# # 9真# # 10真的
预定义的度量拒绝
,TPR
,TNR
,罗斯福
而且FNR
可以添加到化验中吗H
我们的对象使用以下代码。
addPerformanceMetric(某人,evalMetric =c(“拒绝”,“TPR”,“TNR”,“罗斯福”,“FNR”),分析=“状态”)的名字(performanceMetrics(某人)[[“状态”]])
##[1]“拒绝”“TPR”“TNR”“FDR”“FNR”
定义了所需的性能指标之后,函数estimatePerformanceMetrics ()
将为这三种方法中的每一种计算这些度量。
estimatePerformanceMetrics(某人,α=c(0.01,0.05,0.1,0.2),整洁的=真正的)% > %dplyr:::选择(标签,值,performanceMetric, alpha)% > %尾巴()
##标签值performanceMetric alpha ## 55 deseq2 0.10949477 FNR 0.1 ## 56 edgeR 0.09381113 FNR 0.1 ## 57 voom 0.11381970 FNR 0.1 ## 58 deseq2 0.09181118 FNR 0.2 ## 59 edgeR 0.07986767 FNR 0.2 ## 60 voom 0.08741018 FNR 0.2 ## 60 voom 0.08741018 FNR 0.2
此外,函数plotMethodsOverlap ()
而且plotROC ()
有助于可视化不同方法的性能,以防这些方法输出q值。
plotMethodsOverlap ()
是函数的包装器吗沮丧()
从UpSetR包,它有助于可视化给定alpha值的不同方法的命中之间的重叠。

从上面的图中,很明显,有大量的转录本被所有三种方法检测到表达差异。还有一些更小的转录本集,由单个方法或方法子集唯一地检测到。另一种比较不同方法性能的典型方法是受试者工作特征(ROC)曲线。这个函数plotROC ()
输入一个SummarizeBenchmark对象,并绘制其中所有方法的ROC曲线。

4存储多个输出
上面描述的案例研究假设我们对每种方法的单个数值向量感兴趣,即p值向量。这些p值被存储为鞋底分析
在SummarizedBenchmark返回的对象buildBench ()
.然而,在许多情况下,在不同的方法之间会有多个感兴趣的值进行比较。例如,在比较差分表达式的方法时,除了p值之外,还可以查看估计的对数倍变化。
的BenchDesign框架支持多个分析帖子=
参数。调用addMethod ()
调用。当指定0或1个函数时帖子=
对于所有方法,如上面的示例,结果都存储为单个分析
.然而,如果帖子=
传递一个函数的命名列表,分开分析
S将使用每个列表中的名称和函数创建。自分析
名字取自帖子=
,列表中的所有条目都必须命名。此外,由于结果是在使用分析名称的方法之间进行匹配的,如果一个方法缺少帖子=
函数中对应的列分析
S将被设为NA
.
为了跟踪每个方法的p值和对数倍变化值,我们编写了一组新的包装器函数来提取每个方法的对数倍变化,类似于前面为提取p值而编写的包装器函数。与上面只需要每个方法的p值的情况不同,我们不能简单地为运行方法和提取结果编写单个包装器函数。相反的,单独的func =
而且帖子=
规范是必要的。
函数(x) {$log2FoldChange函数(x) {$表格$logFC函数(x) {$系数(2]
BenchDesign(data =mydat)% > %调用addMethod(标签=“deseq2”,func =deseq2_run,帖子=列表(pv =deseq2_pv,利物浦=deseq2_lfc),params =rlang::、动荡频仍的(countData =cntdat,colData =coldat,设计=~条件下,对比=c(“条件”,“2”,“1”))% > %调用addMethod(标签=“磨边机”,func =edgeR_run,帖子=列表(pv =edgeR_pv,利物浦=edgeR_lfc),params =rlang::、动荡频仍的(countData =cntdat,组=coldat$条件下,设计=~coldat$条件)% > %调用addMethod(标签=“轰”,func =voom_run,帖子=列表(pv =voom_pv,利物浦=voom_lfc),params =rlang::、动荡频仍的(countData =cntdat,组=coldat$条件下,设计=~coldat$条件)对。
## deseq2 edgeR voom ## [1,] 2.875541e-04 2.074073e-04 6.103023e-03 ## [2,] 2.799371e-23 2.121422e-16 1.239445e-04 ## [3,] 8.450676e-14 3.109331e-18 5.221157e-06 ## [4,] 6.930834e-01 6.621236e-01 3.357040e-01 ## [5,] 2.479616e-11 2.468951e-09 3.978989e-04 ## [6,] 9.057130e-01 8.947438e-01 5.199404e-01
## deseq2 edgeR voom ## [1,] 3.7329019 3.6767779 3.5232524 ## [2,] -5.3905346 -5.3773940 -5.5543949 ## [3,] -9.7125453 -10.2467488 -8.2533275 ## [4,] -0.4706410 -0.4547095 -1.0510456 ## [5,] 3.7048724 3.7024426 3.9084940 ## [6,] -0.1554938 -0.1504299 -0.7607029
结果存储在每一个化验SummarizedBenchmark对象现在可以以与以前相同的方式进行分析。
5回收BenchDesign
之前,我们提到过aBenchDesign可以在没有任何数据的情况下初始化。在这里,我们将描述为什么支持它以及如何运行它buildBench ()
在一个BenchDesign不包含数据集的。
在对几种方法进行基准测试时,通常认为最好将这些方法应用于多个数据集。在SummarizedBenchmark框架下,这很自然地转化为循环在单个基准中定义的同一组方法BenchDesign对象跨越多个数据集。首先,初始化aBenchDesign不需要任何方法或数据集。
BenchDesign()
bdnull% > %调用addMethod(标签=“bonf”,func =p.adjust,params =rlang::、动荡频仍的(p =pval,方法=“bonferroni”))% > %调用addMethod(标签=“黑洞”,func =p.adjust,params =rlang::、动荡频仍的(p =pval,方法=“黑洞”))
的buildBench ()
方法接受可选的data =
参数。指定时,此数据集用于运行实验,优先于中指定(或缺少)的数据集BenchDesign对象。
##类:SummarizedBenchmark ## dim: 50 2 ##元数据(1):会话## assays(1):默认## rownames: NULL ## rowData names(1):默认## colnames(2): bonf BH ## colData names(6): func。PKG funcc . PKG .vers…参数。方法session.idx
的过程中指定数据buildBench ()
步骤中定义的完全相同的基准比较BenchDesign对象,可以跨多个数据集一致地执行。而这种方法即使在普通情况下也能奏效BenchDesign对象包含默认数据集,建议将BenchDesign如果设计要跨数据集重用,则在创建时不使用任何数据以避免错误。
6下一个步骤
的最重要的特征SummarizedBenchmark
工作流在这个小插图中进行了演示。其他功能和主题,包括如何错误处理,迭代的基准测试,并行化可以在单独的小插图中找到。
7附录
在这里,我们描述如何使用数据从ArrayExpress下载数据。每个示例的表达式数据以RSEM输出格式提供。模拟数据的基础真相的相应信息也可用,包括转录本差异表达状态。
首先,我们使用tximport 1.26.0包下载并导入转录级别的TPM值,并将此数据存储在名为txi
.
图书馆(tximport)图书馆(readr)tempdir()download.file(url =paste0(“https://www.ebi.ac.uk/arrayexpress/files/”,“e - mtab - 4119 / e - mtab - 4119. - processed.3.zip”),destfile =file.path(d,“samples.zip”))解压缩(file.path(d,“samples.zip”),exdir =d)list.files(d,模式=“* _rsem.txt”,full.names =真正的)的名字(fl) < -gsub(“样本(. *)_rsem.txt”,"\ \1",basename(fl))tximport(fl,txIn =真正的,txOut =真正的,geneIdCol =“gene_id”,txIdCol =“transcript_id”,countsCol =“expected_count”,lengthCol =“effective_length”,abundanceCol =“TPM”,countsFromAbundance =“scaledTPM”,进口国=函数(x) {readr::read_tsv(x)})
接下来,我们获取并加载可用于评估差分表达式分析结果的ground truth信息,并将其保留为宠物猫被称为truthdat
.
download.file(url =paste0(“https://www.ebi.ac.uk/arrayexpress/files/”,“e - mtab - 4119 / e - mtab - 4119. - processed.2.zip”),destfile =file.path(d,“truth.zip”))解压缩(file.path(d,“truth.zip”),exdir =d)read_tsv(file.path(d,“truth_transcript.txt”))
我们拯救了tximport
结果与真相宠物猫在这个包装中使用。
参考文献
夏洛特·森森,马克·D·罗宾逊,2016。“iCOBRA:开放、可复制、标准化和实时的方法基准测试。”自然方法13(4): 283-83。https://doi.org/10.1038/nmeth.3805.