Hierarchical weekly model — design record
Architecture chosen (two-stage)
- Stage 1 — pooled residualization (pyfixest, n=625,882, R²=0.605, ~3s):
log(P) ~ log(floorArea) + fa_missing + age bins + building type | FSA FE + (week × type) FE. The absorbed week×type effects are the province-level weekly paths per property type; residuals are quality- and location-adjusted deviations. - Stage 2 — heteroskedastic local-level Kalman per cell: weekly mean residual observed with variance σ²/n_t; latent deviation is a random walk with innovation τ² estimated by MLE per cell. Region cells deviate from the province path; municipality cells deviate from the smoothed region path. Weeks with zero transactions are pure predictions — the grid is never dropped.
Published variants: index (raw weekly), index_smoothed (one-sided filter,
real-time), index_research (two-sided smoother). All three share one
rebasing constant (2021 avg = 100), so they are directly comparable.
Shrinkage behaviour (outputs/tables/hierarchical_summary.csv)
- Trois-Rivières condo (median 1 tx/week): raw weekly SD 30.4% → smoothed 4.2%.
- Drummondville condo (median 0 tx/week): still produces a continuous path, ~98% parent-driven (shrinkage weight).
- Liquid cells (province types, ~300–1,500 tx/week) are data-dominated.
Benchmark: two-stage vs unified city-specific time-dummy (Step 4 baseline)
Liquid province cells agree almost exactly (corr 0.9996, Québec unifamilial). Montréal condo exposed a genuine specification fork: by July 2026 the two-stage index reads 126.9 vs 118.6 for the city-β baseline.
Arbitration by pseudo repeat-sales (BMN, yearly dummies; condo pairs matched on street + floorArea + yearBuilt because condo addresses carry no unit numbers — 6,079 Montréal condo pairs, ≥90 days between sales):
| Measure (2026 level, 2021=100) | Montréal condo | Province condo | Relative |
|---|---|---|---|
| Pseudo repeat-sales (composition-free) | 120.4 | 132.0 | −8.8% |
| Two-stage hierarchical (pooled β) | 126.9 | 138.2 | −8.2% |
| City-specific time-dummy baseline | 118.6 | ~139 | −14% |
The two-stage model reproduces the composition-free relative path almost exactly; the city-β baseline overstates Montréal's divergence. Hedonic levels sit a few percent above repeat-sales, the standard direction (depreciation / renovation bias in repeat pairs). Decision: the two-stage hierarchical model is the headline architecture. The unified per-cell time-dummy remains as a robustness spec.
Compute cost
Full stage 1 + 112 cells of stage 2 run in under one minute on a laptop — weekly refresh is trivially cheap. A Bayesian multilevel variant (PyMC) was rejected for the headline: equivalent shrinkage behaviour at orders of magnitude more compute, and harder vintage reproducibility.
Known caveats (tracked)
se_logcombines the province-path delta-method variance and the Kalman posterior variance; block-bootstrap validation of CI coverage is part of Step 6.- The Kalman gain-based
shrinkage_weightmeasures how much of a week's movement comes from the parent path; reliability grades therefore weigh n / effective N / SE primarily (Step 7). - Montréal plex R² is low (0.20) in any spec — unobserved revenue characteristics; reliability grading must reflect this.
Author: Simon-Pierre Boucher — contact@spboucher.ai