【问题标题】:How to create a vector to store predicted values from a list in R?如何创建一个向量来存储 R 中列表中的预测值?
【发布时间】:2018-08-19 21:40:10
【问题描述】:

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

最初,我只预测了 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 生成的对象类别为“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 个预测值,我将不胜感激。

【问题讨论】:

    标签: r vector forecasting arima


    【解决方案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
    

    【讨论】:

    • 感谢@Julius 的反馈。
    猜你喜欢
    • 2019-08-30
    • 2011-02-07
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多