r - 通过 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 编译实际函数,但没有得到任何速度提升。
可能性:
- data.tables 和矩阵比数据框快
- 删除 rank 函数并简单地分配给最高的 p_value
我还有哪些其他选择?
感谢任何帮助或指导
解决方案
推荐阅读
- postgresql - 我们可以在 sequelize 的 WHERE 子句中写 REPLACE 函数吗?
- vim - 如何正确使用 vim 宏 - 488 Erro
- python - numpy 中的 arr[range(3)] 与 arr[:3] 的区别
- python - 如何在Python中匹配方括号中的日期时间
- api - 有没有办法在后端服务器启动时直接在 fastapi 中调用 api?
- angular - 为什么 Angular router.navigate 不导航?
- jquery - 无法读取未定义的属性“长度” - Fullcalendar
- c++ - 具有指向另一个类中的类实例的指针以及其他方式
- c# - 用户设备认证离线
- python-3.x - python的范围函数的实际范围是多少