212. Classical
Decompose a time series into four components that add up (or multiply) back to the original:
- Level : baseline value around which the series fluctuates
- Trend : long-term progression or direction
- Seasonal : regular, repeating patterns over a fixed period
- Noise : irregular fluctuations not explained by the other components (residuals)
Two functional forms — additive and multiplicative — depending on whether the seasonal swing is constant in absolute units or proportional to the level.
212.0.1. Additive form
Use when the amplitude of seasonal swings is roughly constant over time, regardless of the level. Example: temperature (summer is 10°C above average whether the long-run average is 15°C or 25°C).
212.0.2. Multiplicative form
Use when the seasonal amplitude scales with the level. Example: retail sales (December peak is 30% above the trend, whether the trend is at $1M or $10M).
A multiplicative decomposition can always be converted to an additive one via — useful trick if your tools support only additive.
212.0.3. How to choose
Plot the series. If the seasonal swing grows with the level → multiplicative. If it stays roughly constant → additive. When unsure, try both and check which has more uniform residuals.
212.0.4. Procedure (additive case, integer period )
The classic step-by-step:
- Estimate trend via centered moving average of size . For even (typical with monthly data, ), use a 2-step MA: first an -MA, then a 2-MA. Result: .
- Detrend: .
- Estimate seasonal indices: average the detrended values within each seasonal slot (e.g., all Januaries, all Februaries, etc.). Adjust so the seasonal indices sum to zero (additive) or average to 1 (multiplicative). Result: (depends only on ).
- Residual / noise: .
212.0.5. Limitations of classical decomposition
- Constant seasonal pattern: classical decomposition assumes the seasonal effect is the same in every cycle. Real series often have evolving seasonality (Christmas effect grows over decades). Use STL ([stl.typ](stl.typ)) for those.
- Endpoint problem: the centered MA has gaps at the start and end (size each). Modern methods (STL, X-13) handle this better.
- Sensitivity to outliers: a single anomalous month can distort the seasonal index for that slot. Robust methods (STL with robust loess) address this.
For a quick first pass, classical decomposition is fine. For production forecasting, prefer STL.
Example
Given (24 months of monthly sales data, additive case):
| Month | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
| Year 1 | 110 | 105 | 120 | 130 | 125 | 115 | 108 | 112 | 122 | 135 | 150 | |
| 165 | Year 2 | 120 | 115 | 130 | 140 | 135 | 125 | 118 | 122 | 132 | 145 | |
| 160 | 175 |
Step 1 — trend via 12-MA (centered, requires 2-MA on top)
At each month (for where the centered window fits), compute the 12-month centered moving average. For January year 2 ():
(rough estimate; actual computation involves a 12-MA followed by a 2-MA at each midpoint)
Step 2 — detrend
leaves the seasonal + noise components:
Sample: (Jan year 2 is 10 below trend).
Step 3 — average detrended values per month
Pool all Januaries: , average . Pool all Decembers: . … and so on for each month.
Adjust so seasonal indices sum to 0:
| Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | |
Sum: → adjust by per month so they sum to 0 (skipped here for brevity).
Step 4 — residuals
. If the model fits well, residuals are small and structureless.
Step 5 — interpret
- Trend: +10 units / year (rough slope between year-1 and year-2 averages).
- Seasonal: clear December peak, January-February through.
- Noise: small, well-explained.
Use: forecast next month by extending the trend and adding the seasonal index. For Jan year 3: .