内容

1简介

通常,基准分析是在多个步骤中迭代执行的,根据以前的结果添加或更新方法。此外,在基准测试研究的过程中,开发人员可能会更新方法以改进实现或添加新特性。2021欧洲杯体育投注开户理想情况下,每当更新或添加方法时,基准测试结果也应该更新。简单地说,基准测试中的所有方法都可以通过调用重新计算buildBench ()在原BenchDesign每当基准测试器注意到方法被更改时。然而,这不仅计算效率低,而且还需要基准测试人员手动检查是否有任何方法已经过时。

为了简化此过程,该包包含updateBench ()函数,该函数可用于检查是否有任何结果SummarizedBenchmark对象,并在必要时更新这些结果。

1.1案例研究示例

演示:演示…的使用updateBench (),我们使用相同的例子比较方法的微分表达式中使用总结基准:完整的案例研究装饰图案。的BenchDesign使用包中包含的RNA-seq计数数据和地面真相信息进行初始化。对数据进行更详细的描述完整的案例研究装饰图案。

差分表达式测试的三种方法实现DESeq2刨边机,limma包被添加到基准测试中。与前面一样,每种方法都存储p值和对数倍变化(LFC)值。

deseq2_run < -函数(countData, colData,设计,对比){dds < -DESeqDataSetFromMatrix(countDatacolData =colData,设计=设计)dds < -DESeq(dds)结果(dds,对比=对比)deseq2_pv < -函数(x) {xpvalue}deseq2_lfc < -函数(x) {xlog2FoldChange}edgeR_run < -函数(countData, group, design) {y < -DGEList(countData组=集团)y < -calcNormFactors(y)des < -model.matrix(设计)y < -estimateDisp(y, des)符合< -glmFit(y, des)glmLRT(健康,系数=2)edgeR_pv < -函数(x) {x表格PValue}edgeR_lfc < -函数(x) {x表格logFC}voom_run < -函数(countData, group, design) {y < -DGEList(countData组=集团)y < -calcNormFactors(y)des < -model.matrix(设计)y < -(y, des)易趣lmFit(des), y)voom_pv < -函数(x) {xp.value (,2]}voom_lfc < -函数(x) {x系数(2]}bd < -双相障碍% > %调用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条件)某人< -buildBench(双相障碍,truthCols =cpv =“状态”利物浦=“利物浦”))

2使用updateBench

首先,updateBench ()能不能只叫一个单SummarizedBenchmark对象,以查看是否有任何方法已经过时。默认情况下,函数实际上不会运行任何方法。

## Update SummarizedBenchmark (dryrun) ---------------------------------- ## benchmark data: unchanged (full data missing) ## MD5 hash: 3f41eeab0a157bf127e2b7ffb98ab685 ## names: ??##基准方法:## | |需要|过时| ## |方法| (Re)运行| Func Param Meta Post Vers | ## | deseq2 | N | N N N N N N | ## | edgeR | N | N N N N N N | ## | vom | N | N N N N N N |

输出是一个表,显示是否需要重新评估任何方法,以及方法的哪些组件现在已经过时。在这里,标题对应于:

可以看出N年代下需要(重新)运行,一切结果在SummarizedBenchmark仍然有效,并且不需要重新运行任何方法。还要注意,基准测试数据被列为完整的数据丢失.这是因为SummarizedBenchmark对象只包含MD5哈希原始数据的。(可选地,完整的数据可以存储在SummarizedBenchmark通过指定对象keepData = TRUE在最初的buildBench ()上面的调用。然而,默认情况下不这样做,以防止复制大型数据集。)如果需要更新任何方法,则必须将原始数据指定为updateBench ()使用data =参数。

# # (BDData BenchDesign数据 ) ---------------------------------- ## 类型:f41eeab0a157bf127e2b7ffb98ab685 md5hash # # MD5哈希:3

第二种呼叫方式updateBench ()是同时指定a吗SummarizedBenchmark对象和一个BenchDesign对象。直观地说,这将导致更新的结果SummarizedBenchmark对象中包含任何新的或修改的方法BenchDesign.两个对象之间的方法通过方法标签来匹配,例如:deseq2.作为一个例子,假设我们修改BenchDesign对象,并希望重新运行基准测试实验。我们首先创建一个修改过的BenchDesign对象,在该对象中修改单个方法的手动指定元数据。注意,这只是一个微不足道的更新,通常不需要更新结果。

接下来,我们将对象传递给updateBench ()和原始的SummarizedBenchmark对象。

# #更新SummarizedBenchmark (dryrun ) ---------------------------------- ## 基准数据:不变# # MD5哈希:3 f41eeab0a157bf127e2b7ffb98ab685 # #的名字:coldat cntdat地位利物浦# #基准方法:# # | |过时需要| | # # | |方法(重新)|运行函数参数元后更| # # | deseq2 | | N N Y N N辊| | # # | | N N N N N | # # |轰| | N N N N N |

