如何让 R 的 gamm 工作得更快?

机器算法验证 r 混合模式 计算统计
2022-03-02 20:25:38

昨晚我用 gamm() 开始了一个复杂的计算,这花了我...

     user        system       elapsed 
    9259.76      326.05     9622.64 (s)

...这意味着我花了 160 分钟或 2.67 小时进行计算。问题是我必须做大约 50 甚至 100 多个这些!所以我想知道是否有任何方法可以加快这些计算。我将 32 位与 64 位版本 (4gb) 和 R 2.12.2 进行了比较,以计算一个不太复杂的 gamm()。

32位解决方案

 User      System        elapsed 
 41.87        0.01       42.01

64位解决方案

  User      System      elapsed
 40.06        2.82       43.05

但使用 64 位需要更长的时间!

我现在的问题:

简单地购买更多内存是否有帮助,例如 8GB DDR3?还是会浪费钱?或者 R 2.13.0 中的编译器包是否能够正确处理?我不认为 rcpp 可以处理 gamm() 函数,还是我错了?

欢迎任何意见!

160 分钟过程的 gamm() 模型调用是:

  g1 <- gamm(CountPP10M    ~ s(tempsurf,bs="cr") 
                           + s(salsurf,bs="cr") 
                           + s(speedsurf,bs="cr") 
                           + s(Usurf,bs="cr")
                           + s(Vsurf,bs="cr")   
                           + s(Wsurf,bs="cr")
                           + s(water_depth,bs="cr")
                           + s(distance.to.bridge,bs="cr")
                           + s(dist_land2,bs="cr")
                           + s(Dist_sventa,bs="cr"),
                           data=data,
                           random=list(ID_Station=~1),
                           family=poisson,
                           methods="REML",
                           control=lmc)
            )
2个回答

由于大部分计算将在编译后的 C 代码中完成,因此您将无法在此处实现大幅加速。

如果您正在拟合相关结构,gamm()那么您可以简化您想要拟合的相关结构(即不要使用corARMA(p=1, .....)何时corAR1(....)就足够了。或者如果您每年有很多观察结果,则将相关性嵌套在几年内,而不是整个时间间隔.

如果您不适合相关结构,gam()可以适合简单的随机效应,并且如果您需要更复杂的随机效应,请考虑与mgcv由同一作者但使用lme4包()而不是较慢/较旧的nlme的gamm4包()。lmer()lme()

您可以尝试更简单的基础以获得平滑项;bs = "cr"而不是默认的薄板样条基。

如果所有其他方法都失败了,而您只是面临大数据问题,那么您能做的最好的事情就是利用多个内核(手动将作业拆分为 ncores 块并在夜间以 BATCH 模式运行它们,或者通过一个并行处理包R) 并在周末运行模型。如果你这样做,请确保你把你的gamm()调用包装起来,try()这样整个工作就不会因为你在运行过程中遇到收敛问题而停止。

如果gamm()是在 R 代码而不是 C 中,则可能值得使用 R 2.13 中新的字节码编译器。有一个名为的新核心包compiler,您可以使用该函数编译一个cmpfun()函数。

更多细节可以在这里找到: http ://www.r-bloggers.com/the-new-r-compiler-package-in-r-2-13-0-some-first-experiments/