214. Classical

Decompose a time series 𝑦𝑡 into four components that add up (or multiply) back to the original:

Two functional forms — additive and multiplicative — depending on whether the seasonal swing is constant in absolute units or proportional to the level.

214.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).

214.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 log𝑦𝑡=log𝐿𝑡+log𝑇𝑡+log𝑆𝑡+log𝑁𝑡 — useful trick if your tools support only additive.

214.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.

214.0.4. Procedure (additive case, integer period 𝑚)

The classic step-by-step:

  1. Estimate trend via centered moving average of size 𝑚. For even 𝑚 (typical with monthly data, 𝑚=12), use a 2-step MA: first an 𝑚-MA, then a 2-MA. Result: 𝑇̂𝑡.
  2. Detrend: 𝑦𝑡𝑇̂𝑡.
  3. 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 𝑡mod𝑚).
  4. Residual / noise: 𝑁̂𝑡=𝑦𝑡𝑇̂𝑡𝑆̂𝑡.

214.0.5. Limitations of classical decomposition

For a quick first pass, classical decomposition is fine. For production forecasting, prefer STL.

Example

Given (24 months of monthly sales data, additive case):

MonthJanFebMarAprMayJunJulAugSepOctNovDec
Year 1110105120130125115108112122135150
165Year 2120115130140135125118122132145
160175

Step 1 — trend via 12-MA (centered, requires 2-MA on top)

At each month 𝑡 (for 𝑡{7,,18} where the centered window fits), compute the 12-month centered moving average. For January year 2 (𝑡=13):

𝑇̂13=(avg of months 8..18 first, then average pairs)130

(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: 𝑦13𝑇̂13120130=10 (Jan year 2 is 10 below trend).

Step 3 — average detrended values per month

Pool all Januaries: (110116)+(120130)8, average 8. Pool all Decembers: (165121)+(175142)+37. … and so on for each month.

Adjust so seasonal indices sum to 0:

JanFebMarAprMayJunJulAugSepOctNovDec
𝑆̂10150+10+55128+2+15+30+45

Sum: 57 → adjust by 4.75 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: 𝑦̂25=𝑇̂25+𝑆̂Jan145+(10)=135.