Skip to content
Ivan Svetunkov edited this page Jun 16, 2026 · 9 revisions

title: oETS — Occurrence ETS slug: OES summary: Occurrence-ETS for intermittent demand; OM is the current preferred entry point. status: stable applies_to: [r, python] related: [OM, ADAM]

oETS - Occurrence ETS

oETS (occurrence ETS) models the probability of demand occurrence for intermittent time series data. It implements the occurrence part of the iETS (intermittent ETS) framework.

Note: oes() is an ETS-only wrapper of om(). It disables ARIMA, formula, and some advanced options, providing a lightweight interface for pure ETS occurrence models. For the full feature set (ARIMA, regressors, auto-selection), use om() in R or the OM / OMG / AutoOM classes in Python — see OM.

Python: Use OM, OMG, and AutoOM (see OM).

Note: iETS refers to the full model for demand sizes and demand occurrence. oETS refers to the occurrence part only.

Overview

Intermittent demand data contains many zero values, common in:

  • Spare parts inventory
  • Slow-moving items
  • Event-based data
  • Count data with rare occurrences

oETS models the probability of non-zero demand using ETS-style state-space models, which can then be combined with a demand sizes model for full intermittent demand forecasting.

Mathematical Framework

See OM for the complete mathematical framework, including the full iETS decomposition (y_t = o_t × z_t), latent-variable state equations, per-subtype link formulas, and model variants (oETS, oARIMA, oETSX, oARIMAX).

R Usage

oes() is an ETS-only wrapper around om(). Calling oes(y, ...) is equivalent to om(y, ..., orders=list(ar=0,i=0,ma=0), formula=NULL). For the full feature set use om() directly.

Basic oETS Models

library(smooth)

# Generate intermittent data
y <- rpois(100, 0.5)

# Fixed probability
oes(y, occurrence="fixed", h=10, holdout=TRUE)

# Odds-ratio model with ETS(M,N,N)
oes(y, model="MNN", occurrence="odds-ratio", h=10, holdout=TRUE)

# Inverse odds-ratio
oes(y, model="MNN", occurrence="inverse-odds-ratio", h=10, holdout=TRUE)

# Direct (TSB-like)
oes(y, model="MNN", occurrence="direct", h=10, holdout=TRUE)

# General model (calls oesg internally, which wraps omg)
oes(y, model="MNN", occurrence="general", h=10, holdout=TRUE)

# Automatic selection between subtypes
oes(y, model="MNN", occurrence="auto", h=10, holdout=TRUE)

General Model with oesg()

oesg() is the ETS-only wrapper around omg(), allowing different ETS models for a_t and b_t:

# Different models for a and b — oETS_G(M,N,N)(A,A,N)
oesg(y, modelA="MNN", modelB="AAN", h=10, holdout=TRUE)

# Same model for both
oesg(y, modelA="MNN", modelB="MNN", h=10, holdout=TRUE)

Using om() for Full Features (ARIMA + Regressors)

# With ARIMA — not available via oes()
om(y, model="NNN", orders=list(ar=1, i=0, ma=0), occurrence="odds-ratio")

# With external regressors — not available via oes()
om(y, model="MNN", formula=~x1+x2, occurrence="direct")

Full iETS Model with adam()

Combine occurrence and demand sizes in one model:

# iETS(M,M,N)_F - fixed probability
adam(y, "MMN", occurrence="fixed", h=10, holdout=TRUE)

# iETS(M,M,N)_O - odds-ratio with specified oETS model
adam(y, "MMN", occurrence="odds-ratio", oesmodel="MMN", h=10, holdout=TRUE)

# Two-step approach: estimate oETS first, then use in adam
oesModel <- oes(y, model="MMN", occurrence="odds-ratio", h=10, holdout=TRUE)
adam(y, "MMN", occurrence=oesModel, h=10, holdout=TRUE)

# General model
adam(y, "MMN", occurrence="general", oesmodel="MMN", h=10, holdout=TRUE)

Parameters

oes() accepts an ETS-only subset of om() parameters. For the full parameter list see OM.

Parameter Type (R) Default Description
y vector/ts Time series data; binarised automatically (non-zero → 1)
model character "ZXZ" ETS model for occurrence (e.g., "MNN")
occurrence character "auto" Occurrence subtype; see link table above
persistence numeric vector NULL Fixed smoothing parameters
initial character "backcasting" Initialisation method
phi numeric NULL Damping parameter
ic character "AICc" Information criterion
h integer 0 Forecast horizon
holdout logical FALSE Use holdout validation
bounds character "usual" Parameter bounds

Parameters not available in oes() (use om() instead): orders, formula, regressors, arma, loss, verbose, nlopt_kargs.

Model Notation

See OM for the full iETS(E,T,S)_X(...) notation and occurrence-only oETS / oARIMA naming.

Output

oes() returns an object of class c("om","adam","smooth") (R). Because oes() delegates to om(), the output structure is identical to that of om(). See OM for the full attribute list.

Element Type (R) Description
model character ETS model type used
occurrence character Occurrence subtype
fitted vector Fitted probability values ∈ (0,1)
states matrix State vector values
persistence numeric vector Smoothing parameters
phi numeric Damping parameter
initial numeric vector Initial states
logLik numeric Bernoulli log-likelihood
residuals vector o_t − p̂_t
y vector Binarised occurrence (0/1)

References

  • Svetunkov, I., & Boylan, J.E. (2023). iETS: State space model for intermittent demand forecasting. International Journal of Production Economics, 265, 109013. DOI: 10.1016/j.ijpe.2023.109013.
  • Svetunkov, I. (2023). Forecasting and Analytics with the Augmented Dynamic Adaptive Model (ADAM). Online: https://openforecast.org/adam/.

See Also

  • OM — full occurrence model documentation (OM, OMG, AutoOM; R and Python)
  • ADAM — unified framework combining occurrence and demand sizes
  • ES — standard Exponential Smoothing

Clone this wiki locally