内容

1简介

SummarizedBenchmark,一个完整的基准测试工作流程由三个主要部分组成:

  1. 数据,
  2. 方法,
  3. 性能指标。

前两个(数据而且方法)是进行基准实验所必需的,而最后一个(性能指标)对于评价实验结果是必要的。遵循这种方法,SummarizedBenchmark包定义了两种主要类型的对象:BenchDesign对象和SummarizedBenchmark对象。BenchDesign对象只包含设计的基准实验,即数据而且方法,其中方法定义为函数或算法与参数设置的组合。在构建了BenchDesign时,执行实验以创建一个SummarizedBenchmark包含对数据应用这些方法的结果。SummarizedBenchmark对象扩展了BioconductorSummarizedExperiment类,具有使用的附加功能性能指标

基本框架如下图所示。一个BenchDesign是用方法结合数据要创建SummarizedBenchmark,其中包含将方法应用于数据的输出。然后将此输出与性能指标由用户指定。请注意BenchDesign可以结合几个数据集来生成几个SummarizedBenchmark具有相应输出的对象。为了方便起见,有几个是默认的性能指标是在包中实现的,并且可以添加到SummarizedBenchmark对象,使用简单命令。

基本的基准类关系

基本的基准类关系

在这篇短文中,我们首先说明两者的基本用法BenchDesign而且SummarizedBenchmark类与简单比较方法的p值校正在多假设检验的背景下。在其他几个案例研究小插图中演示了包的更高级功能。在基本熟悉之后SummarizedBenchmark在本简介中介绍了框架,建议大家阅读SummarizedBenchmark:类详细信息更多关于结构的小插图BenchDesign而且SummarizedBenchmark的问题的类和详细信息再现性使用这些类。然后,我们建议继续进行更详细的讨论概要基准:完整的案例研究我们通过比较三种差分表达式分析方法的案例研究来描述包的更高级功能。

2快速入门案例研究

来说明的基本用法BenchDesign类,我们使用tdat此包中包含的数据集。

数据集是adata.frame包含50个双样本t检验的结果。试验使用从单一标准正态分布(当H = 0)或两个均移正态分布(当H = 1).

## H test_statistic effect_size pval SE ## 1 1 -3.2083437 -1.17151466 4.872282e-03 0.3651463 ## 31 -5.7077940 -1.81715381 2.061521e-05 0.3183636 ## 4 1 -1.9805856 -1.09107836 6.313031e-02 0.5508867 ## 51 -1.0014358 -0.37726058 3.298895e-01 0.3767197 ## 61 -0.9190433 -0.47583669 3.702252e-01 0.5177522

