Skip to contents

Generate evenly weighted ensemble forecast distributions from mvgam_forecast objects

Usage

ensemble(object, ...)

# S3 method for mvgam_forecast
ensemble(object, ..., ndraws = 5000)

Arguments

object

list object of class mvgam_forecast. See forecast.mvgam()

...

More mvgam_forecast objects.

ndraws

Positive integer specifying the number of draws to use from each forecast distribution for creating the ensemble. If some of the ensemble members have fewer draws than ndraws, their forecast distributions will be resampled with replacement to achieve the correct number of draws

Value

An object of class mvgam_forecast containing the ensemble predictions. This object can be readily used with the supplied S3 functions plot and score

Details

It is widely recognised in the forecasting literature that combining forecasts from different models often results in improved forecast accuracy. The simplest way to create an ensemble is to use evenly weighted combinations of forecasts from the different models. This is straightforward to do in a Bayesian setting with mvgam as the posterior MCMC draws contained in each mvgam_forecast object will already implicitly capture correlations among the temporal posterior predictions.

Author

Nicholas J Clark

Examples

# \donttest{
# Simulate some series and fit a few competing dynamic models
set.seed(1)
simdat <- sim_mvgam(n_series = 1,
                    prop_trend = 0.6,
                    mu = 1)

plot_mvgam_series(data = simdat$data_train,
                 newdata = simdat$data_test)


m1 <- mvgam(y ~ 1,
            trend_formula = ~ time +
              s(season, bs = 'cc', k = 9),
            trend_model = AR(p = 1),
            noncentred = TRUE,
            data = simdat$data_train,
            newdata = simdat$data_test,
            chains = 2,
            silent = 2)

m2 <- mvgam(y ~ time,
            trend_model = RW(),
            noncentred = TRUE,
            data = simdat$data_train,
            newdata = simdat$data_test,
            chains = 2,
            silent = 2)

# Calculate forecast distributions for each model
fc1 <- forecast(m1)
fc2 <- forecast(m2)

# Generate the ensemble forecast
ensemble_fc <- ensemble(fc1, fc2)

# Plot forecasts
plot(fc1)
#> Out of sample DRPS:
#> 42.585823

plot(fc2)
#> Out of sample DRPS:
#> 47.85449

plot(ensemble_fc)
#> Out of sample DRPS:
#> 43.86142888


