SummarizedBenchmark
包,用于使用示例案例研究处理迭代基准测试。SummarizedBenchmark包版本:2.16.0 "SummarizedBenchmark 2.16.0
通常,基准测试分析是在多个步骤中迭代执行的,并根据以前的结果添加或更新方法。此外,在基准测试研究的过程中,开发人员可能会更新方法以改进实现或添加新特性。bob电竞体育官网理想情况下,每当更新或添加方法时,基准测试结果也应该更新。简单地说,基准测试中的所有方法都可以通过调用重新计算buildBench ()
关于原版BenchDesign每当基准测试器注意到某个方法已更改时。然而,这不仅计算效率低,而且还需要基准测试器手动检查是否有任何方法已经过时。
为了简化此过程,包中包含updateBench ()
函数,该函数可用于检查是否有任何结果SummarizedBenchmark对象需要更新,并在必要时更新这些结果。
演示…的用法updateBench ()
,我们使用相同的例子,比较方法差分表达式中使用概要基准:完整的案例研究装饰图案。的BenchDesign使用包中包含的RNA-seq计数数据和地面真相信息进行初始化。数据将在完整案例研究装饰图案。
图书馆(“limma”)图书馆(“磨边机”)图书馆(“DESeq2”)图书馆(“tximport”)数据(soneson2016)mycounts < -轮(txi$计数)mycoldat < -data.frame(条件=因素(代表(c(1,2),每一个=3.)))rownames(mycoldat) < -colnames(mycounts)mydat < -列表(coldat =mycoldat,cntdat =mycounts,状态=truthdat$的地位,利物浦=truthdat$logFC)bd < -BenchDesign(data =mydat)
三种差分表达式测试方法的实现DESeq2,刨边机,limma包被添加到基准测试中。和前面一样,每个方法的p值和log-fold change (LFC)值都被存储。
deseq2_run < -函数(countData, colData, design, contrast) {dds < -DESeqDataSetFromMatrix(countDatacolData =colData,设计=设计)dds < -DESeq(dds)结果(dds,对比=对比)}deseq2_pv < -函数(x) {x$pvalue}deseq2_lfc < -函数(x) {x$log2FoldChange}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) {x$p.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 =c(pv =“状态”,利物浦=“利物浦”))
首先,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 |
注意,现在需要(重新)运行
而且元
列现在设置为Y
为deseq2
方法,表明该方法的元数据在中已经过时SummarizedBenchmark对象,现在需要重新运行该方法。接下来,假设我们还决定向比较中添加一个新方法。在这里,我们在基于自适应收缩(ASH)的比较中添加了DESeq2的替代版本。史蒂芬斯(2017).
deseq2_ashr < -函数(countData, colData, design, contrast) {dds < -DESeqDataSetFromMatrix(countDatacolData =colData,设计=设计)dds < -DESeq(dds)lfcShrink(dds,对比=相比之下,类型=“ashr”)}bd2 < -调用addMethod(bd2“deseq2_ashr”,deseq2_ashr,帖子=列表(pv =deseq2_pv,利物浦=deseq2_lfc),params =rlang::、动荡频仍的(countData =cntdat,colData =coldat,设计=~条件下,对比=c(“条件”,“2”,“1”)))
现在我们看到它被修饰了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
注意,会话索引也存储在每个方法的列数据中。类的对应项可以快速地将方法映射到会话
存储在对象元数据中的列表。
##数据框架,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
方法必须删除。
如果用户更新BenchDesign,可以仅为已添加或修改的方法计算性能度量。例如,当性能指标的计算成本很高时,此特性非常有用。在下面的例子中,我们计算了原产品名义上10% FDR阈值的拒绝数量SummarizedBenchmark对象。(请注意,我们这样做,而不是直接计算更新的性能指标SummarizedBenchmark对象,仅用于说明目的。)
某人< -addPerformanceMetric(某人,分析=“光伏”,evalMetric =“拒绝”,evalFunction =函数(查询,真值){总和(p.adjust(查询,方法=“黑洞”)<0.1,na。rm =真正的)})某人< -estimatePerformanceMetrics(某人,addColData =真正的)
然后,我们更新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.