0

元の質問を書き直す

ベクトルと定義済みの指数平滑化モデル (この例では、アルファ = 0.5 の単純な指数平滑化) を取り、入力ベクトルに対して 1 ステップ先の予測を行う関数が必要です。以下のコードは、不格好ですが、私が望むことを行います。これを行うためのより良い方法、またはこれを行う組み込み関数/パッケージ関数はありますか?

この質問の 2 番目の部分は次のとおりです。ETS または ARIMA モデルをたとえば{fable}パッケージに適合させる場合、適合した ETS/ARIMA モデルを取得して、ベクトルに対して同じ 1 ステップ先の予測を実行できる機能はありますか?前編のように?

# Ref: # https://stats.stackexchange.com/questions/44984/how-do-you-use-simple-exponential-smoothing-in-r
# 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)) {
        mod <- HoltWinters(x[seq(i)], alpha=alpha, beta=beta, gamma=gamma)
        result_vec[i] <- predict(mod, n.ahead = 1)
    }
    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

reprex パッケージ(v0.3.0)によって 2020-10-22 に作成されました

4

1 に答える 1

0

これは、私が探していた質問と投稿であり、解決しました:

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 に作成されました

于 2020-10-22T20:45:55.090 に答える