# Score forecasts
score(fc1)
#> $series_1
#>       score in_interval interval_width eval_horizon score_type
#> 1  3.523114           1            0.9            1       crps
#> 2  0.932258           1            0.9            2       crps
#> 3  2.073581           1            0.9            3       crps
#> 4  1.414644           1            0.9            4       crps
#> 5  0.996667           1            0.9            5       crps
#> 6  1.419490           1            0.9            6       crps
#> 7  2.097700           1            0.9            7       crps
#> 8  1.610148           1            0.9            8       crps
#> 9  1.232733           1            0.9            9       crps
#> 10 1.225088           1            0.9           10       crps
#> 11 1.347235           1            0.9           11       crps
#> 12 1.604694           1            0.9           12       crps
#> 13 0.990786           1            0.9           13       crps
#> 14 0.966188           1            0.9           14       crps
#> 15 0.843817           1            0.9           15       crps
#> 16 1.019958           1            0.9           16       crps
#> 17 0.899248           1            0.9           17       crps
#> 18 4.163395           1            0.9           18       crps
#> 19 1.249429           1            0.9           19       crps
#> 20 2.031900           1            0.9           20       crps
#> 21 1.496291           1            0.9           21       crps
#> 22 1.579091           1            0.9           22       crps
#> 23 5.095182           0            0.9           23       crps
#> 24 1.374279           1            0.9           24       crps
#> 25 1.398907           1            0.9           25       crps
#> 
#> $all_series
#>       score eval_horizon score_type
#> 1  3.523114            1   sum_crps
#> 2  0.932258            2   sum_crps
#> 3  2.073581            3   sum_crps
#> 4  1.414644            4   sum_crps
#> 5  0.996667            5   sum_crps
#> 6  1.419490            6   sum_crps
#> 7  2.097700            7   sum_crps
#> 8  1.610148            8   sum_crps
#> 9  1.232733            9   sum_crps
#> 10 1.225088           10   sum_crps
#> 11 1.347235           11   sum_crps
#> 12 1.604694           12   sum_crps
#> 13 0.990786           13   sum_crps
#> 14 0.966188           14   sum_crps
#> 15 0.843817           15   sum_crps
#> 16 1.019958           16   sum_crps
#> 17 0.899248           17   sum_crps
#> 18 4.163395           18   sum_crps
#> 19 1.249429           19   sum_crps
#> 20 2.031900           20   sum_crps
#> 21 1.496291           21   sum_crps
#> 22 1.579091           22   sum_crps
#> 23 5.095182           23   sum_crps
#> 24 1.374279           24   sum_crps
#> 25 1.398907           25   sum_crps
#> 
score(fc2)
#> $series_1
#>       score in_interval interval_width eval_horizon score_type
#> 1  4.027405           1            0.9            1       crps
#> 2  1.601258           1            0.9            2       crps
#> 3  3.404619           0            0.9            3       crps
#> 4  0.890614           1            0.9            4       crps
#> 5  2.538261           1            0.9            5       crps
#> 6  2.620900           1            0.9            6       crps
#> 7  1.892433           1            0.9            7       crps
#> 8  0.918860           1            0.9            8       crps
#> 9  1.634557           1            0.9            9       crps
#> 10 1.184265           1            0.9           10       crps
#> 11 1.456347           1            0.9           11       crps
#> 12 1.715809           1            0.9           12       crps
#> 13 1.019106           1            0.9           13       crps
#> 14 0.957008           1            0.9           14       crps
#> 15 1.113928           1            0.9           15       crps
#> 16 1.133647           1            0.9           16       crps
#> 17 1.101088           1            0.9           17       crps
#> 18 2.844725           1            0.9           18       crps
#> 19 1.189586           1            0.9           19       crps
#> 20 3.681478           1            0.9           20       crps
#> 21 2.473191           1            0.9           21       crps
#> 22 1.617496           1            0.9           22       crps
#> 23 4.132401           1            0.9           23       crps
#> 24 1.385082           1            0.9           24       crps
#> 25 1.320426           1            0.9           25       crps
#> 
#> $all_series
#>       score eval_horizon score_type
#> 1  4.027405            1   sum_crps
#> 2  1.601258            2   sum_crps
#> 3  3.404619            3   sum_crps
#> 4  0.890614            4   sum_crps
#> 5  2.538261            5   sum_crps
#> 6  2.620900            6   sum_crps
#> 7  1.892433            7   sum_crps
#> 8  0.918860            8   sum_crps
#> 9  1.634557            9   sum_crps
#> 10 1.184265           10   sum_crps
#> 11 1.456347           11   sum_crps
#> 12 1.715809           12   sum_crps
#> 13 1.019106           13   sum_crps
#> 14 0.957008           14   sum_crps
#> 15 1.113928           15   sum_crps
#> 16 1.133647           16   sum_crps
#> 17 1.101088           17   sum_crps
#> 18 2.844725           18   sum_crps
#> 19 1.189586           19   sum_crps
#> 20 3.681478           20   sum_crps
#> 21 2.473191           21   sum_crps
#> 22 1.617496           22   sum_crps
#> 23 4.132401           23   sum_crps
#> 24 1.385082           24   sum_crps
#> 25 1.320426           25   sum_crps
#> 
score(ensemble_fc)
#> $series_1
#>        score in_interval interval_width eval_horizon score_type
#> 1  3.7299148           1            0.9            1       crps
#> 2  1.2316120           1            0.9            2       crps
#> 3  2.7003969           1            0.9            3       crps
#> 4  1.0364422           1            0.9            4       crps
#> 5  1.6282435           1            0.9            5       crps
#> 6  1.9640138           1            0.9            6       crps
#> 7  1.9986178           1            0.9            7       crps
#> 8  1.1822043           1            0.9            8       crps
#> 9  1.3414211           1            0.9            9       crps
#> 10 1.1086363           1            0.9           10       crps
#> 11 1.3902652           1            0.9           11       crps
#> 12 1.6876465           1            0.9           12       crps
#> 13 0.9988800           1            0.9           13       crps
#> 14 0.9523391           1            0.9           14       crps
#> 15 0.9620027           1            0.9           15       crps
#> 16 0.9439318           1            0.9           16       crps
#> 17 0.9259058           1            0.9           17       crps
#> 18 3.3335444           1            0.9           18       crps
#> 19 1.2523325           1            0.9           19       crps
#> 20 2.6802113           1            0.9           20       crps
#> 21 1.8845088           1            0.9           21       crps
#> 22 1.4960584           1            0.9           22       crps
#> 23 4.7087855           1            0.9           23       crps
#> 24 1.3857925           1            0.9           24       crps
#> 25 1.3377218           1            0.9           25       crps
#> 
#> $all_series
#>        score eval_horizon score_type
#> 1  3.7299148            1   sum_crps
#> 2  1.2316120            2   sum_crps
#> 3  2.7003969            3   sum_crps
#> 4  1.0364422            4   sum_crps
#> 5  1.6282435            5   sum_crps
#> 6  1.9640138            6   sum_crps
#> 7  1.9986178            7   sum_crps
#> 8  1.1822043            8   sum_crps
#> 9  1.3414211            9   sum_crps
#> 10 1.1086363           10   sum_crps
#> 11 1.3902652           11   sum_crps
#> 12 1.6876465           12   sum_crps
#> 13 0.9988800           13   sum_crps
#> 14 0.9523391           14   sum_crps
#> 15 0.9620027           15   sum_crps
#> 16 0.9439318           16   sum_crps
#> 17 0.9259058           17   sum_crps
#> 18 3.3335444           18   sum_crps
#> 19 1.2523325           19   sum_crps
#> 20 2.6802113           20   sum_crps
#> 21 1.8845088           21   sum_crps
#> 22 1.4960584           22   sum_crps
#> 23 4.7087855           23   sum_crps
#> 24 1.3857925           24   sum_crps
#> 25 1.3377218           25   sum_crps
#> 
# }