【问题标题】:How to reduce the computation time for an R program如何减少 R 程序的计算时间
【发布时间】:2018-07-12 18:05:15
【问题描述】:

我正在对时间序列数据执行预测,但我正在努力减少计算时间。这是代码示例。所以代码实际上预测了不同监测站的温度。对于 134 个站点,在我的计算机上大约需要 10 分钟。我在想是否有办法减少整体计算时间。

示例数据如下所示。全站共134个,观测时间为2个月。

date              station1        station2      station3         station4
18/01/2017 0:00     36.8           36.25           27.4            25.75
19/01/2017 0:00     30.71428571    34.6            29.4           22.33333333
20/01/2017 0:00     38.75          40.33333333     30.16666667    29.33333333
21/01/2017 0:00     40.83333333    40.33333333     31.2 3         2.25

dat1 <-read.csv("smart.csv")
library(forecast)
attach(dat1)
library(forecastHybrid)
ptm <- proc.time()
result<-data.frame(auto=0,nnetar=0)
for(i in 2:135) {
   temp.ts <-ts(dat1[i])
   train = temp.ts[1:600]
   test = temp.ts[601:620]

   hm3 <- hybridModel(train, weights = "equal", errorMethod = "MASE", models = 
"an")
   accuracy(hm3,individual = TRUE)
   hForecast <- forecast(hm3, h = 1) 
   result<-rbind(result,data.frame(auto=hForecast$pointForecasts[1],
                 nnetar=hForecast$pointForecasts[2]))
   fit_accuracy <- accuracy(hForecast, test)
}

proc.time()-ptm
write.csv(result, file= "xyz.csv")

【问题讨论】:

  • 当您给我们一些样本数据时,更容易回答问题。尽管如此,我发现的第一件事是您在每个步骤中都在增加结果数据框。我会在循环之前初始化最终维度(即results &lt;- list(135),然后将结果存储在该列表中。最后您可以将其转换为一个data.frame(即rbind.data.frame(results)
  • Profile 你的代码!如果大部分时间都花在hybridModel 上,那么就没有明显简单的方法来提高效率。
  • ...当然除了并行化。
  • 您能否提供数据样本,这将有助于发现您的瓶颈
  • 感谢@kath 的建议。我会试试看它是否有效。

标签: r time prediction computation


【解决方案1】:

鉴于示例,我假设您的数据框类似于

date<-seq(ymd_hm("2016-01-01 00:00"),ymd_hm("2017-09-11 00:00"),by="day")
station1<-runif(620)
station2<-runif(620)
station3<-runif(620)
station4<-runif(620)
dat1=data.frame(date,station1,station2,station3,station4)

如果是这种情况,您的代码会出错:

Error in testaccuracy(f, x, test, d, D) : 
  Not enough forecasts. Check that forecasts and test data match.

此错误是由循环的最后一行引起的:

fit_accuracy <- accuracy(hForecast, test)

因为 hForecast 的长度为 1,测试长度为 20。

所以我编写了以下代码,它运行得足够快:

forecastStation<-function(data){
  temp=ts(data)
  train = temp[1:600,]
  test = temp[601:620,]
  #hm3 <- hybridModel(train, weights = "equal", errorMethod = "MASE", models = "an")
  arimaModel <-auto.arima(train)
  netModel=nnetar(train)
  accuracy(arimaModel,individual = TRUE);accuracy(netModel,individual = TRUE)
  arimaPredict <- forecast(arimaModel, 1)$mean[1]
  netPredict<- forecast(netModel, 1)$mean[1]
  return(data.frame(auto=arimaPredict,nnetar=netPredict))
}
result<-do.call("rbind",lapply(2:5,function(x) FUN=forecastStation(dat1[x])))
result$Station=colnames(dat1)[2:5]

与您的主要区别在于,我不使用 hybridModel 函数,而是单独使用 auto.arima 和 nnetar

结果是表格中的数据框:

> result
       auto    nnetar  Station
1 0.4995727 0.4906344 station1
2 0.4907216 0.5045967 station2
3 0.5300489 0.5413126 station3
4 0.5021821 0.4951382 station4

领先一步的预测。我不确定您是否要提前 1 步或 2 步。如果是第二种情况,请将函数更改为:

forecastStation<-function(data){
  temp=ts(data)
  train = temp[1:600,]
  test = temp[601:620,]
  #hm3 <- hybridModel(train, weights = "equal", errorMethod = "MASE", models = "an")
  arimaModel <-auto.arima(train)
  netModel=nnetar(train)
  accuracy(arimaModel,individual = TRUE);accuracy(netModel,individual = TRUE)
  arimaPredict <- forecast(arimaModel, 20)$mean[1:20]
  netPredict<- forecast(netModel, 20)$mean[1:20]
  return(data.frame(auto=arimaPredict,nnetar=netPredict))
}

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多