## 6.6 Examples of application

### 6.6.1 Non-seasonal data

We continue our examples with the same Box-Jenkins sales data by fitting the ETS(M,M,N) model, but this time with a holdout of ten observations:

```
<- adam(BJsales, "MMN", h=10, holdout=TRUE)
adamETSBJ adamETSBJ
```

```
## Time elapsed: 0.03 seconds
## Model estimated using adam() function: ETS(MMN)
## Distribution assumed in the model: Gamma
## Loss function type: likelihood; Loss function value: 245.3758
## Persistence vector g:
## alpha beta
## 1.0000 0.2404
##
## Sample size: 140
## Number of estimated parameters: 5
## Number of degrees of freedom: 135
## Information criteria:
## AIC AICc BIC BICc
## 500.7515 501.1993 515.4597 516.5661
##
## Forecast errors:
## ME: 3.219; MAE: 3.332; RMSE: 3.787
## sCE: 14.135%; Asymmetry: 91.6%; sMAE: 1.463%; sMSE: 0.028%
## MASE: 2.819; RMSSE: 2.484; rMAE: 0.926; rRMSE: 0.922
```

The output above is similar to the one we discussed in Section 5.6, so we can compare the two models using various criteria and select the most appropriate. Even though the default distribution for the multiplicative error models in ADAM is Gamma, we can compare this model with the ETS(A,A,N) via information criteria. For example, here are the AICc for the two models:

```
# ETS(M,M,N)
AICc(adamETSBJ)
```

`## [1] 501.1993`

```
# ETS(A,A,N)
AICc(adam(BJsales, "AAN", h=10, holdout=TRUE))
```

`## [1] 497.7076`

The comparison is fair because both models were estimated via likelihood, and both likelihoods are formulated correctly, without omitting any terms (e.g. the `ets()`

function from the `forecast`

package omits the \(-\frac{T}{2} \log\left(2\pi e \frac{1}{T}\right)\) for convenience, which makes it incomparable with other models). In this example, the pure additive model is more suitable for the data than the pure multiplicative one.

Figure 6.1 shows how the model fits the data and what forecast it produces. Note that the function produces the **point forecast** in this case, which is not equivalent to the conditional expectation! The point forecast undershoots the actual values in the holdout.

If we want to produce the forecasts (conditional expectation and prediction interval) from the model, we can do it, using the same command as in Section 5.6:

```
forecast(adamETSBJ, h=10,
interval="prediction", level=0.95) |>
plot()
```

Note that, when we ask for “prediction” interval, the `forecast()`

function will automatically decide what to use based on the estimated model: in the case of a pure additive one, it will use analytical solutions, while in the other cases, it will use simulations (see Section 18.3). The point forecast obtained from the forecast function corresponds to the conditional expectation and is calculated based on the simulations. This also means that it will differ slightly from one run of the function to another (reflecting the uncertainty in the error term). Still, the difference, in general, should be negligible for a large number of simulation paths.

The forecast with prediction interval is shown in Figure 6.2. The conditional expectation is not very different from the point forecast in this example. This is because the variance of the error term is close to zero, thus bringing the two close to each other:

`sigma(adamETSBJ)^2`

`## [1] 3.928668e-05`

We can also compare the performance of ETS(M,M,N) with Gamma distribution with the conventional ETS(M,M,N) assuming normality:

```
<- adam(BJsales, "MMN", h=10, holdout=TRUE,
adamETSBJNormal distribution="dnorm")
adamETSBJNormal
```

```
## Time elapsed: 0.03 seconds
## Model estimated using adam() function: ETS(MMN)
## Distribution assumed in the model: Normal
## Loss function type: likelihood; Loss function value: 245.387
## Persistence vector g:
## alpha beta
## 1.0000 0.2415
##
## Sample size: 140
## Number of estimated parameters: 5
## Number of degrees of freedom: 135
## Information criteria:
## AIC AICc BIC BICc
## 500.7740 501.2217 515.4822 516.5885
##
## Forecast errors:
## ME: 3.216; MAE: 3.329; RMSE: 3.783
## sCE: 14.119%; Asymmetry: 91.6%; sMAE: 1.462%; sMSE: 0.028%
## MASE: 2.816; RMSSE: 2.481; rMAE: 0.925; rRMSE: 0.921
```

