Как зациклить двойное экспоненциальное сглаживание Холта путем выборки бета-версии?

Я хочу прогнозировать сотни записей с различными альфа- и бета-версиями в цикле. Моя цель - зациклить результат холта по двум образцам бета-версии (0,1 и 0,9) в RStudio. Вот код:

library(forecast)
library(tidyverse)
library(magicfor)
magic_for(silent =  TRUE)
    dataset<- c(100,200,300,400,500,600,700,800,900,800,700)
    x<-c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9)

#-----------HOLT FOR BETA 0.1------------------

for (alpha in x) {
  des<-holt(dataset, alpha = alpha, beta=0.1)
  mape<-mean(abs(des$residuals)/des$x)*100
  put(beta=0.1, mape)
}
result01<-magic_result_as_dataframe()

#-----------HOLT FOR BETA 0.9------------------

for (alpha in x) {
  des<-holt(dataset, alpha = alpha, beta=0.9)
  mape<-mean(abs(des$residuals)/des$x)*100
  put(beta=0.9, mape)
}
result02<-magic_result_as_dataframe()

Но у меня ошибка в beta=0.9 и вот уведомление:

[1] "Model: ETS(A,A,N)" Error in ets(x, "AAN", alpha = alpha, beta = beta, phi = phi, damped = damped, : No model able to be fitted

Я обнаружил, что проблема связана с набором данных, где, если я поставлю 8 записей или меньше, он может прогнозировать с бета = 0,1, 0,9 и различными образцами альфа и бета. но если у него более 8 записей, он может прогнозировать только с бета = 0,1 и ниже (только 0,1, 0,01, 0,001, 0,0001), но это может быть ошибкой, если бета выше 0,1

не могли бы вы помочь мне исправить это? заранее спасибо


person Sergius Sarmose    schedule 25.06.2020    source источник


Ответы (1)


В параметризации, используемой holt(), бета должна быть меньше альфа. См. https://otexts.com/fpp2/estimation-and-model-selection.html для обсуждения этого.

Вот некоторый код, который делает то, что вы хотите, для диапазона альфа- и бета-значений.

library(forecast)
library(tidyverse)

dataset <- c(100, 200, 300, 400, 500, 600, 700, 800, 900, 800, 700)
get_mape <- function(x, alpha, beta) {
  des <- holt(dataset, alpha=alpha, beta=beta)
  mean(abs(des$residuals) / des$x) * 100
}
holt_mape <- expand.grid(
    alpha = c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9),
    betastar = c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)
  ) %>%
  mutate(
    beta = betastar * alpha,
    mape = map2_dbl(alpha, beta, get_mape, x=dataset)
  ) %>%
  as_tibble()
holt_mape
#> # A tibble: 81 x 4
#>    alpha betastar   beta  mape
#>    <dbl>    <dbl>  <dbl> <dbl>
#>  1   0.1      0.1 0.01   18.5 
#>  2   0.2      0.1 0.02   17.9 
#>  3   0.3      0.1 0.03   16.7 
#>  4   0.4      0.1 0.04   14.7 
#>  5   0.5      0.1 0.05   13.6 
#>  6   0.6      0.1 0.06   12.5 
#>  7   0.7      0.1 0.0700 11.5 
#>  8   0.8      0.1 0.08   10.6 
#>  9   0.9      0.1 0.09    9.64
#> 10   0.1      0.2 0.02   19.1 
#> # … with 71 more rows

Создана 26 июня 2020 г. с помощью пакета reprex (v0.3.0)

Однако обратите внимание, что MAPE вычисляется здесь на обучающих данных. Обычно это будет вычисляться на тестовых данных.

person Rob Hyndman    schedule 25.06.2020