【问题标题】:Forecasting the best current estimate based on univariate low-frequency data基于单变量低频数据预测最佳当前估计
【发布时间】:2021-12-24 18:45:30
【问题描述】:

假设我每年观察一次数据,并且我需要仅根据时间序列中的单变量历史观察得出最佳当前估计值。

date id value
2005-12-31 ABC 3150000
2006-12-31 ABC 5970000
2007-12-31 ABC 6640000
2008-12-31 ABC 6390000
2009-12-31 ABC 7130000
2010-12-31 ABC 7270000
2011-12-31 ABC 7030000
2012-12-31 ABC 7360000
2013-12-31 ABC 7470000
2014-12-31 ABC 7810000
2015-12-31 ABC 8690000
2016-12-31 ABC 8910000
2017-12-31 ABC 2820000
2018-12-31 ABC 4380000
2019-12-31 ABC 2720000
2020-12-31 ABC 2480000
2021-03-31 ABC w
2021-06-30 ABC x
2021-09-30 ABC y
2021-12-31 ABC z

我的想法是拟合 ARIMA 模型,然后在 ARIMA 模型的状态空间表示上使用卡尔曼滤波器来得出对下一次观察的最佳估计。

  1. 假设我不想只预测下一个年度数据点,而是得出季度估计值(wxyz),我的估计越远离最后的真实观察,就越不确定。有没有办法解决这个问题,你会怎么做?

  2. 我如何将预测的不确定性整合到估计中,离最后的真实观察越远?

  3. ARIMA + KF 是解决这个问题的最合适的方法吗,还是您能想到其他解决问题的方法?

我对用 R 或 Python 解决这个问题漠不关心。

感谢您分享您的想法。

这是我的数据集:

structure(list(date = c("2005-12-31", "2006-12-31", "2007-12-31", 
"2008-12-31", "2009-12-31", "2010-12-31", "2011-12-31", "2012-12-31", 
"2013-12-31", "2014-12-31", "2015-12-31", "2016-12-31", "2017-12-31", 
"2018-12-31", "2019-12-31", "2020-12-31", "2021-03-31", "2021-06-30", 
"2021-09-30", "2021-12-31"), id = c("ABC", "ABC", "ABC", "ABC", 
"ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", 
"ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC"), value = c("3150000", 
"5970000", "6640000", "6390000", "7130000", "7270000", "7030000", 
"7360000", "7470000", "7810000", "8690000", "8910000", "2820000", 
"4380000", "2720000", "2480000", "w", "x", "y", "z")), class = "data.frame", row.names = c(NA, 
-20L))

【问题讨论】:

    标签: python r forecasting arima kalman-filter


    【解决方案1】:

    我强烈建议您阅读 Rob Hyndman 关于该主题的书,因为他详细介绍了 ARIMA 和许多其他预测选择,并提供了超级实用的代码和建议:https://otexts.com/fpp2/ -

    对于您的问题,模型选择的选择当然取决于您愿意承担的假设。例如,根据错误的形式,您将拥有某种顺序的独特 ARIMA 模型。为了得到可信的东西,你可能应该确保数据是预先白化的,在我看来,所有这些都让人觉得很不自然。当然只是一个意见;无意判断。

    但因此,我倾向于像 Hyndman 文本中的许多非 ARIMA 样式的模型,例如预言机、神经网络、指数平滑等,它们通常对误差分布更加不可知,因此更关注时间序列的轮廓,并使用它来通知预测。无论哪种方式,看一下 R 中的一个简单示例,与我所说的一致。我希望它对您有所帮助。

    # your data (slightly updated)
    data <- structure(list(
      date = c(
      "2005-12-31", "2006-12-31", "2007-12-31",
      "2008-12-31", "2009-12-31", "2010-12-31", 
      "2011-12-31", "2012-12-31", "2013-12-31", 
      "2014-12-31", "2015-12-31", "2016-12-31", 
      "2017-12-31", "2018-12-31", "2019-12-31", 
      "2020-12-31"), 
      value = c(
        "3150000", "5970000", "6640000", "6390000", 
        "7130000", "7270000", "7030000", "7360000", 
        "7470000", "7810000", "8690000", "8910000", 
        "2820000", "4380000", "2720000", "2480000")), 
      class = "data.frame", 
      row.names = c(NA, -16L))
    
    # load some libs
    library(tidyverse)
    library(forecast)
    library(fable)
    library(fable.prophet)
    library(tsibble)
    
    data_ts <- data %>% 
      mutate(date = yearmonth(date),
             value = as.numeric(value)) %>% 
      as_tsibble()
    
    # take a look at the ts, if desired
    data_ts %>%
      autoplot(value) + 
      theme_minimal() + 
      labs(title = "Values Overtime",
           x = "Date",
           y = "Value")
    
    # fit models
    fit <- data_ts %>%
      model(
        `Naïve` = NAIVE(value), # include a (usually) good, simple model for comparison
        ARIMA = ARIMA(value),
        ETS = ETS(value),
        NNETAR = NNETAR(value)
      )
    
    # generate 2 year forecasts 
    forecast <- fit %>%
        forecast(h = 2) # could be "2 years" if desired
    
    # take a look; will generate a forecast for each year/h level
    forecast 
    
    OUTPUT:
    > forecast 
    # A fable: 8 x 4 [12M]
    # Key:     .model [4]
      .model     date               value    .mean
      <chr>     <mth>              <dist>    <dbl>
    1 Naïve  2021 Dec N(2480000, 3.5e+12) 2480000 
    2 Naïve  2022 Dec   N(2480000, 7e+12) 2480000 
    3 ARIMA  2021 Dec N(3529357, 3.3e+12) 3529357.
    4 ARIMA  2022 Dec N(4204751, 4.7e+12) 4204751.
    5 ETS    2021 Dec N(2705245, 6.4e+11) 2705245.
    6 ETS    2022 Dec N(2705245, 9.8e+11) 2705245.
    7 NNETAR 2021 Dec        sample[5000] 3889162.
    8 NNETAR 2022 Dec        sample[5000] 4335662.
    

    【讨论】:

    • 嗨@pdw5。非常感谢您的回复和有用的示例。这是对过去一周我一直在玩弄的东西的一个很好的补充。我注意到这里的预测仍然是一年一次,只是两年后。我希望在年内更频繁地进行预测,并考虑到我的估计越远离上次年度观察越不确定的事实。这是您过去遇到过的事情吗?
    • 嗨@env11,很高兴能帮上一点忙。对于您关于更窄时间间隔(在这种情况下为一年)的问题,您可以采取许多特征工程步骤来分解您想要的时间序列。例如,看一下 r:business-science.github.io/timetk/articles/… 中的 timetk 包。并且回复:不确定性,我会在每个时间点计算误差,并相应地绘制。看看这里:otexts.com/fpp2/weekly.html。我希望这会有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2019-10-30
    • 1970-01-01
    相关资源
    最近更新 更多