Dynamic Factor Models
Weekly Economic Trackers — Session 2
Tyler Sotomayor · Columbia University
Last session, one witness. Today, dozens.
- Session 1: the Kalman filter optimally reads one noisy indicator
- Real nowcasting: FRED-MD curates 127 monthly series; the Fed watches hundreds
- The oldest fact in macro: comovement — when activity turns, it turns everywhere
- Burns & Mitchell (1946) saw it; Sargent & Sims (1977) formalized it:
The business cycle is low-dimensional. A handful of factors — often one — drive the common movement of everything we measure.
You’ve already seen the payoff
Practicum 1, four public series, one factor:
- correlation 0.90 with the official ten-series WEI
- pre-2020 quarterly R² of 0.63 against GDP growth
Today: the machinery that makes this principled — and that fixes what PCA cannot do.
The static factor model
x_t = \Lambda f_t + e_t, \qquad r \ll N
- \Lambda: loadings — each series’ exposure to the common state
- e_t: idiosyncratic — measurement error + sector-specific shocks
- Each standardized series splits: common share vs. idiosyncratic share
- A good indicator = high common share, not individually interesting
The rotation problem
For any invertible M: $;(M^{-1})(M f_t) $ fits identically.
- Factors are identified only up to rotation, sign, scale
- Managed by normalization: \operatorname{Var}(f)=I, \Lambda'\Lambda diagonal, sign convention
- Two honest consequences:
- factors have no units → scale against GDP before publishing a number
- “the activity factor” is an interpretation, earned by loadings, not algebra
Principal components, and why it works
Least squares on \sum_{i,t}(x_{it} - \lambda_i' f_t)^2 → top eigenvectors. Then:
- Consistency as N, T \to \infty (Stock–Watson 2002; Bai–Ng 2002), even with weakly correlated idiosyncratics
- More series help: every series is another noisy vote on f_t
- Choosing r: Bai–Ng criteria + loadings inspection; nowcasting practice: 1–2 factors
What PCA cannot do: dynamics (no forecasts), missing data (no ragged edge), uncertainty (no bands). All three point back to Session 1.
The dynamic factor model
\begin{aligned}
x_t &= \Lambda f_t + e_t \\
f_t &= A_1 f_{t-1} + \cdots + A_p f_{t-p} + u_t \\
e_{it} &= \rho_i e_{i,t-1} + \varepsilon_{it}
\end{aligned}
State space: stack f_t and the e_{it} in the state, Z = (\Lambda \;\; I_N), H = 0 — the noise is promoted into the state, where it has dynamics.
Kalman filter now delivers: factor + bands · forecasts · likelihood · ragged edge for free · add the tent-weight GDP row → Giannone–Reichlin–Small (2008)
Estimation, three ways
- PCA — fast, transparent; balanced panels only (= the P1 build)
- Two-step (Doz–Giannone–Reichlin 2011) — PCA for parameters, then one Kalman pass over the ragged panel; the daily-production workhorse
- ML via EM (Doz et al. 2012; Bańbura–Modugno 2014) — smoother ↔︎ regressions until convergence; arbitrary missingness; the central-bank standard
Course path: P1 did (1) → exercises do (2) → capstone does (2) or (3).
The news decomposition, operational
\Delta\text{nowcast} \;=\; \sum_{i \,\in\, \text{releases}} w_i \times
\big(\,x_{it} - \mathbb{E}[x_{it} \mid \Omega_{old}]\,\big)
- w_i: from the Kalman gain — big for high common share, short lag, clean measurement
- “Retail sales surprised +0.4pp → nowcast +0.07pp,” derived
- Careful: the model’s surprise ≠ the consensus surprise — say which expectation was beaten
Anatomy of the WEI (Lewis et al. 2022)
- 10 weekly series, 5 sectors — breadth is variance insurance (P1’s claims-only trough was 11pp too deep in April 2020)
- 52-week differences — seasonal adjustment in disguise; price: trailing-year units
- One factor, PCA, GDP scaling — WEI = 2 reads “≈2% growth over the year”
- 2020 forced a methodology adjustment — their production version of the standardization trap from the P1 journal
Cousins: CFNAI (85 series, monthly) · ADS (mixed-frequency exact DFM)
Practical wisdom
- Breadth beats depth — sectoral duplication correlates the “idiosyncratic” noise
- The reference population is a choice — calibrate on normal times or model outliers; never silently
- Transformations do seasonal work — know what 52-week differencing assumes (→ Session 3)
- Read loadings like coefficients — P1’s bank credit loads ≈ 0 because credit-line drawdowns make it acyclical; the model was right
- One factor until proven otherwise
Next
- Practicum 1 is live — brief, instructor build, journal; Exercises 4–5 upgrade it to the two-step DFM
- Session 3: what 52-week differencing was hiding — seasonal adjustment of high-frequency data, on hourly electricity load
- Reading: Doz–Giannone–Reichlin (2011); reread Giannone–Reichlin–Small §3 — it will look familiar now