# Damped Local Trend (DLT)¶

In this section, we will cover:

DLT model structure

DLT global trend configurations

Adding regressors in DLT

Other configurations

```
[1]:
```

```
%matplotlib inline
import orbit
from orbit.models.dlt import DLTMAP
from orbit.diagnostics.plot import plot_predicted_data, plot_predicted_components
from orbit.utils.dataset import load_iclaims
```

```
[2]:
```

```
assert orbit.__version__ == '1.0.12'
```

## Model Structure¶

**DLT** is one of the main exponential smoothing models we support in `orbit`

. Performance is benchmarked with M3 monthly, M4 weekly dataset and some Uber internal dataset (Ng and Wang et al., 2020). The model is a fusion between the classical ETS (Hyndman et. al., 2008)) with some refinement leveraging ideas from Rlgt (Smyl et al., 2019). The
model has a structural forecast equations

with the update process

One important point is that using \(y_t\) as a log-transformed response usually yield better result, especially we can interpret such log-transformed model as a *multiplicative form* of the original model. Besides, there are two new additional components compared to the classical damped ETS model:

\(D(t)\) as the deterministic trend process

\(r\) as the regression component with \(x\) as the regressors

```
[3]:
```

```
# load log-transformed data
df = load_iclaims()
test_size = 52 * 3
train_df = df[:-test_size]
test_df = df[-test_size:]
response_col = 'claims'
date_col = 'week'
```

## Global Trend Configurations¶

There are a few choices of \(D(t)\) configured by `global_trend_option`

:

`loglinear`

`linear`

`flat`

`logistic`

To show the difference among these options, we project the predictions in the charts below. Note that the default is set to `linear`

which we find a better fit for a log-transformed model. Such default is also used in the benchmarking process mentioned previously.

```
[4]:
```

```
%%time
# linear global trend
dlt = DLTMAP(
response_col=response_col,
date_col=date_col,
seasonality=52,
seed=8888,
)
dlt.fit(train_df)
predicted_df = dlt.predict(test_df)
_ = plot_predicted_data(train_df, predicted_df, date_col, response_col, title='DLT Linear Global Trend')
```

```
CPU times: user 1.4 s, sys: 363 ms, total: 1.76 s
Wall time: 2.02 s
```

```
[5]:
```

```
%%time
# log-linear global trend
dlt = DLTMAP(
response_col=response_col,
date_col=date_col,
seasonality=52,
seed=8888,
global_trend_option='loglinear'
)
dlt.fit(train_df)
predicted_df = dlt.predict(test_df)
_ = plot_predicted_data(train_df, predicted_df, date_col, response_col, title='DLT Log-Linear Global Trend')
```

```
CPU times: user 1.29 s, sys: 292 ms, total: 1.58 s
Wall time: 1.43 s
```

```
[6]:
```

```
%%time
# log-linear global trend
dlt = DLTMAP(
response_col=response_col,
date_col=date_col,
seasonality=52,
seed=8888,
global_trend_option='flat'
)
dlt.fit(train_df)
predicted_df = dlt.predict(test_df)
_ = plot_predicted_data(train_df, predicted_df, date_col, response_col, title='DLT Flat Global Trend')
```

```
CPU times: user 1.22 s, sys: 288 ms, total: 1.51 s
Wall time: 1.36 s
```

```
[7]:
```

```
%%time
# logistic global trend
dlt = DLTMAP(
response_col=response_col,
date_col=date_col,
seasonality=52,
seed=8888,
global_trend_option='logistic'
)
dlt.fit(train_df)
predicted_df = dlt.predict(test_df)
_ = plot_predicted_data(train_df, predicted_df, date_col, response_col, title='DLT Logistic Global Trend')
```

```
CPU times: user 1.36 s, sys: 300 ms, total: 1.66 s
Wall time: 1.54 s
```

## Regression¶

You can also add regressors into the model by specifying `regressor_col`

. This serves the purpose of nowcasting or forecasting when exogenous regressors are known such as events and holidays. Without losing generality, the interface is set to be

where \(\mu_j = 0\) and \(\sigma_j = 1\) by default as a non-informative prior. These two parameters are set by the arguments `regressor_beta_prior`

and `regressor_sigma_prior`

as a list. For example,

```
[10]:
```

```
dlt = DLTMAP(
response_col=response_col,
date_col=date_col,
seed=8888,
seasonality=52,
regressor_col=['trend.unemploy', 'trend.filling'],
regressor_beta_prior=[0.1, 0.3],
regressor_sigma_prior=[0.5, 2.0],
)
dlt.fit(df)
predicted_df = dlt.predict(df, decompose=True)
_ = plot_predicted_components(predicted_df, date_col)
```

There are much more configurations on regression such as the regressor signs and penalty type. They will be discussed in later section.

## Other Configurations¶

Just like other model, there are full Bayesian version and aggregated posteriors version for `DLT`

named after `DLTAggregated`

and `DLTFull`

. They are usually more robust in regression but may take longer time to train. More details for each method are available in the docstrings and also here: https://uber.github.io/orbit/orbit.models.html#module-orbit.models.dlt