r语言 - 如何通过采样 beta 循环霍尔特的双指数平滑?



我想用循环中的各种alpha和beta来预测数百条记录。我的目标是通过RStudio中的两个β样本(0.1和0.9)来循环holt结果。这是代码:

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 ,则可能是错误的

你能帮我修一下吗?提前感谢

holt()使用的参数化中,beta必须小于alpha。看见https://otexts.com/fpp2/estimation-and-model-selection.html以便对此进行讨论。

下面是一些代码,可以对一系列alpha和beta值执行您想要的操作。

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

由reprex包于2020-06-26创建(v0.3.0)

然而,请注意,MAPE在这里是根据训练数据计算的。通常,它将根据测试数据进行计算。

最新更新