Skip to content

Model Specification

Ivan Svetunkov edited this page Jun 16, 2026 · 6 revisions

Model Specification

This page documents the model parameter used across smooth functions, along with methods for extracting model type information. This applies to ADAM and ES models.

At a glance

Field Value
Argument name model
Type string, list of strings, or (R only) a previously fitted model object
Valid values A concrete ETS code (e.g. "ANN", "AAdM") or a selection code ("ZZZ", "ZXZ", "XXX", "YYY", "FFF", "PPP", "SSS", "CCC"); or a vector / list of concrete codes.
Default "ZXZ"
Applies to R: adam, auto.adam, es. Python: ADAM, AutoADAM, ES.
Related arguments lags= (seasonal periods), distribution= (error distribution), phi= (damping).

Read more in Section 15.1 and Section 15.4 of Svetunkov (2023).

The model Parameter

The model parameter specifies the type of ETS model to estimate. This is a 3-4 character string describing Error, Trend, and Seasonal components.

ETS Model Notation

The model string follows the pattern "ETS" where:

Component order Component Options Description
1st Error A, M Additive or Multiplicative errors
2nd Trend N, A, Ad, M, Md None, Additive, Additive damped, Multiplicative, Multiplicative damped
3rd Seasonal N, A, M None, Additive, Multiplicative

Common Model Examples

Model Name Description
"ANN" Simple Exponential Smoothing Level only, additive errors
"AAN" Holt's Linear Level + additive trend
"AAdN" Damped Holt's Level + damped additive trend
"AAA" Holt-Winters Additive Additive trend and seasonality
"AAdA" Damped Holt-Winters Additive Damped trend with additive seasonality
"MAM" Holt-Winters Multiplicative Multiplicative errors with additive trend and multiplicative seasonality
"MMM" Fully Multiplicative All components multiplicative

Automatic Selection Codes

The model parameter accepts special codes for automatic model selection:

Code Description Use Case
"ZZZ" Select best using Branch & Bound General automatic selection. Includes multiplicative trends
"ZXZ" Auto-select error and seasonal, additive trend only Default, safer option
"XXX" Test only additive components When multiplicative is inappropriate
"YYY" Test only multiplicative components Positive data with low values
"FFF" Full exhaustive search (all 30 ETS models) Most thorough, slowest
"PPP" Pure additive vs pure multiplicative only Avoids mixed models
"SSS" Pool of 19 standard sensible models Avoids models with infinite variances
"CCC" Combine forecasts using IC weights Ensemble forecasting

Selection Code Combinations

Selection codes can be combined. For example:

  • "ZXZ" - Auto error, additive-only trend, auto seasonal
  • "SXS" - Standard pool with additive-only trend (like ets() from forecast package)
  • "CCN" - Combine non-seasonal models
  • "CAY" - Combine models with additive trend, multiplicative-or-none seasonality

Model Pool

You can provide a vector of specific models to test:

# R: Test specific models only
model <- adam(y, model=c("ANN", "AAN", "AAA"), lags=12)
# Python: Test specific models only
model = ADAM(model=["ANN", "AAN", "AAA"], lags=12)

Reusing Previous Models (R only)

A previously estimated model can be passed directly:

# R: Reuse model structure
model1 <- adam(y1, model="MAM", lags=12)
model2 <- adam(y2, model=model1)  # Same structure, re-estimated on new data

Python vs R

Feature R Python
Model string Yes Yes
Selection codes (Z, X, Y, F, P, S, C) Yes Yes
Model vector Yes Yes (as list)
Reuse previous model Yes Not supported (see Roadmap)

Guidelines for Model Selection

  1. Default choice: Use "ZXZ" - it avoids the explosive multiplicative trend while still allowing automatic selection of error and seasonal components.

  2. Positive data: Consider "YYY" for positive data with low values (e.g., slow-moving products).

  3. Known seasonality: If you know the data has additive seasonality, use "XXA" or similar.

  4. Ensemble forecasts: Use "CCC" to combine forecasts from multiple models.

  5. Exhaustive search: Use "FFF" only when you need the absolute best model and have time for computation.

Model Information Methods

modelType()

Extracts the type of the estimated ETS model.

R Usage

# ETS model
model <- adam(AirPassengers, "MMM", lags=12)
modelType(model)  # "MMM"

# With damping
model <- adam(AirPassengers, "MAdM", lags=12)
modelType(model)  # "MAdM"

# CES model
model <- ces(AirPassengers, "f")
modelType(model)  # "CES(f)"

Python Usage

from smooth import ADAM

model = ADAM(model="MMM", lags=12)
model.fit(y)

# Get model type
model_type = model.model_type  # "MMM"

Output

Returns a character/string representing the model type:

  • For ETS: "ANN", "MAM", "MAdM", etc.
  • For CES: "CES(n)", "CES(s)", "CES(p)", "CES(f)"
  • For ARIMA: "NNN" (no ETS components)

modelName()

Returns the full descriptive name of the fitted model.

R Usage

# ETS model
model <- adam(AirPassengers, "MMM", lags=12)
modelName(model)  # "ETS(M,M,M)"

# ARIMA
model <- adam(BJsales, "NNN", orders=list(ar=1, i=1, ma=1))
modelName(model)  # "ARIMA(1,1,1)"

# Combined ETS+ARIMA
model <- adam(AirPassengers, "AAN", lags=12, orders=c(1,0,1))
modelName(model)  # "ETS(A,A,N)+ARIMA(1,0,1)"

Python Usage

from smooth import ADAM

model = ADAM(model="MMM", lags=12)
model.fit(y)

# Get full model name
name = model.model_name  # "ETS(MMM)"

Output

Returns a human-readable character/string:

  • "ETS(A,A,N)" or "ETS(AAN)" - ETS model with explicit component names
  • "ARIMA(1,1,1)" - ARIMA with orders
  • "ETS(A,A,N)+ARIMA(1,0,1)" - Combined model
  • "CES(full)" - CES with seasonality type

errorType()

Extracts the type of error term: additive ("A") or multiplicative ("M").

R Usage

model <- adam(AirPassengers, "MMM", lags=12)
errorType(model)  # "M"

model <- adam(AirPassengers, "AAN", lags=12)
errorType(model)  # "A"

Python Usage

from smooth import ADAM

model = ADAM(model="MMM", lags=12)
model.fit(y)

# Get error type
error = model.error_type  # "M"

Output

Returns a single character/string:

  • "A" - Additive errors (model estimated on original scale)
  • "M" - Multiplicative errors (percentage errors)

The ets Parameter (experimental)

The ets parameter determines which ETS formulation to use:

Value Description
"conventional" Hyndman et al. (2008) formulation (default)
"adam" ADAM reformulation with different multiplicative component updates

The "adam" formulation updates multiplicative components differently, making the trend less explosive. It is closer to applying ETS to log-transformed data.

R

# Use ADAM formulation
model <- adam(y, model="MMM", lags=12, ets="adam")

Python

from smooth import ADAM

# Use ADAM ETS formulation (less explosive multiplicative trends)
m = ADAM(model="MMM", lags=[12], ets="adam")
m.fit(y)

References

  • Svetunkov, I. (2023). Forecasting and Analytics with the Augmented Dynamic Adaptive Model (ADAM). Chapman and Hall/CRC. Online book: https://openforecast.org/adam/
  • Hyndman, R.J., et al. (2008). Forecasting with Exponential Smoothing: The State Space Approach. Springer.
  • Kolassa, S. (2011). Combining exponential smoothing forecasts using Akaike weights. International Journal of Forecasting, 27, 238-251.

See Also

Clone this wiki locally