我有 1000 个列表,每个列表都有多个时间序列。我想将预测应用于列表中的每个元素。就计算资源而言,这已成为一个棘手的问题。我没有并行计算或高级 R 编程方面的背景知识。任何帮助将不胜感激。
我创建了虚拟列表。基本上, dat.list 与我正在研究的类似。
library("snow")
library("plyr")
library("forecast")
## Create Dummy Data
z <- ts(matrix(rnorm(30,10,10), 100, 3), start = c(1961, 1), frequency = 12)
lam <- 0.8
ap <- list(z=z,lam=lam)
## forecast using lapply
z <- ts(matrix(rnorm(30,10,10), 100, 3), start = c(1971, 1), frequency = 12)
lam <- 0.5
zp <- list(z=z,lam=lam)
dat.list <- list(ap=ap,zp=zp)
xa <- proc.time()
tt <- lapply(dat.list,function(x) lapply(x$z,function(y) (forecast::ets(y))))
xb <- proc.time()
上面的代码给了我我需要的东西。我想在上面的代码中对两个 lapply 应用并行处理。因此,我尝试使用 snow 包和本网站中显示的示例。
## Parallel Processing
clus <- makeCluster(3)
custom.function <- function(x) lapply(x$z,function(y) (forecast::ets(y)))
clusterExport(clus,"custom.function")
x1 <- proc.time()
tm <- parLapply(clus,dat.list,custom.function)
x2<-proc.time()
stopCluster(clus)
以下是我的问题,
- 出于某种原因,非并行版本的 tm 输出是不同的。预测函数 ets 应用于每个数据点,而不是列表中的元素。
非并行:
summary(tt)
Length Class Mode
ap 3 -none- list
zp 3 -none- list
平行版:
summary(tm)
Length Class Mode
ap 300 -none- list
zp 300 -none- list
我的第二个问题是我应该如何在自定义函数中并行化 lapply,基本上是嵌套的 parLapply
custom.function <- function(x) parLapply(clus,x$z,function(y) (forecast::ets(y))) ## 不工作
非常感谢您的帮助