注意现在需要(重新)运行而且列现在设置为Ydeseq2方法中该方法的元数据已过时SummarizedBenchmark对象,现在需要重新运行该方法。接下来,假设我们还决定在比较中添加一个新方法。这里,我们在基于自适应收缩(ASH)的比较中添加了DESeq2的替代版本史蒂芬斯(2017)

现在我们看到的是修改后的deseq2而且deseq2_ashr方法被列为需要重新运行。

# #更新SummarizedBenchmark (dryrun ) ---------------------------------- ## 基准数据:不变# # MD5哈希:3 f41eeab0a157bf127e2b7ffb98ab685 # #的名字:coldat cntdat地位利物浦# #基准方法:# # | |过时需要| | # # | |方法(重新)|运行函数参数元后更| # # | deseq2 | | N N Y N N辊| | # # | | N N N N N | # # |轰| | N N N N N | # # | deseq2_ashr | Y  | - - - - - |

要运行更新,只需修改对的调用updateBench ()dryrun = FALSE.当我们这样做时,只计算需要重新运行的两个方法。

## class: SummarizedBenchmark ## dim: 15677 4 # metadata(1): sessions ## assays(2): pv lfc ## rownames: NULL ## rowData names(2): pv lfc ## colnames(4): edgeR voom deseq2_ashr deseq2 ## colData names(10): func。pkg func.pkg.vers……session.idxmeta.note

我们可以检查输出,看看的结果deseq2_ashr方法已随更新的deseq2结果。

## edgeR voom deseq2_ashr deseq2 ## [1,] 3.6767779 3.5232524 3.40956538 3.7329019 ## [2,] -5.3773940 -5.5543949 -5.32293232 -5.3905346 ## [3,] -10.2467488 -8.2533275 -9.20816381 -9.7125453 ## [4,] -0.4547095 -1.0510456 -0.08956298 -0.4706410 ## [5,] 3.7024426 3.9084940 3.61844601 3.7048724 ## [6,] - 0.150499 -0.7607029 -0.02921223 -0.1554938

2.1基准测试会话

注意,会话索引也存储在每个方法的列数据中。的对应条目可以使用此方法快速映射到会话存储在对象元数据中的列表。

4行1列的数据帧idx# #  ## edgeR 1 ## voom 1 ## deseq2_ashr 2 ## deseq2 2

正如在SummarizedBenchmark:类的细节装饰图案,会话的元数据中是否存储会话信息的列表SummarizedBenchmark对象。的每一项会话列表包括在会话期间生成结果的方法名称、相应的方法结果、运行参数和会话信息。我们可以检查每个会话的方法列表,并查看它是否与session.idx上面的值。

# # # #[1]([1])”轰“刨边机” " ## ## [[ 2]] # #[1]“deseq2_ashr”“deseq2”

作为另一个例子,我们还可以比较newSummarizedBenchmark反对原始的对象BenchDesign.默认情况下,updateBench ()将保存所有的方法在SummarizedBenchmark对象,即使在new中没有找到相应的方法BenchDesign对象。为了避免这种行为,我们可以指定keepAll = FALSE

# #更新SummarizedBenchmark (dryrun ) ---------------------------------- ## 基准数据:不变# # MD5哈希:3 f41eeab0a157bf127e2b7ffb98ab685 # #的名字:coldat cntdat地位利物浦# #基准方法:# # | |过时需要| | # # | |方法(重新)|运行函数参数元后更| # # | deseq2 | | N N Y N N辊| | # # | | N N N N N | # # |轰| | N N N N N | # # | deseq2_ashr |下降  | - - - - - |

正如预期,deseq2方法必须再次更新以返回与原始方法定义匹配的值,而更新的deseq2_ashr方法必须被删除。

3.更新性能指标

如果用户更新BenchDesign,可以仅为已添加或修改的方法计算性能指标。例如,当计算性能指标的计算成本很高时,该特性非常有用。在下面的例子中,我们计算原产品在名义上的10% FDR阈值下的拒绝数量SummarizedBenchmark对象。(注意,我们这样做,而不是直接计算更新的性能指标SummarizedBenchmark仅供说明之用。)

然后,我们更新BenchDesign然后重新运行函数estimatePerformanceMetrics ()与参数重新运行= FALSE.将此参数设置为将检测哪些性能指标以前已经计算过,并且只会重新计算已添加或修改的方法的指标。

## ## Option rerun设置为' FALSE ':仅针对以下方法重新运行性能指标:deseq2_ashr, deseq2
## class: SummarizedBenchmark ## dim: 15677 4 # metadata(1): sessions ## assays(2): pv lfc ## rownames: NULL ## rowData names(2): pv lfc ## colnames(4): edgeR voom deseq2_ashr deseq2 ## colData names(12): func。pkg func.pkg.vers……点。会话meta.note

参考文献

斯蒂芬斯,马修。2017。“错误发现率:一项新的交易。”生物统计学18(2): 275 - 94。https://doi.org/10.1093/biostatistics/kxw041