首页 > 解决方案 > 通过 future_mapply 应用的加速功能

问题描述

我编写了一个函数来为 91 个时间序列模型进行反向逐步 arima 建模。

该函数有两个输入:

  1. a list of time series objects
  2. a list of data frames

功能如下:

backward_stepwise<-function(x, y){
  repeat{
    arima_result<-auto_arima(x)
    last_col<-colnames(x)[ncol(x)]
    names(arima_result$coef)<-gsub(pattern = "xreg", replacement = last_col,
                                  x = names(arima_result$coef))
    arima_pvals<-p_calc(arima_result)
    arima_outputs<-run_outputs(arima_result, arima_pvals)
    arima_ranked<-rank_pval(arima_outputs)
    remove_num_one<-remove_one(arima_ranked)
    y<-subset(y, select = colnames(y) != remove_num_one)
    x<-as.ts(y)

    if(min(arima_ranked$rank, na.rm = TRUE) != 1){
      break
    }

  }

  return(list(arima_result, arima_ranked))
}

在哪里:

auto_arima<-function(x){
  arima_results<-auto.arima(x[,2], xreg = x[,3:ncol(x)], approximation = FALSE, stepwise = FALSE)
}
p_calc<-function(x){
  p_vals<-round((1-pnorm(abs(x$coef)/sqrt(diag(x$var.coef))))*2, digits = 3)
  p_vals<-broom::tidy(p_vals)
}
run_outputs<-function(x, y){
  outputs<-x$coef
  outputs<-broom::tidy(outputs)
  outputs<-cbind(outputs, y)
  outputs<-outputs[,c(1,2,4)] # selecting columns to include
  setNames(object = outputs, nm = c("term", "coef", "pval")) # naming colums of outputs

}
rank_pval<-function(x){
  x["rank"]<-NA
  cond<-{substr(x$term,1,2) != "ar" &
      substr(x$term,1,2) != "ma" &
      substr(x$term, 1, nchar(x$term)) != "intercept" &
      substr(x$term, 1, nchar(x$term)) != "drift" &
      x$pval > 0.2}

  x[cond, "rank"]<-rank(-x[cond,]$pval, na.last = NA)

  return(x)

}
remove_one<-function(x){
  x<-subset(x$term, subset = x$rank == 1)

}
cond_select<-function(x, y){
  x<-subset(x, select = names(x) != y)
  x<-ts(x)
}

最快的实现(68.69 秒)是使用:

plan(multiprocess)
ts_outputs<-future_mapply(backward_stepwise, list_ts_actual, list_df_actual, SIMPLIFY = FALSE)

我有哪些选择可以进一步加快速度?最终,我希望在本地机器上尽快运行。

我正在使用带有 Intel(R) Core(TM) i&7-7770HQ CPU 的戴尔 XPS 15 9560 - 4 核,8 个逻辑处理器。

我知道你不能通过 mcmapply 并行处理,因为你不能在 Windows 操作系统上分叉。

我尝试用 cmpfun 编译实际函数,但没有得到任何速度提升。

可能性:

我还有哪些其他选择?

感谢任何帮助或指导

标签: rmapply

解决方案


推荐阅读