これは、私が探していた質問と投稿であり、解決しました:
https://stats.stackexchange.com/questions/265115/one-step-ahead-forecast
https://robjhyndman.com/hyndsight/out-of-sample-one-step-forecasts/
次に、モデルビルダーを活用してフィルターに必要なものを構築し、そこにある手法を使用して、一歩先の予測を行いたい新しいデータ (および元のモデル)forecast::ets()
を再呼び出しすることができました。ets()
次に、その新しいモデルを呼び出しfitted()
て、一歩先の予測を取得します。これは、フィルターに実行させたいことと十分に一致します (出力に 1 つずつ異なる違いがあり、十分に簡単に処理できます)。
ほとんどの場合、{fable}
パッケージETS()
呼び出しで機能しました。ただし、確実に一致させるために開始値を指定する方法がわかりません。しかし、全体的にはかなり近く、時間の経過とともにほぼ一致するはずです。
以下は、私が持っていたものと、最終的に最終的な解決策を示したサンプルコードです。
# Ref: # https://stats.stackexchange.com/questions/44984/how-do-you-use-simple-exponential-smoothing-in-r
# Hand-rolled solution
# NOT fully tested, just in this case. Gives one-step-ahead forecasts for an exponential smoothing model
ses <- function(x, alpha, beta = FALSE, gamma = FALSE) {
## Populate this vector with return values
result_vec <- numeric(length(x))
result_vec[1] <- NA
for (i in 2:length(x)) {
## One method
mod <- HoltWinters(x[seq(i)], alpha=alpha, beta=beta, gamma=gamma)
result_vec[i] <- predict(mod, n.ahead = 1)
## A similar method
# result_vec[i] <- forecast::ses(x[seq(i)], alpha=alpha, beta=beta, gamma=gamma, h=1)$mean
}
result_vec
}
new_wt <- c(1, 0, 0, 0, 0, 1, 1, 1)
ses(new_wt, 0.5)
#> [1] NA 0.5000000 0.2500000 0.1250000 0.0625000 0.5312500 0.7656250
#> [8] 0.8828125
## From: https://robjhyndman.com/hyndsight/out-of-sample-one-step-forecasts/
## I can do one-step-ahead forecasts with the forecast package
library(forecast)
#> Registered S3 method overwritten by 'quantmod':
#> method from
#> as.zoo.data.frame zoo
#>
#> Attaching package: 'forecast'
#> The following object is masked _by_ '.GlobalEnv':
#>
#> ses
## Values to do one-step-ahead forecasts on
new_wt <- c(1, 0, 0, 0, 0, 1, 1, 1)
## Fit a model with hand-picked parameters, in this case, and walk the forecast
## ahead a step at a time.
initial_value <- 0
fit <- forecast::ets(initial_value, model="ANN", alpha=0.5, use.initial.values = T)
fit2 <- forecast::ets(new_wt, model=fit, use.initial.values = T)
fitted(fit2) %>% as.vector()
#> [1] 0.0000000 0.5000000 0.2500000 0.1250000 0.0625000 0.0312500 0.5156250
#> [8] 0.7578125
## With fable, I can't seem to make it work:
library(fable)
#> Loading required package: fabletools
#>
#> Attaching package: 'fabletools'
#> The following objects are masked from 'package:forecast':
#>
#> accuracy, forecast
library(tibble)
new_wt_ts <-
tibble(value = new_wt, idx = seq(length(new_wt))) %>%
as_tsibble(index = idx)
myfable <-
model(new_wt_ts, ets = ETS(value ~ error("A") + trend("N", alpha=0.5) + season("N")))
## This is close to the others, and goes in the right direction, not sure why it doesn't match?
fitted(myfable, new_wt_ts)
#> # A tsibble: 8 x 3 [1]
#> # Key: .model [1]
#> .model idx .fitted
#> <chr> <int> <dbl>
#> 1 ets 1 0.531
#> 2 ets 2 0.765
#> 3 ets 3 0.383
#> 4 ets 4 0.191
#> 5 ets 5 0.0957
#> 6 ets 6 0.0478
#> 7 ets 7 0.524
#> 8 ets 8 0.762
reprex パッケージ(v0.3.0)によって 2020-10-22 に作成されました