应用模型于多个时间序列

5
假设我有多个时间序列需要进行预测。如果我对每个序列都有相应的时间序列对象,我可以拟合(为了举例)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

有没有一种简单的方法可以同时应用时间序列模型到多个时间序列中,并提取相关信息?最终,我想要做的是将每一个时间序列的预测结果放入一个数据框或者矩阵中(但是如果能够对模型过程中的中间步骤,例如每个时间序列的auto.arima()输出,进行同样的操作就更好了)...

1个回答

5

在这里只需使用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)

编辑使用forecast包中的auto.arima函数获取订单:

请注意,我很少使用这个包,所以我不确定最终结果。 这里只展示使用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

这太棒了,正是我想要的。但是现在如果我想对拟合的ARIMA模型的预测执行相同的操作,就会遇到问题。看起来我应该能够使用res对象并使用相同的lapply方法创建一个预测矩阵,类似于:lapply(res, forecast.Arima,h=5)... - Marc Tulla
另外,作为一个单独的(相关的)问题:是否有一种方法可以通过auto.arima()将建议的ARIMA顺序参数提取到列表中?如果我要做这样的事情:res <- lapply(dat.ts,auto.arima),以获取订单列表,并将其用作map函数的最终参数? - Marc Tulla
你可以使用 lapply(res, forecast.Arima, h=5) 或者更加明确的 lapply(res, function(model) forecast.Arima(model, h=5)) - agstudy
太好了!但现在我遇到了一个问题:如果我手动运行lapply ARIMA代码,而不是使用orders函数将订单映射到每个ARIMA模型,我可以执行lapply(res, forecast.Arima) ...但是如果我使用那个orders函数,它会正确地映射到模型,但是当我将该映射输入到forecast.Arima函数时,会出现错误:“ts(x)中的错误:'ts'对象必须具有一个或多个观察值”...你知道为什么吗?我找不到这两个对象之间的任何区别... - Marc Tulla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接