SPB Git

Repository Public Research preview

Commit

révision scientifique complète (editorial board, 2026-10-17)

- scoreboard uniforme (règle médiane pour tous les modèles ; Duan en robustesse) : le
  « renversement » forward-in-time de la v1.0 était un artefact de retransformation
- inférence : bootstrap par grappes (municipalités) + tests DM/GW groupés sur toutes
  les comparaisons ; décomposition niveau/compétence du generalization gap
- robustesse : splits groupés parcelle/bâtiment, FE spatiaux emboîtés, Box–Cox fin,
  sensibilité HGB ; nouvelle section 7, 9 tables et 1 figure
- méthodologie formalisée (13 équations) ; littérature 33 → 58 références vérifiées
- docs/REVIEW-REPORT.md, docs/CHANGELOG-REVISION.md ; version 1.1, October 2026

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed · Oct 18, 2026 parent 984118f
62 changed files +3,545 −758 Browse files
62 changed files
modified README.md +76 −36
@@ -4,7 +4,7 @@
4 **UQO Working Paper No. 11** — *A Systematic Assessment of Hedonic Specifications 4 **UQO Working Paper No. 11** — *A Systematic Assessment of Hedonic Specifications
5 and Estimation Methods for the Quebec Housing Market, 2021–2026* 5 and Estimation Methods for the Quebec Housing Market, 2021–2026*
6 6
7−[![Paper](https://img.shields.io/badge/paper-PDF%20(23%20p.)-b31b1b?logo=latex&logoColor=white)](paper/main.pdf) 7+[![Paper](https://img.shields.io/badge/paper-PDF%20(40%20p.)-b31b1b?logo=latex&logoColor=white)](paper/main.pdf)
8 [![Python](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white)](requirements.txt) 8 [![Python](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white)](requirements.txt)
9 [![Data](https://img.shields.io/badge/data-514%2C212%20sales%20·%20roll--matched%20parquet-4051b5)](data/raw/README.md) 9 [![Data](https://img.shields.io/badge/data-514%2C212%20sales%20·%20roll--matched%20parquet-4051b5)](data/raw/README.md)
10 [![Models](https://img.shields.io/badge/models-20%20·%204%20design%20axes-4051b5)](src/wp11/models.py) 10 [![Models](https://img.shields.io/badge/models-20%20·%204%20design%20axes-4051b5)](src/wp11/models.py)
@@ -15,13 +15,19 @@ and Estimation Methods for the Quebec Housing Market, 2021–2026*
15 > **TL;DR** — A controlled horse race of **20 hedonic models** on 514,212 Quebec sales 15 > **TL;DR** — A controlled horse race of **20 hedonic models** on 514,212 Quebec sales
16 > (2021–2026) with assessor-grade structural attributes: 6 functional forms × a time-FE 16 > (2021–2026) with assessor-grade structural attributes: 6 functional forms × a time-FE
17 > ladder × a spatial-FE ladder × 6 estimation methods, all scored on the **same 17 > ladder × a spatial-FE ladder × 6 estimation methods, all scored on the **same
18−> price-level scoreboard** (Duan smearing / Box–Cox inversion) under **two holdouts** 18+> price-level scoreboard** (one retransformation rule for every model) under **two
19−> (random 80/20 and forward-in-time). Functional form is second-order (±2 pp of MdAPE); 19+> holdouts** (random 80/20 and forward-in-time), with municipality-clustered bootstrap
20−> spatial controls are first-order (~10 pp) but overfit at ~1 km granularity; **gradient 20+> intervals and Diebold–Mariano-type tests on every comparison. Functional form is
21−> boosting wins under random validation** (MdAPE 14.4% vs 16.5% for the best linear 21+> second-order (1.5 pp of MdAPE); spatial controls are first-order (~10 pp), and a ~1 km
22−> model) — but under the forward-in-time split *every* model degrades and the ML 22+> grid overfits when used alone but becomes the best linear specification once nested in
23−> advantage **reverses** (splines 19.1% vs boosting 21.2%, identical R²_ln): random 23+> municipalities; **gradient boosting wins under random validation** (14.4% vs 17.6% for
24−> cross-validation is the wrong experiment for valuation models. 24+> the best linear model, −3.2 pp [−4.7, −1.9]), a gain that survives parcel- and
25+> building-grouped holdouts. Under the forward-in-time split (train < 2025, test 2025–26)
26+> every model degrades and the gap shrinks to 0.5 pp and to insignificance — but the
27+> decomposition shows this is a *level* (staleness) effect: re-levelled, boosting still
28+> leads by 2.9 pp. Random cross-validation hides the staleness cost; it does not reverse
29+> the ranking (the reversal reported in v1.0 was an artefact of an asymmetric
30+> retransformation, corrected in v1.1).
25 31
26 --- 32 ---
27 33
@@ -29,8 +35,8 @@ and Estimation Methods for the Quebec Housing Market, 2021–2026*
29 35
30 | Item | Value | 36 | Item | Value |
31 |---|---| 37 |---|---|
32−| Version | 1.0 (August 2026) | 38+| Version | **1.1 (October 2026)** — revised 2026-10-17 by the editorial-board review (see `docs/`); v1.0 = August 2026 |
33−| SSRN | [7626698](https://ssrn.com/abstract=7626698) — submitted 2026-10-17 (preliminary upload) | 39+| SSRN | [7626698](https://ssrn.com/abstract=7626698) — v1.0 uploaded 2026-10-17; v1.1 PDF to be uploaded as a revision |
34 | Journal | not yet submitted | 40 | Journal | not yet submitted |
35 | Code & data | reproducible from `scripts/` (see Quick start); raw parquet snapshot not redistributed | 41 | Code & data | reproducible from `scripts/` (see Quick start); raw parquet snapshot not redistributed |
36 42
@@ -77,23 +83,35 @@ and accuracy by market segment.
77 83
78 ## 🏆 Headline results 84 ## 🏆 Headline results
79 85
86+All MdAPE in %, median retransformation rule for every model (v1.1 scoreboard).
87+
80 | Object | Random 80/20 holdout | Forward-in-time holdout | 88 | Object | Random 80/20 holdout | Forward-in-time holdout |
81 |---|---|---| 89 |---|---|---|
82−| Functional-form range (A1–A6), MdAPE | 16.5 % (splines) – 18.6 % (Box–Cox) | 19.1 % – 21.0 % | 90+| Functional-form range (A1–A6) | 17.6 (splines) – 19.2 (quadratics) | 20.4 (linear) – 23.3 |
83−| Data-driven Box–Cox exponent | λ̂ = 0.25, buys nothing out of sample | — | 91+| Splines vs. semi-log | −1.4 pp [−1.8, −1.1] | −1.4 pp [−2.3, −0.8] |
84−| Dropping spatial FE (C1 vs C2) | 27.9 % vs 18.1 % (+10 pp) | 26.5 % vs 20.5 % | 92+| Data-driven Box–Cox exponent | λ̂ = 0.25 (0.35 on a fine grid), −0.5 pp vs. semi-log, worse on MAPE | — |
85−| ~1.1 km grid FE (C4) | 19.4 % — **overfits** vs 17.5 % at ~5.5 km | 22.1 % | 93+| Dropping spatial FE (C1 vs C2) | 28.8 vs 19.2 (+9.6 pp) | 29.0 vs 23.3 |
86−| Dropping time FE (B1 vs B3) | 21.1 % vs 18.1 % | 25.4 % vs 20.5 % | 94+| ~5.5 km grid vs. municipality FE (C3 vs C2) | 18.7 vs 19.2 — **not significant** (−0.45 [−1.07, +0.37]) | 24.3 vs 23.3 |
87−| Gradient boosting (D4) | **14.4 %** (−13 % vs best linear 16.5 %) | 21.2 % | 95+| ~1.1 km grid alone (C4) | 21.0 — overfits (+1.8 pp [+1.2, +2.3]) | 25.3 |
88−| Random forest (D3) | 14.6 % | 21.3 % | 96+| ~1.1 km grid **nested in municipalities** (C4′) | **17.3** — best linear specification | 21.6 |
89−| Boosting without coordinates (D5) | 23.2 % | 26.2 % | 97+| Dropping time FE (B1 vs B3) | 22.0 vs 19.2 | 29.3 vs 23.3 |
90−| Semi-log + splines (A6) | 16.5 % | **19.1 %** — beats boosting, same R²_ln (0.52) | 98+| Gradient boosting (D4) vs. best linear (A6) | **14.4** vs 17.6, −3.2 pp [−4.7, −1.9], DM t = −3.6 | 21.2 vs 21.7, −0.5 pp [−1.7, +0.6], n.s. |
91−| Implied monthly indices across forms | agree within a few index points | | 99+| Random forest (D3) | 14.6 | 21.3 |
92−| Boosted implicit age / area profiles | track quadratic OLS closely | | 100+| Boosting without coordinates (D5) | 23.2 | 26.2 |
93− 101+| Parcel- / building-grouped holdout, D4 vs A6 | 14.5 vs 17.6 / 14.6 vs 17.8 (gap unchanged) | — |
94−Practical synthesis: a semi-log with splines, quarter effects and spatial FE matched to 102+| Staleness cost (forward − same-period random) | — | D4 +7.5 pp, A6 +4.7, A1 +3.3 |
95−market thickness is within two points of the frontier in deployment conditions — 103+| Median log level error, forward split | — | D4 +0.18, A6 +0.16, A1 +0.10 |
96−transparent, auditable, fast. Validate against the future, not a shuffle of the past. 104+| Re-levelled forward MdAPE | — | **D4 13.9 vs A6 16.8** (gap 2.9 ≈ random 3.5) |
105+| Boosting lead over splines by test quarter | — | 1.5 pp (2025Q1) → 0.0 (2026Q3) |
106+| Monthly indices, four linear forms | agree within 2.5 index points | |
107+| Boosted imputation index, July 2026 | 160.5 vs 168.6–171.0 for the linear forms | |
108+| Boosted age profile vs. quadratic OLS | same shape, 0.10–0.13 log points flatter from age 20 | |
109+
110+Practical synthesis: a semi-log with splines, quarter effects and spatial fixed effects
111+nested from municipality down to a fine grid is within three points of the frontier under
112+random validation and indistinguishable from it in deployment. Supply the price level from
113+an index or a frequent refit, spend the flexibility budget on the spatial surface, and
114+validate against the future, not a shuffle of the past.
97 115
98 ## 🗂 Repository layout 116 ## 🗂 Repository layout
99 117
@@ -148,8 +166,9 @@ peak RAM ≈ 8 GB.
148 | 01 | `01_build_sample.py` | residential use codes, roll match ≤ 50 m / score ≥ 150, price ≥ $50k, floor area 20–2,000 m², known year built, 1/99 % trims within sale year; builds grid cells | `data/processed/`, `results/reproduced/sample_counts.csv`, `summary_stats.csv` | 166 | 01 | `01_build_sample.py` | residential use codes, roll match ≤ 50 m / score ≥ 150, price ≥ $50k, floor area 20–2,000 m², known year built, 1/99 % trims within sale year; builds grid cells | `data/processed/`, `results/reproduced/sample_counts.csv`, `summary_stats.csv` |
149 | 02 | `02_horserace.py` | fits the 20 models on each split, retransforms predictions to price levels, scores MdAPE/MAPE/RMSE_ln/R²_ln; Box–Cox profile likelihood | `horserace_random.csv`, `horserace_temporal.csv`, `boxcox.csv` | 167 | 02 | `02_horserace.py` | fits the 20 models on each split, retransforms predictions to price levels, scores MdAPE/MAPE/RMSE_ln/R²_ln; Box–Cox profile likelihood | `horserace_random.csv`, `horserace_temporal.csv`, `boxcox.csv` |
150 | 03 | `03_extensions.py` | constant-quality monthly indices by form, implicit ln-price profiles (quadratic OLS vs boosting), learning curves, accuracy by segment | `index.csv`, `profiles.csv`, `learning.csv`, `segments.csv` | 168 | 03 | `03_extensions.py` | constant-quality monthly indices by form, implicit ln-price profiles (quadratic OLS vs boosting), learning curves, accuracy by segment | `index.csv`, `profiles.csv`, `learning.csv`, `segments.csv` |
151−| 04 | `04_make_figures.py` | the 9 figures | `figures/fig_*.png` | 169+| 04 | `04_make_figures.py` | the 10 figures | `figures/fig_*.png` |
152−| 05 | `05_make_tables.py` | the 7 LaTeX tables | `results/tables/*.tex` | 170+| 05 | `05_make_tables.py` | the 16 LaTeX tables | `results/tables/*.tex` |
171+| 06 | `06_robustness.py` | cluster-bootstrap CIs + clustered DM tests, same-period and by-quarter decomposition, level re-levelling, leakage decomposition, parcel- and building-grouped races, nested spatial FE, fine Box–Cox grid, boosting hyper-parameter sensitivity (run after 02; ≈ 20 min) | `inference_*.csv`, `pairs.csv`, `same_period.csv`, `by_quarter.csv`, `relevel.csv`, `leakage.csv`, `horserace_group_*.csv`, `nested_fe.csv`, `boxcox_fine.csv`, `hgb_sensitivity.csv` |
153 172
154 ## 🗃 Data 173 ## 🗃 Data
155 174
@@ -161,23 +180,28 @@ physical configuration, use code. Sample cascade (paper §3): residential use co
161 high-confidence match → price ≥ $50,000 → plausible floor area → known year built → 180 high-confidence match → price ≥ $50,000 → plausible floor area → known year built →
162 1/99 % trims ⇒ **514,212 sales** (348,253 single-family, 75,734 condominiums, 74,909 181 1/99 % trims ⇒ **514,212 sales** (348,253 single-family, 75,734 condominiums, 74,909
163 plexes, 10,349 cottages, 4,881 mobile homes) over 1,115 municipalities, 5,255 cells of 182 plexes, 10,349 cottages, 4,881 mobile homes) over 1,115 municipalities, 5,255 cells of
164−~5.5 km and 30,548 cells of ~1.1 km. Mean price $462,000 (median $399,000). The raw 183+~5.5 km and 30,548 cells of ~1.1 km. Mean price $440,207 (median $397,375); 86 further dwellings of undetermined class. One fifth of sales are repeat sales of the same parcel and 30% share exact coordinates with another sale (92% of condominiums). The raw
165 parquet (100 MB, transaction microdata) is **not redistributed**. 184 parquet (100 MB, transaction microdata) is **not redistributed**.
166 185
167 ## 🔬 Methodology 186 ## 🔬 Methodology
168 187
169 1. **One attribute set, one sample** for every model (`src/wp11/sample.py`). 188 1. **One attribute set, one sample** for every model (`src/wp11/sample.py`).
170 2. **Axis A** — six functional forms on a municipality + quarter FE backbone; Box–Cox λ by 189 2. **Axis A** — six functional forms on a municipality + quarter FE backbone; Box–Cox λ by
171− profile likelihood; log models retransformed with Duan smearing, Box–Cox inverted 190+ profile likelihood. Every transformed-scale prediction is inverted with the same
172− (`src/wp11/models.py`). 191+ *median rule* (plain inversion); Duan smearing is computed for every model and
192+ reported as a robustness scoreboard (`src/wp11/models.py`).
173 3. **Axis B / C** — time-FE ladder (none → month) and spatial-FE ladder (none → ~1.1 km 193 3. **Axis B / C** — time-FE ladder (none → month) and spatial-FE ladder (none → ~1.1 km
174 grid) on the quadratic semi-log backbone. 194 grid) on the quadratic semi-log backbone.
175 4. **Axis D** — OLS, cross-validated ridge, random forest, gradient boosting with and 195 4. **Axis D** — OLS, cross-validated ridge, random forest, gradient boosting with and
176 without coordinates, spatial k-NN comparables, all on the identical attribute set. 196 without coordinates, spatial k-NN comparables, all on the identical attribute set.
177 5. **Two holdouts** — random 80/20 and forward-in-time (train < 2025, test 2025–26, time 197 5. **Two holdouts** — random 80/20 and forward-in-time (train < 2025, test 2025–26, time
178− effects carried forward); metrics on price levels, design clustered by municipality. 198+ effects carried forward), plus parcel- and building-grouped holdouts; metrics on price
199+ levels; municipality-clustered bootstrap intervals and clustered Diebold–Mariano tests
200+ (`src/wp11/inference.py`); level/skill decomposition of the forward error.
179 6. **Extensions** — implied monthly indices, implicit-price profiles, learning curves, 201 6. **Extensions** — implied monthly indices, implicit-price profiles, learning curves,
180 segment accuracy (`scripts/03_extensions.py`). 202 segment accuracy (`scripts/03_extensions.py`).
203+7. **Robustness** — retransformation rule, leakage-free holdouts, nested spatial FE, fine
204+ Box–Cox grid, boosting hyper-parameters (`scripts/06_robustness.py`).
181 205
182 ## 🖼 Figures & tables inventory 206 ## 🖼 Figures & tables inventory
183 207
@@ -192,10 +216,13 @@ parquet (100 MB, transaction microdata) is **not redistributed**.
192 | `fig_profiles` | implicit ln-price profiles: quadratic OLS vs gradient boosting | 216 | `fig_profiles` | implicit ln-price profiles: quadratic OLS vs gradient boosting |
193 | `fig_learning` | learning curves: MdAPE against training-set size | 217 | `fig_learning` | learning curves: MdAPE against training-set size |
194 | `fig_segments` | MdAPE by market segment (random holdout) | 218 | `fig_segments` | MdAPE by market segment (random holdout) |
219+| `fig_horizon` | forward-in-time MdAPE by test quarter (distance from the training window) |
195 220
196 Tables (`results/tables/*.tex`): summary statistics, scoreboard random holdout, 221 Tables (`results/tables/*.tex`): summary statistics, scoreboard random holdout,
197−scoreboard forward-in-time holdout, Box–Cox profile, generalization gap, learning 222+scoreboard forward-in-time holdout, inference (bootstrap CIs + DM tests), targeted pairs,
198−curves, segments. 223+Box–Cox profile, generalization gap, same-period / level decomposition, by-quarter
224+accuracy, learning curves, segments, median vs. Duan retransformation, grouped holdouts,
225+seen/unseen leakage decomposition, nested spatial FE, boosting hyper-parameters.
199 226
200 ## ⚠️ Limitations 227 ## ⚠️ Limitations
201 228
@@ -206,8 +233,13 @@ curves, segments.
206 - Attributes are those of the assessment roll (no interior quality, renovations or 233 - Attributes are those of the assessment roll (no interior quality, renovations or
207 listing text); the ML advantage measured here is the value of flexible *spatial* 234 listing text); the ML advantage measured here is the value of flexible *spatial*
208 learning on that attribute set, not of richer data. 235 learning on that attribute set, not of richer data.
209−- Tree ensembles are tuned lightly (fixed hyper-parameters); the ranking is robust to 236+- Tree ensembles use fixed, conventional hyper-parameters; four materially different
210− the choices tried but not exhaustively optimised. 237+ configurations (including early stopping on a time-ordered validation set) leave the
238+ ranking unchanged (paper §7.5), but no linear model with a continuous spatial surface
239+ (kriging, bivariate splines) is estimated as a competitor.
240+- The forward-in-time test covers one regime (the 2025–26 recovery); the level
241+ re-levelling uses the test-set median ratio (an oracle upper bound for what a published
242+ index would deliver).
211 243
212 ## 📝 Citation 244 ## 📝 Citation
213 245
@@ -222,7 +254,8 @@ curves, segments.
222 type = {Working Paper}, 254 type = {Working Paper},
223 number = {11}, 255 number = {11},
224 year = {2026}, 256 year = {2026},
225− month = {August} 257+ month = {October},
258+ note = {Version 1.1}
226 } 259 }
227 ``` 260 ```
228 261
@@ -239,3 +272,10 @@ Université du Québec en Outaouais (UQO), Gatineau, QC.
239 Language-Model and Vision Features* (now **WP 14**) and *Does the Sales Comparison 272 Language-Model and Vision Features* (now **WP 14**) and *Does the Sales Comparison
240 Approach Actually Work?* (now **WP 16**). 273 Approach Actually Work?* (now **WP 16**).
241 - Cover page, metadata and layout follow `Recherche-UQO/HARMONISATION.md` (2026-10-17). 274 - Cover page, metadata and layout follow `Recherche-UQO/HARMONISATION.md` (2026-10-17).
275+- **Revision 2026-10-17 (v1.1)**: full editorial-board review. Scientific report in
276+ `docs/REVIEW-REPORT.md`, audit trail (every changed number, old → new) in
277+ `docs/CHANGELOG-REVISION.md`; pre-revision PDF kept as `docs/main_pre-revision-20261017.pdf`
278+ (git tag `pre-revision-20261017`). Main correction: v1.0 applied Duan smearing to the
279+ linear log models but not to the tree ensembles; under a uniform rule the forward-in-time
280+ "reversal" disappears (the gap shrinks to 0.5 pp, n.s.) and the paper now decomposes the
281+ forward error into a common level (staleness) component and intact relative skill.
added docs/CHANGELOG-REVISION.md +165 −0
@@ -0,0 +1,165 @@
1+# Changelog — révision scientifique complète (editorial board, 2026-10-17)
2+
3+Papier : **WP 11 — Half a Million Prices, Twenty Models** (v1.0, August 2026 → **v1.1, October 2026**).
4+État de référence : tag git `pre-revision-20261017`, PDF `docs/main_pre-revision-20261017.pdf` (23 pages).
5+Rapport scientifique associé : `docs/REVIEW-REPORT.md`.
6+
7+## 1. Corrections majeures (où / avant / après / pourquoi / preuve)
8+
9+### 1.1 Règle de retransformation asymétrique → scoreboard uniforme (correction centrale)
10+- **Où** : `src/wp11/models.py` (`fit_predict`, `run_horserace`), §4.3 Methodology, §5, §7.1, abstract, intro, conclusion.
11+- **Avant** : les modèles linéaires en log (A2, A3, A5, A6, B*, C*, D1, D2) étaient multipliés par le facteur de
12+ smearing de Duan (ŝ ≈ 1.06–1.08) ; les ensembles d'arbres (D3, D4, D5) et le k-NN (D6) ne l'étaient pas
13+ (`np.exp(pred)` nu). Les métriques log (RMSE_ln, R²_ln) étaient calculées sur la prédiction smearée pour une
14+ famille et non pour l'autre.
15+- **Après** : règle « médiane » (inversion directe de la prédiction transformée, éq. 10) appliquée **à tous** les
16+ modèles pour le tableau principal ; règle « moyenne » (Duan, éq. 11, généralisée au Box–Cox par moyenne sur
17+ 1 000 résidus) calculée pour tous et rapportée en robustesse (Table 12).
18+- **Pourquoi** : la comparaison v1.0 opposait un A6 smearé (19.1 %) à un D4 non smearé (21.2 %) dans le split
19+ temporel — le « renversement » annoncé en titre de la v1.0 était un artefact : (i) résidus log asymétriques
20+ à gauche (skewness −1.4 à −1.8, médiane +0.06) donc le smearing abaisse par coïncidence la MdAPE de tout modèle
21+ log ; (ii) marché haussier en 2025-26 : tout facteur > 1 compense une partie de la staleness. Appliquée
22+ uniformément, aucune des deux règles ne renverse le classement (médiane : A6 21.7 vs D4 21.2 ; moyenne :
23+ 19.1 vs 18.4).
24+- **Preuve** : `results/reproduced/horserace_{random,temporal}.csv` (colonnes `mdape` vs `mdape_mean`, `smear`),
25+ `results/tables/retransformation.tex`, médianes de résidus vérifiées sur `data/processed/predictions_*.parquet`.
26+- **Chiffres modifiés (ancien → nouveau, MdAPE %)** — random : A1 18.2→18.2, A2 18.2→19.0, A3 17.0→18.0, A4 18.6→18.6,
27+ A5 18.1→19.2, A6 16.5→17.6, B1 21.1→22.0, B2 18.1→19.1, B4 18.3→19.3, C1 27.9→28.8, C3 17.5→18.7, C4 19.4→21.0,
28+ D2 16.7→17.7 ; D3/D4/D5/D6 inchangés (14.6/14.4/23.2/21.2). Forward : A1 20.4→20.4, A2 20.6→23.2, A3 19.2→21.8,
29+ A4 21.0→21.0, A5 20.5→23.3, A6 19.1→21.7, B1 25.4→29.3, B2 21.0→23.7, B4 20.3→22.9, C1 26.5→29.0, C3 21.3→24.3,
30+ C4 22.1→25.3, D2 19.5→22.3 ; D3/D4/D5/D6 inchangés (21.3/21.2/26.2/25.6). R²_ln des modèles log : +0.01 à +0.04
31+ (random), −0.03 à −0.04 (forward).
32+- **Conséquence narrative** : « the ranking reverses » (v1.0) → « the gap shrinks from 3.2 to 0.5 points and loses
33+ significance ; relative skill transfers intact, the level does not » (v1.1). Abstract, §1, §5.5, §8, §9 réécrits.
34+
35+### 1.2 Inférence statistique ajoutée (absente en v1.0)
36+- **Avant** : aucun intervalle, aucun test ; le README affirmait « design clustered by municipality » sans aucune
37+ implémentation.
38+- **Après** : `src/wp11/inference.py` — bootstrap par grappes (municipalités, B = 500) pour la MdAPE de chaque
39+ modèle et pour les différences ; test de type Diebold–Mariano / Giacomini–White à erreurs-types groupées sur les
40+ pertes APE et log² (éq. 13). Tables 4 (tous les modèles vs A6) et 5 (13 paires ciblées).
41+- **Résultats clés** : D4 vs A6 random −3.2 [−4.7, −1.9] (t = −3.6) ; forward −0.5 [−1.7, +0.6] (t = −1.6, p = 0.11) ;
42+ C3 vs C2 random −0.45 [−1.07, +0.37] (n.s.) ; C4 vs C2 +1.8 [+1.2, +2.3] ; B4 vs B3 +0.19 [+0.01, +0.37] ;
43+ D2 vs A6 +0.06 [−0.02, +0.16] (n.s.).
44+- **Conséquence** : la phrase « the 5.5 km grid beats municipality effects » est ramenée à « nominally better,
45+ within bootstrap noise » ; « month effects indistinguishable from quarter » précisé (légèrement pires, significatif).
46+
47+### 1.3 Décomposition du « generalization gap » (nouveau)
48+- Comparaison à période fixe (modèles random évalués sur les 31 465 ventes 2025-26 de leur test) : D4 13.7 → 21.2
49+ (coût de staleness 7.5), A6 17.0 → 21.7 (4.7), A1 17.1 → 20.4 (3.3). Biais de niveau médian forward : D4 +0.183,
50+ A6 +0.161, A1 +0.102. MdAPE re-nivelée forward : D4 13.9 vs A6 16.8 (écart 2.9 ≈ écart random 3.5).
51+ Par trimestre : avance D4 sur A6 de 1.5 pt (2025Q1) → 0 (2026Q3).
52+- Fichiers : `same_period.csv`, `relevel.csv`, `by_quarter.csv` ; Tables 8–9, Figure 6 (nouvelle).
53+
54+### 1.4 Fuite d'information dans le split aléatoire (nouveau)
55+- Faits : 20.6 % des ventes sont des reventes d'une même parcelle ; 30.3 % partagent des coordonnées exactes avec
56+ une autre vente (91.6 % des condos). Colonnes `parcel`, `coord` ajoutées à `sample.py` (reconstruction du
57+ parquet d'analyse, 514 212 ventes identiques).
58+- Splits groupés (`split("group_parcel")`, `split("group_coord")`) : course complète. Parcelle : D4 14.5 / A6 17.6
59+ (≈ inchangé). Bâtiment : D4 14.6 / A6 17.8 (écart 3.2 identique) ; seul D6 se dégrade (21.2 → 22.3).
60+ Décomposition vu/non vu : D4 12.0 vs 15.3 (coord.), A6 17.8 vs 17.6 ; condos D4 8.9 vs 10.2.
61+- Tables 13–14 ; §4.4, §7.2.
62+
63+### 1.5 Effets spatiaux fins : « seventeen K sales » et repli arbitraire
64+- **Avant** (§5.3) : « its cells average seventeen K sales each » — faux : 514 212 / 30 548 = 16.8 ventes par cellule
65+ (médiane 3). Corrigé. Cellules non vues (2.5 % des ventes test) tarifées au niveau de la cellule de référence :
66+ désormais explicité.
67+- **Nouveau** : C3′ (muni + grille 5.5 km) et C4′ (muni + grille 1.1 km) — solution de norme minimale (ridge α→0)
68+ ≈ pooling partiel vers la municipalité. Random : C4′ 17.3 % (meilleure spécification linéaire du papier),
69+ C3′ 17.7 % ; forward : 21.6 / 21.5 vs C2 23.3. Conclusion de l'axe C reformulée : « hierarchy, not coarseness ».
70+ Table 15 ; `nested_fe.csv`.
71+
72+### 1.6 Box–Cox : grille fine
73+- Grille 0.05 sur [−0.25, 0.75] : λ̂ = 0.35 (profil plat 0.25–0.55 à la tolérance du solveur itératif) ;
74+ MdAPE random 18.4 % (vs 18.6 % à 0.25). `boxcox_fine.csv`. Texte §5.1 et §7.4.
75+
76+### 1.7 Hyper-paramètres du boosting
77+- Quatre configurations alternatives (shallow, deep, régularisée, early stopping sur les 10 % derniers mois
78+ d'entraînement) sous les deux splits. `hgb_sensitivity.csv`, Table 16, §7.5. Random 14.3–14.7 % (baseline 14.4), forward 21.2–21.6 % (baseline 21.2) ; early stopping : 700 / 1 000 itérations, reproduit le baseline à 0.1 pt.
79+
80+### 1.8 Statistiques descriptives incohérentes
81+- **Avant** (§3.2, README) : « Prices average $462,000 (median $399,000) ». **Table 1** : 440 207 / 397 375.
82+ **Après** : texte aligné sur la table ; ajout des 86 logements de classe indéterminée (la somme des classes v1.0
83+ faisait 514 126 ≠ 514 212) ; répartition par année ; nettoyage des lots > P99.5 explicité (était silencieux
84+ dans `sample.py`) ; bornes âge/étages/logements explicitées.
85+
86+### 1.9 Indices et profils : affirmations adoucies
87+- **Avant** : « all five [indices] agree to within a few index points » ; « curves sit within a tenth of a log
88+ point ». **Après** : les quatre formes linéaires s'accordent à ≤ 2.5 points ; l'indice boosting finit 9 points
89+ plus bas (160.5 vs 168.6–171.0 ; écart max 10.9) ; profil d'âge du boosting uniformément plus plat de 0.10–0.13
90+ log-point à partir de 20 ans (−0.20 vs −0.31 à 40 ans), surface : ≤ 0.05. Chiffres vérifiés dans
91+ `index.csv`, `profiles.csv`.
92+- Learning curves recalculées (règle médiane) : OLS 19.1 → 19.2 (v1.0 : 18.4 → 18.1) ; GB 17.6 → 14.5 ; écart
93+ 1.6 → 4.7 pts (v1.0 : < 1 → 3.6). Segments : condo 18.2 vs 9.1 (v1.0 OLS 20.4), grandes villes 17.7 vs 11.9,
94+ petites municipalités 24.8 vs 18.7 (v1.0 23.3), chalets 34.3 vs 32.1 (v1.0 33.9).
95+
96+### 1.10 Méthodologie formalisée
97+- §4 réécrit : équations (1)–(13) — fonction hédonique générale, six formes A1–A6, profil de vraisemblance Box–Cox
98+ (avec jacobien), ridge, règle k-NN, règles médiane/Duan, métriques, test DM groupé. Documentation du traitement
99+ des catégories non vues, du carry-forward et de son analogue pour les arbres (correction de la phrase « clamped
100+ month counter » : rien n'est écrêté dans le code ; les arbres sont constants par morceaux).
101+
102+### 1.11 Autres corrections éditoriales
103+- « 13 % improvement » → « 18 % » (14.4 vs 17.6) ; « 13–21 % » → « 18–25 % » ; intro « 27.9 % versus 17.5 % »
104+ vs README « vs 18.1 % » harmonisé (28.8 vs 19.2, référence = backbone C2).
105+- Hiérarchie de la discussion : liste à puces → prose (règle de style du protocole).
106+- Mots-clés harmonisés au vocabulaire commun (« hedonic price function », « forward-in-time holdout »,
107+ « automated valuation model »).
108+- `\WPversion` 1.0 → 1.1 ; `\WPdate` August 2026 → October 2026 ; page titre canonique intacte ; macro
109+ `\companionpaper` conservée (main.tex / main_anon.tex).
110+
111+## 2. Références
112+
113+### Vérifiées (Crossref `api.crossref.org/works?query.bibliographic=…`, 2026-10-17) et corrigées
114+Toutes les entrées conservées de la v1.0 (31) ont été retrouvées sur Crossref et dotées de leur DOI. Corrections :
115+- `box1964analysis` : pages 211–252 → **211–243** (244–252 = discussion).
116+- `bogin2020house` : number 1 → **1–2** ; DOI 10.1007/s11146-019-09712-0.
117+- `silver2018house` : l'article EURONA 2018 n'est pas indexé ; remplacé par la version vérifiée **IMF Working Paper
118+ 16/213 (2016)**, DOI 10.5089/9781475552249.001, même titre (ordre des mots corrigé).
119+- `ke2017lightgbm` : @article → **@inproceedings** (NIPS 2017, non indexé Crossref ; actes Curran Associates).
120+- `malpezzi2003hedonic` : DOI 10.1002/9780470690680.ch5 ; `anselin1988spatial` : DOI 10.1007/978-94-015-7799-1.
121+
122+### Retirées (non citées dans le texte et bibliographiquement défectueuses)
123+- `knight2003listing` (volume/pages vides ; en réalité chapitre Springer 2008, pp. 39–54).
124+- `diewert2004hedonic` (« Mimeo » en champ journal ; non indexé).
125+
126+### Ajoutées (27, toutes vérifiées sur Crossref, DOI dans le .bib)
127+hill2018geospatial (RIW 64(4) 737–756) · pace2020residuals (JREFE 60 170–180) · lorenz2023interpretable
128+(REE 51(5) 1178–1208) · diewert2016tokyo (RSUE 60 300–315) · diewert2015decomposition (Econometric Reviews 34
129+106–126) · diebold1995comparing (JBES 13(3) 253–263) · giacomini2006tests (Econometrica 74(6) 1545–1578) ·
130+bergmeir2012crossvalidation (Information Sciences 191 192–213) · roberts2017crossvalidation (Ecography 40(8)
131+913–929) · kuminoff2010which (JEEM 60(3) 145–160) · bishop2020best (REEP 14(2) 260–281) · bourassa2007spatial
132+(JREFE 35(2) 143–160) · bourassa2003submarkets (JHE 12(1) 12–28) · goodman2003segmentation (JHE 12(3) 181–201) ·
133+zurada2011comparison (JRER 33(3) 349–388) · antipov2012mass (ESWA 39(2) 1772–1778) · perezrave2019machine
134+(J. Property Research 36(1) 59–96) · mccluskey2013prediction (JPR 30(4) 239–265) · schulz2014automated (JPR 31(2)
135+131–153) · fik2003modeling (REE 31(4) 623–646) · clapp2003semiparametric (JREFE 27(3) 303–320) ·
136+pace1998spatiotemporal (JREFE 17(1) 15–33) · dube2013pooled (LSRS 6(1) 1–18) · hill2009boom (JHE 18(3) 193–205) ·
137+manning2001estimating (J. Health Econ. 20(4) 461–494) · thibodeau2003marking (REE 31(1) 1–22) ·
138+khoshnoud2023evolution (JREL 31(1) 1–47).
139+Total : 33 → **58** entrées (31 conservées + 27 ajoutées), toutes citées, toutes vérifiées.
140+
141+## 3. Réanalyses exécutées (laptop, Apple Silicon 18 cœurs, Python 3.14 / scikit-learn 1.6.1)
142+
143+| Script | Contenu | Durée | Sorties |
144+|---|---|---|---|
145+| `01_build_sample.py` | reconstruction de l'échantillon (+ clés `parcel`, `coord`) — 514 212 ventes identiques | 2 s | `data/processed/analysis.parquet` |
146+| `02_horserace.py` | 20 modèles × 2 splits, règles médiane + Duan, prédictions sauvegardées | 3 min 28 s | `horserace_*.csv`, `boxcox.csv`, `predictions_*.parquet` (non commités) |
147+| `03_extensions.py` | indices, profils, learning curves, segments (règle médiane) | 4 min 18 s | `index.csv`, `profiles.csv`, `learning.csv`, `segments.csv` |
148+| `06_robustness.py` (nouveau) | bootstrap + DM, même période, par trimestre, fuite, re-nivellement, paires, splits groupés (2 courses complètes), FE emboîtés, Box–Cox fin, sensibilité HGB | 16 min 16 s | `inference_*.csv`, `same_period.csv`, `by_quarter.csv`, `leakage.csv`, `relevel.csv`, `pairs.csv`, `horserace_group_*.csv`, `nested_fe.csv`, `boxcox_fine.csv`, `hgb_sensitivity.csv` |
149+| `04_make_figures.py` | 10 figures (+ `fig_horizon.png`) | < 1 min | `figures/` |
150+| `05_make_tables.py` | 16 tables LaTeX (9 nouvelles) | < 1 s | `results/tables/` |
151+
152+Tous les nombres du texte proviennent de ces sorties ; aucune table n'est tapée à la main.
153+
154+## 4. Éléments non modifiés / analyses recommandées non exécutées
155+- Modèle linéaire à surface spatiale (krigeage des résidus, splines bivariées en lat/lng, effets hiérarchiques
156+ bayésiens) : non estimé (hors cadre « 20 modèles ») — recommandé pour fermer l'écart linéaire/boosting par l'autre
157+ côté.
158+- Holdout spatialement bloqué (cellules entières en test) : non exécuté (change la question en extrapolation
159+ spatiale ; les FE spatiaux y sont par construction inopérants).
160+- Re-nivellement par un indice **publié** (hors échantillon, non oracle) : non exécuté (aucun indice externe
161+ chargé ; le re-nivellement présenté utilise le ratio médian du test, borne supérieure).
162+- Variante « médiane calibrée » (exp(ẑ + médiane des résidus d'entraînement)) : discutée, non tabulée.
163+- Fenêtres temporelles alternatives (p. ex. train < 2024, test 2024) : non exécutées — limite déclarée §8.4.
164+- Comparaison avec LightGBM / XGBoost natifs ou réseaux de neurones : hors périmètre.
165+- La règle de nettoyage des lots > P99.5 → 0 (héritée) est documentée mais conservée pour préserver l'échantillon.
added docs/REVIEW-REPORT.md +118 −0
@@ -0,0 +1,118 @@
1+# Rapport de l'editorial board — WP 11 « Half a Million Prices, Twenty Models » (2026-10-17)
2+
3+Révision v1.0 (August 2026, 23 p.) → v1.1 (October 2026). Journal d'audit détaillé : `docs/CHANGELOG-REVISION.md`.
4+Comité : économie immobilière, économétrie appliquée, économétrie spatiale, évaluation foncière, apprentissage
5+automatique, édition scientifique. Revue cible : *Journal of Housing Economics* (repli JRER / IJF).
6+
7+## 1. Diagnostic général
8+
9+Le papier pose une question nette et utile — quels choix de spécification hédonique comptent réellement pour la
10+précision hors échantillon — et y répond par un dispositif expérimental propre (un jeu d'attributs, quatre axes, un
11+seul scoreboard, deux holdouts) sur un échantillon rare par sa taille et la qualité des descripteurs (rôle
12+d'évaluation). La contribution est réelle et conservée. Trois faiblesses structurelles de la v1.0 ont été
13+identifiées et corrigées :
14+
15+1. **Le résultat phare était un artefact.** Les modèles linéaires en log étaient retransformés par smearing de Duan
16+ et les ensembles d'arbres non. Dans le split temporel, le smearing (facteur ≈ 1.06) compense une partie de la
17+ staleness du niveau dans un marché haussier ; c'est ce qui produisait « A6 19.1 % vs D4 21.2 % » et le
18+ « renversement » affiché en abstract. Sous une règle uniforme, le boosting reste devant (21.2 vs 21.7, écart non
19+ significatif). Correction intégrale (code, tables, texte) ; la v1.1 le dit explicitement.
20+2. **Aucune inférence.** Des différences de 0.2 à 0.6 point étaient interprétées comme des résultats. Ajout d'un
21+ bootstrap par grappes (municipalités) et de tests Diebold–Mariano/Giacomini–White groupés sur toutes les
22+ comparaisons. Plusieurs affirmations tombent (grille 5.5 km > municipalités ; mois ≈ trimestre) ou se précisent.
23+3. **Mécanisme du « generalization gap » non identifié.** La v1.0 confondait difficulté de la période test et
24+ staleness du modèle. Décomposition ajoutée (même période, biais de niveau, re-nivellement, horizon par
25+ trimestre) : la compétence relative des ensembles transfère intacte (écart re-nivelé 2.9 pts ≈ 3.5 en random),
26+ c'est le niveau qui ne transfère pas, un peu plus pour les arbres (feuille terminale en t). Ce résultat est plus
27+ faible que le « renversement » mais plus utile et défendable.
28+
29+## 2. Diagnostic par section
30+
31+| Section | Forces | Faiblesses / erreurs trouvées | Action |
32+|---|---|---|---|
33+| Abstract | clair, chiffré | chiffres issus du scoreboard asymétrique ; « reverses », « identical R² » faux ; trop long pour la page 2 (débordait sur une page blanche) | réécrit, 4 leçons reformulées, mention de la correction |
34+| 1 Introduction | bonne mise en situation Rosen → ML | « 13 % improvement » (vrai : 18 %) ; « 27.9 vs 17.5 » (comparait C1 à C3 au lieu du backbone) ; aucune mention de l'inférence ni des fuites | réécrit ; renvoi à la nouvelle §7 |
35+| 2 Literature | couvre les trois courants | mince (33 réf., 29 citées) ; manquaient Hill–Scholz, Pace–Hayunga, Lorenz et al., Diewert–Shimizu, Kuminoff et al., DM/GW, Bergmeir–Benítez, Roberts et al., Dubé–Legros ; deux entrées non citées et défectueuses | +27 réf. vérifiées, −2 retirées ; Mayer et al. 2019 identifié comme antécédent direct (updating) |
36+| 3 Data | cascade d'échantillon transparente | moyenne/médiane des prix fausses dans le texte (462k/399k vs 440k/397k) ; 86 ventes « other » omises ; nettoyage des lots > P99.5 non documenté ; bornes âge/étages non dites | corrigé ; répartition annuelle ; repeat sales et coordonnées partagées quantifiés |
37+| 4 Methodology | design clair | aucune équation ; Duan non écrit ; inversion Box–Cox sans discussion du biais ; « clamped month counter » inexact (rien n'est écrêté ; arbres constants par morceaux) ; catégories non vues → référence arbitraire non dit ; hyper-paramètres « a priori » sans analyse | 13 équations ; règles médiane/moyenne ; carry-forward ; holdouts groupés ; inférence ; décomposition niveau/skill |
38+| 5 Results | lecture par axe efficace | « seventeen K sales » (17) ; ordre A sous split temporel non discuté (A1 gagne par coïncidence de biais) ; différences non testées | réécrit avec IC/tests ; §5.5 refondue (décomposition) |
39+| 6 Extensions | objets économiques pertinents | « all five agree within a few points » (indice GB −9 pts) ; « within a tenth of a log point » (0.10–0.13 systématique, profil plus plat) ; learning/segments chiffrés sous scoreboard asymétrique | affirmations ramenées aux chiffres ; mécanismes de l'écart d'indice discutés |
40+| 7 Robustness | — (n'existait pas) | — | nouvelle section : retransformation, fuites, FE emboîtés, Box–Cox fin, hyper-paramètres HGB |
41+| 8 Discussion | hiérarchie utile | liste à puces ; « the machines lose their edge » (faux) ; « 3–7 points » sans mécanisme | prose ; hiérarchie révisée ; mécanisme niveau vs skill ; implications réécrites |
42+| 9 Conclusion | synthèse pratique | reprenait le renversement ; « within two points of the frontier in deployment » | réécrite |
43+
44+## 3. Méthodologie — verdict motivé (§3 du master prompt)
45+
46+- **Spécification justifiée** : oui, le design par axes est la force du papier ; la v1.1 le formalise (éq. 1–9).
47+- **Hypothèses d'estimation explicites** : désormais oui (OLS via ridge α = 10⁻⁶, solution de norme minimale ;
48+ encodage one-hot avec référence ; splines : 6 nœuds uniformes, 8 fonctions de base ; RF/HGB : paramètres listés).
49+- **Variables définies** : oui (notation unifiée §4.1 ; bornes et nettoyages §3.2).
50+- **Effets fixes appropriés** : oui, avec la nuance majeure trouvée en révision : les FE fins doivent être emboîtés
51+ (C4′ 17.3 % = meilleure spécification linéaire ; C4 seule 21.0 %). Le repli « cellule de référence » pour les
52+ cellules non vues est désormais documenté et corrigé par l'emboîtement.
53+- **Dépendance spatiale/temporelle** : traitée par l'inférence groupée (municipalités) et par les holdouts
54+ temporel, par parcelle et par bâtiment. Limite : pas de holdout bloqué spatialement (déclaré).
55+- **Erreurs-types** : absentes en v1.0 → bootstrap par grappes + DM groupé (éq. 13). Le DM sur la perte APE teste la
56+ MAPE, pas la MdAPE ; le bootstrap couvre la médiane — distinction explicitée.
57+- **Construction de l'échantillon transparente** : oui (cascade 745 119 → 514 212, reproduite à l'identique).
58+- **Robustesse** : cinq analyses ajoutées (§7) ; toutes exécutées, aucune revendiquée sans sortie.
59+- **Interprétation** : « 18 % improvement » = (17.6−14.4)/17.6 ; « ten points » = 28.8 − 19.2 ; profils en log-points.
60+- **Significativité statistique vs économique** : distinguée systématiquement (ex. C3 vs C2, D2 vs A6, D4 vs A6
61+ forward : non significatifs ; D4 vs A6 random : −3.2 [−4.7, −1.9]).
62+- **Langage causal** : aucun ; le papier est prédictif/descriptif.
63+
64+## 4. Résultats — incohérences trouvées et état des réanalyses
65+
66+- Toutes les incohérences texte/table de la v1.0 sont listées au CHANGELOG §1.1, 1.5, 1.8, 1.9, 1.11.
67+- Nouveaux résultats (tous issus de `results/reproduced/*.csv`) :
68+ - Scoreboard uniforme (Tables 2–3) ; IC et tests (Tables 4–5) ; décomposition (Tables 8–9, Fig. 6) ;
69+ retransformation (Table 12) ; splits groupés (Table 13) ; vu/non vu (Table 14) ; FE emboîtés (Table 15) ;
70+ sensibilité HGB (Table 16) ; Box–Cox fin (texte §7.4).
71+ - Sensibilité HGB : quatre configurations alternatives (shallow, deep, régularisée, early stopping sur les 10 % derniers mois) donnent 14.3–14.7 % (random) et 21.2–21.6 % (forward) contre 14.4 / 21.2 pour le baseline ; le classement et la décomposition ne dépendent pas des hyper-paramètres fixés a priori.
72+- Vérifications de cohérence finales : abstract ↔ §1 ↔ §5 ↔ §8–9 ↔ README ↔ tables (chiffres relus un à un après
73+ régénération des tables ; voir CHANGELOG §1.1 pour la liste ancien → nouveau).
74+
75+## 5. Littérature
76+
77+33 entrées en v1.0 → 58 en v1.1 ; 100 % vérifiées sur Crossref avec DOI (sauf LightGBM, actes NIPS non indexés,
78+référence standard). 2 entrées retirées (non citées, défectueuses), 5 corrigées, 27 ajoutées et intégrées à
79+l'argument (fonctionnelle : Kuminoff et al. 2010, Bishop et al. 2020, Khoshnoud et al. 2023 ; spatial : Pace et al.
80+1998, Clapp 2003, Fik et al. 2003, Bourassa et al. 2003/2007, Goodman–Thibodeau 2003, Pace–Hayunga 2020,
81+Dubé–Legros 2013 ; indices : Hill et al. 2009, Hill–Scholz 2018, Diewert et al. 2015, Diewert–Shimizu 2016 ;
82+ML/AVM : Zurada et al. 2011, Antipov–Pokryshevskaya 2012, McCluskey et al. 2013, Schulz et al. 2014, Pérez-Rave et al.
83+2019, Lorenz et al. 2023, Thibodeau 2003 ; validation : Diebold–Mariano 1995, Giacomini–White 2006,
84+Bergmeir–Benítez 2012, Roberts et al. 2017 ; retransformation : Manning–Mullahy 2001).
85+
86+## 6. Limites restantes
87+
88+1. Un seul régime temporel testé (reprise 2025-26, +15 % en 18 mois) ; l'ordre des coûts de staleness entre
89+ familles pourrait différer dans un marché plat ou baissier.
90+2. Le re-nivellement utilise le ratio médian du test (oracle) : borne supérieure de ce qu'un indice publié
91+ permettrait.
92+3. Pas de modèle linéaire à surface spatiale continue (krigeage, splines bivariées) ni d'effets hiérarchiques
93+ proprement estimés ; l'emboîtement C4′ est un pooling partiel implicite (norme minimale), pas un modèle
94+ hiérarchique explicite.
95+4. Les holdouts groupés neutralisent reventes et bâtiments partagés, pas le voisinage immédiat.
96+5. Attributs du rôle seulement (pas de qualité intérieure, texte d'annonce, photos) ; l'avantage ML mesuré est celui
97+ de la flexibilité spatiale sur cet ensemble d'attributs.
98+6. La règle « lots > P99.5 → 0 » héritée du pipeline est documentée mais discutable.
99+7. Longueur : 40 pages avec 16 tables et 10 figures ; pour la soumission, les Tables 4–5, 12–16 iraient en annexe.
100+
101+## 7. Analyses recommandées non exécutées
102+
103+Voir CHANGELOG §4 : surface spatiale linéaire (krigeage / splines lat-lng / hiérarchique bayésien) ; holdout bloqué
104+spatialement ; re-nivellement par indice externe ; fenêtres temporelles alternatives (rolling origin) ; variante
105+« médiane calibrée » ; LightGBM/XGBoost natifs et réseaux de neurones ; coût de retraining mensuel (course
106+glissante) — cette dernière est la plus importante pour la revue cible.
107+
108+## 8. Maturité pour publication
109+
110+- **Verdict** : manuscrit désormais défendable en revue (JHE) sous réserve d'une coupe (annexes) et, idéalement, d'une
111+ course glissante (retraining mensuel) qui transformerait la §5.5 en recommandation opérationnelle chiffrée.
112+- **Risques de rejet** : (i) « un seul marché, une seule période » — mitigé par l'échelle provinciale et la
113+ décomposition ; (ii) absence d'un modèle linéaire spatialement sophistiqué comme concurrent (un rapporteur
114+ spatial le demandera) ; (iii) la correction d'un résultat phare publié en v1.0 sur SSRN doit être assumée
115+ explicitement (fait dans l'abstract et §7.1) — c'est un point d'intégrité, pas une faiblesse.
116+- **Points forts pour la revue** : taille et qualité des données, design expérimental, inférence complète,
117+ décomposition niveau/compétence inédite dans la littérature AVM, résultat « hierarchy, not coarseness » sur les FE
118+ spatiaux.
modified figures/fig_forms.png +0 −0

Binary file not shown.

modified figures/fig_generalization.png +0 −0

Binary file not shown.

added figures/fig_horizon.png +0 −0

Binary file not shown.

modified figures/fig_learning.png +0 −0

Binary file not shown.

modified figures/fig_methods.png +0 −0

Binary file not shown.

modified figures/fig_segments.png +0 −0

Binary file not shown.

modified figures/fig_space.png +0 −0

Binary file not shown.

modified figures/fig_time.png +0 −0

Binary file not shown.

modified paper/main.pdf +0 −0

Binary file not shown.

modified paper/main.tex +41 −30
@@ -48,6 +48,11 @@
48 \usepackage{enumitem} 48 \usepackage{enumitem}
49 \setlist{nosep,leftmargin=*} 49 \setlist{nosep,leftmargin=*}
50 50
51+% Float placement: let text and floats share pages
52+\setcounter{topnumber}{3}\setcounter{bottomnumber}{2}\setcounter{totalnumber}{4}
53+\renewcommand{\topfraction}{0.9}\renewcommand{\bottomfraction}{0.6}
54+\renewcommand{\textfraction}{0.08}\renewcommand{\floatpagefraction}{0.5}
55+
51 % ============================================================================ 56 % ============================================================================
52 % METADATA 57 % METADATA
53 % ============================================================================ 58 % ============================================================================
@@ -55,9 +60,9 @@
55 \newcommand{\WPtitle}{Half a Million Prices, Twenty Models} 60 \newcommand{\WPtitle}{Half a Million Prices, Twenty Models}
56 \newcommand{\WPsubtitle}{A Systematic Assessment of Hedonic Specifications and 61 \newcommand{\WPsubtitle}{A Systematic Assessment of Hedonic Specifications and
57 Estimation Methods for the Quebec Housing Market, 2021--2026} 62 Estimation Methods for the Quebec Housing Market, 2021--2026}
58−\newcommand{\WPdate}{August 2026} 63+\newcommand{\WPdate}{October 2026}
59−\newcommand{\WPversion}{1.0} 64+\newcommand{\WPversion}{1.1}
60−\newcommand{\WPkeywords}{hedonic pricing, functional form, house price indexes, machine learning, automated valuation, out-of-sample prediction} 65+\newcommand{\WPkeywords}{hedonic price function, functional form, spatial fixed effects, machine learning, automated valuation model, forward-in-time holdout, house price index}
61 \newcommand{\WPjel}{R31, C21, C52, C53} 66 \newcommand{\WPjel}{R31, C21, C52, C53}
62 67
63 \newcommand{\WPauthor}{Simon-Pierre Boucher} 68 \newcommand{\WPauthor}{Simon-Pierre Boucher}
@@ -68,34 +73,39 @@
68 283, boulevard Alexandre-Tach\'e\\ Gatineau, Qu\'ebec, Canada J9A 1L8} 73 283, boulevard Alexandre-Tach\'e\\ Gatineau, Qu\'ebec, Canada J9A 1L8}
69 74
70 \newcommand{\WPabstract}{% 75 \newcommand{\WPabstract}{%
71−Fifty years after \mbox{Rosen (1974)}, applied hedonic practice still rests 76+Fifty years after \mbox{Rosen (1974)}, applied hedonic practice still
72−on a series of specification choices --- functional form, temporal controls, 77+rests on specification choices---functional form, temporal controls,
73−spatial controls, estimation method --- that are usually made by convention 78+spatial controls, estimation method---that are made by convention and
74−and rarely stress-tested jointly. Using 514{,}212 Quebec residential sales 79+rarely stress-tested jointly. Using 514{,}212 Quebec residential sales
75 (2021--2026) whose structural descriptors come from the provincial 80 (2021--2026) whose structural descriptors come from the provincial
76 assessment roll, we run a controlled horse race of twenty hedonic models 81 assessment roll, we run a controlled horse race of twenty hedonic models
77−organised along those four axes, scoring every model on identical holdouts 82+organised along those four axes, scoring every model on identical
78−and on the same price-level scoreboard (log models are Duan-retransformed, 83+holdouts and on the same price-level scoreboard with a single
79−Box--Cox inverted). Four lessons emerge. (1)~Functional form is a 84+retransformation rule, with a municipality-clustered bootstrap interval
80−second-order choice: from linear to splines, the median absolute error 85+and a Diebold--Mariano-type test on every comparison. Four lessons
81−spans 16.5--18.6\%, and the data-driven Box--Cox exponent 86+emerge. (1)~Functional form is second-order: from linear to splines the
82−($\hat\lambda=0.25$) buys nothing out of sample. (2)~Controls are 87+median absolute error spans 17.6--19.2\%, and the data-driven Box--Cox
83−first-order: dropping spatial fixed effects costs ten error points --- 88+exponent gains half a point. (2)~Controls are first-order: dropping
84−location granularity matters far more than curvature, but only up to the 89+spatial fixed effects costs ten error points; a $\sim$1~km grid used
85−point where cells thin out (a $\sim$1~km grid \emph{overfits}). 90+alone overfits, but nested within municipalities it becomes the most
86−(3)~Under random validation, estimation method matters most: gradient 91+accurate linear specification---the bias--variance trade-off in
87−boosting reaches 14.4\% --- a 13\% improvement over the best linear model 92+absorbing location is resolved by hierarchy, not coarseness. (3)~Under
88−--- with random forests close behind, and coordinates alone reproduce 93+random validation the estimation method dominates: gradient boosting
89−what thousands of dummies buy. (4)~But the ranking is an artifact of the 94+reaches 14.4\%, an 18\% improvement over the best linear model
90−split: under a forward-in-time holdout (train $<$~2025, test 2025--26) 95+(95\% interval 1.9--4.7 points) that survives holdouts grouped by parcel
91−every model degrades and the machine-learning advantage \emph{reverses} 96+and by building and comes almost entirely from a flexible surface over
92−--- the spline hedonic posts a lower median error than gradient boosting 97+space. (4)~Under a forward-in-time holdout (train $<$~2025, test
93−and an identical log-scale $R^2$ --- a stark warning against evaluating 98+2025--26) every model degrades and the gap shrinks to half a point and
94−valuation models with random cross-validation alone. Constant-quality 99+to insignificance. Decomposing the error shows that relative pricing
95−monthly indices implied by the competing forms agree to within a few 100+skill transfers forward intact (re-levelled, boosting leads by 2.9
96−index points, and the boosted model's implicit age and floor-area 101+points) while every frozen model under-prices the typical future sale
97−profiles track the quadratic OLS closely --- interpretation and 102+by 10--20\%, the ensembles slightly more. Random cross-validation hides
98−prediction disagree less than the random-validation gap suggests.} 103+this staleness cost; it does not, as a previous version of this paper
104+claimed on the basis of an asymmetric retransformation, reverse the
105+ranking. Constant-quality indices agree across functional forms to
106+within 2.5 points but a boosted imputation index rises nine points less,
107+and the boosted model's implicit age and area profiles share the shape
108+of the quadratic OLS gradients with a milder depreciation path.}
99 109
100 \hypersetup{pdftitle={Half a Million Prices, Twenty Models}, pdfauthor={Simon-Pierre Boucher}} 110 \hypersetup{pdftitle={Half a Million Prices, Twenty Models}, pdfauthor={Simon-Pierre Boucher}}
101 111
@@ -113,10 +123,11 @@ prediction disagree less than the random-validation gap suggests.}
113 \input{sections/methodology} 123 \input{sections/methodology}
114 \input{sections/results} 124 \input{sections/results}
115 \input{sections/extensions} 125 \input{sections/extensions}
126+\input{sections/robustness}
116 \input{sections/discussion} 127 \input{sections/discussion}
117 \input{sections/conclusion} 128 \input{sections/conclusion}
118 129
119−\newpage 130+\clearpage
120 \bibliography{references} 131 \bibliography{references}
121 132
122 \end{document} 133 \end{document}
modified paper/main_anon.pdf +0 −0

Binary file not shown.

modified paper/main_anon.tex +41 −30
@@ -48,6 +48,11 @@
48 \usepackage{enumitem} 48 \usepackage{enumitem}
49 \setlist{nosep,leftmargin=*} 49 \setlist{nosep,leftmargin=*}
50 50
51+% Float placement: let text and floats share pages
52+\setcounter{topnumber}{3}\setcounter{bottomnumber}{2}\setcounter{totalnumber}{4}
53+\renewcommand{\topfraction}{0.9}\renewcommand{\bottomfraction}{0.6}
54+\renewcommand{\textfraction}{0.08}\renewcommand{\floatpagefraction}{0.5}
55+
51 % ============================================================================ 56 % ============================================================================
52 % METADATA 57 % METADATA
53 % ============================================================================ 58 % ============================================================================
@@ -55,9 +60,9 @@
55 \newcommand{\WPtitle}{Half a Million Prices, Twenty Models} 60 \newcommand{\WPtitle}{Half a Million Prices, Twenty Models}
56 \newcommand{\WPsubtitle}{A Systematic Assessment of Hedonic Specifications and 61 \newcommand{\WPsubtitle}{A Systematic Assessment of Hedonic Specifications and
57 Estimation Methods for the Quebec Housing Market, 2021--2026} 62 Estimation Methods for the Quebec Housing Market, 2021--2026}
58−\newcommand{\WPdate}{August 2026} 63+\newcommand{\WPdate}{October 2026}
59−\newcommand{\WPversion}{1.0} 64+\newcommand{\WPversion}{1.1}
60−\newcommand{\WPkeywords}{hedonic pricing, functional form, house price indexes, machine learning, automated valuation, out-of-sample prediction} 65+\newcommand{\WPkeywords}{hedonic price function, functional form, spatial fixed effects, machine learning, automated valuation model, forward-in-time holdout, house price index}
61 \newcommand{\WPjel}{R31, C21, C52, C53} 66 \newcommand{\WPjel}{R31, C21, C52, C53}
62 67
63 \newcommand{\WPauthor}{Simon-Pierre Boucher} 68 \newcommand{\WPauthor}{Simon-Pierre Boucher}
@@ -68,34 +73,39 @@
68 283, boulevard Alexandre-Tach\'e\\ Gatineau, Qu\'ebec, Canada J9A 1L8} 73 283, boulevard Alexandre-Tach\'e\\ Gatineau, Qu\'ebec, Canada J9A 1L8}
69 74
70 \newcommand{\WPabstract}{% 75 \newcommand{\WPabstract}{%
71−Fifty years after \mbox{Rosen (1974)}, applied hedonic practice still rests 76+Fifty years after \mbox{Rosen (1974)}, applied hedonic practice still
72−on a series of specification choices --- functional form, temporal controls, 77+rests on specification choices---functional form, temporal controls,
73−spatial controls, estimation method --- that are usually made by convention 78+spatial controls, estimation method---that are made by convention and
74−and rarely stress-tested jointly. Using 514{,}212 Quebec residential sales 79+rarely stress-tested jointly. Using 514{,}212 Quebec residential sales
75 (2021--2026) whose structural descriptors come from the provincial 80 (2021--2026) whose structural descriptors come from the provincial
76 assessment roll, we run a controlled horse race of twenty hedonic models 81 assessment roll, we run a controlled horse race of twenty hedonic models
77−organised along those four axes, scoring every model on identical holdouts 82+organised along those four axes, scoring every model on identical
78−and on the same price-level scoreboard (log models are Duan-retransformed, 83+holdouts and on the same price-level scoreboard with a single
79−Box--Cox inverted). Four lessons emerge. (1)~Functional form is a 84+retransformation rule, with a municipality-clustered bootstrap interval
80−second-order choice: from linear to splines, the median absolute error 85+and a Diebold--Mariano-type test on every comparison. Four lessons
81−spans 16.5--18.6\%, and the data-driven Box--Cox exponent 86+emerge. (1)~Functional form is second-order: from linear to splines the
82−($\hat\lambda=0.25$) buys nothing out of sample. (2)~Controls are 87+median absolute error spans 17.6--19.2\%, and the data-driven Box--Cox
83−first-order: dropping spatial fixed effects costs ten error points --- 88+exponent gains half a point. (2)~Controls are first-order: dropping
84−location granularity matters far more than curvature, but only up to the 89+spatial fixed effects costs ten error points; a $\sim$1~km grid used
85−point where cells thin out (a $\sim$1~km grid \emph{overfits}). 90+alone overfits, but nested within municipalities it becomes the most
86−(3)~Under random validation, estimation method matters most: gradient 91+accurate linear specification---the bias--variance trade-off in
87−boosting reaches 14.4\% --- a 13\% improvement over the best linear model 92+absorbing location is resolved by hierarchy, not coarseness. (3)~Under
88−--- with random forests close behind, and coordinates alone reproduce 93+random validation the estimation method dominates: gradient boosting
89−what thousands of dummies buy. (4)~But the ranking is an artifact of the 94+reaches 14.4\%, an 18\% improvement over the best linear model
90−split: under a forward-in-time holdout (train $<$~2025, test 2025--26) 95+(95\% interval 1.9--4.7 points) that survives holdouts grouped by parcel
91−every model degrades and the machine-learning advantage \emph{reverses} 96+and by building and comes almost entirely from a flexible surface over
92−--- the spline hedonic posts a lower median error than gradient boosting 97+space. (4)~Under a forward-in-time holdout (train $<$~2025, test
93−and an identical log-scale $R^2$ --- a stark warning against evaluating 98+2025--26) every model degrades and the gap shrinks to half a point and
94−valuation models with random cross-validation alone. Constant-quality 99+to insignificance. Decomposing the error shows that relative pricing
95−monthly indices implied by the competing forms agree to within a few 100+skill transfers forward intact (re-levelled, boosting leads by 2.9
96−index points, and the boosted model's implicit age and floor-area 101+points) while every frozen model under-prices the typical future sale
97−profiles track the quadratic OLS closely --- interpretation and 102+by 10--20\%, the ensembles slightly more. Random cross-validation hides
98−prediction disagree less than the random-validation gap suggests.} 103+this staleness cost; it does not, as a previous version of this paper
104+claimed on the basis of an asymmetric retransformation, reverse the
105+ranking. Constant-quality indices agree across functional forms to
106+within 2.5 points but a boosted imputation index rises nine points less,
107+and the boosted model's implicit age and area profiles share the shape
108+of the quadratic OLS gradients with a milder depreciation path.}
99 109
100 \hypersetup{pdftitle={Half a Million Prices, Twenty Models}, pdfauthor={}} 110 \hypersetup{pdftitle={Half a Million Prices, Twenty Models}, pdfauthor={}}
101 111
@@ -113,10 +123,11 @@ prediction disagree less than the random-validation gap suggests.}
113 \input{sections/methodology} 123 \input{sections/methodology}
114 \input{sections/results} 124 \input{sections/results}
115 \input{sections/extensions} 125 \input{sections/extensions}
126+\input{sections/robustness}
116 \input{sections/discussion} 127 \input{sections/discussion}
117 \input{sections/conclusion} 128 \input{sections/conclusion}
118 129
119−\newpage 130+\clearpage
120 \bibliography{references} 131 \bibliography{references}
121 132
122 \end{document} 133 \end{document}
modified paper/references.bib +371 −60
@@ -7,7 +7,8 @@
7 year = {1974}, 7 year = {1974},
8 volume = {82}, 8 volume = {82},
9 number = {1}, 9 number = {1},
10− pages = {34--55} 10+ pages = {34--55},
11+ doi = {10.1086/260169}
11 } 12 }
12 13
13 @article{halvorsen1981choice, 14 @article{halvorsen1981choice,
@@ -17,7 +18,8 @@
17 year = {1981}, 18 year = {1981},
18 volume = {10}, 19 volume = {10},
19 number = {1}, 20 number = {1},
20− pages = {37--49} 21+ pages = {37--49},
22+ doi = {10.1016/0094-1190(81)90021-8}
21 } 23 }
22 24
23 @article{cassel1985cost, 25 @article{cassel1985cost,
@@ -27,7 +29,8 @@
27 year = {1985}, 29 year = {1985},
28 volume = {18}, 30 volume = {18},
29 number = {2}, 31 number = {2},
30− pages = {135--142} 32+ pages = {135--142},
33+ doi = {10.1016/0094-1190(85)90012-9}
31 } 34 }
32 35
33 @article{cropper1988choice, 36 @article{cropper1988choice,
@@ -37,7 +40,8 @@
37 year = {1988}, 40 year = {1988},
38 volume = {70}, 41 volume = {70},
39 number = {4}, 42 number = {4},
40− pages = {668--675} 43+ pages = {668--675},
44+ doi = {10.2307/1935831}
41 } 45 }
42 46
43 @article{box1964analysis, 47 @article{box1964analysis,
@@ -47,7 +51,8 @@
47 year = {1964}, 51 year = {1964},
48 volume = {26}, 52 volume = {26},
49 number = {2}, 53 number = {2},
50− pages = {211--252} 54+ pages = {211--243},
55+ doi = {10.1111/j.2517-6161.1964.tb00553.x}
51 } 56 }
52 57
53 @incollection{malpezzi2003hedonic, 58 @incollection{malpezzi2003hedonic,
@@ -58,7 +63,8 @@
58 publisher = {Blackwell}, 63 publisher = {Blackwell},
59 address = {Oxford}, 64 address = {Oxford},
60 year = {2003}, 65 year = {2003},
61− pages = {67--89} 66+ pages = {67--89},
67+ doi = {10.1002/9780470690680.ch5}
62 } 68 }
63 69
64 @article{sirmans2005composition, 70 @article{sirmans2005composition,
@@ -68,7 +74,8 @@
68 year = {2005}, 74 year = {2005},
69 volume = {13}, 75 volume = {13},
70 number = {1}, 76 number = {1},
71− pages = {1--44} 77+ pages = {1--44},
78+ doi = {10.1080/10835547.2005.12090154}
72 } 79 }
73 80
74 @article{duan1983smearing, 81 @article{duan1983smearing,
@@ -78,7 +85,8 @@
78 year = {1983}, 85 year = {1983},
79 volume = {78}, 86 volume = {78},
80 number = {383}, 87 number = {383},
81− pages = {605--610} 88+ pages = {605--610},
89+ doi = {10.1080/01621459.1983.10478017}
82 } 90 }
83 91
84 @article{goodman1998housing, 92 @article{goodman1998housing,
@@ -88,7 +96,8 @@
88 year = {1998}, 96 year = {1998},
89 volume = {7}, 97 volume = {7},
90 number = {2}, 98 number = {2},
91− pages = {121--143} 99+ pages = {121--143},
100+ doi = {10.1006/jhec.1998.0229}
92 } 101 }
93 102
94 @article{dubin1998spatial, 103 @article{dubin1998spatial,
@@ -98,7 +107,8 @@
98 year = {1998}, 107 year = {1998},
99 volume = {7}, 108 volume = {7},
100 number = {4}, 109 number = {4},
101− pages = {304--327} 110+ pages = {304--327},
111+ doi = {10.1006/jhec.1998.0236}
102 } 112 }
103 113
104 @book{anselin1988spatial, 114 @book{anselin1988spatial,
@@ -106,7 +116,8 @@
106 title = {Spatial Econometrics: Methods and Models}, 116 title = {Spatial Econometrics: Methods and Models},
107 publisher = {Kluwer Academic}, 117 publisher = {Kluwer Academic},
108 address = {Dordrecht}, 118 address = {Dordrecht},
109− year = {1988} 119+ year = {1988},
120+ doi = {10.1007/978-94-015-7799-1}
110 } 121 }
111 122
112 @article{hill2013hedonic, 123 @article{hill2013hedonic,
@@ -116,25 +127,19 @@
116 year = {2013}, 127 year = {2013},
117 volume = {27}, 128 volume = {27},
118 number = {5}, 129 number = {5},
119− pages = {879--914} 130+ pages = {879--914},
131+ doi = {10.1111/j.1467-6419.2012.00731.x}
120 } 132 }
121 133
122−@article{silver2018house, 134+@techreport{silver2018house,
123− author = {Silver, Mick}, 135+ author = {Silver, Mick},
124− title = {How to Measure Hedonic Property Price Indexes Better}, 136+ title = {How to Better Measure Hedonic Residential Property Price Indexes},
125− journal = {EURONA — Eurostat Review on National Accounts and Macroeconomic Indicators}, 137+ institution = {International Monetary Fund},
126− year = {2018}, 138+ type = {IMF Working Paper},
127− volume = {1}, 139+ number = {16/213},
128− pages = {35--66} 140+ address = {Washington, DC},
129−} 141+ year = {2016},
130− 142+ doi = {10.5089/9781475552249.001}
131−@article{diewert2004hedonic,
132− author = {Diewert, W. Erwin},
133− title = {Hedonic Regressions: A Review of Some Unresolved Issues},
134− journal = {Mimeo, University of British Columbia},
135− year = {2004},
136− volume = {},
137− pages = {}
138 } 143 }
139 144
140 @article{mullainathan2017machine, 145 @article{mullainathan2017machine,
@@ -144,7 +149,8 @@
144 year = {2017}, 149 year = {2017},
145 volume = {31}, 150 volume = {31},
146 number = {2}, 151 number = {2},
147− pages = {87--106} 152+ pages = {87--106},
153+ doi = {10.1257/jep.31.2.87}
148 } 154 }
149 155
150 @article{athey2019machine, 156 @article{athey2019machine,
@@ -153,7 +159,8 @@
153 journal = {Annual Review of Economics}, 159 journal = {Annual Review of Economics},
154 year = {2019}, 160 year = {2019},
155 volume = {11}, 161 volume = {11},
156− pages = {685--725} 162+ pages = {685--725},
163+ doi = {10.1146/annurev-economics-080217-053433}
157 } 164 }
158 165
159 @article{breiman2001random, 166 @article{breiman2001random,
@@ -163,7 +170,8 @@
163 year = {2001}, 170 year = {2001},
164 volume = {45}, 171 volume = {45},
165 number = {1}, 172 number = {1},
166− pages = {5--32} 173+ pages = {5--32},
174+ doi = {10.1023/A:1010933404324}
167 } 175 }
168 176
169 @article{friedman2001greedy, 177 @article{friedman2001greedy,
@@ -173,16 +181,18 @@
173 year = {2001}, 181 year = {2001},
174 volume = {29}, 182 volume = {29},
175 number = {5}, 183 number = {5},
176− pages = {1189--1232} 184+ pages = {1189--1232},
185+ doi = {10.1214/aos/1013203451}
177 } 186 }
178 187
179−@article{ke2017lightgbm, 188+@inproceedings{ke2017lightgbm,
180− author = {Ke, Guolin and Meng, Qi and Finley, Thomas and Wang, Taifeng and Chen, Wei and Ma, Weidong and Ye, Qiwei and Liu, Tie-Yan}, 189+ author = {Ke, Guolin and Meng, Qi and Finley, Thomas and Wang, Taifeng and Chen, Wei and Ma, Weidong and Ye, Qiwei and Liu, Tie-Yan},
181− title = {{LightGBM}: A Highly Efficient Gradient Boosting Decision Tree}, 190+ title = {{LightGBM}: A Highly Efficient Gradient Boosting Decision Tree},
182− journal = {Advances in Neural Information Processing Systems}, 191+ booktitle = {Advances in Neural Information Processing Systems 30 (NIPS 2017)},
183− year = {2017}, 192+ editor = {Guyon, I. and Von Luxburg, U. and Bengio, S. and Wallach, H. and Fergus, R. and Vishwanathan, S. and Garnett, R.},
184− volume = {30}, 193+ publisher = {Curran Associates},
185− pages = {3146--3154} 194+ year = {2017},
195+ pages = {3146--3154}
186 } 196 }
187 197
188 @article{mayer2019estimation, 198 @article{mayer2019estimation,
@@ -192,7 +202,8 @@
192 year = {2019}, 202 year = {2019},
193 volume = {12}, 203 volume = {12},
194 number = {1}, 204 number = {1},
195− pages = {134--150} 205+ pages = {134--150},
206+ doi = {10.1108/JERER-08-2018-0035}
196 } 207 }
197 208
198 @article{bogin2020house, 209 @article{bogin2020house,
@@ -201,8 +212,9 @@
201 journal = {Journal of Real Estate Finance and Economics}, 212 journal = {Journal of Real Estate Finance and Economics},
202 year = {2020}, 213 year = {2020},
203 volume = {60}, 214 volume = {60},
204− number = {1}, 215+ number = {1--2},
205− pages = {40--52} 216+ pages = {40--52},
217+ doi = {10.1007/s11146-019-09712-0}
206 } 218 }
207 219
208 @article{steurer2021metrics, 220 @article{steurer2021metrics,
@@ -212,7 +224,8 @@
212 year = {2021}, 224 year = {2021},
213 volume = {38}, 225 volume = {38},
214 number = {2}, 226 number = {2},
215− pages = {99--129} 227+ pages = {99--129},
228+ doi = {10.1080/09599916.2020.1858937}
216 } 229 }
217 230
218 @article{pace1997spatial, 231 @article{pace1997spatial,
@@ -222,7 +235,8 @@
222 year = {1997}, 235 year = {1997},
223 volume = {14}, 236 volume = {14},
224 number = {3}, 237 number = {3},
225− pages = {333--340} 238+ pages = {333--340},
239+ doi = {10.1023/A:1007762613901}
226 } 240 }
227 241
228 @article{case2004modeling, 242 @article{case2004modeling,
@@ -232,7 +246,8 @@
232 year = {2004}, 246 year = {2004},
233 volume = {29}, 247 volume = {29},
234 number = {2}, 248 number = {2},
235− pages = {167--191} 249+ pages = {167--191},
250+ doi = {10.1023/B:REAL.0000035309.60607.53}
236 } 251 }
237 252
238 @article{bourassa2010predicting, 253 @article{bourassa2010predicting,
@@ -242,7 +257,8 @@
242 year = {2010}, 257 year = {2010},
243 volume = {32}, 258 volume = {32},
244 number = {2}, 259 number = {2},
245− pages = {139--159} 260+ pages = {139--159},
261+ doi = {10.1080/10835547.2010.12091276}
246 } 262 }
247 263
248 @article{desrosiers2000hedonic, 264 @article{desrosiers2000hedonic,
@@ -252,7 +268,8 @@
252 year = {2000}, 268 year = {2000},
253 volume = {18}, 269 volume = {18},
254 number = {3}, 270 number = {3},
255− pages = {291--315} 271+ pages = {291--315},
272+ doi = {10.1108/14635780010338245}
256 } 273 }
257 274
258 @article{gencay1996nonlinear, 275 @article{gencay1996nonlinear,
@@ -262,7 +279,8 @@
262 year = {1996}, 279 year = {1996},
263 volume = {52}, 280 volume = {52},
264 number = {2}, 281 number = {2},
265− pages = {129--135} 282+ pages = {129--135},
283+ doi = {10.1016/S0165-1765(96)00851-8}
266 } 284 }
267 285
268 @article{kok2017big, 286 @article{kok2017big,
@@ -272,7 +290,8 @@
272 year = {2017}, 290 year = {2017},
273 volume = {43}, 291 volume = {43},
274 number = {6}, 292 number = {6},
275− pages = {202--211} 293+ pages = {202--211},
294+ doi = {10.3905/jpm.2017.43.6.202}
276 } 295 }
277 296
278 @article{hong2020machine, 297 @article{hong2020machine,
@@ -282,16 +301,8 @@
282 year = {2020}, 301 year = {2020},
283 volume = {24}, 302 volume = {24},
284 number = {3}, 303 number = {3},
285− pages = {140--152} 304+ pages = {140--152},
286−} 305+ doi = {10.3846/ijspm.2020.11544}
287−
288−@article{knight2003listing,
289− author = {Knight, John R.},
290− title = {Hedonic Modeling of the Home Selling Process},
291− journal = {Journal of Real Estate Finance and Economics},
292− year = {2003},
293− volume = {},
294− pages = {}
295 } 306 }
296 307
297 @book{iaao2013standard, 308 @book{iaao2013standard,
@@ -309,7 +320,8 @@
309 year = {2002}, 320 year = {2002},
310 volume = {24}, 321 volume = {24},
311 number = {1}, 322 number = {1},
312− pages = {1--26} 323+ pages = {1--26},
324+ doi = {10.1080/10835547.2002.12091087}
313 } 325 }
314 326
315 @techreport{oecd2013handbook, 327 @techreport{oecd2013handbook,
@@ -319,3 +331,302 @@
319 address = {Luxembourg}, 331 address = {Luxembourg},
320 year = {2013} 332 year = {2013}
321 } 333 }
334+
335+% ---------------------------------------------------------------------------
336+% References added in the 2026-10-17 revision (all verified on Crossref)
337+% ---------------------------------------------------------------------------
338+
339+@article{hill2018geospatial,
340+ author = {Hill, Robert J. and Scholz, Michael},
341+ title = {Can Geospatial Data Improve House Price Indexes? {A} Hedonic Imputation Approach with Splines},
342+ journal = {Review of Income and Wealth},
343+ year = {2018},
344+ volume = {64},
345+ number = {4},
346+ pages = {737--756},
347+ doi = {10.1111/roiw.12303}
348+}
349+
350+@article{pace2020residuals,
351+ author = {Pace, R. Kelley and Hayunga, Darren},
352+ title = {Examining the Information Content of Residuals from Hedonic and Spatial Models Using Trees and Forests},
353+ journal = {Journal of Real Estate Finance and Economics},
354+ year = {2020},
355+ volume = {60},
356+ number = {1--2},
357+ pages = {170--180},
358+ doi = {10.1007/s11146-019-09724-w}
359+}
360+
361+@article{lorenz2023interpretable,
362+ author = {Lorenz, Felix and Willwersch, Jonas and Cajias, Marcelo and Fuerst, Franz},
363+ title = {Interpretable Machine Learning for Real Estate Market Analysis},
364+ journal = {Real Estate Economics},
365+ year = {2023},
366+ volume = {51},
367+ number = {5},
368+ pages = {1178--1208},
369+ doi = {10.1111/1540-6229.12397}
370+}
371+
372+@article{diewert2016tokyo,
373+ author = {Diewert, W. Erwin and Shimizu, Chihiro},
374+ title = {Hedonic Regression Models for {Tokyo} Condominium Sales},
375+ journal = {Regional Science and Urban Economics},
376+ year = {2016},
377+ volume = {60},
378+ pages = {300--315},
379+ doi = {10.1016/j.regsciurbeco.2016.08.002}
380+}
381+
382+@article{diewert2015decomposition,
383+ author = {Diewert, W. Erwin and de Haan, Jan and Hendriks, Rens},
384+ title = {Hedonic Regressions and the Decomposition of a House Price Index into Land and Structure Components},
385+ journal = {Econometric Reviews},
386+ year = {2015},
387+ volume = {34},
388+ number = {1--2},
389+ pages = {106--126},
390+ doi = {10.1080/07474938.2014.944791}
391+}
392+
393+@article{diebold1995comparing,
394+ author = {Diebold, Francis X. and Mariano, Roberto S.},
395+ title = {Comparing Predictive Accuracy},
396+ journal = {Journal of Business \& Economic Statistics},
397+ year = {1995},
398+ volume = {13},
399+ number = {3},
400+ pages = {253--263},
401+ doi = {10.1080/07350015.1995.10524599}
402+}
403+
404+@article{giacomini2006tests,
405+ author = {Giacomini, Raffaella and White, Halbert},
406+ title = {Tests of Conditional Predictive Ability},
407+ journal = {Econometrica},
408+ year = {2006},
409+ volume = {74},
410+ number = {6},
411+ pages = {1545--1578},
412+ doi = {10.1111/j.1468-0262.2006.00718.x}
413+}
414+
415+@article{bergmeir2012crossvalidation,
416+ author = {Bergmeir, Christoph and Ben{\'i}tez, Jos{\'e} M.},
417+ title = {On the Use of Cross-Validation for Time Series Predictor Evaluation},
418+ journal = {Information Sciences},
419+ year = {2012},
420+ volume = {191},
421+ pages = {192--213},
422+ doi = {10.1016/j.ins.2011.12.028}
423+}
424+
425+@article{roberts2017crossvalidation,
426+ author = {Roberts, David R. and Bahn, Volker and Ciuti, Simone and Boyce, Mark S. and Elith, Jane and Guillera-Arroita, Gurutzeta and Hauenstein, Severin and Lahoz-Monfort, Jos{\'e} J. and Schr{\"o}der, Boris and Thuiller, Wilfried and Warton, David I. and Wintle, Brendan A. and Hartig, Florian and Dormann, Carsten F.},
427+ title = {Cross-Validation Strategies for Data with Temporal, Spatial, Hierarchical, or Phylogenetic Structure},
428+ journal = {Ecography},
429+ year = {2017},
430+ volume = {40},
431+ number = {8},
432+ pages = {913--929},
433+ doi = {10.1111/ecog.02881}
434+}
435+
436+@article{kuminoff2010which,
437+ author = {Kuminoff, Nicolai V. and Parmeter, Christopher F. and Pope, Jaren C.},
438+ title = {Which Hedonic Models Can We Trust to Recover the Marginal Willingness to Pay for Environmental Amenities?},
439+ journal = {Journal of Environmental Economics and Management},
440+ year = {2010},
441+ volume = {60},
442+ number = {3},
443+ pages = {145--160},
444+ doi = {10.1016/j.jeem.2010.06.001}
445+}
446+
447+@article{bishop2020best,
448+ author = {Bishop, Kelly C. and Kuminoff, Nicolai V. and Banzhaf, H. Spencer and Boyle, Kevin J. and von Gravenitz, Kathrine and Pope, Jaren C. and Smith, V. Kerry and Timmins, Christopher D.},
449+ title = {Best Practices for Using Hedonic Property Value Models to Measure Willingness to Pay for Environmental Quality},
450+ journal = {Review of Environmental Economics and Policy},
451+ year = {2020},
452+ volume = {14},
453+ number = {2},
454+ pages = {260--281},
455+ doi = {10.1093/reep/reaa001}
456+}
457+
458+@article{bourassa2007spatial,
459+ author = {Bourassa, Steven C. and Cantoni, Eva and Hoesli, Martin},
460+ title = {Spatial Dependence, Housing Submarkets, and House Price Prediction},
461+ journal = {Journal of Real Estate Finance and Economics},
462+ year = {2007},
463+ volume = {35},
464+ number = {2},
465+ pages = {143--160},
466+ doi = {10.1007/s11146-007-9036-8}
467+}
468+
469+@article{bourassa2003submarkets,
470+ author = {Bourassa, Steven C. and Hoesli, Martin and Peng, Vincent S.},
471+ title = {Do Housing Submarkets Really Matter?},
472+ journal = {Journal of Housing Economics},
473+ year = {2003},
474+ volume = {12},
475+ number = {1},
476+ pages = {12--28},
477+ doi = {10.1016/S1051-1377(03)00003-2}
478+}
479+
480+@article{goodman2003segmentation,
481+ author = {Goodman, Allen C. and Thibodeau, Thomas G.},
482+ title = {Housing Market Segmentation and Hedonic Prediction Accuracy},
483+ journal = {Journal of Housing Economics},
484+ year = {2003},
485+ volume = {12},
486+ number = {3},
487+ pages = {181--201},
488+ doi = {10.1016/S1051-1377(03)00031-7}
489+}
490+
491+@article{zurada2011comparison,
492+ author = {Zurada, Jozef and Levitan, Alan S. and Guan, Jian},
493+ title = {A Comparison of Regression and Artificial Intelligence Methods in a Mass Appraisal Context},
494+ journal = {Journal of Real Estate Research},
495+ year = {2011},
496+ volume = {33},
497+ number = {3},
498+ pages = {349--388},
499+ doi = {10.1080/10835547.2011.12091311}
500+}
501+
502+@article{antipov2012mass,
503+ author = {Antipov, Evgeny A. and Pokryshevskaya, Elena B.},
504+ title = {Mass Appraisal of Residential Apartments: An Application of Random Forest for Valuation and a {CART}-Based Approach for Model Diagnostics},
505+ journal = {Expert Systems with Applications},
506+ year = {2012},
507+ volume = {39},
508+ number = {2},
509+ pages = {1772--1778},
510+ doi = {10.1016/j.eswa.2011.08.077}
511+}
512+
513+@article{perezrave2019machine,
514+ author = {P{\'e}rez-Rave, Jorge Iv{\'a}n and Correa-Morales, Juan Carlos and Gonz{\'a}lez-Echavarr{\'i}a, Favi{\'a}n},
515+ title = {A Machine Learning Approach to Big Data Regression Analysis of Real Estate Prices for Inferential and Predictive Purposes},
516+ journal = {Journal of Property Research},
517+ year = {2019},
518+ volume = {36},
519+ number = {1},
520+ pages = {59--96},
521+ doi = {10.1080/09599916.2019.1587489}
522+}
523+
524+@article{mccluskey2013prediction,
525+ author = {McCluskey, William J. and McCord, Michael and Davis, Peadar T. and Haran, Martin and McIlhatton, David},
526+ title = {Prediction Accuracy in Mass Appraisal: A Comparison of Modern Approaches},
527+ journal = {Journal of Property Research},
528+ year = {2013},
529+ volume = {30},
530+ number = {4},
531+ pages = {239--265},
532+ doi = {10.1080/09599916.2013.781204}
533+}
534+
535+@article{schulz2014automated,
536+ author = {Schulz, Rainer and Wersing, Martin and Werwatz, Axel},
537+ title = {Automated Valuation Modelling: A Specification Exercise},
538+ journal = {Journal of Property Research},
539+ year = {2014},
540+ volume = {31},
541+ number = {2},
542+ pages = {131--153},
543+ doi = {10.1080/09599916.2013.846930}
544+}
545+
546+@article{fik2003modeling,
547+ author = {Fik, Timothy J. and Ling, David C. and Mulligan, Gordon F.},
548+ title = {Modeling Spatial Variation in Housing Prices: A Variable Interaction Approach},
549+ journal = {Real Estate Economics},
550+ year = {2003},
551+ volume = {31},
552+ number = {4},
553+ pages = {623--646},
554+ doi = {10.1046/j.1080-8620.2003.00079.x}
555+}
556+
557+@article{clapp2003semiparametric,
558+ author = {Clapp, John M.},
559+ title = {A Semiparametric Method for Valuing Residential Locations: Application to Automated Valuation},
560+ journal = {Journal of Real Estate Finance and Economics},
561+ year = {2003},
562+ volume = {27},
563+ number = {3},
564+ pages = {303--320},
565+ doi = {10.1023/A:1025838007297}
566+}
567+
568+@article{pace1998spatiotemporal,
569+ author = {Pace, R. Kelley and Barry, Ronald and Clapp, John M. and Rodriquez, Mauricio},
570+ title = {Spatiotemporal Autoregressive Models of Neighborhood Effects},
571+ journal = {Journal of Real Estate Finance and Economics},
572+ year = {1998},
573+ volume = {17},
574+ number = {1},
575+ pages = {15--33},
576+ doi = {10.1023/A:1007799028599}
577+}
578+
579+@article{dube2013pooled,
580+ author = {Dub{\'e}, Jean and Legros, Di{\`e}go},
581+ title = {Dealing with Spatial Data Pooled over Time in Statistical Models},
582+ journal = {Letters in Spatial and Resource Sciences},
583+ year = {2013},
584+ volume = {6},
585+ number = {1},
586+ pages = {1--18},
587+ doi = {10.1007/s12076-012-0082-3}
588+}
589+
590+@article{hill2009boom,
591+ author = {Hill, Robert J. and Melser, Daniel and Syed, Iqbal},
592+ title = {Measuring a Boom and Bust: The {Sydney} Housing Market 2001--2006},
593+ journal = {Journal of Housing Economics},
594+ year = {2009},
595+ volume = {18},
596+ number = {3},
597+ pages = {193--205},
598+ doi = {10.1016/j.jhe.2009.07.010}
599+}
600+
601+@article{manning2001estimating,
602+ author = {Manning, Willard G. and Mullahy, John},
603+ title = {Estimating Log Models: To Transform or Not to Transform?},
604+ journal = {Journal of Health Economics},
605+ year = {2001},
606+ volume = {20},
607+ number = {4},
608+ pages = {461--494},
609+ doi = {10.1016/S0167-6296(01)00086-8}
610+}
611+
612+@article{thibodeau2003marking,
613+ author = {Thibodeau, Thomas G.},
614+ title = {Marking Single-Family Property Values to Market},
615+ journal = {Real Estate Economics},
616+ year = {2003},
617+ volume = {31},
618+ number = {1},
619+ pages = {1--22},
620+ doi = {10.1111/j.1080-8620.2003.00055.x}
621+}
622+
623+@article{khoshnoud2023evolution,
624+ author = {Khoshnoud, Mahsa and Sirmans, G. Stacy and Zietz, Emily N.},
625+ title = {The Evolution of Hedonic Pricing Models},
626+ journal = {Journal of Real Estate Literature},
627+ year = {2023},
628+ volume = {31},
629+ number = {1},
630+ pages = {1--47},
631+ doi = {10.1080/09277544.2023.2201020}
632+}
modified paper/sections/conclusion.tex +34 −24
@@ -5,28 +5,38 @@
5 5
6 We ran the hedonic specification debate as a controlled experiment: 6 We ran the hedonic specification debate as a controlled experiment:
7 twenty models, four design axes, one attribute set, one scoreboard, two 7 twenty models, four design axes, one attribute set, one scoreboard, two
8−holdouts, half a million sales. The verdict inverts the profession's 8+holdouts, half a million sales, and a bootstrap interval on every
9−implicit priorities. The choices that consume the most methodological 9+comparison. The verdict inverts the profession's implicit priorities.
10−attention --- functional form, transformation parameters --- move 10+The choices that consume the most methodological attention---functional
11−out-of-sample accuracy by at most two points of median error, while the 11+form, transformation parameters---move out-of-sample accuracy by at most
12−choices often made by default --- whether and how finely to absorb space 12+two points of median error, while the choices often made by
13−and time --- move it by three to ten. Machine-learning estimators 13+default---whether and how to absorb space and time---move it by three to
14−dominate the standard scoreboard, but the standard scoreboard asks the 14+ten, and the way fine spatial effects are implemented matters more than
15−wrong question: when the test set lies in the future, as it always does 15+their resolution. Machine-learning estimators dominate the standard
16−in deployment, the boosted ensemble's advantage reverses against a 16+scoreboard by three points, a gain that is real, grows with the sample
17−spline hedonic with good controls, because most of what it learned was a 17+and comes almost entirely from a flexible surface over space. When the
18−spatially fine price configuration that does not transfer across the 18+test set lies in the future, as it always does in deployment, that gain
19−market cycle. 19+shrinks to half a point and loses significance, not because the learned
20+surface fails to transfer---re-levelled, it prices future sales as well
21+as it prices contemporaneous ones---but because every frozen model
22+carries a stale price level, and a boosted model carries a slightly
23+staler one than a linear model with carry-forward time effects.
20 24
21−Meanwhile the objects economists actually harvest from hedonic models 25+The objects economists harvest from hedonic models prove stable along
22−prove reassuringly stable: constant-quality indices agree across forms 26+the axis that generates the most debate and less so along the axis that
23−to within a few points over a full boom--bust--recovery cycle, and the 27+generates the least: constant-quality indices agree across functional
24−machine's implicit age and area gradients replicate the quadratic OLS. 28+forms to within 2.5 points over a full boom--bust--recovery cycle but
25−The practical synthesis is almost embarrassingly simple: a semi-log with 29+differ by nine points between a time-dummy index and a boosted
26−splines, quarter effects, and spatial fixed effects at a granularity 30+imputation index, and the machine's implicit age and area gradients
27−matched to market thickness is within two points of the frontier in 31+share the shape of the quadratic OLS with a milder depreciation path.
28−deployment conditions --- transparent, auditable, and fast. Where the 32+The practical synthesis is simple. A semi-log with splines, quarter
29−extra accuracy of learning methods is worth its retraining cadence --- 33+effects and spatial fixed effects nested from municipality down to a
30−high-frequency AVMs, collateral monitoring --- our decomposition says to 34+fine grid is within three points of the frontier under random
31−spend the flexibility budget on the spatial surface, and to validate, 35+validation and indistinguishable from it in deployment---transparent,
32−always, against the future rather than against a shuffle of the past. 36+auditable and fast. Where the extra within-period accuracy of learning
37+methods is worth a retraining cadence---high-frequency automated
38+valuation, collateral monitoring---our decomposition says to spend the
39+flexibility budget on the spatial surface, to supply the price level
40+from an index or a frequent refit rather than from the model, and to
41+validate, always, against the future rather than against a shuffle of
42+the past.
modified paper/sections/data.tex +43 −26
@@ -6,37 +6,53 @@
6 \subsection{Sources} 6 \subsection{Sources}
7 7
8 We use a registry of 745{,}119 Quebec residential-market transactions 8 We use a registry of 745{,}119 Quebec residential-market transactions
9−recorded between January 2021 and July 2026 --- sale price, date, address 9+recorded between January 2021 and July 2026---sale price, date, address
10−and coordinates --- each matched at the parcel level to the municipal 10+and coordinates---each matched at the parcel level to the municipal
11 assessment roll in force at the sale date (median match distance 11 assessment roll in force at the sale date (median match distance
12−0.6~metres, validated against the roll's recorded value). The roll 12+0.6~metres, validated against the roll's recorded value). The same
13−contributes the structural descriptors that are notoriously missing from 13+snapshot underlies \companionpaper{}. The roll contributes the
14−transaction registries: total floor area, lot area, year of construction, 14+structural descriptors that are typically missing from transaction
15−number of dwelling units, number of storeys, physical configuration 15+registries: total floor area, lot area, year of construction, number of
16−(detached, semi-detached, row, apartment-linked) and the standardized use 16+dwelling units, number of storeys, physical configuration (detached,
17−code. This combination --- market prices with assessor-grade structure 17+semi-detached, row, apartment-linked) and the standardised use code.
18−for half a million sales across an entire province --- is what makes a 18+This combination---market prices with assessor-grade structure for half a
19−controlled specification race feasible: every model sees exactly the same 19+million sales across an entire province---is what makes a controlled
20−attributes. 20+specification race feasible: every model sees exactly the same
21+attributes, and the attribute set is the one a mass-appraisal office
22+actually holds.
21 23
22 \subsection{Sample} 24 \subsection{Sample}
23 25
24 We keep residential use codes (dwellings, cottages, mobile homes), require 26 We keep residential use codes (dwellings, cottages, mobile homes), require
25−a high-confidence roll match (distance $\le 50$~m, score $\ge 150$), a 27+a high-confidence roll match (distance $\le 50$~m, match score
26−price of at least \$50{,}000, a plausible floor area (20--2{,}000~m$^2$) 28+$\ge 150$), a price of at least \$50{,}000, a plausible floor area
27−and a known year of construction, and trim prices and floor areas at the 29+(20--2{,}000~m$^2$) and a known year of construction, and trim prices and
28−1st and 99th percentiles within each sale year. The estimation sample 30+floor areas at the 1st and 99th percentiles within each sale year.
29−contains \textbf{514{,}212 sales}: 348{,}253 single-family homes, 75{,}734 31+Building age is the sale year minus the year of construction, bounded
30−condominiums, 74{,}909 plexes (2--5 units), 10{,}349 cottages and 4{,}881 32+between 0 and 150; storeys are bounded between 1 and 6 and dwelling units
31−mobile homes, spread over 1{,}115 municipalities, 5{,}255 grid cells of 33+between 1 and 12; lot areas above the 99.5th percentile, which are
32−$\sim$5.5~km and 30{,}548 cells of $\sim$1.1~km. 34+implausible for residential parcels, are set to zero and treated as
33−Table~\ref{tab:sumstats} reports the descriptives. Prices average 35+units without an exclusive lot, together with condominiums. The
34−\$462{,}000 (median \$399{,}000); the window covers the tail of the 36+estimation sample contains \textbf{514{,}212 sales}: 348{,}253
35−post-pandemic boom, the 2022--2023 rate correction and the subsequent 37+single-family homes, 75{,}734 condominiums, 74{,}909 plexes (two to five
36−recovery --- a demanding environment for any static price model, which we 38+units), 10{,}349 cottages, 4{,}881 mobile homes and 86 dwellings of
37−exploit in the forward-in-time evaluation. 39+undetermined class, spread over 1{,}115 municipalities, 5{,}255 grid
40+cells of $\sim$5.5~km and 30{,}548 cells of $\sim$1.1~km. Sales are
41+spread across the window (97{,}868 in 2021, 90{,}733 in 2022, 76{,}411 in
42+2023, 90{,}812 in 2024, 103{,}830 in 2025 and 54{,}558 in January--July
43+2026). Table~\ref{tab:sumstats} reports the descriptive statistics.
44+Prices average \$440{,}207 (median \$397{,}375), floor areas 132~m$^2$
45+and building ages 44 years; the window covers the tail of the
46+post-pandemic boom, the 2022--23 rate correction and the 2024--26
47+recovery, during which the constant-quality price level rose by roughly
48+70\% (Section~\ref{sec:ext}). This is a demanding environment for any
49+static price model, which the forward-in-time evaluation exploits.
50+One fifth of the sales (105{,}814) concern a parcel that sells more than
51+once in the window and 30\% share their exact coordinates with another
52+sale; Section~\ref{sec:holdouts} explains why these repeat and
53+co-located sales matter for validation.
38 54
39−\begin{table}[t] 55+\begin{table}[tbp]
40 \centering 56 \centering
41 \begin{threeparttable} 57 \begin{threeparttable}
42 \caption{Summary statistics, estimation sample} 58 \caption{Summary statistics, estimation sample}
@@ -47,7 +63,8 @@ exploit in the forward-in-time evaluation.
47 \item \textit{Notes:} 514{,}212 residential sales, January 2021 -- July 63 \item \textit{Notes:} 514{,}212 residential sales, January 2021 -- July
48 2026. Structural descriptors from the assessment roll in force at the 64 2026. Structural descriptors from the assessment roll in force at the
49 sale date. Lot area is zero for condominiums and other units without an 65 sale date. Lot area is zero for condominiums and other units without an
50−exclusive lot. 66+exclusive lot (and for the 0.5\% of lots above the 99.5th percentile,
67+see text).
51 \end{tablenotes} 68 \end{tablenotes}
52 \end{threeparttable} 69 \end{threeparttable}
53 \end{table} 70 \end{table}
modified paper/sections/discussion.tex +94 −61
@@ -5,77 +5,110 @@
5 5
6 \subsection{A hierarchy of specification choices} 6 \subsection{A hierarchy of specification choices}
7 7
8−Read jointly, the four axes imply a clear hierarchy of returns to 8+Read jointly, the four axes imply a hierarchy of returns to
9−specification effort, useful to anyone building a hedonic model: 9+specification effort. The first and largest return is to location:
10+any spatial absorption beats none by about ten points of median error, a
11+margin that dwarfs every other choice, and the granularity question is
12+one of implementation rather than of resolution. A fine grid used alone
13+overfits because thin cells are estimated from a handful of sales and
14+unseen cells are priced arbitrarily; the same grid nested within
15+municipalities, which pools thin cells toward their municipality, is the
16+most accurate linear specification we estimate. The second return is to
17+time controls: in a moving market a model without time effects mistakes
18+appreciation for attributes, at a cost of three points under random
19+validation and six when the level must be carried forward, while
20+granularity beyond quarters is cosmetic. The third return is to the
21+estimator, and its size depends on the question asked. Under random
22+validation gradient boosting buys three points over the best linear
23+model, a gain that is statistically unambiguous and that grows with the
24+training sample; in deployment the gain on the median error shrinks to
25+half a point and loses significance, because the ensembles carry a
26+slightly staler price level, while their relative pricing skill is
27+intact. The fourth and smallest return is to functional form: splines
28+are a cheap and reliable upgrade over the semi-log, and the Box--Cox
29+machinery is not worth its complexity, exactly as
30+\citet{cropper1988choice} concluded from simulations four decades ago.
10 31
11−\begin{enumerate} 32+\subsection{Why the forward-in-time split compresses the ranking}
12−\item \textbf{Get location right} ($\sim$10 points of median error):
13−any spatial absorption beats none by a margin that dwarfs every other
14−choice; the optimal granularity is interior --- around 5~km here ---
15−because finer cells trade bias for variance.
16−\item \textbf{Include some time control} ($\sim$3 points): in a moving
17−market, a model without time effects mistakes appreciation for
18−attributes; granularity beyond quarters is cosmetic.
19−\item \textbf{Choose the estimator for the job} ($\sim$2 points
20−deployed, $\sim$4 under random validation): boosting buys real accuracy
21−in interpolation-heavy uses (filling gaps within a period, mass
22−appraisal with contemporaneous comparables) and much less when the
23−target is the future.
24−\item \textbf{Stop worrying about functional form} ($\lesssim$2
25−points): splines are a cheap upgrade; the Box--Cox machinery is not
26−worth its complexity, exactly as \citet{cropper1988choice} concluded
27−from simulations four decades ago.
28−\end{enumerate}
29 33
30−\subsection{Why the machines lose their edge out of time} 34+The decomposition of Section~\ref{sec:gap} clarifies what the
31− 35+forward-in-time holdout measures. The boosting model's random-split
32−The decomposition rows explain the generalization gap. The boosting 36+advantage comes almost entirely from a flexible spatial surface
33−model's random-split advantage comes almost entirely from a flexible 37+(removing the coordinates costs it 8.8 points), and that surface
34−spatial surface (removing coordinates costs it 8.8 points). That surface 38+transfers to 2025--26 sales: re-levelled, the model prices them with a
35−is estimated \emph{jointly} with the time path, and trees clamp: beyond 39+13.9\% median error, against 16.8\% for the spline hedonic. What does
36−the last training month the model prices 2025--26 sales at a frozen 40+not transfer is the aggregate level. Trees are piecewise constant in the
37−level, exactly like the carry-forward linear models, while its 41+month counter and the terminal leaf in time averages the last training
38−fine-grained spatial fit --- calibrated on the 2021--24 price 42+months rather than the last one, so a frozen boosted model enters the
39−configuration --- partially decays as relative prices shift. The linear 43+test period with a slightly staler level than a linear model whose last
40−models, coarser but more rigid, carry a structure that transfers better. 44+month effect is carried forward; by mid-2026 both are about 25\% below
41−This is not an indictment of machine learning --- retrained monthly, the 45+the market and indistinguishable. The lesson is not that machine
42−boosting model would presumably keep its interpolation advantage --- but 46+learning fails out of sample. It is that the forward-in-time holdout
43−it prices the \emph{retraining requirement} that random cross-validation 47+conflates two things---the common level error that any static model
44−hides, and it matches the practitioner evidence that AVM accuracy decays 48+incurs, and the relative accuracy the estimator contributes---and that
45−quickly out of sample period \citep{bogin2020house, kok2017big}. 49+the first dominates the second within a few quarters. Retrained monthly,
50+or re-levelled with a published index as practitioners do
51+\citep{thibodeau2003marking, mayer2019estimation}, the boosted model
52+would presumably keep its interpolation advantage; the forward split
53+prices the \emph{retraining or re-levelling requirement} that random
54+cross-validation hides, and it matches the practitioner evidence that
55+automated-valuation accuracy decays quickly outside the sample period
56+\citep{bogin2020house, kok2017big}. It also explains why our first
57+version, which smeared the linear models but not the ensembles, found a
58+reversal: in a rising market an upward retransformation factor applied
59+to one family only offsets part of that family's staleness.
46 60
47 \subsection{Implications} 61 \subsection{Implications}
48 62
49−\paragraph{For research.} Hedonic coefficients and indices are robust 63+\paragraph{For research.} Hedonic indices are robust to functional form
50−objects: form and even estimator perturb them little 64+and implicit-price gradients are robust to the estimator in shape, if
51−(Section~\ref{sec:ext}). Researchers using hedonics to \emph{measure} 65+not in slope (Section~\ref{sec:ext}). Researchers using hedonic models to
52−--- indices, implicit prices, capitalization effects --- can keep simple 66+\emph{measure}---indices, implicit prices, capitalization effects---can
53−forms with good controls and report validation under a temporal split 67+keep simple forms with good, preferably hierarchical, spatial controls.
54−when prediction claims are made. 68+When prediction claims are made, they should report a forward-in-time
69+split alongside random cross-validation, and they should report
70+intervals: several of the differences that organise the applied
71+debate---a 5.5~km grid against municipality effects, month against
72+quarter effects, boosting against splines in deployment---are not
73+distinguishable from zero on half a million sales.
55 74
56 \paragraph{For mass appraisal.} Quebec's assessors face exactly this 75 \paragraph{For mass appraisal.} Quebec's assessors face exactly this
57−design problem every three years. Our results suggest the largest 76+design problem every three years. Our results suggest that the largest
58−accuracy gains lie not in exotic estimators but in spatial resolution 77+accuracy gains lie in spatial resolution implemented hierarchically, that
59−chosen by market thickness --- and that any model, linear or boosted, 78+flexible learners add a further three points within the period they are
60−frozen at a reference date degrades by 3--7 points of median error 79+estimated on, and that any model, linear or boosted, frozen at a
61−within two years. This quantifies the staleness mechanism behind the 80+reference date under-prices the typical sale by 10--20\% within eighteen
62−assessment inequities documented in \companionpaper{}: the 81+months in a market like 2025--26. This quantifies the staleness
63−valuation technology's out-of-time decay is of the same magnitude as the 82+mechanism behind the assessment inequities documented in
64−inequities measured there. 83+\companionpaper{}: the valuation technology's out-of-time decay is of the
84+same order as the inequities measured there, and it is a level problem
85+that an index adjustment addresses before any change of estimator.
65 86
66−\paragraph{For the AVM literature.} Every comparison should report a 87+\paragraph{For the automated-valuation literature.} Every comparison
67−forward-in-time split alongside random cross-validation 88+should report a forward-in-time split, a leakage-free grouped split when
68−\citep{steurer2021metrics}. On our data, the choice of split changes not 89+properties sell repeatedly or share coordinates, and a single
69−just magnitudes but the \emph{winner}. 90+retransformation rule applied to all models
91+\citep{steurer2021metrics}. On our data the first changes the size and
92+significance of the headline gap, the second changes nothing, and the
93+third, applied asymmetrically, is enough to manufacture a reversal.
70 94
71 \subsection{Limitations} 95 \subsection{Limitations}
72 96
73 Our attribute set, though assessor-grade, omits listing-level quality 97 Our attribute set, though assessor-grade, omits listing-level quality
74 (renovations, finishes, views); richer features would likely raise the 98 (renovations, finishes, views); richer features would likely raise the
75−machines' interpolation advantage. Hyper-parameters were deliberately 99+learners' within-period advantage. Hyper-parameters were deliberately
76−conventional --- a tuned boosted model would gain somewhat, as would a 100+conventional, and Section~\ref{sec:robust} shows that materially
77−spatially smarter linear model (e.g.\ kriging residuals, 101+different boosting configurations, including one tuned on a time-ordered
78−\citealp{case2004modeling}). The forward split covers one specific 102+validation set, leave the ranking unchanged; a spatially smarter linear
79−regime change (the 2025--26 recovery); other windows would shift 103+model (kriged residuals, \citealp{case2004modeling}; semiparametric
80−magnitudes. And Quebec's institutional homogeneity aids transferability 104+location surfaces, \citealp{clapp2003semiparametric}) would narrow the
81−of results across municipalities but may limit it across countries. 105+gap from the other side and is not estimated here. The forward split
106+covers one specific regime (the 2025--26 recovery), in which prices rose
107+by about 15\% in eighteen months; a flat or falling period would produce
108+a smaller level error and possibly a different ordering of staleness
109+across model families. The grouped holdouts remove leakage through
110+repeat sales and shared coordinates but not through neighbouring parcels
111+in the same street, which a spatially blocked holdout would address at
112+the cost of changing the question to spatial extrapolation. Finally,
113+Quebec's institutional homogeneity aids transferability of results
114+across municipalities but may limit it across countries.
modified paper/sections/extensions.tex +90 −61
Large diff (199 lines) is not loaded by default to keep the page fast.Load diff
modified paper/sections/introduction.tex +96 −68
Large diff (183 lines) is not loaded by default to keep the page fast.Load diff
modified paper/sections/literature.tex +92 −50
Large diff (154 lines) is not loaded by default to keep the page fast.Load diff
modified paper/sections/methodology.tex +264 −70
Large diff (344 lines) is not loaded by default to keep the page fast.Load diff
modified paper/sections/results.tex +282 −86
Large diff (441 lines) is not loaded by default to keep the page fast.Load diff
added paper/sections/robustness.tex +216 −0
Large diff (216 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/boxcox_fine.csv +22 −0
Large diff (22 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/by_quarter.csv +36 −0
Large diff (36 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/hgb_sensitivity.csv +11 −0
Large diff (11 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/horserace_group_coord.csv +21 −0
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/horserace_group_parcel.csv +21 −0
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/horserace_random.csv +21 −21
Large diff (42 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/horserace_temporal.csv +21 −21
Large diff (42 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/inference_random.csv +21 −0
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/inference_temporal.csv +21 −0
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/leakage.csv +37 −0
Large diff (37 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/learning.csv +6 −6
Large diff (19 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/nested_fe.csv +5 −0
Large diff (5 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/pairs.csv +27 −0
Large diff (27 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/relevel.csv +41 −0
Large diff (41 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/same_period.csv +21 −0
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/segments.csv +7 −7
Large diff (22 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/by_quarter.tex +13 −0
Large diff (14 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/generalization.tex +5 −5
Large diff (16 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/group_splits.tex +34 −0
Large diff (35 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/hgb_sensitivity.tex +13 −0
Large diff (14 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/horserace_random.tex +18 −18
Large diff (49 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/horserace_temporal.tex +18 −18
Large diff (50 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/inference.tex +32 −0
Large diff (33 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/leakage.tex +21 −0
Large diff (22 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/learning.tex +6 −6
Large diff (18 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/nested_fe.tex +13 −0
Large diff (14 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/pairs.tex +21 −0
Large diff (22 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/retransformation.tex +18 −0
Large diff (19 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/same_period.tex +21 −0
Large diff (22 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/segments.tex +7 −7
Large diff (20 lines) is not loaded by default to keep the page fast.Load diff
modified scripts/02_horserace.py +7 −2
Large diff (22 lines) is not loaded by default to keep the page fast.Load diff
modified scripts/04_make_figures.py +33 −0
Large diff (45 lines) is not loaded by default to keep the page fast.Load diff
modified scripts/05_make_tables.py +306 −0
Large diff (318 lines) is not loaded by default to keep the page fast.Load diff
added scripts/06_robustness.py +274 −0
Large diff (274 lines) is not loaded by default to keep the page fast.Load diff
added src/wp11/inference.py +95 −0
Large diff (95 lines) is not loaded by default to keep the page fast.Load diff
modified src/wp11/models.py +220 −43
Large diff (348 lines) is not loaded by default to keep the page fast.Load diff
modified src/wp11/sample.py +8 −2
Large diff (23 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme