You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:如何并行拟合分组时间序列的auto.arima模型?

并行ARIMA拟合的问题修正与优化方案

一、你的并行代码的核心问题

你提供的并行代码里未定义ARIMA_List对象——这个变量应该对应分组后的数据子集列表,也就是串行代码中nest()生成的data列。直接使用未赋值的ARIMA_List会导致运行报错,这是必须修正的点。

二、修正后的可运行并行代码(基于parallel包)

先补充分组数据列表的定义,再完成并行拟合:

library(dplyr)
library(forecast)
library(parallel)

# 先完成数据分组嵌套,提取分组数据列表
df_nested <- df %>% 
  group_by(Country, City) %>% 
  nest()
ARIMA_List <- df_nested$data  # 定义缺失的分组数据列表

# 初始化并行集群
no_cores <- detectCores() - 1
cl <- makeCluster(no_cores)

# 给每个集群节点加载必要的包
clusterEvalQ(cl, {
  library(forecast)
})

# 并行拟合ARIMA模型
ARIMA_Models <- parLapply(cl, ARIMA_List, function(x) {
  auto.arima(x$Count)
})

# 关闭集群
stopCluster(cl)

# 可选:将模型合并回原嵌套数据框,方便后续调用
df_nested <- df_nested %>% 
  mutate(arima_model = ARIMA_Models)

三、更简洁高效的实现方式

1. 使用furrr包(推荐)

furrr是purrr的并行扩展,语法和你原本的串行代码几乎一致,无需手动管理集群,上手成本低:

library(dplyr)
library(forecast)
library(furrr)

# 设置并行会话,使用核心数-1作为工作进程数
plan(multisession, workers = detectCores() - 1)

# 并行拟合模型,写法和串行的`lapply`几乎无差别
df_nested <- df %>% 
  group_by(Country, City) %>% 
  nest() %>% 
  mutate(arima_model = future_map(data, ~auto.arima(.x$Count)))

# 可选:恢复串行执行计划
plan(sequential)

2. 使用foreach+doParallel组合

这也是R中常用的并行框架,适合习惯循环写法的场景:

library(dplyr)
library(forecast)
library(foreach)
library(doParallel)

# 初始化并行集群并注册后端
no_cores <- detectCores() - 1
cl <- makeCluster(no_cores)
registerDoParallel(cl)

# 分组嵌套数据
df_nested <- df %>% 
  group_by(Country, City) %>% 
  nest()

# 并行循环拟合模型
ARIMA_Models <- foreach(sub_df = df_nested$data) %dopar% {
  auto.arima(sub_df$Count)
}

# 关闭集群
stopCluster(cl)

# 合并模型到数据框
df_nested <- df_nested %>% 
  mutate(arima_model = ARIMA_Models)

四、关键提示

  • 当分组数量极少时(比如你这里只有4组),并行计算的**启动开销(集群初始化、数据传递)**可能会超过并行带来的提速收益,只有当分组数多、单组模型拟合耗时较长时,并行才真正有价值。
  • 确保所有集群节点都安装了forecast等依赖包,否则会出现找不到函数的报错。

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:30:39