2

我正在尝试对相同的模拟数据集上的几个统计测试进行强力的头对头比较。我将生成数千个“控制”和数千个“实验”种群,并在每组上运行相同的测试。调用测试的包装器将被调用数千次。

我的问题是:

  1. 下面的计划是一个好的计划吗?
  2. 你能想出任何方法来提高速度吗(不重写本机 R 函数,尽管我可以复制它们的内部代码的子集并只运行它而不是整个函数)?

计划

我已经有了模拟种群,并将使用适当的应用函数将控制和相应的实验观察传递给包装器。

除了控制和实验观察之外,包装器将没有任何参数(我们称它们为xxand yy)。其他所有内容都将在包装器中进行硬编码,以尽可能避免流控制逻辑的开销和在环境之间复制数据。

每个要调用的函数都将在单独的行上,以一致的格式,按依赖顺序排列(例如,在某种意义上,cox.zph依赖于已经存在的coxph对象,因此coxph()将在 之前调用cox.zph())。函数将被包装try(),如果一个函数失败,输出和依赖于它的函数首先测试它返回的对象是否try-error作为它的第一个类,如果有,某种占位符值。

被调用函数块后面将跟随一个长c()语句,其中从单独的行中的各个拟合对象中提取的每个项目。同样,如果源对象是try-error或占位符,则NA在该输出槽中放置一个。

这样,如果某些函数失败,整个运行不会中止,并且每个模拟的输出是相同长度的数字向量,适合捕获到矩阵。

根据给定模拟集的目标,我可以根据需要注释掉或插入额外的测试和结果。

一些更具体的后续问题

  1. 如果我已经在使用compilePKGS(T)and enableJIT(3)(来自内置库),通过手动运行或在我的包装函数及其调用的解释函数上compiler是否有任何进一步的收获?compile()cmpfun()
  2. 是否有人对选择最佳价值有任何指导enableJIT(),或者如果我不关心启动时间,“越多越好”吗?
  3. 如果每个模拟都是一个新的随机变量,我从记忆中没有任何收获,对吧?
  4. 对于长时间运行的任务,我喜欢让内部函数检查是否存在给定名称的文件,如果存在,则将其源到其环境中。这使我可以即时重新控制会话以修复问题、运行browser()、保存内部对象等,而无需中止整个运行。但是,我想 ping 通常会开始累加的文件系统。对于将布尔值(即调试脚本或不提供调试脚本)传递给正在运行的 R 进程(在 Linux 下)的最有效方式,是否存在共识?

谢谢。

4

1 回答 1

3

这可能只会解决您的部分问题。我也很幸运通过避免应用函数来加快进程。apply 不是矢量化的,实际上需要相当多的时间。我看到了使用嵌套 ifelse() 语句的好处。

你试过 Rprof() 吗?在我的案例中,它有助于识别我的代码中的慢速元素。本身不是解决方案,而是有用的诊断。

于 2013-05-14T21:59:19.393 回答