提出并实现了几种计算方法假定值调整而且q值目标是控制测试集合中错误发现的总数。在这个例子中,我们比较了三个这样的方法:

  1. 邦费罗尼校正(p.adjustw /方法= "bonferroni"邓恩(1961)
  2. Benjamini-Hochberg (p.adjustw /method = "BH"(Benjamini和Hochberg 1995),
  3. Storey的FDR q值(qvalue: qvalue(2002楼)

首先,考虑如果没有SummarizedBenchmark框架。

为了比较方法,每种方法都应用于tdat,结果存储在单独的变量中。

由于感兴趣的值可以从每个方法的输出中获得,长度为50(测试假设的数量),为了保持整洁,可以将它们组合成一个单一的值data.frame

## 1 0.24361409 0.02191765 0.0079813228 ## 2 0.3290660527 ## 3 0.00103076 0.00103076 0.0003753518 ## 4 1.00000000 0.12140444 0.0442094809 ## 5 1.00000000 0.47127065 0.1716134119 ## 6 1.00000000 0.48250104 0.1757029652

data.frame调整后的p值和q值可以用于比较方法,可以直接解析表或使用类似的框架iCOBRA.此外,data.frame可以存为一个吗RDSRdata对象,以供将来参考,从而消除了对原始数据重新计算的需要。

虽然这种方法可以很好地用于较小的比较,但随着方法和参数数量的增加,它很快就会变得难以应付和笨拙。此外,一旦应用每种方法,最终data.frame邻接的)是构造的,没有办法确定如何计算每个值。虽然可以使用一个信息名称来“标记”每个方法(如上所述),但这并不能捕捉到全部的复杂性,例如参数和上下文,函数在哪里被评估。一种解决方案可能涉及在单独的文件中手动记录函数调用和参数data.frame希望保持与输出的同步data.frame.然而,这很容易出错,例如在快速“复制和粘贴”操作或添加和删除参数组合期间。的框架是另一种(希望是更好的)解决方案SummarizedBenchmark包中。

SummarizedBenchmark方法,BenchDesign由数据和任意数量的方法构造。可选的BenchDesign也可以在没有任何数据或方法输入的情况下构造。方法和数据可以以几种不同的方式模块化地从对象中添加或删除,这将在下一节中进行描述。为简单起见,我们首先演示如何构造BenchDesign只使用数据集作为输入。数据对象,在这里tdat,必须显式传递给data =参数。

然后,可以将感兴趣的每个方法添加到BenchDesign使用调用addMethod ()

至少,调用addMethod ()需要三个参数:

  1. 双相障碍:BenchDesign对象进行修改,
  2. 标签:方法的字符名,以及
  3. 函数:要调用的函数。

方法所需要的任何参数函数方法应该作为命名参数传递,例如。P = pval, method = "bonferroni",params =作为一个列表quosures使用、动荡频仍的rlang:: (. .).注意这里pval包裹在、动荡频仍的rlang:: (. .)需要指定为tdat pval美元用于访问data.frame中的列的函数。对于熟悉的读者ggplot2包装,使用Params = rlang::quos(..)这里应该看类似的用法Aes = Aes (..)ggplot2用于在数据和绘图(或基准测试)参数之间进行映射。

类中的管道操作符可以更简洁地编写添加方法的过程magrittr包中。

对于某些方法,例如上面的q值方法,可能需要在主要方法上调用“后处理”函数来提取所需的输出(这里是q值)。这应该使用可选参数指定帖子=参数。

现在,BenchDesign对象包含三个方法。这可以通过调用对象来验证。

b
# # BenchDesign  ------------------------------------------------ ## 基准数据:# #类型:数据# #名称:H, test_statistic, effect_size, pval, SE # #基准方法:# #方法:bonf;func: p.adjust ##方法:BH;Func: p.adjust ##方法:qv;func: qvalue:: qvalue

方法可以查看关于每个方法的更多详细信息printMethods ()函数。

# # bonf  ------------------------------------------------------- ## BenchDesign方法(BDMethod ) ------------------------------ ## 方法:p.adjust # #函数(p = p.adjust方法。方法,n = length(p)…# #参数:# # p: pval # #方法:“bonferroni”# #:# # # #元没有:# # # # BH  --------------------------------------------------------- ## BenchDesign方法(BDMethod ) ------------------------------ ## 方法:p.adjust # #函数(p = p.adjust方法。方法,n = length(p)…# #参数:# # p: pval # #方法:“黑洞”# #:# # # #元没有:# # # # qv  --------------------------------------------------------- ## BenchDesign方法(BDMethod ) ------------------------------ ## 方法:qvalue: qvalue # #函数(p,罗斯福。level = NULL, pfdr = FALSE, lfdr.out…##参数:## p: pval ## post: ## default: function (x){…## meta: ##无

虽然该基准现在包括进行基准研究所需的所有信息,但实际调整后的p值和q值尚未计算出来。要做到这一点,我们只需调用buildBench ().而buildBench ()除了?以外不需要任何输入BenchDesign对象,当相应的ground truth是已知的,则truthCols =参数。在本例中,H的列tdatdata.frame包含每个模拟假设检验的真零或替代状态。注意,如果任何方法是在单独的包中定义的,则必须安装和加载它们之前进行实验。

返回的对象是aSummarizedBenchmark类。的SummarizedBenchmark对象的扩展SummarizedExperiment对象。调整后的p值和q值表包含在对象的单个“分析”中,并使用每种添加的方法调用addMethod ()作为对应的列标签就像名字一样。

## bonf BH qv ## [1,] 0.24361409 0.02191765 0.0079813228 ## [2,] 1.00000000 0.90365415 0.3290660527 ## [3,] 0.00103076 0.00103076 0.0003753518 ## [4,] 1.00000000 0.12140444 0.0442094809 ## [5,] 1.00000000 0.47127065 0.1716134119 ## [6,] 1.00000000 0.48250104 0.1757029652

方法的元数据包含在colData ()在比较中,每一行对应一个方法。

## 3行6列的数据框架## funcPKG func.pkg.vers func.pkg.manual参数。p参数。方法##      ## bonf stats 4.2.1 FALSE pval "bonferroni" ## BH stats 4.2.1 FALSE pval "BH" ## qv qvalue 2.30.0 FALSE pval NA ## session.idx ##  ## bonf 1 ## BH 1 ## qv 1

属性指定的函数和参数的列之外调用addMethod ()Func, post, label, param.*),colData ()控件期间添加的其他几个列buildBench ()的过程。的包名和版本的列函数如有的话(func.pkgfunc.pkg.vers).

可用时,地面实况数据包含在rowData ()SummarizedBenchmark对象。

##数据帧的50行和1列## H ## <数值> ## 1 1 ## 2 0 ## 3 1 ## 4 1 ## 5 1 ## ... ...## 46 0 ## 47 1 ## 48 0 ## 49 1 ## 50

此外,SummarizedBenchmark类包含一个额外的插槽,用户可以在其中定义性能指标以评估不同的方法。由于不同的基准测试实验可能需要使用不同的指标来评估方法的性能,因此SummarizedBenchmark类提供了定义性能指标的灵活方法。我们可以使用函数定义性能指标addPerformanceMetric ()通过提供SummarizedBenchmark对象、度量的名称、分析名称以及定义它的函数。重要的是,该函数必须包含以下两个参数:query(引用正在计算的值向量,即一个方法的输出)和truth(引用基本真理向量)。如果为性能函数提供了进一步的参数,则这些参数必须包含默认值。

对于我们的示例,我们定义了性能度量“TPR”(真阳性率),它计算给定alpha值后恢复的真阳性的比例。此性能度量使用H我们的实验SummarizedBenchmark实例对象。

## $TPR ##函数(查询,true, alpha = 0.1) {## goodHits <- sum((查询< alpha) & truth == 1) ## goodHits / sum(truth == 1) ##}

定义了所有所需的性能指标之后,函数estimatePerformanceMetrics ()为每个方法计算这些。性能函数的参数可以在这里传递。在下面的例子中,我们指定了几个α=用于计算每个函数的性能指标的值。

## 3行9列的数据帧PKG func.pkg.vers func.pkg.manual参数。p参数。方法##      ## bonf stats 4.2.1 FALSE pval "bonferroni" ## BH stats 4.2.1 FALSE pval "BH" ## qv qvalue 2.30.0 FALSE pval NA ## session.idx TPR.1 TPR.2 TPR.3 ##     ## bonf 1 0.125 0.20 0.225 ## BH 1 0.375 0.55 0.625 ## qv 1 0.600 0.70 0.900

默认情况下,上面的函数返回一个DataFrame,其中性能函数的参数存储在其elementMetadata ()

## colType分析性能测试alpha ## <字符> <字符> <字符> <数字> ## func。func.pkg. pkg methodInformation NA NA NA ## func.pkg.vers methodInformation NA NA NA ## func.pkg.manual methodInformation NA NA NA ##参数。p methodInformation NA NA NA ##参数。方法方法Information NA NA NA ## session.idx methodInformation NA NA NA ## TPR.1 performanceMetric H TPR 0.05 ## TPR.2 performanceMetric H TPR 0.10 ## TPR.3 performanceMetric H TPR 0.20

第二种可能是设置参数addColData = TRUE将这些结果存储在colData ()SummarizedBenchmark对象。

## 3行10列的数据框架## funcPKG func.pkg.vers func.pkg.manual参数。p参数。方法##      ## bonf stats 4.2.1 FALSE pval "bonferroni" ## BH stats 4.2.1 FALSE pval "BH" ## qv qvalue 2.30.0 FALSE pval NA ## session.idx TPR.1 TPR.2 TPR.3 pm.session ##      ## bonf 1 0.125 0.20 0.225 1 ## BH 1 0.375 0.55 0.625 1 ## qv 1 0.600 0.70 0.900 1
## colType分析性能测试alpha ## <字符> <字符> <字符> <数字> ## func。func.pkg. pkg methodInformation NA NA NA ## func.pkg.vers methodInformation NA NA NA ## func.pkg.manual methodInformation NA NA NA ##参数。p methodInformation NA NA NA ##参数。方法方法Information NA NA NA ## session.idx methodInformation NA NA NA ## TPR.1 performanceMetric H TPR 0.05 ## TPR.2 performanceMetric H TPR 0.10 ## TPR.3 performanceMetric H TPR 0.20 ## pm.session performanceMetricSes.. NA NA NA

最后,如果用户喜欢更整洁的格式,通过设置参数tidy = TRUE该函数返回结果的长格式版本。

# # func。PKG func.pkg.vers func.pkg.manual参数。p参数。方法session.idx ## 1 stats 4.2.1 FALSE pval "bonferroni" 1 ## 2 stats 4.2.1 FALSE pval "BH" 1 ## 3 qvalue 2.30.0 FALSE pval  1 ## 4 stats 4.2.1 FALSE pval "bonferroni" 1 ## 5 stats 4.2.1 FALSE pval "BH" 1 ## 6 qvalue 2.30.0 FALSE pval  1 ## 7 stats 4.2.1 FALSE pval "bonferroni" 1 ## 8 stats 4.2.1 FALSE pval "BH" 1 ## 9 qvalue 2.30.0 FALSE pval  1 ## pm.session label value assay performanceMetric alpha ## 1 1 bonf 0.125 H TPR 0.05 ## 2 1 BH 0.375 H TPR 0.05 ## 3 1 qv 0.600 H TPR 0.05 ## 4 1 bonf 0.200 H TPR 0.10 ## 5 1 BH 0.550 H TPR 0.10 ## 6 1 qv 0.700 H TPR 0.10 ## 7 1 bonf 0.225 H TPR 0.20 ## 8 1 BH 0.625 H TPR 0.20 ## 9 1 qv 0.900 H TPR 0.20

作为另一种选择data.frame与前面的块一样,我们可以调用该函数tidyUpMetrics ()中保存的结果SummarizedBenchmark对象。

# # func。PKG func.pkg.vers func.pkg.manual参数。p参数。方法session.idx ## 1 stats 4.2.1 FALSE pval "bonferroni" 1 ## 2 stats 4.2.1 FALSE pval "BH" 1 ## 3 qvalue 2.30.0 FALSE pval  1 ## 4 stats 4.2.1 FALSE pval "bonferroni" 1 ## 5 stats 4.2.1 FALSE pval "BH" 1 ## 6 qvalue 2.30.0 FALSE pval  1 ## pm.session label value assay performanceMetric alpha ## 1 1 bonf 0.125 H TPR 0.05 ## 2 1 BH 0.375 H TPR 0.05 ## 3 1 qv 0.600 H TPR 0.05 ## 4 1 bonf 0.200 H TPR 0.10 ## 5 1 BH 0.550 H TPR 0.10 ## 6 1 qv 0.700 H TPR 0.10

例如,下面的代码为Bonferroni方法提取alpha为0.1的TPR。

##值## 1

3.下一个步骤

这个小插图描述了最小的结构SummarizedBenchmark框架,使用BenchDesign而且SummarizedBenchmark类。这对于构建和执行简单的基准测试应该足够了,但对于更复杂的基准测试实验可能还不够。的更详细示例SummarizedBenchmark概要基准:完整的案例研究小插图和其他功能可以找到各种功能小插曲。的更完整的描述BenchDesign而且SummarizedBenchmark类可以在SummarizedBenchmark:类详细信息装饰图案。

参考文献

Benjamini, Yoav, Yosef Hochberg, 1995。控制错误发现率:一种实用而强大的多重测试方法。皇家统计学会杂志。乙组(方法学), 289 - 300。

Dunn, Olive Jean, 1961。“手段之间的多重比较。”美国统计协会杂志56(293): 52-64。

John D. Storey, 2002。《关于错误发现率的直接方法》皇家统计学会学报:B辑(统计方法学)64(3): 479-98。