内容

1简介

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

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

1.1案例研究

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

三种差分表达式测试方法的实现DESeq2刨边机,limma包被添加到基准测试中。和前面一样,每个方法的p值和log-fold change (LFC)值都被存储。

deseq2_run < -函数(countData, colData, design, contrast) {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(健康,系数=2edgeR_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对象查看是否有任何方法已经过时。默认情况下,该函数不会实际运行任何方法。

##更新摘要基准测试(dryrun) ---------------------------------- ##基准测试数据:不变(完整的数据缺失)## MD5哈希:3f41eeab0a157bf127e2b7ffb98ab685 ##名称:??##基准测试方法:## | | Need to | expired b| ## | Method | (Re)Run | Func Param Meta Post Vers | ## | deseq2 | N | N N N N N N N N N N | ## b| edgeR | N | N N N N N N N N N | ## | voom | N | N N N N N N N N N N N |

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

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

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

第二种调用方式updateBench ()是同时指定一个SummarizedBenchmark对象和BenchDesign对象。的结果会更新SummarizedBenchmark对象中包含任何新的或修改过的方法BenchDesign.两个对象之间的方法由方法标签来匹配。deseq2.方法中的一个方法作为示例,假设修改BenchDesign对象,并希望重新运行基准测试实验。我们首先创建一个modifiedBenchDesign对象,在其中修改单个方法的手动指定元数据。请注意,这只是一个简单的更新,通常不需要更新结果。

接下来,我们将对象传递给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 ()干跑= FALSE.当我们这样做时,只计算需要重新运行的两个方法。

##类:SummarizedBenchmark ## dim: 15677 4 ##元数据(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 funcc . 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.1504299 -0.7607029 -0.02921223 -0.1554938

2.1基准测试会话

注意,会话索引也存储在每个方法的列数据中。类的对应项可以快速地将方法映射到会话存储在对象元数据中的列表。

##数据框架,4行1列idx ## <数字> ## edgeR 1 ## voom 1 ## deseq2_ashr 2 ## deseq2 2 ##

如在SummarizedBenchmark:类详细信息装饰图案,会话的元数据中是否存储会话信息列表SummarizedBenchmark对象。每一项会话List包括在会话期间生成结果的方法名称、相应的方法结果、运行参数和会话信息。我们可以检查每个会话的方法列表,并查看它是否与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 ()使用参数rerun = FALSE.将此参数设置为将检测之前计算过哪些性能指标,并且只会重新计算已添加或修改的方法的指标。

## ##选项rerun被设置为“FALSE”:##仅为以下方法重新运行性能指标:deseq2_ashr, deseq2
##类:SummarizedBenchmark ## dim: 15677 4 ##元数据(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 funcc . PKG .vers…点。会话meta.note

参考文献

马修·斯蒂芬斯,2017年。“虚假发现率:一项新举措。”生物统计学18(2): 275-94。https://doi.org/10.1093/biostatistics/kxw041