r - 如何通过采样 beta 循环 Holt 的双指数平滑?
问题描述
我想预测数百条记录,其中包含一些不同的 alpha 和 beta 循环。我的目标是在 RStudio 中通过 2 个 beta 样本(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 条或更少的记录,它可以预测 beta=0.1、0.9 以及各种 alpha 和 beta 样本。但如果它有超过 8 条记录,它只能预测 beta=0.1 和更低(0.1、0.01、0.001、0.0001 仅)但如果 beta 高于 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 包(v0.3.0)于 2020-06-26 创建
但是,请注意 MAPE 是在训练数据上计算的。通常它会根据测试数据进行计算。
推荐阅读
- javascript - 流类型在看似不相关的类型上抛出错误
- python - 从 StreamReader 读取,同时也接收事件 python asnycio
- java - 为所有用户在 Ubuntu 16 上安装 OpenJDK 9
- javascript - TypeError:无法在“CanvasRenderingContext2D”上执行“drawImage”:提供的值不是类型“(CSSImageValue 或 HTMLImageElement
- kdb - kdb 项目被列出并转换为行
- c++ - c++ rand() 仅在 1-10 之间生成 8
- jquery - Uncaught SyntaxError: Unexpected token: 当试图解析 JSON 请求时
- ruby-on-rails - Rails - 从集合中获取多态子项作为 ActiveRecord::Relation
- r - 带有网格的地图中的线交叉(ggplot)
- android - android更快的截屏方式?