如何创建一个向量来存储R中列表的预测值?

时间:2018-03-11 21:57:57

标签: r vector forecasting arima

我正在为项目开发一个预测循环,我一直在使用函数sarima.for形成包ASTSA来执行预测。

最初,我预测地平线上只有1个观察点,我能够将预测值存储在我创建的矢量中。

然而,当我预测循环预测地平线前方的两个观测时,不知何故只存储了第一个值。

我创建了矢量

fc_values <- double(12) 

但如上所述,仅适用于1 n.adead = 1

的预测

然后我创建了一个矩阵,看看它是否有效

 fc_values=matrix(nrow = 12, ncol=2)

但它没有奏效。

这是该功能预测预测的一个例子

$pred
      Jan      Feb
2012 20.65135 20.68599

$se
      Jan      Feb
2012 1.734058 2.911538

从预测函数sarima.for生成的对象类是&#34; list&#34;。

当我刚预测一个值时,它适用于下面的示例

varii <- sarima.for( xdata = x , n.ahead =1 , 1,0,1) 
fc_values <- varii$pred

但现在有2个值,它不起作用,并出现以下错误:

 Not enough forecasts. Check that forecasts and test data match.
 In addition: Warning messages:
 1: In fc_valuesl[i] <- varii$pred :
 number of items to replace is not a multiple of replacement length

这是一个TS作为例子

     Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov
2008                                                         135.62 213.84 347.80
2009 542.13 462.34 399.07 213.86 122.86  70.32  23.02  23.58  71.64 245.10 310.74
        Dec
2008 467.15
2009 499.75

对于如何构建一个向量来存储sarima.for命令产生的2个预测值,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您没有提供存储时间序列的示例,但这里有一些选项。

set.seed(1)
x <- rnorm(100)
y <- rnorm(100)

是两个样本时间序列。

使用未指定长度的矢量看起来像

fc_vec1 <- numeric()
fc_vec1 <- c(fc_vec1, sarima.for(x, 2, 1, 0, 1)$pred)
fc_vec1 <- c(fc_vec1, sarima.for(y, 2, 1, 0, 1)$pred)
fc_vec1
# [1]  0.10913776  0.10869919  0.00957128 -0.05164050

也就是说,我们不断向向量添加新元素。然而,这不是最好的选择。您似乎也知道预测的数量。因此,我们可以在定义时指定向量长度:

fc_vec2 <- numeric(4)
fc_vec2[1:2] <- sarima.for(x, 2, 1, 0, 1)$pred
fc_vec2[3:4] <- sarima.for(y, 2, 1, 0, 1)$pred
fc_vec2
# [1]  0.10913776  0.10869919  0.00957128 -0.05164050

鉴于您的预测来自不同的时间序列,但是连接到单个向量并不是很有吸引力。因此,使用矩阵更好:

fc_mat <- matrix(NA, 2, 2)
fc_mat[1, ] <- sarima.for(x, 2, 1, 0, 1)$pred
fc_mat[2, ] <- sarima.for(y, 2, 1, 0, 1)$pred
fc_mat
#            [,1]       [,2]
# [1,] 0.10913776  0.1086992
# [2,] 0.00957128 -0.0516405

将所有时间序列存储在单个对象中是个好主意。例如,如果我们将它们放在列表Z中,那么我们可以更简洁:

Z <- list(x, y)
sapply(Z, function(z) sarima.for(z, 2, 1, 0, 1)$pred)
#           [,1]        [,2]
# [1,] 0.1091378  0.00957128
# [2,] 0.1086992 -0.05164050