因为它很大,我不能dput
在这里。但是假设realmatrix
是" mts"具有非平凡的价值
realmatrix <- matrix(NA, ncol = 100, nrow = 138)
实际上它存储了100个时间序列,长度(行)= 138(从2005年1月到2016年6月)。
我希望将Arima
预测(提前12个月:即2016年7月至2017年6月)存储在另一个矩阵farimamatrix
(应该有12行和100列)中,通过以下循环:
farimamatrix <- matrix(NA, nrow = 12, ncol = 100)
m <- k <- list()
for (i in 1:100) {
try(m[[i]] <- Arima(realmatrix[,i], order = c(0,1,0), seasonal = c(1,0,1)))
k[[i]] <- forecast.Arima(m[[i]], h=12)
farimamatrix[,i] <- fitted(k[[i]])
}
但我收到以下消息:
farimamatrix中的错误[,i]&lt; - 拟合(k [[i]]):
矩阵上的下标数量不正确
出了什么问题?提前谢谢。
已编辑(24/10):根据哲源的回答更新/更正,之前的问题已经消失
原始数据:
tsdata <-
structure(c(28220L, 27699L, 28445L, 29207L, 28482L, 28326L, 28322L,
28611L, 29187L, 29145L, 29288L, 29352L, 28881L, 29383L, 29898L,
29888L, 28925L, 29069L, 29114L, 29886L, 29917L, 30144L, 30531L,
30494L, 30700L, 30325L, 31313L, 32031L, 31383L, 30767L, 30500L,
31181L, 31736L, 32136L, 32654L, 32305L, 31856L, 31731L, 32119L,
31953L, 32300L, 31743L, 32150L, 33014L, 32964L, 33674L, 33410L,
31559L, 30667L, 30495L, 31978L, 32043L, 30945L, 30715L, 31325L,
32262L, 32717L, 33420L, 33617L, 34123L, 33362L, 33731L, 35118L,
35027L, 34298L, 34171L, 33851L, 34715L, 35184L, 35190L, 35079L,
35958L, 35875L, 35446L, 36352L, 36050L, 35567L, 35161L, 35419L,
36337L, 36967L, 36745L, 36370L, 36744L, 36303L, 36899L, 38621L,
37994L, 36809L, 36527L, 35916L, 37178L, 37661L, 37794L, 38642L,
37763L, 38367L, 38006L, 38442L, 38654L, 38345L, 37628L, 37698L,
38613L, 38525L, 39389L, 39920L, 39556L, 40280L, 41653L, 40269L,
39592L, 39100L, 37726L, 37867L, 38551L, 38895L, 40100L, 40950L,
39838L, 40643L, 40611L, 39611L, 39445L, 38059L, 37131L, 36697L,
37746L, 37733L, 39188L, 39127L, 38554L, 38219L, 38497L, 39165L,
40077L, 38370L, 37174L), .Dim = c(138L, 1L), .Dimnames = list(
NULL, "Data"), .Tsp = c(2005, 2016.41666666667, 12), class = "ts")
代码
library("forecast")
z <- stl(tsdata[, "Data"], s.window="periodic")
t <- z$time.series[,"trend"]
s <- z$time.series[,"seasonal"]
e <- z$time.series[,"remainder"]
# error matrix
ematrix <- matrix(rnorm(138 * 100, sd = 100), nrow = 138)
# generating a ts class error matrix
ematrixts <- ts(ematrix, start=c(2005,1), freq=12)
# combining the trend + season + error matrix into a real matrix
realmatrix <- t + s + ematrixts
# creating a (forecast) arima matrix
farimamatrix <- matrix(NA, ncol = 100, nrow = 12)
m <- k <- vector("list", length = 100)
for (i in 1:100) {
try(m[[i]] <- Arima(realmatrix[,i], order = c(0,1,0), seasonal = c(1,0,1)))
print(i)
k[[i]] <- forecast.Arima(m[[i]], h = 12)
farimamatrix[,i] <- k[[i]]$mean
}
# ts.plot(farimamatrix[,1:100],col = c(rep("gray",100),rep("red",1)))
循环似乎有效,但由于Arima
失败而在几次迭代后发生故障:
stats :: arima中的错误(x = x,order = order,seasonal = seasonal,include.mean = include.mean,:&#34;来自CSS的非固定季节性AR部分
答案 0 :(得分:1)
是的,上一个问题已经消失,现在你遇到了一个新问题,关于Arima
的失败。严格来说,你应该提出一个新的问题。但无论如何我会在这里回答。
错误消息非常具有说明性。当您拟合模型ARIMA(0,1,0)(1,0,1)
时,有时季节性部分是非平稳的,因此需要进一步的季节差异。
通过查看ts.plot(realmatrix)
,我发现realmatrix
的所有100列非常相似。因此,我将取出第一栏进行分析。
x <- realmatrix[,1]
显然,非季节性差异是必须的,但我们是否也需要季节性差异?请查看ACF
acf(diff(x))
我们实际上发现了有关季节性模式的有力证据。所以,是的,需要季节性差异。
现在让我们在两个差分后检查ACF:
acf(diff(diff(x, lag = 12))) ## first do seasonal diff, then non-seasonal diff
季节之间似乎出现了负增长,表明季节性MA过程。所以ARIMA(0,1,0)(0,1,1)[12]
是一个不错的选择。
fit <- arima(x, order = c(0,1,0), seasonal = c(0,1,1))
检查残差:
acf(fit$residuals)
我实际上对这个结果感到非常高兴,因为根本没有滞后1甚至滞后2自相关,并且也没有季节性自相关。您实际上可以尝试进一步添加季节性和/或非季节性AR(1),但不会有任何改进。所以这是我们的最终模型。
所以使用以下循环:
farimamatrix <- matrix(NA, ncol = 100, nrow = 12)
m <- k <- vector("list", length = 100)
for (i in 1:100) {
m[[i]] <- Arima(realmatrix[,i], order = c(0,1,0), seasonal = c(0,1,1))
print(i)
k[[i]] <- forecast.Arima(m[[i]], h = 12)
farimamatrix[,i] <- k[[i]]$mean
}
现在所有100个模型拟合都是成功的。
回顾性反思
也许我应该解释为什么ARIMA(0,1,0)(1,0,1)[12]
模型在初始答案中适用于我的模拟数据。因为请注意我如何模拟我的数据:
seasonal <- rep_len(sin((1:12) * pi / 6), 138)
是的,潜在的季节性模式是真正的复制,当然也是固定的。