In this specific example, the two distributions produce very similar results with almost indistinguishable estimates of parameters.

### 6.6.2 Seasonal data

The `AirPassengers`

data used in Section 5.6 has (as we discussed) multiplicative seasonality. So, the ETS(M,M,M) model might be more suitable than the pure additive one that we used previously:

`<- adam(AirPassengers, "MMM", h=12, holdout=TRUE) adamETSAir `

After running the command above we might get a warning, saying that the model has a potentially explosive multiplicative trend. This happens, when the final in-sample value of the trend component is greater than one, in which case the forecast trajectory might exhibit exponential growth. Here is what we have in the output of this model:

` adamETSAir`

```
## Time elapsed: 0.22 seconds
## Model estimated using adam() function: ETS(MMM)
## Distribution assumed in the model: Gamma
## Loss function type: likelihood; Loss function value: 467.5831
## Persistence vector g:
## alpha beta gamma
## 0.7707 0.0075 0.0005
##
## Sample size: 132
## Number of estimated parameters: 17
## Number of degrees of freedom: 115
## Information criteria:
## AIC AICc BIC BICc
## 969.1663 974.5347 1018.1739 1031.2804
##
## Forecast errors:
## ME: -3.676; MAE: 15.766; RMSE: 21.721
## sCE: -16.804%; Asymmetry: -7.8%; sMAE: 6.006%; sMSE: 0.685%
## MASE: 0.655; RMSSE: 0.693; rMAE: 0.207; rRMSE: 0.211
```

Notice that the smoothing parameter \(\gamma\) is equal to zero, which implies that we deal with the data with deterministic multiplicative seasonality. Comparing the information criteria (e.g. AICc) with the ETS(A,A,A) (discussed in Subsection 5.6.2), the pure multiplicative model does a better job at fitting the data than the additive one:

```
<- adam(AirPassengers, "AAA", lags=12,
adamETSAirAdditive h=12, holdout=TRUE)
AICc(adamETSAirAdditive)
```

`## [1] 1130.755`

The conditional expectation and prediction interval from this model are more adequate as well (Figure 6.3):

`<- forecast(adamETSAir, h=12, interval="prediction") adamForecast `

```
## Warning: Your model has a potentially explosive multiplicative trend. I cannot
## do anything about it, so please just be careful.
```

`plot(adamForecast, main="")`

If we want to calculate the error measures based on the conditional expectation, we can use the `measures()`

function from the `greybox`

package in the following way:

```
measures(adamETSAir$holdout,
$mean,
adamForecastactuals(adamETSAir))
```

```
## ME MAE MSE MPE MAPE
## -3.899580772 15.760874924 475.087984962 -0.012844841 0.033927372
## sCE sMAE sMSE MASE RMSSE
## -0.178271694 0.060043161 0.006895099 0.654413507 0.695660143
## rMAE rRMSE rAME asymmetry sPIS
## 0.207379933 0.211664854 0.054795046 -0.090738625 1.734279065
```

These can be compared with the measures from the ETS(A,A,A) model:

```
measures(adamETSAir$holdout,
$forecast,
adamETSAirAdditiveactuals(adamETSAir))
```

```
## ME MAE MSE MPE MAPE
## 28.35965165 37.11169870 2442.02641428 0.04879284 0.07053496
## sCE sMAE sMSE MASE RMSSE
## 1.29647863 0.14138198 0.03544188 1.54092949 1.57719458
## rMAE rRMSE rAME asymmetry sPIS
## 0.48831182 0.47988470 0.39849628 0.69332492 -7.30801405
```

Comparing, for example, MSE from the two models, we can conclude that the pure multiplicative model is more accurate than the pure additive one.

We can also produce the plot of the time series decomposition according to ETS(M,M,M) (see Figure 6.4):

`plot(adamETSAir, which=12)`

The plot in Figure 6.4 shows that the residuals are more random for the pure multiplicative model than for the ETS(A,A,A), but there still might be some structure left. The autocorrelation and partial autocorrelation functions (discussed in Section 8.3) might help in understanding this better:

```
par(mfcol=c(2,1), mar=c(2,4,2,1))
plot(adamETSAir, which=10:11)
```

The plot in Figure 6.5 shows that there is still some correlation left in the residuals, which could be either due to pure randomness or imperfect estimation of the model. Tuning the parameters of the optimiser or selecting a different model might solve the problem.