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

How to create a vector to store predicted values from a list in R?

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

最初,我只预测了 horizon 上的 1 个观测值,并且我能够将预测值存储在我创建的向量中。

但是,当我预测循环以预测 horizon 上的两个观察结果时,不知何故只存储了第一个值。

我创建的矢量为

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 生成的 object 的

Class 是 "list".

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

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 个预测值的相关帮助,我将不胜感激。

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

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