将模型应用于多个时间序列

时间:2013-11-26 18:34:58

标签: r xts

假设我有多个时间序列,我想要预测。如果我有适当的时间序列对象,我可以适合(例如)ARIMA模型等等。但是,我知道当所有系列都在一个 xts 对象中时,必须有一种简单的方法来自动执行此过程(不考虑不同的变量可能需要不同的ARIMA模型;这可能是一个问题下一次)。

作为xts对象的一些示例数据(六个不同业务的每日收入):

library(xts)

ts <- structure(c(534L, 549L, 636L, 974L, 848L, 895L, 1100L, 1278L, 
1291L, 1703L, 1532L, 533L, 619L, 642L, 939L, 703L, 759L, 1213L, 
1195L, 1153L, 1597L, 1585L, 649L, 597L, 628L, 924L, 703L, 863L, 
1261L, 1161L, 1212L, 1616L, 1643L, 583L, 694L, 611L, 891L, 730L, 
795L, 1242L, 1210L, 1159L, 1501L, 1702L, 513L, 532L, 580L, 917L, 
978L, 947L, 1227L, 1253L, 1121L, 1697L, 1569L, 646L, 636L, 516L, 
869L, 980L, 937L, 1173L, 1203L, 1204L, 1511L, 1640L), .Dim = c(11L, 
6L), .Dimnames = list(NULL, c("Americas_Globe", "Americas_Lucky", 
"Americas_Star", "Asia_Star", "EuroPac_Globe", "EuroPac_Lucky"
)), index = structure(c(1367384400, 1367470800, 1367557200, 1367643600, 
1367730000, 1367816400, 1367902800, 1367989200, 1368075600, 1368162000, 
1368248400), tzone = "", tclass = c("POSIXlt", "POSIXt")), .indexCLASS = c("POSIXlt", 
"POSIXt"), tclass = c("POSIXlt", "POSIXt"), .indexTZ = "", tzone = "", class = c("xts", 
"zoo"))

我可以从这个对象中提取一个时间序列...

ts.amerglob <- ts[,1] #Extract the "Americas_Global company time-series

然后对其进行建模(例如,为了适应ARIMA模型):

ts.ag.arima <- arima(ts.amerglob, order=c(0,1,1))

并进行预测

ts.ag.forecasts <- forecast.Arima(ts.ag.arima, h=5)

但是如果我想为这个 ts 对象中的6家公司中的每一家做这件事呢?

在拟合标准回归模型时,我使用by()来做与数据子集类似的事情。但是在这里应用这种方法似乎不起作用:

co.arima <- by(ts, ts[,1:6],
    function(x) arima(x, order=c(1,0,1)))

返回有关序列长度的错误:

error in tapply(seq_len(11L), list(INDICES = c(534L, 549L, 636L, 974L,  : 
  arguments must have same length

有没有简单的方法可以同时将时间序列模型应用于多个时间序列并提取相关信息?最后我要做的是将每个时间序列的预测分成一个数据框架或矩阵(但是能够在建模过程中使用中间步骤做同样的事情会很好,例如< em> auto.arima()每个时间序列的输出)...

1 个答案:

答案 0 :(得分:4)

只需在此使用lapply

res <- lapply(dat.ts,arima,order=c(1,0,1))

如果您想为每个时间系列使用不同的订单参数,可以使用Mapmapply

## generate a random list of orders
orders <- lapply(seq_len(ncol(dat.ts)),function(x)sample(c(0,1),3,rep=T))
## for each serie compute its arima with its corresponding order
Map(function(x,ord)arima(x,ord),as.list(dat.ts),orders)

编辑使用auto.arima fom forecast包获取订单:

注意我很少使用这个软件包,所以我不确定最终的结果。我在这里只显示了使用lapply的想法:

orders <- lapply(dat.ts,function(x){
             mod <- auto.arima(x)
             mod$arma[c(1, 6, 2, 3, 7, 4, 5)][1:3]
 })
$Americas_Globe
[1] 0 1 0
$Americas_Lucky
[1] 0 1 0
$Americas_Star
[1] 0 1 1
$Asia_Star
[1] 0 1 0
$EuroPac_Globe
[1] 0 1 0
$EuroPac_Lucky
[1] 0 1 0