SPB Git

spb/wp9_uqo

Public

UQO Working Paper No. 9 — A grand hedonic model of the Canadian housing market: decomposing structure and location value.

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

v1.2 → v1.3 : passage au pipeline reproductible (N 140 931 → 142 121), province dérivée
de la RTA (11,7 % d'annonces mal étiquetées corrigées), décomposition Shapley–Owen,
inférence alternative + bootstrap wild-cluster par province, spline, holdout spatial par
RTA, sensibilité de Moran, effets type/tenure (Kennedy), 91 références vérifiées (Crossref),
annexe (construction des variables, réconciliation v1.2/v1.3), README, docs/REVIEW-REPORT.md
et docs/CHANGELOG-REVISION.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Oct 18, 2026) parent 8eb9bf6 Browse files

78 changed files +4,381 −2,079

78 changed files
modified README.md +154 −134
@@ -1,23 +1,26 @@
1 # 🏘️ A Grand Hedonic Model of the Canadian Housing Market 1 # 🏘️ A Grand Hedonic Model of the Canadian Housing Market
2 2
3 **UQO Working Paper No. 9** — *Decomposing the Value of Structure and Location across 3 **UQO Working Paper No. 9** — *Decomposing the Value of Structure and Location across
4−140,931 MLS Listings with High-Dimensional Neighbourhood Fixed Effects* 4+142,121 MLS Listings with High-Dimensional Neighbourhood Fixed Effects*
5 5
6−[![Paper](https://img.shields.io/badge/paper-PDF%20(34%20p.)-b31b1b?logo=latex&logoColor=white)](paper/main.pdf) 6+[![Paper](https://img.shields.io/badge/paper-PDF%20(52%20p.)-b31b1b?logo=latex&logoColor=white)](paper/main.pdf)
7 [![Python](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white)](requirements.txt) 7 [![Python](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white)](requirements.txt)
8 [![DuckDB](https://img.shields.io/badge/data-DuckDB%20·%20172%2C019%20listings-FFF000?logo=duckdb&logoColor=black)](data/raw/README.md) 8 [![DuckDB](https://img.shields.io/badge/data-DuckDB%20·%20172%2C019%20listings-FFF000?logo=duckdb&logoColor=black)](data/raw/README.md)
9 [![Estimation](https://img.shields.io/badge/estimation-statsmodels%20·%20linearmodels%20(AbsorbingLS)-4051b5)](src/wp9/models.py) 9 [![Estimation](https://img.shields.io/badge/estimation-statsmodels%20·%20linearmodels%20(AbsorbingLS)-4051b5)](src/wp9/models.py)
10 [![Reproducible](https://img.shields.io/badge/reproducible-end--to--end%20pipeline-2e7d32)](scripts/) 10 [![Reproducible](https://img.shields.io/badge/reproducible-end--to--end%20pipeline-2e7d32)](scripts/)
11−[![Tables verified](https://img.shields.io/badge/tables-identical%20to%20published-2e7d32)](docs/AUDIT.md) 11+[![Revised](https://img.shields.io/badge/revised-editorial%20board%202026--10--17-2e7d32)](docs/REVIEW-REPORT.md)
12 [![Institution](https://img.shields.io/badge/UQO-D%C3%A9pt.%20des%20sciences%20administratives-16365c)](https://uqo.ca) 12 [![Institution](https://img.shields.io/badge/UQO-D%C3%A9pt.%20des%20sciences%20administratives-16365c)](https://uqo.ca)
13 [![Author](https://img.shields.io/badge/author-Simon--Pierre%20Boucher-16365c)](mailto:simon-pierre.boucher@uqo.ca) 13 [![Author](https://img.shields.io/badge/author-Simon--Pierre%20Boucher-16365c)](mailto:simon-pierre.boucher@uqo.ca)
14 [![Contact](https://img.shields.io/badge/contact-simon--pierre.boucher%40uqo.ca-a02020?logo=maildotru&logoColor=white)](mailto:simon-pierre.boucher@uqo.ca) 14 [![Contact](https://img.shields.io/badge/contact-simon--pierre.boucher%40uqo.ca-a02020?logo=maildotru&logoColor=white)](mailto:simon-pierre.boucher@uqo.ca)
15 15
16−> **TL;DR** — On 140,931 Canadian MLS listings, absorbing 1,153 neighbourhood (FSA) fixed 16+> **TL;DR** — On 142,121 Canadian MLS listings (asking prices), absorbing 1,155
17−> effects lifts explained log-price variance from **46% → 77%**. Location alone is worth 17+> neighbourhood (FSA) fixed effects lifts explained log-price variance from **44% → 78%**.
18−> ~30 percentage points of R² — more than every structural attribute combined. The model 18+> A Shapley–Owen decomposition assigns **≈34 pp to structure and ≈36 pp to location**: the
19−> values held-out homes with a median absolute error of **15.8%** (OOS R² = 0.764), 19+> two are of comparable importance, and location is the single largest block once province
20−> competitive with commercial AVMs, while staying fully transparent. 20+> and neighbourhood are grouped (the sequential ladder would say 44 vs 32). Living-area
21+> elasticity 0.53, +12% per full bathroom, bedrooms ≈ 0. Out of sample: MdAPE **15.6%**
22+> (R² 0.77) in neighbourhoods seen in training, **17.3%** (R² 0.74) in neighbourhoods never
23+> seen when the FSA effect is interpolated from its neighbours.
21 24
22 --- 25 ---
23 26
@@ -25,10 +28,10 @@
25 28
26 | Item | Value | 29 | Item | Value |
27 |---|---| 30 |---|---|
28−| Version | 1.2 (May 2026) | 31+| Version | **1.3 (October 2026)** — revised 2026-10-17 by the editorial-board review ([`docs/REVIEW-REPORT.md`](docs/REVIEW-REPORT.md), [`docs/CHANGELOG-REVISION.md`](docs/CHANGELOG-REVISION.md)); v1.2 (May 2026) archived as `docs/main_pre-revision-20261017.pdf` and git tag `pre-revision-20261017` |
29−| SSRN | [7626678](https://ssrn.com/abstract=7626678) — submitted 2026-10-17 (preliminary upload) | 32+| SSRN | [7626678](https://ssrn.com/abstract=7626678) — v1.2 uploaded 2026-10-17; **v1.3 to be uploaded** (title N changed 140,931 → 142,121) |
30 | Journal | not yet submitted | 33 | Journal | not yet submitted |
31−| Code & data | reproducible from `scripts/` (see Quick start); raw DuckDB snapshot not redistributed | 34+| Code & data | fully reproducible from `scripts/` on the committed `data/processed/analysis.parquet`; raw DuckDB snapshot not redistributed |
32 35
33 ## 📖 Table of contents 36 ## 📖 Table of contents
34 37
@@ -40,12 +43,11 @@
40 5. [The pipeline, step by step](#-the-pipeline-step-by-step) 43 5. [The pipeline, step by step](#-the-pipeline-step-by-step)
41 6. [Data](#-data) 44 6. [Data](#-data)
42 7. [Methodology](#-methodology) 45 7. [Methodology](#-methodology)
43−8. [The two results tiers (reference vs. reproduced)](#-the-two-results-tiers-reference-vs-reproduced) 46+8. [The two results tiers (reproduced vs. reference)](#-the-two-results-tiers-reproduced-vs-reference)
44 9. [Figures & tables inventory](#-figures--tables-inventory) 47 9. [Figures & tables inventory](#-figures--tables-inventory)
45−10. [Reproduction verification](#-reproduction-verification) 48+10. [Limitations](#-limitations)
46−11. [Limitations](#-limitations) 49+11. [Citation](#-citation)
47−12. [Citation](#-citation) 50+12. [Author & contact](#-author--contact)
48−13. [Author & contact](#-author--contact)
49 51
50 --- 52 ---
51 53
@@ -59,50 +61,60 @@ estimates a **semi-logarithmic hedonic price equation** at national scale for Ca
59 ln P_i = α + β·ln(Area_i) + x_i'γ + d_i'δ + μ_f(i) + ε_i 61 ln P_i = α + β·ln(Area_i) + x_i'γ + d_i'δ + μ_f(i) + ε_i
60 ``` 62 ```
61 63
62−where `μ_f(i)` is a fixed effect for the **Forward Sortation Area** (FSA — the first three 64+where `P_i` is the **asking price** of listing *i* and `μ_f(i)` is a fixed effect for its
63−characters of the postal code) of listing *i*. With 1,153 absorbed FSA intercepts, every 65+**Forward Sortation Area** (FSA — the first three characters of the postal code). With 1,155
66+absorbed FSA intercepts (1,146 FSAs + 9 province-level pools of small FSAs), every
64 neighbourhood gets an arbitrary price level that soaks up schools, transit, coastline, 67 neighbourhood gets an arbitrary price level that soaks up schools, transit, coastline,
65 employment density — observed or not — and the structural implicit prices (β, γ) are 68 employment density — observed or not — and the structural implicit prices (β, γ) are
66 identified purely from **within-neighbourhood** variation. Estimation is by absorbing 69 identified purely from **within-neighbourhood** variation. Estimation is by absorbing
67−least squares (numerically identical to full-dummy OLS); inference is clustered by FSA. 70+least squares (numerically identical to full-dummy OLS); baseline inference is clustered by FSA.
68− 71+
69−Beyond the headline decomposition the paper delivers: out-of-sample valuation accuracy 72+Beyond the headline decomposition the paper delivers: a **Shapley–Owen decomposition** of
70−(80/20 split, Duan-smeared retransformation), robustness across six sample cuts, quantile 73+R² across regressor blocks (order-free alternative to the sequential ladder); inference
71−hedonic regressions, a quadratic test of diminishing returns to floor space, an urban 74+under HC1 / FSA-cluster / province-cluster / two-way SEs and a **province-level wild-cluster
72−price gradient in distance to the nine major metros, Moran's I spatial diagnostics, 75+bootstrap**; out-of-sample valuation accuracy (repeated random 80/20 splits *and* a
73−leave-one-province-out transferability, and a ranked map of Canada's most and least 76+**spatial holdout of entire FSAs** with interpolated effects, Duan-smeared retransformation);
74−expensive neighbourhoods net of structure. 77+robustness across eight sample cuts; quantile hedonic regressions; quadratic **and spline**
78+tests of diminishing returns to floor space; an urban price gradient in distance to nine
79+metros (pooled, metro intercepts, quadratic); Moran's I diagnostics with k-sensitivity;
80+leave-one-province-out transferability; dwelling-type/ownership effects with the Kennedy
81+correction; and a ranked map of Canada's most and least expensive neighbourhoods net of
82+structure.
75 83
76 ## 🏆 Headline results 84 ## 🏆 Headline results
77 85
78 | Quantity | Value | 86 | Quantity | Value |
79 |---|---| 87 |---|---|
80−| Estimation sample | **140,931** listings — 82,334 houses, 57,857 condos, 9 provinces | 88+| Estimation sample | **142,121** listings — 83,524 houses, 57,853 condos, 744 other; 9 provinces (province from FSA letter) |
81−| Absorbed neighbourhood effects | **1,153** FSAs | 89+| Absorbed neighbourhood effects | **1,155** (1,146 FSAs ≥ 25 listings + 9 pooled residual categories) |
82−| R²: structural only (M1) | 0.464 | 90+| R² houses: M1 structural / M2 +type / M3 +province / M4 +FSA | 0.467 / 0.470 / 0.605 / 0.769 |
83−| R²: + dwelling type & ownership (M2) | 0.469 | 91+| R²: grand model, all residential, FSA FE (M5) | **0.776** (structure-only on the same sample: 0.436) |
84−| R²: + province FE (M3) | 0.567 | 92+| Variance decomposition (pp of R², all residential) | sequential: structure 43.6, type 1.6, province 14.3, FSA 18.1 · **Shapley: 33.0 / 7.5 / 8.9 / 28.2** · **Owen: structure 34.0, type 7.3, location 36.3** |
85−| R²: grand model, FSA FE (M5) | **0.767** | 93+| Living-area elasticity (M5) | **0.529** (FSA-cluster SE 0.009; province-cluster 0.037; wild-cluster p = 0.004) |
86−| Living-area elasticity (M5) | **0.547** (cluster SE 0.009) | 94+| Full-bathroom premium | **0.112 log points ≈ +11.9%** per bathroom (0.148 ≈ +16% on houses with province FE) |
87−| Full-bathroom premium | **0.109 log points ≈ +11%** per bathroom | 95+| Bedrooms, half baths (conditional on area) | −0.006, −0.034 — not significant under province-level inference |
88−| Bedrooms, conditional on area | ≈ 0 (the textbook hedonic result) | 96+| Dwelling type (vs apartment, same size & FSA) | house +46%, triplex +43%, fourplex +39%, duplex +16%, townhouse ≈ 0 (Kennedy-corrected) |
89−| Out-of-sample R² (log price) | **0.764** | 97+| Out-of-sample, random 80/20 (within support) | R² **0.772**, MdAPE **15.6%**, 60% within ±20% (5 seeds: 0.769 ± 0.010, 15.5 ± 0.2%) |
90−| Median absolute valuation error | **15.8%** (59% of homes priced within ±20%) | 98+| Out-of-sample, **held-out FSAs** (20% of neighbourhoods) | province-mean effect: R² 0.52, MdAPE 25% · **IDW of 5 nearest FSAs: R² 0.74, MdAPE 17.3%** |
91−| Moran's I of residuals, structural → grand | **0.46 → 0.08** (−82%) | 99+| Moran's I of residuals, structural → grand (k = 10) | **0.50 → 0.06** (−87%); k = 5: 0.52 → 0.11; k = 20: 0.47 → 0.03 |
92−| Urban gradient | −8.5% location premium per doubling of distance to metro | 100+| Floor space | quadratic: elasticity 0.63 at 60 m² → 0.41 at 350 m²; spline: 0.57 / 0.65 / 0.58 / 0.41 / 0.48 by quintile; ΔR² = 0.001 |
93−| Neighbourhood premia span | ×9 between the most and least expensive FSAs | 101+| Urban gradient | −0.082 per log unit of distance ⇒ **−5.5% per doubling**; +21% within 5 km, −38% beyond 320 km |
94− 102+| LOPO transfer (within-province R²) | mean 0.34; MB/AB/NB/ON/SK/NS 0.46–0.52; QC 0.19; **BC −0.49** |
95−The most expensive neighbourhoods net of structure are all in the **City of Vancouver** 103+| Neighbourhood premia span | ×10.5 between extremes (V6S +226% vs A0B −69%), ×6.7 between P99 and P1 |
96−(V6S, V8E, V6T: +150–200% vs. the national median); the cheapest are in rural 104+
97−Saskatchewan, Manitoba and Newfoundland (−60 to −67%). 105+The most expensive neighbourhoods net of structure are on **Vancouver's west side** (V6S
106+Dunbar–Point Grey, V6T UBC), in **Whistler** (V8E) and **West Vancouver** (V7T); the first
107+Ontario FSA (M5R, the Annex) ranks 14th. The cheapest are in rural Newfoundland (A0B, A0G),
108+Saskatchewan (S0N, S0C, S0H, S0A), Manitoba and New Brunswick.
98 109
99 ## 📁 Repository layout 110 ## 📁 Repository layout
100 111
101 ``` 112 ```
102 wp9_uqo/ 113 wp9_uqo/
103 ├── README.md ← you are here 114 ├── README.md ← you are here
104−├── docs/ AUDIT.md (forensic audit + verification), CHANGES.md, 115+├── docs/ REVIEW-REPORT.md + CHANGELOG-REVISION.md (editorial-board
105−│ PAPER_REVIEW.md, UPGRADE_REPORT.md 116+│ revision, 2026-10-17), main_pre-revision-20261017.pdf (v1.2),
117+│ AUDIT.md, CHANGES.md, PAPER_REVIEW.md, UPGRADE_REPORT.md (history)
106 ├── requirements.txt pinned Python dependencies 118 ├── requirements.txt pinned Python dependencies
107 ├── .gitignore 119 ├── .gitignore
108 ├── data/ 120 ├── data/
@@ -121,19 +133,22 @@ wp9_uqo/
121 │ ├── 01_build_sample.py 133 │ ├── 01_build_sample.py
122 │ ├── 02_estimate_core.py 134 │ ├── 02_estimate_core.py
123 │ ├── 03_estimate_extended.py 135 │ ├── 03_estimate_extended.py
124−│ ├── 04_make_figures.py (--results reference|reproduced) 136+│ ├── 04_make_figures.py (--results reproduced|reference; default reproduced)
125−│ └── 05_make_tables.py (--results reference|reproduced) 137+│ ├── 05_make_tables.py (--results reproduced|reference; default reproduced)
138+│ └── 06_revision_analyses.py Shapley/Owen, SE comparison + wild bootstrap, spline,
139+│ spatial holdout, Moran sensitivity, metro gradient
126 ├── figures/ all 17 paper figures (PNG, generated) 140 ├── figures/ all 17 paper figures (PNG, generated)
127 ├── results/ 141 ├── results/
128−│ ├── reference/ ORIGINAL published outputs — canonical paper numbers 142+│ ├── reference/ archived outputs of the May 2026 version (v1.2)
129−│ ├── reproduced/ outputs regenerated end-to-end by this pipeline 143+│ ├── reproduced/ outputs of the current pipeline — THE PAPER'S NUMBERS (v1.3)
130−│ └── tables/ the 6 LaTeX tables consumed by the paper 144+│ └── tables/ the 13 LaTeX tables consumed by the paper
131 └── paper/ 145 └── paper/
132 ├── main.tex preamble + metadata; \input's the sections 146 ├── main.tex preamble + metadata; \input's the sections
133− ├── main.pdf compiled paper (34 pages) 147+ ├── main.pdf compiled paper (52 pages)
134 ├── sections/ titlepage, introduction, literature, data, 148 ├── sections/ titlepage, introduction, literature, data,
135− │ methodology, results, robustness, conclusion 149+ │ methodology, results, robustness, discussion, conclusion
136− ├── references.bib 32 entries, natbib author-year, aer style 150+ ├── appendix/appendix.tex variable construction, Moran sensitivity, v1.2 ↔ v1.3 reconciliation
151+ ├── references.bib 91 entries (all Crossref-verified, DOIs), natbib author-year, aer style
137 ├── Makefile / .latexmkrc build config 152 ├── Makefile / .latexmkrc build config
138 └── uq_logo.jpg 153 └── uq_logo.jpg
139 ``` 154 ```
@@ -149,15 +164,17 @@ python3 -m pip install -r requirements.txt
149 python3 scripts/01_build_sample.py # duckdb → data/processed/analysis.parquet 164 python3 scripts/01_build_sample.py # duckdb → data/processed/analysis.parquet
150 python3 scripts/02_estimate_core.py # M1–M5 ladder → results/reproduced/ 165 python3 scripts/02_estimate_core.py # M1–M5 ladder → results/reproduced/
151 python3 scripts/03_estimate_extended.py # OOS, robustness, quantile, Moran, LOPO… 166 python3 scripts/03_estimate_extended.py # OOS, robustness, quantile, Moran, LOPO…
167+python3 scripts/06_revision_analyses.py # Shapley/Owen, SE comparison, spline, spatial holdout…
152 python3 scripts/04_make_figures.py # figures/ (17 PNG) 168 python3 scripts/04_make_figures.py # figures/ (17 PNG)
153−python3 scripts/05_make_tables.py # results/tables/ (6 .tex) 169+python3 scripts/05_make_tables.py # results/tables/ (13 .tex)
154 170
155 # Paper: 171 # Paper:
156 cd paper && latexmk -pdf main.tex # or `make` 172 cd paper && latexmk -pdf main.tex # or `make`
157 ``` 173 ```
158 174
159−Without the raw DuckDB you can still run steps **02→05**: the committed 175+Without the raw DuckDB you can still run steps **02→06**: the committed
160 `data/processed/analysis.parquet` (6 MB) is the estimation sample produced by step 01. 176 `data/processed/analysis.parquet` (6 MB) is the estimation sample produced by step 01.
177+The whole pipeline (01→06) runs in about **2 minutes** on an Apple M5 Max.
161 178
162 ## 🔬 The pipeline, step by step 179 ## 🔬 The pipeline, step by step
163 180
@@ -165,9 +182,10 @@ Without the raw DuckDB you can still run steps **02→05**: the committed
165 |---|---|---|---|---| 182 |---|---|---|---|---|
166 | 01 | `01_build_sample.py` | raw DuckDB (172,019 rows) | `analysis.parquet` (142k rows, 21 cols) | ~40 s | 183 | 01 | `01_build_sample.py` | raw DuckDB (172,019 rows) | `analysis.parquet` (142k rows, 21 cols) | ~40 s |
167 | 02 | `02_estimate_core.py` | parquet | `fit.json`, `coef_M{1,2,3,5}.csv`, `grand_model.parquet`, `fsa_premia.csv` | ~1 min | 184 | 02 | `02_estimate_core.py` | parquet | `fit.json`, `coef_M{1,2,3,5}.csv`, `grand_model.parquet`, `fsa_premia.csv` | ~1 min |
168−| 03 | `03_estimate_extended.py` | parquet + step 02 | `oos.json`, `robustness.csv`, `heterogeneity.csv`, `quantile.csv`, `lopo.csv`, `ext2.json`, Moran arrays, gradient/nonlinearity bands | ~6 min | 185+| 03 | `03_estimate_extended.py` | parquet + step 02 | `oos.json`, `robustness.csv` (8 cuts), `heterogeneity.csv`, `quantile.csv`, `lopo.csv`, `ext2.json`, Moran arrays, gradient/nonlinearity bands | ~10 s |
186+| 06 | `06_revision_analyses.py` | parquet + step 02 | `shapley.csv`, `se_comparison.csv`, `spline.csv`, `spatial_holdout.json`, `moran_sensitivity.csv`, `gradient_metro.json` | ~35 s |
169 | 04 | `04_make_figures.py` | results tier + parquet | 17 PNG figures | ~30 s | 187 | 04 | `04_make_figures.py` | results tier + parquet | 17 PNG figures | ~30 s |
170−| 05 | `05_make_tables.py` | results tier | 6 LaTeX tables | ~5 s | 188+| 05 | `05_make_tables.py` | results tier | 13 LaTeX tables | ~5 s |
171 189
172 \* Apple Silicon, single process. 190 \* Apple Silicon, single process.
173 191
@@ -181,9 +199,13 @@ Without the raw DuckDB you can still run steps **02→05**: the committed
181 `"50 x 120"` frontage×depth) with a missingness indicator; the top 1% of positive 199 `"50 x 120"` frontage×depth) with a missingness indicator; the top 1% of positive
182 parsed lots (multi-acre rural acreage strings) treated as "no usable lot info"; 200 parsed lots (multi-acre rural acreage strings) treated as "no usable lot info";
183 - dwelling type consolidated to 8 groups, ownership to 6 groups; 201 - dwelling type consolidated to 8 groups, ownership to 6 groups;
184−- FSA from the postal code; FSAs with < 25 listings pooled into `<PROV>_other`; 202+- FSA from the postal code; **province from the first letter of the FSA** (Canada Post
203+ convention; the scraper's `_province` seed mislabelled 11.7% of listings and is kept as
204+ `prov_seed`); territories / invalid letters (27 records) dropped; FSAs with < 25
205+ listings pooled into `<PROV>_other`;
185 - filters: strictly positive price, non-missing living area / bedrooms / bathrooms, 206 - filters: strictly positive price, non-missing living area / bedrooms / bathrooms,
186− valid FSA; then the extreme 1% tails of price and living area are trimmed. 207+ valid FSA (147,236); then the extreme 1% tails of price and living area are trimmed
208+ (142,121).
187 209
188 ## 📊 Data 210 ## 📊 Data
189 211
@@ -197,89 +219,79 @@ file limit, plus its content is scraped listing data). It lives on the author's
197 place it at `data/raw/realtor_mls_unique.duckdb` to run step 01. All downstream artifacts 219 place it at `data/raw/realtor_mls_unique.duckdb` to run step 01. All downstream artifacts
198 — including the committed estimation sample — derive from it programmatically. 220 — including the committed estimation sample — derive from it programmatically.
199 221
200−Estimation-sample snapshot (Table 1 of the paper): median list price ≈ **$639,888**; 222+Estimation-sample snapshot (Table 1 of the paper): median asking price **$639,900**;
201−median living area ≈ **135 m²**; 3 bedrooms; 2 full bathrooms. Both price and price/m² 223+median living area **135 m²**; 3 bedrooms; 2 full bathrooms. Both price and price/m² are
202−are strongly right-skewed, motivating the log transformation. Ontario, Quebec, BC and 224+strongly right-skewed, motivating the log transformation. ON 55,897 · BC 32,994 · QC 19,949
203−Alberta dominate; PEI and the territories have no listings in this snapshot. 225+· AB 19,463 · SK 3,458 · MB 3,062 · NS 3,044 · NB 2,980 · NL 1,274; PEI and the territories
226+have no listings. **Prices are asking prices, not transactions** — every coefficient is an
227+implicit *list* price.
204 228
205 ## 📐 Methodology 229 ## 📐 Methodology
206 230
207 - **Specification ladder** — M1 structural only → M2 + type/ownership → M3 + province FE 231 - **Specification ladder** — M1 structural only → M2 + type/ownership → M3 + province FE
208 (house subsample) → M4 houses + FSA FE → M5 **grand model** (all residential, FSA FE). 232 (house subsample) → M4 houses + FSA FE → M5 **grand model** (all residential, FSA FE).
209− The M3→M5 gap ≈ 20 pp of R² *is* the value of resolving location at neighbourhood scale. 233+- **Variance decomposition** — sequential increments *and* Shapley values over the four
210−- **Absorbing least squares** (`linearmodels.AbsorbingLS`) sweeps out the 1,153 FSA 234+ blocks (16 regressions) plus Owen values grouping province + FSA into one location block
211− intercepts without materialising dummies; slopes are numerically identical to 235+ (Israeli 2007; Huettner & Sunder 2012). The sequential ladder credits the ~10 pp shared by
212− full-dummy OLS. SEs clustered by FSA throughout. 236+ structure and location to whichever enters first.
213−- **Retransformation** — predictions in levels use Duan's (1983) smearing estimator (no 237+- **Absorbing least squares** (`linearmodels.AbsorbingLS`) sweeps out the 1,155 FSA
214− log-normality assumption). 238+ intercepts; slopes identical to full-dummy OLS. Baseline SEs clustered by FSA; also HC1,
215−- **Validation** — random 80/20 split, evaluation restricted to FSAs observed in 239+ province-cluster, two-way, and a restricted wild-cluster bootstrap-t at the province level
216− training (out-of-support FE are not identified); leave-one-province-out CV with 240+ (Rademacher, full enumeration of 2⁹ = 512 draws).
217− province-specific intercepts; Moran's I with row-standardised k-NN weights (k = 10, 241+- **Percentage effects** — e^γ − 1 for counts; Kennedy (1981) correction for indicators.
218− 15,000-listing sample, 199 permutations). 242+- **Functional form** — quadratic in ln(area) and a linear spline with quintile knots.
219− 243+- **Retransformation** — Duan (1983) smearing.
220−## 🧭 The two results tiers (reference vs. reproduced) 244+- **Validation** — (i) random 80/20 splits × 5 seeds, evaluation on FSAs seen in training;
221− 245+ (ii) **spatial holdout**: 20% of FSAs held out entirely × 5 reps, FSA effect imputed as the
222−The original upstream cleaning code (`RE_DB_QC/hedonic`) was **lost** before this 246+ province mean or as the inverse-distance mean of the 5 nearest training FSAs; (iii)
223−repository was assembled; `src/wp9/sample.py` is a careful reconstruction from the 247+ leave-one-province-out with province intercepts.
224−paper's own data section, calibrated against every stored output (see `docs/AUDIT.md`). It 248+- **Spatial diagnostics** — Moran's I, row-standardised k-NN weights (k = 5, 10, 20), two
225−reproduces the published sample to **+0.86%** and all headline estimates closely — but 249+ 15,000-listing subsamples, 199 permutations.
226−not to the last digit. To keep the published record intact: 250+- **Urban gradient** — location residual on ln(distance to nearest of 9 metros): pooled,
227− 251+ with nearest-metro intercepts, quadratic; FSA-clustered SEs.
228−- **`results/reference/`** — the original outputs (verbatim files, plus values 252+
229− transcribed from the published tables). **Default** source for figures/tables, so the 253+## 🧭 The two results tiers (reproduced vs. reference)
230− paper always shows exactly the published numbers. 254+
231−- **`results/reproduced/`** — regenerated end-to-end by scripts 02–03 on the 255+- **`results/reproduced/`** — **the paper's numbers since v1.3.** Regenerated end-to-end by
232− reconstructed sample. 256+ scripts 01–06 on the committed sample, with the province derived from the FSA.
233− 257+- **`results/reference/`** — the archived outputs of the May 2026 version (v1.2), whose
234−```bash 258+ upstream cleaning code was lost (see `docs/AUDIT.md`). Kept for the reconciliation table
235−python3 scripts/04_make_figures.py --results reproduced # opt in to regenerated numbers 259+ in Appendix C of the paper. `python3 scripts/0{4,5}_*.py --results reference` rebuilds
236−python3 scripts/05_make_tables.py --results reproduced 260+ the v1.2 figures/tables (the six original tables only).
237−```
238 261
239 ## 🖼️ Figures & tables inventory 262 ## 🖼️ Figures & tables inventory
240 263
241−| # | Figure | Shows | Numbers from | 264+| # | Figure | Shows |
242−|---|---|---|---| 265+|---|---|---|
243−| 1 | `fig_price_dist` | raw vs. log price distribution | micro sample | 266+| 1 | `fig_price_dist` | raw vs. log asking price |
244−| 2 | `fig_province_ppm2` | median $/m² by province | micro sample | 267+| 2 | `fig_province_ppm2` | median $/m² by province (FSA-derived) |
245−| 3 | `fig_r2` | R² across the M1–M5 ladder | reference | 268+| 3 | `fig_r2` | R² across the M1–M5 ladder |
246−| 4 | `fig_forest` | structural implicit prices, 95% CI (M3) | reference | 269+| 4 | `fig_decomp` | sequential vs. Shapley variance decomposition |
247−| 5 | `fig_size_gradient` | median price by size bin × dwelling type | micro sample | 270+| 5 | `fig_forest` | structural implicit prices, 95% CI (M3) |
248−| 6a/6b | `fig_map` / `fig_fsa_map` | listing map & FSA medians, coloured by ln $/m² | micro sample | 271+| 6 | `fig_size_gradient` | median price by size bin × dwelling type |
249−| 7 | `fig_premia` | top/bottom 12 FSA premia vs. national median | reference | 272+| 7a/7b | `fig_map` / `fig_fsa_map` | listing map & FSA medians, ln $/m² |
250−| 8 | `fig_decomp` | variance decomposition bar | reference | 273+| 8 | `fig_premia` | top/bottom 12 FSA premia vs. median FSA |
251−| 9 | `fig_nonlinear` | marginal elasticity vs. size (quadratic model) | reproduced band + reference anchor | 274+| 9 | `fig_nonlinear` | marginal elasticity vs. size: quadratic + spline |
252−| 10 | `fig_gradient` | location premium vs. distance to metro | reproduced | 275+| 10 | `fig_gradient` | location premium by distance band to metro |
253−| 11 | `fig_quantile` | quantile coefficients τ = 0.1…0.9 | reference | 276+| 11 | `fig_quantile` | quantile coefficients τ = 0.1…0.9 |
254−| 12 | `fig_moran` | Moran scatterplots, structural vs. grand | reproduced clouds, reference I | 277+| 12 | `fig_moran` | Moran scatterplots, structural vs. grand |
255−| 13 | `fig_heterogeneity` | size elasticity by province, 95% CI | reference | 278+| 13 | `fig_heterogeneity` | size elasticity by province, 95% CI |
256−| 14 | `fig_oos` | OOS error buckets (±10/±20%) | reference | 279+| 14 | `fig_oos` | OOS error buckets (±10/±20%) |
257−| 15/16 | `fig_fit` / `fig_resid` | predicted vs. actual; residual diagnostics | reproduced | 280+| 15 | `fig_fit` / `fig_resid` | predicted vs. actual; residual diagnostics |
258− 281+
259−(The leave-one-province-out results appear as a table only.) 282+Tables (`results/tables/`, 13): `summary_stats`, `shapley`, `regression` (M1/M2/M3/M5),
260− 283+`type_effects`, `spline`, `gradient`, `robustness` (8 cuts), `se_comparison`, `quantile`,
261−Tables (`results/tables/`): `summary_stats`, `regression` (M1/M2/M3/M5), 284+`lopo`, `oos`, `spatial_holdout`, `moran_sensitivity` (appendix).
262−`robustness` (6 sample cuts), `quantile`, `lopo`, `oos` — all six verified
263−**numerically identical** to the originally published tables.
264−
265−## ✅ Reproduction verification
266−
267−Full side-by-side in [`docs/AUDIT.md`](docs/AUDIT.md) §5. Highlights (original → reproduced):
268−
269−- Sample: 140,931 → 142,146 (+0.86%); condos match to 3 listings.
270−- R² ladder: 0.464/0.469/0.567/0.762/0.767 → 0.467/0.470/0.569/0.766/0.770.
271−- OOS: R² 0.764 → 0.770; median APE 15.8% → 15.6%.
272−- Moran's I: 0.459→0.082 vs. 0.494→0.072 (same −82~85% conclusion).
273−- Known gaps (flagged, not hidden): M5 living elasticity 0.547 vs. 0.530; lot-field
274− coefficients differ (the original free-text lot parser could not be fully recovered);
275− LOPO mean 0.362 vs. 0.315 with identical province ranking.
276 285
277 ## ⚠️ Limitations 286 ## ⚠️ Limitations
278 287
279−List prices, not transactions; no construction year / renovation status / interior 288+Asking prices, not transactions (implicit *list* prices; accuracy is an upper bound for
280−quality (absorbed into FSA effects and the residual); lot information sparse and noisy; 289+transaction-price models); no construction year / renovation / interior quality (within-FSA
281−a single cross-section — levels, not dynamics. See the paper's conclusion for the 290+sorting remains); noisy fields (lot parsed from free text, storeys/parking with implausible
282−research agenda these imply. 291+extremes and zero when unreported, province reconstructed from the postal code); a single
292+cross-section of one platform; FSAs are postal, not planning, units and 9 pooled residual
293+categories are not neighbourhoods; structural prices do not transfer to BC (LOPO R² < 0).
294+See §7 of the paper.
283 295
284 ## 📚 Citation 296 ## 📚 Citation
285 297
@@ -288,14 +300,15 @@ research agenda these imply.
288 author = {Boucher, Simon-Pierre}, 300 author = {Boucher, Simon-Pierre},
289 title = {A Grand Hedonic Model of the Canadian Housing Market: 301 title = {A Grand Hedonic Model of the Canadian Housing Market:
290 Decomposing the Value of Structure and Location across 302 Decomposing the Value of Structure and Location across
291− 140,931 MLS Listings with High-Dimensional Neighbourhood 303+ 142,121 MLS Listings with High-Dimensional Neighbourhood
292 Fixed Effects}, 304 Fixed Effects},
293 institution = {Universit\'e du Qu\'ebec en Outaouais, 305 institution = {Universit\'e du Qu\'ebec en Outaouais,
294 D\'epartement des sciences administratives}, 306 D\'epartement des sciences administratives},
295 type = {Working Paper}, 307 type = {Working Paper},
296 number = {9}, 308 number = {9},
297 year = {2026}, 309 year = {2026},
298− month = {May} 310+ month = {October},
311+ note = {Version 1.3}
299 } 312 }
300 ``` 313 ```
301 314
@@ -317,3 +330,10 @@ redistributed; code and paper are shared for research reproducibility.
317 - Numbering: UQO Working Paper No. 9 since the first version (May 2026). 330 - Numbering: UQO Working Paper No. 9 since the first version (May 2026).
318 - The original flat May 2026 project (`immo-wp9-spb-20260529`) is archived in `Recherche-UQO/_archives/versions-mai-2026/grand-hedonic-model-canada--immo-wp9-20260529`; `docs/AUDIT.md` and `docs/CHANGES.md` describe how this repository was rebuilt from it. 331 - The original flat May 2026 project (`immo-wp9-spb-20260529`) is archived in `Recherche-UQO/_archives/versions-mai-2026/grand-hedonic-model-canada--immo-wp9-20260529`; `docs/AUDIT.md` and `docs/CHANGES.md` describe how this repository was rebuilt from it.
319 - Cover page, metadata and layout follow `Recherche-UQO/HARMONISATION.md` (2026-10-17). 332 - Cover page, metadata and layout follow `Recherche-UQO/HARMONISATION.md` (2026-10-17).
333+- **Revision 2026-10-17 (v1.2 → v1.3)**: full scientific revision by the editorial-board
334+ protocol (`Recherche-UQO/REVISION-MASTER-PROMPT.md`). Report: `docs/REVIEW-REPORT.md`;
335+ audit trail of every change (old → new numbers, reasons, verification sources):
336+ `docs/CHANGELOG-REVISION.md`. The paper now reports the fully reproducible pipeline
337+ (`results/reproduced/`) with FSA-derived provinces; the N in the subtitle changed from
338+ 140,931 to 142,121 accordingly. The pre-revision PDF is `docs/main_pre-revision-20261017.pdf`.
339+ Deviation from the standard: none (appendix added per the template).
modified data/processed/analysis.parquet +0 −0

Binary file not shown.

added docs/CHANGELOG-REVISION.md +91 −0
@@ -0,0 +1,91 @@
1+# CHANGELOG-REVISION — Audit trail of the 2026-10-17 editorial-board revision (v1.2 → v1.3)
2+
3+All original files are preserved under git tag `pre-revision-20261017`; the v1.2 PDF is
4+`docs/main_pre-revision-20261017.pdf`; the v1.2 numerical outputs remain in
5+`results/reference/` (untouched). Every number in the v1.3 paper comes from
6+`results/reproduced/` produced by `scripts/01…06`.
7+
8+## 1. Decision to switch the paper to the reproduced tier
9+
10+**Why.** (a) The v1.2 numbers came from an upstream pipeline that no longer exists
11+(`docs/AUDIT.md`); the shipped code reproduced them only approximately (+0.86 % sample).
12+(b) The province variable used by v1.2 (`_province`, the scraper's regional seed) mislabels
13+16,558 of 142,121 listings (11.7 %): e.g. 13,600 listings with A/B/E/K/P FSAs (NL, NS, NB,
14+Ottawa-area and northern ON) labelled "QC"; 4,278 V-FSAs (BC) labelled "AB"; 1,326 T-FSAs
15+(AB) labelled "BC". This affected M3 (province FE), LOPO, provincial heterogeneity, the
16+ON/QC/BC cut, the `<PROV>_other` pooling, and the province labels in the premia figure
17+(v1.2 showed "E2A (QC)", "R0M (SK)"). (c) Fixing (b) requires re-running everything, which
18+is only possible on the reconstructed sample. **Evidence:** cross-tab FSA letter × seed
19+province, 2026-10-17 (reproduced in `scripts/01_build_sample.py` logic; see §2).
20+
21+**Consequence.** N changes 140,931 → 142,121 (title, abstract, README, BibTeX). All
22+headline magnitudes preserved (Appendix C of the paper, Table A2).
23+
24+## 2. Code changes
25+
26+| File | Change |
27+|---|---|
28+| `src/wp9/config.py` | `FSA_PROVINCE` map (Canada Post first letter → province) |
29+| `src/wp9/sample.py` | `prov` derived from FSA letter; seed kept as `prov_seed`; FSAs with letters O/W/X/Y → dropped (27 records) |
30+| `scripts/02_estimate_core.py` | records `n_fe` in `fit.json` |
31+| `scripts/03_estimate_extended.py` | 2 robustness rows added (storeys/parking capped at P99; excl. pooled residual FSAs); quantile vcov made explicit (`robust`, Epanechnikov, Hall–Sheather) |
32+| `scripts/06_revision_analyses.py` | **new**: Shapley/Owen decomposition; SE comparison (HC1, FSA, province, two-way) + restricted wild-cluster bootstrap-t at province level (Rademacher, 512 enumerated draws); spline elasticities; spatial holdout (20 % of FSAs × 5 reps, province-mean vs IDW-5 imputation) + 5 random seeds; Moran sensitivity (k = 5/10/20 × 2 subsamples); gradient with metro intercepts and quadratic |
33+| `scripts/04_make_figures.py` | default tier `reproduced`; `fig_decomp` = sequential vs Shapley; `fig_nonlinear` adds spline segments |
34+| `scripts/05_make_tables.py` | default tier `reproduced`; 7 new tables (`shapley`, `se_comparison`, `spline`, `spatial_holdout`, `moran_sensitivity`, `type_effects`, `gradient`); notes corrected (quantile SEs, regression N of FE, robustness) ; `[t]` → `[htbp]` |
35+| `paper/main.tex` | v1.3, October 2026, subtitle N, abstract, keywords (8), `multirow`, `appendix`, float parameters, `\clearpage` before bibliography, appendix input |
36+| `paper/sections/*.tex` | all eight sections rewritten (see §3) |
37+| `paper/appendix/appendix.tex` | **new** (variable construction; Moran sensitivity; reconciliation v1.2 ↔ v1.3) |
38+| `paper/references.bib` | 64 → 91 entries (§4) |
39+| `README.md` | Status, TL;DR, headline table, pipeline, tiers, inventory, limitations, citation, notes |
40+
41+## 3. Major corrections (where · before · after · why · evidence)
42+
43+| # | Where | Before (v1.2) | After (v1.3) | Why / evidence |
44+|---|---|---|---|---|
45+| 1 | Title, abstract, data | N = 140,931; 1,153 FSAs | N = 142,121; 1,155 effects = 1,146 FSAs + 9 pooled | §1; `01_build_sample.py` log |
46+| 2 | Data §3.2 | province = scraper seed | province = FSA letter; 27 territory/invalid records dropped | §1 |
47+| 3 | Data §3.3 text | median "$565,000 / 125 m²" | $639,900 / 135.3 m² | text contradicted Table 1 even in v1.2 ($639,888 / 134.6) |
48+| 4 | Data | "nine provinces" with NB absent from tables | NB 2,980 listings (was hidden under "QC") | cross-tab |
49+| 5 | Results §5.1 | R² M1/M2/M3/M4/M5 = 0.464/0.469/0.567/0.762/0.767 | 0.467/0.470/0.605/0.769/0.776 | re-estimation; M3 rises because provinces are now correct |
50+| 6 | Results §5.2 (new) | "location alone ≈ 30 pp, more than all structure" (sequential only) | sequential 43.6/1.6/14.3/18.1; Shapley 33.0/7.5/8.9/28.2; Owen structure 34.0, type 7.3, location 36.3 | `shapley.csv`; order-dependence of sequential R² (Israeli 2007; Huettner & Sunder 2012) |
51+| 7 | Results §5.3 | elasticity 0.547 (0.009); bath 0.109 (+11 %) | 0.529 (0.009); bath 0.112 (+11.9 %); M3 0.148 (+16 %) | `coef_M5.csv`, `coef_M3.csv` |
52+| 8 | Results §5.3 | half-baths "proxy for older floor plans"; bedrooms "textbook ≈ 0" | half-baths −0.034 and bedrooms −0.006 **not significant under province-level inference** (wild p = 0.52 / 0.58); described as negligible | `se_comparison.csv` |
53+| 9 | Results §5.3 | has_lot −0.196, ln lot 0.030 read separately | −0.459 / 0.067 read jointly (≈ −0.02 at median lot); indicator ≈ dwelling-type marker (84 % of condos, 7 % of houses lack lot) | `coef_M5.csv`; has_lot by category |
54+| 10 | Results §5.4 (new) | type/ownership effects never shown | Table 4 with Kennedy %: house +45.7 %, triplex +43.0 %, fourplex +38.7 %, duplex +15.8 %, townhouse +0.1 %; freehold +10.7 %, condo +10.2 %, leasehold −12.2 % vs co-op | `coef_M5.csv` |
55+| 11 | Results §5.5 | top FSAs "all in the City of Vancouver" (+150–200 %); intro: "Vancouver and GTA" | V6S +226 %, V6T +201 %, V8E Whistler +197 %, V6G +185 %, V7T West Vancouver +179 %; first ON (M5R) 14th at +142 %; ratio ×10.5 extremes, ×6.7 P99/P1 | `fsa_premia.csv` |
56+| 12 | Results §5.5 | bottom FSAs "rural SK, MB, NL"; labels E2A (QC), R0M (SK) | A0B −69 %, A0G −64 %, S0N/S0C/S0H/S0A ≈ −62 %, R2W Winnipeg −62 %, E3Y/E2A (NB), V0C | `fsa_premia.csv` |
57+| 13 | Results §5.6 | quadratic b1 1.06, b2 −0.053; elasticity 0.65 → 0.45 | b1 1.147, b2 −0.063; 0.63 at 60 m² → 0.41 at 350 m²; spline 0.57/0.65/0.58/0.41/0.48; ΔR² 0.001 | `ext2.json`, `spline.csv` |
58+| 14 | Results §5.7 | "a doubling of distance → 8.5 % lower premium" | slope −0.082 per log unit ⇒ **−5.5 % per doubling**; metro-FE slope −0.079; quadratic steepening; bands +21 % (<5 km) → −38 % (>320 km); non-monotone 10–40 km | 2^λ − 1; `gradient_metro.json`, `gradient_bins.csv` |
59+| 15 | Robustness §6.1 | 6 cuts; elasticity 0.51–0.62 | 8 cuts; 0.49 (houses) – 0.62 (condos); capped counts 0.513; excl. pooled 0.522 | `robustness.csv` |
60+| 16 | Robustness §6.2 (new) | FSA-cluster SEs only | HC1 0.0037 / FSA 0.0094 / province 0.037 / two-way 0.0375 for ln area; wild p 0.004 for area, bath, lot | `se_comparison.csv` |
61+| 17 | Robustness §6.3 | "elasticity rises 0.56 → 0.60; bath stable 0.10–0.13" (table showed 0.18 → 0.07) | elasticity flat 0.57–0.59; bath declines 0.19 → 0.10; lot rises 0.006 → 0.053 | `quantile.csv` |
62+| 18 | Robustness §6.4 | Moran 0.46 → 0.08 (−82 %), z 145/23, "p < 0.01" | 0.50 → 0.06 (−87 %), z 141/16, p = 0.005 (minimum with 199 perms); k = 5: 0.52 → 0.11; k = 20: 0.47 → 0.03 | `ext2.json`, `moran_sensitivity.csv` |
63+| 19 | Robustness §6.5 | heterogeneity BC 0.49 … MB 0.66; NL 0.44 | NL 0.41, ON 0.47, BC 0.49, NS 0.50, QC 0.57, AB 0.59, NB 0.61, MB 0.66, SK 0.73 | `heterogeneity.csv` |
64+| 20 | Robustness §6.6 | LOPO mean 0.36; "above 0.40 for large central and western markets"; AB −0.10 | mean 0.34; MB/AB/NB/ON/SK/NS 0.46–0.52; NL 0.40; QC 0.19; **BC −0.49** | `lopo.csv` |
65+| 21 | Robustness §6.7 | OOS R² 0.764, MdAPE 15.8 %, 59.5 % within ±20 % | 0.772, 15.6 %, 60.1 %; 5 seeds 0.769 ± 0.010, 15.5 ± 0.2 %; **FSA holdout**: province-mean R² 0.52 / MdAPE 25 %; IDW-5 R² 0.74 / 17.3 % | `oos.json`, `spatial_holdout.json` |
66+| 22 | Abstract/intro/conclusion | "elasticity 0.51–0.62", "11–15 % per bathroom", "×9" | 0.53 (0.49–0.62), ≈12 %, ×10 | consistency with tables |
67+| 23 | Throughout | "list price" / "price" interchangeably | "asking price" / "implicit list price" consistently; limitation (i) expanded with mechanisms | master prompt priority |
68+
69+## 4. References added (29) — verification source
70+
71+Crossref REST API `works?query.bibliographic=` on 2026-10-17 unless noted; DOI recorded in `.bib`.
72+
73+allen2009canadian 10.1111/j.1540-5982.2009.01541.x · sheppard1999hedonic 10.1016/S1574-0080(99)80010-8 · bishop2020best 10.1093/reep/reaa001 · bishop2019estimating 10.1016/j.jue.2018.11.006 · sirmans2006value 10.1007/s11146-006-9983-5 · kennedy1981estimation (AER 71(4):801; RePEc `aea:aecrev:v:71:y:1981:i:4:p:801`) · abadie2023when 10.1093/qje/qjac038 · mackinnon2017wild 10.1002/jae.2508 · israeli2007shapley 10.1007/s10888-006-9036-6 · gromping2007estimators 10.1198/000313007X188252 · huettner2012axiomatic 10.1214/12-EJS710 · kelejian1998generalized 10.1023/A:1007707430416 · kelejian2001asymptotic 10.1016/S0304-4076(01)00064-1 · hill2018geospatial 10.1111/roiw.12303 · bogin2019local 10.1111/1540-6229.12233 · roberts2017cross 10.1111/ecog.02881 · combes2019costs 10.1093/restud/rdy063 · davis2008price 10.1016/j.jue.2007.02.003 · albouy2018metropolitan 10.1162/rest_a_00710 · diewert2015hedonic 10.1080/07474938.2014.944791 · horowitz1992role 10.1002/jae.3950070202 · merlo2004bargaining 10.1016/j.jue.2004.05.004 (DOI record fetched) · anglin2003tradeoff 10.1023/A:1021526332732 · han2016what 10.1016/j.jue.2016.03.008 · genesove2012search 10.1016/j.jue.2012.01.002 · hossain2009determinants 10.1080/00036840701522861 · dube2013commuter 10.1016/j.tra.2013.07.015 · theriault2003modelling 10.1108/02637470310464472 · statcan2022fsa (Statistics Canada catalogue 92-179-G2021001, release 2022-09-21, catalogue page fetched).
74+
75+**Removed:** cmhc2018canadian (unverifiable), gabaix2016power (uncited).
76+**Corrected:** sirmans2005composition pages 3–43 → 1–44 (+DOI); Court 1939, Griliches 1961, Combes & Gobillon 2015 → `@incollection`; Correia 2017 → `@unpublished`; DOIs added to rosen1974, lancaster1966, malpezzi2003, can1992, bourassa2007, case2004, kuminoff2010, glaeser2005, duan1983, cameron2015, mullainathan2017, ekeland2004, bajari2005, black1999, chay2005, linden2008, gibbons2012, moran1950, koenker1978, zietz2008, mcmillen2010, pace1998.
77+
78+## 5. Re-analyses executed
79+
80+See `REVIEW-REPORT.md` §5. Total wall-clock ≈ 2.5 min (Apple M5 Max). Seeds: `SEED_OOS=12345`, `SEED_MORAN=3`, `SEED_EXT2=7`, `SEED_REV=2026`; random-split repeats use seeds 12345, 1, 2, 3, 4.
81+
82+## 6. Items for the author's attention
83+
84+1. **Title N on SSRN** (7626678): v1.2 says 140,931; v1.3 says 142,121 — upload v1.3 and update the title there.
85+2. The repository's `.gitignore` excludes `data/processed/*.parquet` but the file is tracked (6 MB) — intentional for reproducibility; left as is.
86+3. The scraper seed is retained as `prov_seed` in the parquet for audit only; it is not used anywhere.
87+4. Historical docs (`AUDIT.md`, `CHANGES.md`, `PAPER_REVIEW.md`, `UPGRADE_REPORT.md`) describe the August 2026 rebuild and v1.2 upgrade; they are kept unchanged as history and some of their statements (e.g. "paper uses results/reference") no longer hold.
88+
89+## 7. Not modified for lack of data
90+
91+Transaction prices, time on market, age/renovation/quality fields, finer-than-FSA geography, amenity data for premium decomposition, additional snapshots for dynamics.
added docs/REVIEW-REPORT.md +103 −0
@@ -0,0 +1,103 @@
1+# REVIEW-REPORT — Editorial-board revision of UQO WP 9 (2026-10-17)
2+
3+**Paper:** *A Grand Hedonic Model of the Canadian Housing Market: Decomposing the Value of
4+Structure and Location across 142,121 MLS Listings with High-Dimensional Neighbourhood
5+Fixed Effects* — v1.2 (May 2026, 34 pp., 64 refs) → **v1.3 (October 2026, 52 pp., 91 refs)**.
6+Protocol: `Recherche-UQO/REVISION-MASTER-PROMPT.md` + `REVISION-PROTOCOLE.md`. Pre-revision
7+state: git tag `pre-revision-20261017`, `docs/main_pre-revision-20261017.pdf`.
8+Companion audit trail: `docs/CHANGELOG-REVISION.md`.
9+
10+## 0. Summary verdict
11+
12+A well-executed national measurement paper whose v1.2 had three structural problems that a
13+referee would have caught: (1) the headline "location ≈ 30 pp, more than all structure"
14+rested on a sequential R² ladder whose attribution is order-dependent; (2) ~12 % of listings
15+carried the wrong province (the scraper seed, not the postal code), visible on the published
16+premia figure ("E2A (QC)", "R0M (SK)"); (3) the paper's numbers came from a lost pipeline
17+that the shipped code reproduced only approximately. All three are fixed in v1.3: the paper
18+now reports the fully reproducible pipeline with FSA-derived provinces, complements the
19+ladder with a Shapley–Owen decomposition, and adds inference, functional-form and
20+spatial-validation analyses. The contribution survives in a more defensible form:
21+**structure and location are of comparable importance (≈34 vs ≈36 pp of R²), and location
22+is the largest block only once province and FSA are grouped.**
23+
24+## 1. Diagnosis by section (v1.2 → action in v1.3)
25+
26+| Section | Strengths | Weaknesses / errors found | Action |
27+|---|---|---|---|
28+| Abstract | Clear, quantified | "location alone ≈ 30 pp … dominant" unqualified; elasticity range 0.51–0.62 mixes samples; list-price nature not stated | Rewritten with attribution rule, inference caveat, within/out-of-support accuracy, explicit asking-price statement |
29+| Introduction | Good motivation, 3 contributions | Novelty claim unsupported by Canadian lit; "GTA among top premia" false (all top-12 are BC); no statement of list-price caveat | Rewritten; Canadian lit cited (Allen et al. 2009; Hossain & Latif 2009; Dubé et al. 2013; Thériault et al. 2003); design caveats stated upfront |
30+| Literature | 7 thematic subsections | Missing: Sheppard 1999, Sirmans et al. 2006 meta-analysis, Bishop et al. 2020, Bishop–Timmins 2019, Kennedy 1981, Kelejian–Prucha 1998/2001, Abadie et al. 2023, MacKinnon–Webb 2017, Shapley/Owen refs, Davis–Palumbo 2008, Albouy–Ehrlich–Shin 2018, Combes–Duranton–Gobillon 2019, Diewert et al. 2015, Hill–Scholz 2018, Bogin et al. 2019, list-price literature (Horowitz 1992, Merlo & Ortalo-Magné 2004, Anglin et al. 2003, Han–Strange 2016, Genesove–Han 2012), spatial CV (Roberts et al. 2017); one unverifiable reference (Mok & Chan 2018) | 27 verified refs added, 2 removed, 23 DOIs added; new subsection "List prices and the Canadian evidence" |
31+| Data | Transparent parsing | Median price "$565,000 / 125 m²" in text vs $639,888 / 134.6 in table; province = scraper seed (11.7 % mislabelled); NB present but reported as absent; territories listed as absent though 22 records existed; storeys/parking zero-fill and extreme values undocumented; "1,153 FSAs" counted 9 pooled province categories as FSAs | Province rebuilt from FSA letter; territories/invalid letters dropped; all counts recomputed and reported (147,236 → 142,121; 1,146 FSAs + 9 pools); StatCan FSA definition cited |
32+| Methodology | Correct equation, HDFE well explained | No equation for decomposition, inference, quantile, Moran, gradient, Duan; "ladder" as bullet list; Halvorsen–Palmquist cited but Kennedy correction absent; clustering level not discussed | Six numbered equations added (Kennedy, Shapley, quantile, Moran, Duan, gradient reading); inference subsection (FSA vs province, wild-cluster bootstrap); validation designs defined |
33+| Results | Clear figures | Order-dependent decomposition presented as fact; "doubling of distance → −8.5 %" wrong (slope −0.085 per log unit = −5.7 % per doubling); half-bath/bedroom effects over-interpreted; has_lot coefficient read in isolation; type/ownership effects never reported though invoked; gradient non-monotonicity unmentioned; Whistler (V8E) called "City of Vancouver" | Shapley/Owen table + figure; gradient table (bands, metro FE, quadratic) and correct per-doubling reading; type/ownership table with Kennedy %; joint reading of lot variables; spline table; geography paragraph corrected |
34+| Robustness | Six cuts, quantiles, Moran, LOPO, OOS | Quantile text claimed bathroom premium "stable 0.10–0.13" while table showed 0.18 → 0.07; LOPO text claimed ">0.40 for large central and western markets" while BC 0.32, QC 0.30, AB −0.10; Moran p "<0.01" with 199 permutations (min 0.005); OOS random split only; "analytical SEs" for quantiles undefined | Text rewritten to match recomputed tables; SE-comparison table (HC1/FSA/province/two-way + wild bootstrap); spatial holdout table (FSA-level, province-mean vs IDW); Moran sensitivity (k = 5/10/20, two subsamples); two robustness rows added (capped counts; excl. pooled FSAs) |
35+| Discussion | Good engagement with literature | Repeated v1.2 overstatements; "upper end of published estimates" for bathrooms unsupported | Rewritten; new "Inference" paragraph; six limitations incl. list-to-sale wedge mechanics; methodological message on sequential ladders |
36+| Conclusion | Modest tone | Numbers inconsistent with new results | Rewritten (four conclusions) |
37+| Appendix | none | — | Added: variable construction, Moran sensitivity, v1.2 ↔ v1.3 reconciliation table |
38+
39+## 2. Methodology — verdict on each point of §3 of the master prompt
40+
41+- **Specification justified:** yes; semi-log with log area; constant elasticity tested by quadratic and spline (ΔR² ≤ 0.001; curvature concentrated above 150 m²).
42+- **Estimation assumptions explicit:** now yes (conditional mean zero given attributes and FSA; within-FSA sorting of unobserved quality acknowledged as the residual threat).
43+- **Variables correctly defined:** yes after revision (zero-fill of storeys/parking, lot indicator + ln(1+lot), province from FSA all documented, Appendix A).
44+- **Fixed effects appropriate:** yes. One-way FSA FE, exact demeaning. Note: 9 "pooled residual" categories are not neighbourhoods; dropping them changes nothing (Table 7).
45+- **Spatial dependence defensible:** FE remove 87 % of Moran's I; residual I = 0.03–0.11 significant → clustered inference required; result robust to k and subsample.
46+- **Standard errors:** baseline FSA-cluster (G = 1,155) appropriate; province-cluster SEs ×4 larger; restricted wild-cluster bootstrap at province level (G = 9, 512 enumerated draws) → area, bathrooms, lot robust (p = 0.004 = minimum); half-baths and bedrooms not (p = 0.52, 0.58). Text revised accordingly.
47+- **Sample construction transparent:** yes (raw 172,019 → core 147,236 → trimmed 142,121; Appendix A).
48+- **Robustness addresses genuine threats:** 8 cuts incl. capped counts and no pooled FSAs; quantiles; functional form; alternative SEs; spatial holdout; LOPO.
49+- **Coefficient interpretation:** e^γ−1 for counts (11.9 % per bathroom), Kennedy (1981) for indicators (house +45.7 % vs apartment), gradient per doubling 2^λ−1 (−5.5 %). The v1.2 "−8.5 % per doubling" was a mathematical error.
50+- **Statistical vs economic significance:** distinguished (bedrooms −0.6 %: statistically significant under FSA clustering only, economically nil).
51+- **Causal claims:** none; FE described as measurement device; premia as composite capitalisation.
52+
53+## 3. Literature
54+
55+- **Existing references verified:** all 62 retained entries checked against Crossref (query + DOI) or publisher/RePEc records; DOIs added to 23 entries that lacked one; Sirmans et al. (2005) pages corrected to 1–44 (Crossref); Court (1939), Griliches (1961), Combes & Gobillon (2015) retyped as `@incollection`; Correia (2017) as `@unpublished`.
56+- **Removed (2):** `cmhc2018canadian` (Mok & Chan, "House Prices and the Geography of the Canadian Housing Market", CJUR 2018 — no Crossref/Scholar record; treated as unverifiable) → replaced by Allen, Amano, Byrne & Gregory (2009, CJE); `gabaix2016power` (orphan, never cited).
57+- **Added (29, all Crossref-verified with DOI except Kennedy 1981 verified via RePEc/AER and the StatCan catalogue record):** Sheppard 1999; Bishop et al. 2020; Bishop & Timmins 2019; Sirmans et al. 2006; Kennedy 1981; Abadie et al. 2023; MacKinnon & Webb 2017; Israeli 2007; Grömping 2007; Huettner & Sunder 2012; Kelejian & Prucha 1998, 2001; Hill & Scholz 2018; Bogin, Doerner & Larson 2019; Roberts et al. 2017; Combes, Duranton & Gobillon 2019; Davis & Palumbo 2008; Albouy, Ehrlich & Shin 2018; Diewert, de Haan & Hendriks 2015; Horowitz 1992; Merlo & Ortalo-Magné 2004; Anglin, Rutherford & Springer 2003; Han & Strange 2016; Genesove & Han 2012; Allen et al. 2009; Hossain & Latif 2009; Dubé, Thériault & Des Rosiers 2013; Thériault et al. 2003; Statistics Canada 2022 (FSA reference guide). Full list with DOIs in `CHANGELOG-REVISION.md` §4.
58+- **Count:** 64 → 91 entries, 91/91 cited, 0 unverified.
59+
60+## 4. Results — inconsistencies found and resolved
61+
62+1. Text vs table medians (price, area) — fixed by regeneration from the sample.
63+2. Quantile bathroom premium "stable" vs declining 0.18 → 0.07 — text corrected (now 0.19 → 0.10).
64+3. LOPO narrative vs table — corrected (new ranking: BC −0.49, QC 0.19).
65+4. Gradient per doubling −8.5 % → −5.5 % (correct transformation).
66+5. "All top FSAs in the City of Vancouver" — V8E is Whistler, V7T West Vancouver; corrected.
67+6. "GTA among the highest" — first ON FSA ranks 14th; corrected.
68+7. Premia labelled with wrong provinces (E2A "QC", R0M "SK") — fixed at source.
69+8. Moran p "<0.01" — reported as 0.005 (minimum attainable).
70+9. "1,153 FSAs" — 1,146 FSAs + 9 pooled categories; stated.
71+10. Storeys coefficient 0.001*** driven by a 593-storey record — explained; capped-row robustness.
72+11. Mean APE in repeated splits dominated by one listing with 3,620 parking spaces — trimmed mean reported with note.
73+
74+## 5. Re-analyses executed (all on this Mac, total < 3 min; scripts versioned)
75+
76+| Analysis | Script | Output | Runtime |
77+|---|---|---|---|
78+| Sample rebuild with FSA-derived province | `01_build_sample.py` | `data/processed/analysis.parquet` | 40 s |
79+| Ladder M1–M5, premia | `02_estimate_core.py` | `results/reproduced/{fit.json,coef_M*.csv,fsa_premia.csv,grand_model.parquet}` | 5 s |
80+| OOS, 8 robustness cuts, heterogeneity, quantiles, quadratic, gradient, Moran, LOPO | `03_estimate_extended.py` | `results/reproduced/*` | 8 s |
81+| Shapley/Owen (16 regressions ×2 samples), SE comparison + wild-cluster bootstrap (512 draws × 5 coefs), spline, spatial holdout (5 FSA reps + 5 random seeds), Moran sensitivity (12 configs), metro gradient | `06_revision_analyses.py` (new) | `shapley.csv`, `se_comparison.csv`, `spline.csv`, `spatial_holdout.json`, `moran_sensitivity.csv`, `gradient_metro.json` | 33 s |
82+| 13 tables, 17 figures | `05_make_tables.py`, `04_make_figures.py` | `results/tables/`, `figures/` | 35 s |
83+
84+## 6. Recommended analyses NOT executed (data unavailable or out of scope)
85+
86+- Linking listings to transaction prices / time on market (no sales data in the snapshot).
87+- Age, renovation and interior-quality controls (fields absent).
88+- Explicit spatial error model (Kelejian–Prucha GS2SLS) on the within-FSA residuals — feasible but adds complexity without changing conclusions; left for future work.
89+- Fully interacted submarket-specific coefficient systems (province × attribute slopes) — partially covered by province-by-province estimation.
90+- Finer geography (6-character postal codes or dissemination areas) — requires a boundary file / geocoding of ~140k points to census units; not attempted.
91+- Panel of snapshots for dynamics — single cross-section only.
92+- Decomposition of FSA premia into amenities (schools, transit) — requires external amenity data.
93+- ML benchmark (XGBoost/LightGBM) against the hedonic model — dead code in the original project was dropped in Aug 2026; not revived (would need `xgboost`, `lightgbm`).
94+
95+## 7. Remaining limitations (stated in §7.4 of the paper)
96+
97+Asking prices; unobserved quality and within-FSA sorting; noisy lot/storey/parking fields and reconstructed province; single cross-section of one platform; postal (not planning) geography and 9 pooled pseudo-neighbourhoods; structural prices do not transfer to BC.
98+
99+## 8. Publication maturity
100+
101+- **Target journals:** *Journal of Housing Economics*, *Journal of Real Estate Finance and Economics*, *Regional Science and Urban Economics* (empirical note), *Canadian Journal of Economics* (Canadian scope), *Journal of Property Research*.
102+- **Readiness:** suitable for submission as a measurement/benchmark paper after the author checks the items flagged in `CHANGELOG-REVISION.md` §6 (title N change on SSRN; wording of the novelty claim).
103+- **Main rejection risks:** (i) asking prices rather than transactions — the central vulnerability; now framed honestly but a referee at a top field journal may still ask for a list-to-sale validation on a subsample; (ii) descriptive rather than causal contribution — framed as measurement; (iii) FSA geography as "neighbourhood"; (iv) single snapshot, unknown platform coverage; (v) the two lot coefficients are hard to interpret and depend on a free-text parser.
modified figures/fig_decomp.png +0 −0

Binary file not shown.

modified figures/fig_fit.png +0 −0

Binary file not shown.

modified figures/fig_forest.png +0 −0

Binary file not shown.

modified figures/fig_fsa_map.png +0 −0

Binary file not shown.

modified figures/fig_gradient.png +0 −0

Binary file not shown.

modified figures/fig_heterogeneity.png +0 −0

Binary file not shown.

modified figures/fig_map.png +0 −0

Binary file not shown.

modified figures/fig_moran.png +0 −0

Binary file not shown.

modified figures/fig_nonlinear.png +0 −0

Binary file not shown.

modified figures/fig_oos.png +0 −0

Binary file not shown.

modified figures/fig_premia.png +0 −0

Binary file not shown.

modified figures/fig_price_dist.png +0 −0

Binary file not shown.

modified figures/fig_province_ppm2.png +0 −0

Binary file not shown.

modified figures/fig_quantile.png +0 −0

Binary file not shown.

modified figures/fig_r2.png +0 −0

Binary file not shown.

modified figures/fig_resid.png +0 −0

Binary file not shown.

modified figures/fig_size_gradient.png +0 −0

Binary file not shown.

added paper/appendix/appendix.tex +125 −0
@@ -0,0 +1,125 @@
1+% Author: Simon-Pierre Boucher — contact@spboucher.ai
2+% ============================================================================
3+% Appendix
4+% ============================================================================
5+\newpage
6+\begin{appendices}
7+
8+\renewcommand{\thetable}{A\arabic{table}}
9+\renewcommand{\thefigure}{A\arabic{figure}}
10+\setcounter{table}{0}
11+\setcounter{figure}{0}
12+
13+\section{Variable construction}
14+\label{app:variables}
15+
16+The raw \texttt{listings} table stores every attribute as text. The estimation sample is
17+built by the first script of the pipeline (\texttt{01\_build\_sample.py}) from the rules
18+below, which were reconstructed from the description of the original (May 2026) pipeline and validated
19+against its stored outputs; the original cleaning code was not preserved.
20+
21+\paragraph{Bedrooms.} The integer components of the raw string are summed, so that
22+``3~+~1'' (three bedrooms on the main level and one below grade) is coded as four.
23+
24+\paragraph{Living area.} The explicit floor-area measurement is preferred. Exact entries
25+are used as reported; banded entries such as ``1100--1500 sqft'' are mapped to the upper
26+bound of the band, the convention that reproduces the published living-area distribution.
27+When the field is absent the interior-size field is used. Square feet are converted at
28+$1\text{ ft}^2 = 0.0929\text{ m}^2$; entries labelled m$^2$ are used as such.
29+
30+\paragraph{Lot area.} The free-text lot field is parsed when it contains a number with a
31+recognisable unit (square feet, square metres, acres or hectares), a phrase of the form
32+``under $x$ acre'', an acreage range (mapped to its upper bound), or a frontage-by-depth
33+pair in feet. Parsed lots above the 99th percentile of positive values are treated as
34+unparsed, because they are dominated by multi-acre acreage strings whose relationship to
35+the dwelling is unclear. The variable entering the regressions is $\ln(1+\text{lot area})$
36+together with an indicator equal to one when a positive lot area was parsed.
37+
38+\paragraph{Counts.} Full bathrooms, half bathrooms, parking spaces and storeys are taken as
39+reported; half bathrooms, parking and storeys are set to zero when absent. No cap is
40+applied in the baseline; Table~\ref{tab:robustness} caps storeys and parking at their 99th
41+percentiles.
42+
43+\paragraph{Dwelling type and ownership.} The raw building type is consolidated into eight
44+groups (house; apartment; row or townhouse; duplex; triplex; fourplex; manufactured home,
45+which pools manufactured, mobile and park-model homes; other), and the ownership type into
46+six (freehold; condominium or strata; leasehold; co-operative or co-ownership; other; not
47+reported). The broad listing category (house, condominium, plex, townhouse, apartment) is
48+also retained as a control.
49+
50+\paragraph{Neighbourhood and province.} The FSA is the first three characters of the postal
51+code, retained when it matches the pattern letter--digit--letter. The province is the
52+Canada Post region of the first letter: A, Newfoundland and Labrador; B, Nova Scotia; C,
53+Prince Edward Island; E, New Brunswick; G, H and J, Quebec; K, L, M, N and P, Ontario; R,
54+Manitoba; S, Saskatchewan; T, Alberta; V, British Columbia \citep{statcan2022fsa}. The
55+letters X and Y (territories) and the unassigned letters O and W (27 records in total) are
56+dropped. The scraper's own province field, which records the regional seed of the
57+extraction, is retained for reference only; it disagrees with the FSA-based province for
58+11.7\% of the estimation sample.
59+
60+\paragraph{Filters.} Listings are kept when the asking price is strictly positive, living
61+area, bedrooms and bathrooms are non-missing and the FSA is valid (147{,}236 of 172{,}019
62+raw records); the 1st and 99th percentiles of price and living area are then applied as
63+inclusive bounds, leaving 142{,}121 listings. FSAs with fewer than 25 listings are pooled
64+into one residual category per province.
65+
66+\section{Additional results}
67+\label{app:tables}
68+
69+\input{../results/tables/moran_sensitivity}
70+
71+\section{Reconciliation with the May 2026 version}
72+\label{app:reconciliation}
73+
74+The May 2026 version of this paper (v1.2) reported estimates from an upstream pipeline that
75+was not preserved. The present version re-estimates every result from the reconstructed
76+pipeline described in Appendix~\ref{app:variables}, with two substantive differences: the
77+province of each listing is derived from its FSA rather than from the scraper's regional
78+seed, and the reconstructed trimming rule retains 142{,}121 rather than 140{,}931 listings
79+(a difference of 0.8\%, concentrated at the upper living-area bound). All headline
80+magnitudes are preserved (Table~\ref{tab:reconciliation}); the estimates that changed
81+materially are those that use the province variable---the province-effects $R^2$, the
82+leave-one-province-out ranking and the provincial heterogeneity---and the two lot
83+coefficients, whose free-text parser could not be recovered exactly. The variance
84+decomposition, the inference comparison, the spline, the spatial holdout and the Moran
85+sensitivity analysis are new to this version.
86+
87+\begin{table}[htbp]\centering
88+\caption{Headline estimates: May 2026 version (v1.2) and present version (v1.3)}
89+\label{tab:reconciliation}
90+\begin{threeparttable}
91+\begin{tabular}{lcc}
92+\toprule
93+Quantity & v1.2 (May 2026) & v1.3 (this version) \\
94+\midrule
95+Estimation sample & 140{,}931 & 142{,}121 \\
96+Absorbed location effects & 1{,}153 & 1{,}155 \\
97+$R^2$: M1 / M2 / M3 (houses) & 0.464 / 0.469 / 0.567 & 0.467 / 0.470 / 0.605 \\
98+$R^2$: M4 (houses, FSA) / M5 (grand) & 0.762 / 0.767 & 0.769 / 0.776 \\
99+Living-area elasticity, M5 (SE) & 0.547 (0.009) & 0.529 (0.009) \\
100+Full-bathroom coefficient, M5 (SE) & 0.109 (0.004) & 0.112 (0.004) \\
101+Bedrooms, M5 & $-0.002$ & $-0.006$ \\
102+$\ln$ lot / lot indicator, M5 & 0.030 / $-0.196$ & 0.067 / $-0.459$ \\
103+Out-of-sample $R^2$ / MdAPE & 0.764 / 15.8\% & 0.772 / 15.6\% \\
104+Moran's $I$, structure $\to$ grand ($k=10$) & 0.46 $\to$ 0.08 & 0.50 $\to$ 0.06 \\
105+Gradient slope on $\ln$ distance & $-0.085$ & $-0.082$ \\
106+Quadratic in $\ln$ area: $\beta_1$ / $\beta_2$ & 1.065 / $-0.053$ & 1.147 / $-0.063$ \\
107+LOPO mean within-province $R^2$ & 0.362 (AB negative) & 0.341 (BC negative) \\
108+Size elasticity range across provinces & 0.44 (NL)--0.66 (MB) & 0.41 (NL)--0.73 (SK) \\
109+Premium ratio, most / least expensive FSA & $\approx 9$ & $\approx 10$ \\
110+\bottomrule
111+\end{tabular}
112+\begin{tablenotes}\footnotesize
113+\item Notes: v1.2 values are the published numbers of the May 2026 version, archived in
114+\texttt{results/reference/}; v1.3 values are produced by the current pipeline
115+(\texttt{results/reproduced/}). The v1.2 province variable was the scraper's regional seed,
116+which mislabelled about 12\% of listings; the v1.2 statement that the lowest-premium FSAs
117+included ``E2A (QC)'' and ``R0M (SK)'' reflected this error (E is New Brunswick and R is
118+Manitoba). In v1.2 a doubling of distance was described as lowering the location premium by
119+8.5\%; the correct reading of a slope of $-0.085$ on $\ln$ distance is $-5.7\%$ per
120+doubling.
121+\end{tablenotes}
122+\end{threeparttable}
123+\end{table}
124+
125+\end{appendices}
modified paper/main.pdf +0 −0

Binary file not shown.

modified paper/main.tex +42 −23
@@ -4,6 +4,7 @@
4 % A Grand Hedonic Model of the Canadian Housing Market 4 % A Grand Hedonic Model of the Canadian Housing Market
5 % 5 %
6 % Build: latexmk -pdf main.tex (or `make` in this directory) 6 % Build: latexmk -pdf main.tex (or `make` in this directory)
7+% Revised by the editorial-board review of 2026-10-17 (v1.3): see docs/REVIEW-REPORT.md.
7 % Figures are read from ../figures/, tables from ../results/tables/. 8 % Figures are read from ../figures/, tables from ../results/tables/.
8 % ============================================================================ 9 % ============================================================================
9 \documentclass[12pt,letterpaper]{article} 10 \documentclass[12pt,letterpaper]{article}
@@ -29,11 +30,18 @@
29 \usepackage{booktabs} 30 \usepackage{booktabs}
30 \usepackage{threeparttable} 31 \usepackage{threeparttable}
31 \usepackage{makecell} 32 \usepackage{makecell}
33+\usepackage{multirow}
32 34
33 % ---------------------------------------------------------------- figures 35 % ---------------------------------------------------------------- figures
34 \usepackage{graphicx} 36 \usepackage{graphicx}
35 \usepackage{subcaption} 37 \usepackage{subcaption}
36 \graphicspath{{../figures/}{./}} 38 \graphicspath{{../figures/}{./}}
39+\renewcommand{\topfraction}{0.9}
40+\renewcommand{\bottomfraction}{0.6}
41+\renewcommand{\textfraction}{0.07}
42+\renewcommand{\floatpagefraction}{0.75}
43+\setcounter{topnumber}{3}
44+\setcounter{totalnumber}{4}
37 45
38 % ---------------------------------------------------------------- captions 46 % ---------------------------------------------------------------- captions
39 \usepackage[font=small,labelfont=bf,labelsep=period,justification=justified,singlelinecheck=false]{caption} 47 \usepackage[font=small,labelfont=bf,labelsep=period,justification=justified,singlelinecheck=false]{caption}
@@ -58,16 +66,19 @@
58 \usepackage{enumitem} 66 \usepackage{enumitem}
59 \setlist{nosep,leftmargin=*} 67 \setlist{nosep,leftmargin=*}
60 68
69+% ---------------------------------------------------------------- appendix
70+\usepackage[toc,page]{appendix}
71+
61 % ============================================================================ 72 % ============================================================================
62 % METADATA 73 % METADATA
63 % ============================================================================ 74 % ============================================================================
64 \newcommand{\WPnumber}{9} 75 \newcommand{\WPnumber}{9}
65 \newcommand{\WPtitle}{A Grand Hedonic Model of the Canadian Housing Market} 76 \newcommand{\WPtitle}{A Grand Hedonic Model of the Canadian Housing Market}
66 \newcommand{\WPsubtitle}{Decomposing the Value of Structure and Location across 77 \newcommand{\WPsubtitle}{Decomposing the Value of Structure and Location across
67− 140{,}931 MLS Listings with High-Dimensional Neighbourhood Fixed Effects} 78+ 142{,}121 MLS Listings with High-Dimensional Neighbourhood Fixed Effects}
68−\newcommand{\WPdate}{May 2026} 79+\newcommand{\WPdate}{October 2026}
69−\newcommand{\WPversion}{1.2} 80+\newcommand{\WPversion}{1.3}
70−\newcommand{\WPkeywords}{hedonic pricing, housing markets, Canada, fixed effects, spatial heterogeneity, automated valuation} 81+\newcommand{\WPkeywords}{hedonic pricing, housing markets, Canada, high-dimensional fixed effects, neighbourhood effects, spatial autocorrelation, automated valuation model, list prices}
71 \newcommand{\WPjel}{R31, R21, C21, C55} 82 \newcommand{\WPjel}{R31, R21, C21, C55}
72 83
73 \newcommand{\WPauthor}{Simon-Pierre Boucher} 84 \newcommand{\WPauthor}{Simon-Pierre Boucher}
@@ -78,24 +89,30 @@
78 283, boulevard Alexandre-Tach\'e\\ Gatineau, Qu\'ebec, Canada J9A 1L8} 89 283, boulevard Alexandre-Tach\'e\\ Gatineau, Qu\'ebec, Canada J9A 1L8}
79 90
80 \newcommand{\WPabstract}{% 91 \newcommand{\WPabstract}{%
81−We estimate a large-scale hedonic price model for the Canadian residential real-estate 92+We estimate a national hedonic price function for the Canadian residential market on a
82−market using a cross-section of 140{,}931 active MLS listings drawn from the nine provinces 93+cross-section of 142{,}121 active MLS listings from nine provinces. A semi-logarithmic
83−present in the data. A semi-logarithmic specification decomposes dwelling prices into 94+specification relates the log list price to structural attributes, dwelling type and
84−structural attributes, dwelling type and ownership form, and 1{,}153 neighbourhood 95+ownership form, and 1{,}155 absorbed neighbourhood (Forward Sortation Area) fixed effects
85−(Forward Sortation Area) fixed effects estimated by absorbing least squares. Moving from a 96+estimated by absorbing least squares with neighbourhood-clustered inference. Moving from a
86−purely structural model to the full specification raises the explained share of price 97+structural model to the full specification raises the explained share of log-price
87−variation from 46\% to 77\%, establishing that location is the dominant price determinant 98+variation from 44\% to 78\%. Because structure and location are correlated, the attribution
88−in Canada: neighbourhood effects alone account for roughly thirty percentage points of 99+of this gain depends on the order in which blocks enter: a Shapley--Owen decomposition
89−explanatory power. The living-area elasticity is 0.51--0.62, each full bathroom commands a 100+assigns about 34 percentage points to structure and 36 to location, so that the two are of
90−premium of about 11--15\%, and---conditional on floor space---bedroom counts are 101+comparable importance and the neighbourhood is the single largest block once province and
91−economically negligible. The implicit prices are stable across alternative samples and 102+neighbourhood are grouped. Conditional on location, the living-area elasticity is 0.53
92−trimming rules, and the model delivers strong out-of-sample valuation accuracy (held-out 103+(0.49--0.62 across samples), each full bathroom adds about 12\%, and bedroom counts are
93−$R^2=0.76$; median absolute error of 16\%). The neighbourhood effects absorb the bulk of 104+economically negligible. The implicit prices of area and bathrooms survive province-level
94−the spatial dependence in prices---Moran's~$I$ falls from 0.46 to 0.08---and we further 105+wild-cluster bootstrap inference, whereas the small half-bathroom and bedroom effects do not.
95−document diminishing returns to floor space, an urban price gradient that decays with 106+Neighbourhood effects remove 87\% of the spatial autocorrelation in residuals (Moran's~$I$
96−distance to major metros, and quantile and cross-province heterogeneity in the implicit 107+0.50 to 0.06). The model values held-out listings in neighbourhoods seen in training with
97−prices. We map the resulting neighbourhood premia, which span a factor of roughly nine 108+an out-of-sample $R^2$ of 0.77 and a median absolute percentage error of 15.6\%; for
98−between the most and least expensive areas.} 109+neighbourhoods never seen in training, spatial interpolation of the neighbourhood effect
110+still yields $R^2=0.74$ and a median error of 17\%. Floor space displays mild diminishing
111+returns, the location premium falls by about 5.5\% per doubling of distance to the nearest
112+metropolitan centre, and implicit prices vary across the price distribution and across
113+provinces. Neighbourhood premia span a factor of about ten between the most and least
114+expensive areas. Because the dependent variable is the asking price rather than the
115+transaction price, all estimates describe the pricing of listings, not of sales.}
99 116
100 \hypersetup{pdftitle={A Grand Hedonic Model of the Canadian Housing Market}, pdfauthor={Simon-Pierre Boucher}} 117 \hypersetup{pdftitle={A Grand Hedonic Model of the Canadian Housing Market}, pdfauthor={Simon-Pierre Boucher}}
101 118
@@ -113,7 +130,9 @@ between the most and least expensive areas.}
113 \input{sections/discussion} 130 \input{sections/discussion}
114 \input{sections/conclusion} 131 \input{sections/conclusion}
115 132
116−\newpage 133+\clearpage
117 \bibliography{references} 134 \bibliography{references}
118 135
136+\input{appendix/appendix}
137+
119 \end{document} 138 \end{document}
modified paper/references.bib +382 −63
@@ -9,7 +9,8 @@
9 volume = {82}, 9 volume = {82},
10 number = {1}, 10 number = {1},
11 pages = {34--55}, 11 pages = {34--55},
12− year = {1974} 12+ year = {1974},
13+ doi = {10.1086/260169}
13 } 14 }
14 15
15 @article{lancaster1966new, 16 @article{lancaster1966new,
@@ -19,23 +20,28 @@
19 volume = {74}, 20 volume = {74},
20 number = {2}, 21 number = {2},
21 pages = {132--157}, 22 pages = {132--157},
22− year = {1966} 23+ year = {1966},
24+ doi = {10.1086/259131}
23 } 25 }
24 26
25−@article{court1939hedonic, 27+@incollection{court1939hedonic,
26− author = {Court, Andrew T.}, 28+ author = {Court, Andrew T.},
27− title = {Hedonic Price Indexes with Automotive Examples}, 29+ title = {Hedonic Price Indexes with Automotive Examples},
28− journal = {The Dynamics of Automobile Demand, General Motors}, 30+ booktitle = {The Dynamics of Automobile Demand},
29− pages = {99--117}, 31+ publisher = {General Motors Corporation},
30− year = {1939} 32+ address = {New York},
33+ pages = {99--117},
34+ year = {1939}
31 } 35 }
32 36
33−@article{griliches1961hedonic, 37+@incollection{griliches1961hedonic,
34− author = {Griliches, Zvi}, 38+ author = {Griliches, Zvi},
35− title = {Hedonic Price Indexes for Automobiles: An Econometric Analysis of Quality Change}, 39+ title = {Hedonic Price Indexes for Automobiles: An Econometric Analysis of Quality Change},
36− journal = {The Price Statistics of the Federal Government, NBER}, 40+ booktitle = {The Price Statistics of the Federal Government},
37− pages = {173--196}, 41+ publisher = {National Bureau of Economic Research},
38− year = {1961} 42+ address = {New York},
43+ pages = {173--196},
44+ year = {1961}
39 } 45 }
40 46
41 @article{halvorsen1980interpretation, 47 @article{halvorsen1980interpretation,
@@ -54,8 +60,9 @@
54 journal = {Journal of Real Estate Literature}, 60 journal = {Journal of Real Estate Literature},
55 volume = {13}, 61 volume = {13},
56 number = {1}, 62 number = {1},
57− pages = {3--43}, 63+ pages = {1--44},
58− year = {2005} 64+ year = {2005},
65+ doi = {10.1080/10835547.2005.12090154}
59 } 66 }
60 67
61 @incollection{malpezzi2003hedonic, 68 @incollection{malpezzi2003hedonic,
@@ -65,7 +72,8 @@
65 editor = {O'Sullivan, Tony and Gibb, Kenneth}, 72 editor = {O'Sullivan, Tony and Gibb, Kenneth},
66 publisher = {Blackwell}, 73 publisher = {Blackwell},
67 pages = {67--89}, 74 pages = {67--89},
68− year = {2003} 75+ year = {2003},
76+ doi = {10.1002/9780470690680.ch5}
69 } 77 }
70 78
71 @article{can1992specification, 79 @article{can1992specification,
@@ -75,7 +83,8 @@
75 volume = {22}, 83 volume = {22},
76 number = {3}, 84 number = {3},
77 pages = {453--474}, 85 pages = {453--474},
78− year = {1992} 86+ year = {1992},
87+ doi = {10.1016/0166-0462(92)90039-4}
79 } 88 }
80 89
81 @book{anselin1988spatial, 90 @book{anselin1988spatial,
@@ -92,7 +101,8 @@
92 volume = {35}, 101 volume = {35},
93 number = {2}, 102 number = {2},
94 pages = {143--160}, 103 pages = {143--160},
95− year = {2007} 104+ year = {2007},
105+ doi = {10.1007/s11146-007-9036-8}
96 } 106 }
97 107
98 @article{case2004modeling, 108 @article{case2004modeling,
@@ -102,7 +112,8 @@
102 volume = {29}, 112 volume = {29},
103 number = {2}, 113 number = {2},
104 pages = {167--191}, 114 pages = {167--191},
105− year = {2004} 115+ year = {2004},
116+ doi = {10.1023/B:REAL.0000035309.60607.53}
106 } 117 }
107 118
108 @article{kuminoff2010which, 119 @article{kuminoff2010which,
@@ -112,7 +123,8 @@
112 volume = {60}, 123 volume = {60},
113 number = {3}, 124 number = {3},
114 pages = {145--160}, 125 pages = {145--160},
115− year = {2010} 126+ year = {2010},
127+ doi = {10.1016/j.jeem.2010.06.001}
116 } 128 }
117 129
118 @article{glaeser2005why, 130 @article{glaeser2005why,
@@ -122,7 +134,8 @@
122 volume = {95}, 134 volume = {95},
123 number = {2}, 135 number = {2},
124 pages = {329--333}, 136 pages = {329--333},
125− year = {2005} 137+ year = {2005},
138+ doi = {10.1257/000282805774669961}
126 } 139 }
127 140
128 @article{duan1983smearing, 141 @article{duan1983smearing,
@@ -132,7 +145,8 @@
132 volume = {78}, 145 volume = {78},
133 number = {383}, 146 number = {383},
134 pages = {605--610}, 147 pages = {605--610},
135− year = {1983} 148+ year = {1983},
149+ doi = {10.1080/01621459.1983.10478017}
136 } 150 }
137 151
138 @article{cameron2015practitioner, 152 @article{cameron2015practitioner,
@@ -142,25 +156,17 @@
142 volume = {50}, 156 volume = {50},
143 number = {2}, 157 number = {2},
144 pages = {317--372}, 158 pages = {317--372},
145− year = {2015} 159+ year = {2015},
160+ doi = {10.3368/jhr.50.2.317}
146 } 161 }
147 162
148−@article{correia2017reghdfe, 163+@unpublished{correia2017reghdfe,
149 author = {Correia, Sergio}, 164 author = {Correia, Sergio},
150 title = {Linear Models with High-Dimensional Fixed Effects: An Efficient and Feasible Estimator}, 165 title = {Linear Models with High-Dimensional Fixed Effects: An Efficient and Feasible Estimator},
151− journal = {Working Paper}, 166+ note = {Working paper, Duke University},
152 year = {2017} 167 year = {2017}
153 } 168 }
154 169
155−@article{gabaix2016power,
156− author = {Gabaix, Xavier},
157− title = {Power Laws in Economics: An Introduction},
158− journal = {Journal of Economic Perspectives},
159− volume = {30},
160− number = {1},
161− pages = {185--206},
162− year = {2016}
163−}
164 170
165 @article{mullainathan2017machine, 171 @article{mullainathan2017machine,
166 author = {Mullainathan, Sendhil and Spiess, Jann}, 172 author = {Mullainathan, Sendhil and Spiess, Jann},
@@ -169,18 +175,10 @@
169 volume = {31}, 175 volume = {31},
170 number = {2}, 176 number = {2},
171 pages = {87--106}, 177 pages = {87--106},
172− year = {2017} 178+ year = {2017},
179+ doi = {10.1257/jep.31.2.87}
173 } 180 }
174 181
175−@article{cmhc2018canadian,
176− author = {Mok, Diana and Chan, Sheryl},
177− title = {House Prices and the Geography of the Canadian Housing Market},
178− journal = {Canadian Journal of Urban Research},
179− volume = {27},
180− number = {1},
181− pages = {1--18},
182− year = {2018}
183−}
184 182
185 @article{ekeland2004identification, 183 @article{ekeland2004identification,
186 author = {Ekeland, Ivar and Heckman, James J. and Nesheim, Lars}, 184 author = {Ekeland, Ivar and Heckman, James J. and Nesheim, Lars},
@@ -189,7 +187,8 @@
189 volume = {112}, 187 volume = {112},
190 number = {S1}, 188 number = {S1},
191 pages = {S60--S109}, 189 pages = {S60--S109},
192− year = {2004} 190+ year = {2004},
191+ doi = {10.1086/379947}
193 } 192 }
194 193
195 @article{bajari2005hedonic, 194 @article{bajari2005hedonic,
@@ -199,7 +198,8 @@
199 volume = {113}, 198 volume = {113},
200 number = {6}, 199 number = {6},
201 pages = {1239--1276}, 200 pages = {1239--1276},
202− year = {2005} 201+ year = {2005},
202+ doi = {10.1086/498586}
203 } 203 }
204 204
205 @article{black1999better, 205 @article{black1999better,
@@ -209,7 +209,8 @@
209 volume = {114}, 209 volume = {114},
210 number = {2}, 210 number = {2},
211 pages = {577--599}, 211 pages = {577--599},
212− year = {1999} 212+ year = {1999},
213+ doi = {10.1162/003355399556070}
213 } 214 }
214 215
215 @article{chay2005does, 216 @article{chay2005does,
@@ -219,7 +220,8 @@
219 volume = {113}, 220 volume = {113},
220 number = {2}, 221 number = {2},
221 pages = {376--424}, 222 pages = {376--424},
222− year = {2005} 223+ year = {2005},
224+ doi = {10.1086/427462}
223 } 225 }
224 226
225 @article{linden2008estimates, 227 @article{linden2008estimates,
@@ -229,7 +231,8 @@
229 volume = {98}, 231 volume = {98},
230 number = {3}, 232 number = {3},
231 pages = {1103--1127}, 233 pages = {1103--1127},
232− year = {2008} 234+ year = {2008},
235+ doi = {10.1257/aer.98.3.1103}
233 } 236 }
234 237
235 @book{lesage2009introduction, 238 @book{lesage2009introduction,
@@ -246,16 +249,20 @@
246 volume = {52}, 249 volume = {52},
247 number = {2}, 250 number = {2},
248 pages = {172--191}, 251 pages = {172--191},
249− year = {2012} 252+ year = {2012},
253+ doi = {10.1111/j.1467-9787.2012.00760.x}
250 } 254 }
251 255
252−@article{combes2015empirics, 256+@incollection{combes2015empirics,
253− author = {Combes, Pierre-Philippe and Gobillon, Laurent}, 257+ author = {Combes, Pierre-Philippe and Gobillon, Laurent},
254− title = {The Empirics of Agglomeration Economies}, 258+ title = {The Empirics of Agglomeration Economies},
255− journal = {Handbook of Regional and Urban Economics}, 259+ booktitle = {Handbook of Regional and Urban Economics},
256− volume = {5}, 260+ editor = {Duranton, Gilles and Henderson, J. Vernon and Strange, William C.},
257− pages = {247--348}, 261+ volume = {5},
258− year = {2015} 262+ publisher = {Elsevier},
263+ pages = {247--348},
264+ year = {2015},
265+ doi = {10.1016/B978-0-444-59517-1.00005-2}
259 } 266 }
260 267
261 @article{moran1950notes, 268 @article{moran1950notes,
@@ -265,7 +272,8 @@
265 volume = {37}, 272 volume = {37},
266 number = {1/2}, 273 number = {1/2},
267 pages = {17--23}, 274 pages = {17--23},
268− year = {1950} 275+ year = {1950},
276+ doi = {10.1093/biomet/37.1-2.17}
269 } 277 }
270 278
271 @article{koenker1978regression, 279 @article{koenker1978regression,
@@ -275,7 +283,8 @@
275 volume = {46}, 283 volume = {46},
276 number = {1}, 284 number = {1},
277 pages = {33--50}, 285 pages = {33--50},
278− year = {1978} 286+ year = {1978},
287+ doi = {10.2307/1913643}
279 } 288 }
280 289
281 @article{zietz2008determinants, 290 @article{zietz2008determinants,
@@ -285,7 +294,8 @@
285 volume = {37}, 294 volume = {37},
286 number = {4}, 295 number = {4},
287 pages = {317--333}, 296 pages = {317--333},
288− year = {2008} 297+ year = {2008},
298+ doi = {10.1007/s11146-007-9053-7}
289 } 299 }
290 300
291 @article{mcmillen2010issues, 301 @article{mcmillen2010issues,
@@ -295,7 +305,8 @@
295 volume = {50}, 305 volume = {50},
296 number = {3}, 306 number = {3},
297 pages = {712--733}, 307 pages = {712--733},
298− year = {2010} 308+ year = {2010},
309+ doi = {10.1111/j.1467-9787.2010.00664.x}
299 } 310 }
300 311
301 @article{pace1998spatiotemporal, 312 @article{pace1998spatiotemporal,
@@ -305,7 +316,8 @@
305 volume = {17}, 316 volume = {17},
306 number = {1}, 317 number = {1},
307 pages = {15--33}, 318 pages = {15--33},
308− year = {1998} 319+ year = {1998},
320+ doi = {10.1023/A:1007799028599}
309 } 321 }
310 322
311 % ============================================================================ 323 % ============================================================================
@@ -648,3 +660,310 @@
648 pages = {628--649}, 660 pages = {628--649},
649 doi = {10.1177/1536867X1001000406} 661 doi = {10.1177/1536867X1001000406}
650 } 662 }
663+
664+% ============================================================================
665+% Added in the October 2026 editorial-board revision (v1.3).
666+% Every entry verified against Crossref (query + DOI) on 2026-10-17; see
667+% docs/CHANGELOG-REVISION.md for the verification record.
668+% ============================================================================
669+
670+% ---- Hedonic surveys and best practice ----
671+@incollection{sheppard1999hedonic,
672+ author = {Sheppard, Stephen},
673+ title = {Hedonic Analysis of Housing Markets},
674+ booktitle = {Handbook of Regional and Urban Economics},
675+ editor = {Cheshire, Paul and Mills, Edwin S.},
676+ volume = {3},
677+ publisher = {Elsevier},
678+ pages = {1595--1635},
679+ year = {1999},
680+ doi = {10.1016/S1574-0080(99)80010-8}
681+}
682+@article{bishop2020best,
683+ 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.},
684+ title = {Best Practices for Using Hedonic Property Value Models to Measure Willingness to Pay for Environmental Quality},
685+ journal = {Review of Environmental Economics and Policy},
686+ volume = {14},
687+ number = {2},
688+ pages = {260--281},
689+ year = {2020},
690+ doi = {10.1093/reep/reaa001}
691+}
692+@article{bishop2019estimating,
693+ author = {Bishop, Kelly C. and Timmins, Christopher},
694+ title = {Estimating the Marginal Willingness to Pay Function Without Instrumental Variables},
695+ journal = {Journal of Urban Economics},
696+ volume = {109},
697+ pages = {66--83},
698+ year = {2019},
699+ doi = {10.1016/j.jue.2018.11.006}
700+}
701+@article{sirmans2006value,
702+ author = {Sirmans, G. Stacy and MacDonald, Lynn and Macpherson, David A. and Zietz, Emily Norman},
703+ title = {The Value of Housing Characteristics: A Meta Analysis},
704+ journal = {Journal of Real Estate Finance and Economics},
705+ volume = {33},
706+ number = {3},
707+ pages = {215--240},
708+ year = {2006},
709+ doi = {10.1007/s11146-006-9983-5}
710+}
711+
712+% ---- Interpretation of semilogarithmic coefficients ----
713+@article{kennedy1981estimation,
714+ author = {Kennedy, Peter E.},
715+ title = {Estimation with Correctly Interpreted Dummy Variables in Semilogarithmic Equations},
716+ journal = {American Economic Review},
717+ volume = {71},
718+ number = {4},
719+ pages = {801},
720+ year = {1981}
721+}
722+
723+% ---- Inference with clustered data ----
724+@article{abadie2023when,
725+ author = {Abadie, Alberto and Athey, Susan and Imbens, Guido W. and Wooldridge, Jeffrey M.},
726+ title = {When Should You Adjust Standard Errors for Clustering?},
727+ journal = {Quarterly Journal of Economics},
728+ volume = {138},
729+ number = {1},
730+ pages = {1--35},
731+ year = {2023},
732+ doi = {10.1093/qje/qjac038}
733+}
734+@article{mackinnon2017wild,
735+ author = {MacKinnon, James G. and Webb, Matthew D.},
736+ title = {Wild Bootstrap Inference for Wildly Different Cluster Sizes},
737+ journal = {Journal of Applied Econometrics},
738+ volume = {32},
739+ number = {2},
740+ pages = {233--254},
741+ year = {2017},
742+ doi = {10.1002/jae.2508}
743+}
744+
745+% ---- Variance decomposition (relative importance) ----
746+@article{israeli2007shapley,
747+ author = {Israeli, Osnat},
748+ title = {A {S}hapley-Based Decomposition of the {R}-Square of a Linear Regression},
749+ journal = {Journal of Economic Inequality},
750+ volume = {5},
751+ number = {2},
752+ pages = {199--212},
753+ year = {2007},
754+ doi = {10.1007/s10888-006-9036-6}
755+}
756+@article{gromping2007estimators,
757+ author = {Gr{\"o}mping, Ulrike},
758+ title = {Estimators of Relative Importance in Linear Regression Based on Variance Decomposition},
759+ journal = {The American Statistician},
760+ volume = {61},
761+ number = {2},
762+ pages = {139--147},
763+ year = {2007},
764+ doi = {10.1198/000313007X188252}
765+}
766+@article{huettner2012axiomatic,
767+ author = {Huettner, Frank and Sunder, Marco},
768+ title = {Axiomatic Arguments for Decomposing Goodness of Fit According to {S}hapley and {O}wen Values},
769+ journal = {Electronic Journal of Statistics},
770+ volume = {6},
771+ pages = {1239--1250},
772+ year = {2012},
773+ doi = {10.1214/12-EJS710}
774+}
775+
776+% ---- Spatial econometrics ----
777+@article{kelejian1998generalized,
778+ author = {Kelejian, Harry H. and Prucha, Ingmar R.},
779+ title = {A Generalized Spatial Two-Stage Least Squares Procedure for Estimating a Spatial Autoregressive Model with Autoregressive Disturbances},
780+ journal = {Journal of Real Estate Finance and Economics},
781+ volume = {17},
782+ number = {1},
783+ pages = {99--121},
784+ year = {1998},
785+ doi = {10.1023/A:1007707430416}
786+}
787+@article{kelejian2001asymptotic,
788+ author = {Kelejian, Harry H. and Prucha, Ingmar R.},
789+ title = {On the Asymptotic Distribution of the {M}oran {I} Test Statistic with Applications},
790+ journal = {Journal of Econometrics},
791+ volume = {104},
792+ number = {2},
793+ pages = {219--257},
794+ year = {2001},
795+ doi = {10.1016/S0304-4076(01)00064-1}
796+}
797+@article{hill2018geospatial,
798+ author = {Hill, Robert J. and Scholz, Michael},
799+ title = {Can Geospatial Data Improve House Price Indexes? {A} Hedonic Imputation Approach with Splines},
800+ journal = {Review of Income and Wealth},
801+ volume = {64},
802+ number = {4},
803+ pages = {737--756},
804+ year = {2018},
805+ doi = {10.1111/roiw.12303}
806+}
807+@article{bogin2019local,
808+ author = {Bogin, Alexander and Doerner, William and Larson, William},
809+ title = {Local House Price Dynamics: New Indices and Stylized Facts},
810+ journal = {Real Estate Economics},
811+ volume = {47},
812+ number = {2},
813+ pages = {365--398},
814+ year = {2019},
815+ doi = {10.1111/1540-6229.12233}
816+}
817+@article{roberts2017cross,
818+ 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.},
819+ title = {Cross-Validation Strategies for Data with Temporal, Spatial, Hierarchical, or Phylogenetic Structure},
820+ journal = {Ecography},
821+ volume = {40},
822+ number = {8},
823+ pages = {913--929},
824+ year = {2017},
825+ doi = {10.1111/ecog.02881}
826+}
827+
828+% ---- Land, location and agglomeration ----
829+@article{combes2019costs,
830+ author = {Combes, Pierre-Philippe and Duranton, Gilles and Gobillon, Laurent},
831+ title = {The Costs of Agglomeration: House and Land Prices in {F}rench Cities},
832+ journal = {Review of Economic Studies},
833+ volume = {86},
834+ number = {4},
835+ pages = {1556--1589},
836+ year = {2019},
837+ doi = {10.1093/restud/rdy063}
838+}
839+@article{davis2008price,
840+ author = {Davis, Morris A. and Palumbo, Michael G.},
841+ title = {The Price of Residential Land in Large {US} Cities},
842+ journal = {Journal of Urban Economics},
843+ volume = {63},
844+ number = {1},
845+ pages = {352--384},
846+ year = {2008},
847+ doi = {10.1016/j.jue.2007.02.003}
848+}
849+@article{albouy2018metropolitan,
850+ author = {Albouy, David and Ehrlich, Gabriel and Shin, Minchul},
851+ title = {Metropolitan Land Values},
852+ journal = {Review of Economics and Statistics},
853+ volume = {100},
854+ number = {3},
855+ pages = {454--466},
856+ year = {2018},
857+ doi = {10.1162/rest_a_00710}
858+}
859+@article{diewert2015hedonic,
860+ author = {Diewert, W. Erwin and de Haan, Jan and Hendriks, Rens},
861+ title = {Hedonic Regressions and the Decomposition of a House Price Index into Land and Structure Components},
862+ journal = {Econometric Reviews},
863+ volume = {34},
864+ number = {1--2},
865+ pages = {106--126},
866+ year = {2015},
867+ doi = {10.1080/07474938.2014.944791}
868+}
869+
870+% ---- List prices, search and bargaining ----
871+@article{horowitz1992role,
872+ author = {Horowitz, Joel L.},
873+ title = {The Role of the List Price in Housing Markets: Theory and an Econometric Model},
874+ journal = {Journal of Applied Econometrics},
875+ volume = {7},
876+ number = {2},
877+ pages = {115--129},
878+ year = {1992},
879+ doi = {10.1002/jae.3950070202}
880+}
881+@article{merlo2004bargaining,
882+ author = {Merlo, Antonio and Ortalo-Magn{\'e}, Fran{\c c}ois},
883+ title = {Bargaining over Residential Real Estate: Evidence from {E}ngland},
884+ journal = {Journal of Urban Economics},
885+ volume = {56},
886+ number = {2},
887+ pages = {192--216},
888+ year = {2004},
889+ doi = {10.1016/j.jue.2004.05.004}
890+}
891+@article{anglin2003tradeoff,
892+ author = {Anglin, Paul M. and Rutherford, Ronald and Springer, Thomas M.},
893+ title = {The Trade-off Between the Selling Price of Residential Properties and Time-on-the-Market: The Impact of Price Setting},
894+ journal = {Journal of Real Estate Finance and Economics},
895+ volume = {26},
896+ number = {1},
897+ pages = {95--111},
898+ year = {2003},
899+ doi = {10.1023/A:1021526332732}
900+}
901+@article{han2016what,
902+ author = {Han, Lu and Strange, William C.},
903+ title = {What Is the Role of the Asking Price for a House?},
904+ journal = {Journal of Urban Economics},
905+ volume = {93},
906+ pages = {115--130},
907+ year = {2016},
908+ doi = {10.1016/j.jue.2016.03.008}
909+}
910+@article{genesove2012search,
911+ author = {Genesove, David and Han, Lu},
912+ title = {Search and Matching in the Housing Market},
913+ journal = {Journal of Urban Economics},
914+ volume = {72},
915+ number = {1},
916+ pages = {31--45},
917+ year = {2012},
918+ doi = {10.1016/j.jue.2012.01.002}
919+}
920+
921+% ---- Canadian evidence ----
922+@article{allen2009canadian,
923+ author = {Allen, Jason and Amano, Robert and Byrne, David P. and Gregory, Allan W.},
924+ title = {Canadian City Housing Prices and Urban Market Segmentation},
925+ journal = {Canadian Journal of Economics},
926+ volume = {42},
927+ number = {3},
928+ pages = {1132--1149},
929+ year = {2009},
930+ doi = {10.1111/j.1540-5982.2009.01541.x}
931+}
932+@article{hossain2009determinants,
933+ author = {Hossain, Belayet and Latif, Ehsan},
934+ title = {Determinants of Housing Price Volatility in {C}anada: A Dynamic Analysis},
935+ journal = {Applied Economics},
936+ volume = {41},
937+ number = {27},
938+ pages = {3521--3531},
939+ year = {2009},
940+ doi = {10.1080/00036840701522861}
941+}
942+@article{dube2013commuter,
943+ author = {Dub{\'e}, Jean and Th{\'e}riault, Marius and Des Rosiers, Fran{\c c}ois},
944+ title = {Commuter Rail Accessibility and House Values: The Case of the {M}ontreal {S}outh {S}hore, {C}anada, 1992--2009},
945+ journal = {Transportation Research Part A: Policy and Practice},
946+ volume = {54},
947+ pages = {49--66},
948+ year = {2013},
949+ doi = {10.1016/j.tra.2013.07.015}
950+}
951+@article{theriault2003modelling,
952+ author = {Th{\'e}riault, Marius and Des Rosiers, Fran{\c c}ois and Villeneuve, Paul and Kestens, Yan},
953+ title = {Modelling Interactions of Location with Specific Value of Housing Attributes},
954+ journal = {Property Management},
955+ volume = {21},
956+ number = {1},
957+ pages = {25--62},
958+ year = {2003},
959+ doi = {10.1108/02637470310464472}
960+}
961+@techreport{statcan2022fsa,
962+ author = {{Statistics Canada}},
963+ title = {Census Forward Sortation Area Boundary File, Reference Guide, Census Year 2021},
964+ institution = {Statistics Canada},
965+ type = {Catalogue no.},
966+ number = {92-179-G2021001},
967+ address = {Ottawa},
968+ year = {2022}
969+}
modified paper/sections/conclusion.tex +46 −37
@@ -4,44 +4,53 @@
4 \label{sec:conclusion} 4 \label{sec:conclusion}
5 % ============================================================================ 5 % ============================================================================
6 6
7−Using a nationwide cross-section of 140{,}931 MLS listings and 1{,}153 absorbed 7+Using a nationwide cross-section of 142{,}121 MLS listings and 1{,}155 absorbed
8−neighbourhood fixed effects, we estimate a grand hedonic model of the Canadian 8+neighbourhood fixed effects, we estimate a hedonic price function for the Canadian
9−residential housing market. The exercise yields three robust conclusions. First, 9+residential market and decompose the variance of log asking prices into structure and
10−location dominates: resolving geography from the provincial to the neighbourhood scale 10+location. The exercise yields four conclusions. First, location and structure are of
11−raises explained price variation from 57\% to 77\%, and location as a whole accounts for 11+comparable importance: resolving geography from the provincial to the neighbourhood scale
12−roughly thirty percentage points of $R^2$---more than every structural attribute 12+raises explained variation from 60\% to 77\%, and a Shapley--Owen decomposition assigns
13−combined, and a listing-level counterpart to the large land shares documented in 13+about 34 percentage points of $R^2$ to structure and 36 to location, so that the
14−aggregate data \citep{davis2007price,knoll2017no}. Second, the structural implicit 14+neighbourhood is the single largest block once province and neighbourhood are grouped,
15−prices behave as hedonic theory predicts and are strikingly stable across samples: 15+while the sequential ladder that most hedonic papers report would credit structure with 44
16−living area carries an elasticity near 0.55, each full bathroom adds about 11--15\%, and 16+points and location with 32. The answer to ``how much is location worth?'' is therefore
17−bedroom counts are economically negligible once floor space is held 17+inseparable from the attribution rule, and we have made that rule explicit. Second, the
18−fixed---magnitudes squarely within the range catalogued by decades of hedonic work 18+structural implicit list prices behave as hedonic theory predicts and are stable across
19−\citep{sirmans2005composition}. Third, the neighbourhood premia are vast---a factor of 19+eight samples: living area carries an elasticity of 0.53, each full bathroom adds about
20−roughly nine separates the most and least expensive FSAs---and the model translates into 20+12\%, and bedroom counts are economically negligible once floor space is held fixed. The
21−a credible valuation tool, predicting held-out prices with an out-of-sample $R^2$ of 21+area and bathroom effects survive province-level wild-cluster bootstrap inference; the
22−0.76 and a median error of 16\%. These conclusions survive an extensive battery of 22+small half-bathroom and bedroom effects do not. Third, the neighbourhood premia are
23−checks: the implicit prices are stable across subsamples and across the price 23+vast---a factor of about ten separates Vancouver's west side from rural Newfoundland for an
24−distribution, the neighbourhood effects absorb 82\% of the spatial autocorrelation in 24+identical dwelling---and the neighbourhood effects remove 87\% of the spatial
25−residuals, floor space displays diminishing returns, value decays with distance to major 25+autocorrelation in residuals. Fourth, the model is a credible valuation tool whose accuracy
26−metros as the monocentric tradition predicts, and the structural prices transfer across 26+depends on spatial support: it values held-out listings in known neighbourhoods with an
27−provinces in leave-one-province-out cross-validation. 27+out-of-sample $R^2$ of 0.77 and a median absolute error of 15.6\%, and listings in
28+neighbourhoods never observed with an $R^2$ of 0.74 and a median error of 17\% when the
29+neighbourhood effect is interpolated from adjacent FSAs. Floor space displays mild
30+diminishing returns concentrated above 150~m$^2$, the location premium declines by about
31+5.5\% per doubling of distance to the nearest metropolitan centre, implicit prices vary
32+sensibly across the price distribution and across provinces, and the structural prices
33+transfer across most provinces but not to British Columbia.
28 34
29−The reading we propose is deliberately modest and, we believe, well supported: in 35+The reading we propose is deliberately modest. In Canada, the neighbourhood is at least as
30−Canada, the single largest priced component of a home is its neighbourhood. That fact 36+large a component of a dwelling's asking price as the dwelling itself, and it is the
31−is simultaneously a measurement result (for assessment, taxation and index 37+component whose dispersion is greatest. That fact is simultaneously a measurement result
32−construction), a validation result (a transparent fixed-effects design removes the 38+(for assessment, taxation and index construction), a validation result (a transparent
33−spatial dependence that motivates far more elaborate machinery), and a policy result 39+fixed-effects design removes most of the spatial dependence that motivates far more
34−(the premium dispersion that supply constraints and agglomeration generate is the 40+elaborate machinery, and its fixed effects are smooth enough to be interpolated), and a
35−dominant term in the decomposition). Section~\ref{sec:discussion} details the 41+policy result (the premium dispersion that supply constraints and agglomeration generate is
36−limitations---list prices, unobserved quality, noisy lot data, a single 42+largest precisely in the most expensive markets). Section~\ref{sec:discussion} details the
37−cross-section---and the research agenda they imply. Even within those bounds, the model 43+limitations---asking rather than transaction prices, unobserved quality, noisy fields, a
38−provides a transparent, reproducible benchmark for automated valuation, market 44+single cross-section, postal rather than planning geography---and the research agenda they
39−monitoring and the welfare analysis of local amenities across the Canadian residential 45+imply. Within those bounds, the model provides a transparent and reproducible benchmark for
40−market. 46+automated valuation, market monitoring and the analysis of location value across the
47+Canadian residential market.
41 48
42 \vspace{0.6em} 49 \vspace{0.6em}
43 \noindent\textbf{Reproducibility.} Data engineering was performed in \texttt{DuckDB} and 50 \noindent\textbf{Reproducibility.} Data engineering was performed in \texttt{DuckDB} and
44−\texttt{pandas}; estimation used \texttt{statsmodels} (cluster-robust OLS) and 51+\texttt{pandas}; estimation used \texttt{statsmodels} for cluster-robust OLS and quantile
45−\texttt{linearmodels} (absorbing least squares); figures were produced in 52+regression and \texttt{linearmodels} for absorbing least squares; figures were produced
46−\texttt{matplotlib}. All tables and figures are generated programmatically from the 53+in \texttt{matplotlib}. All tables and figures are generated programmatically from the source
47−source database by the numbered scripts in the accompanying repository. 54+database by the numbered scripts in the accompanying repository, and
55+Appendix~\ref{app:reconciliation} reconciles the present estimates with those of the May
56+2026 version of this paper.
modified paper/sections/data.tex +85 −47
Large diff (157 lines) is not loaded by default to keep the page fast.Load diff
modified paper/sections/discussion.tex +159 −114
Large diff (290 lines) is not loaded by default to keep the page fast.Load diff
modified paper/sections/introduction.tex +99 −80
Large diff (189 lines) is not loaded by default to keep the page fast.Load diff
modified paper/sections/literature.tex +161 −136
Large diff (316 lines) is not loaded by default to keep the page fast.Load diff
modified paper/sections/methodology.tex +167 −52
Large diff (246 lines) is not loaded by default to keep the page fast.Load diff
modified paper/sections/results.tex +220 −123
Large diff (398 lines) is not loaded by default to keep the page fast.Load diff
modified paper/sections/robustness.tex +159 −93
Large diff (307 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/coef_M1.csv +9 −9
Large diff (19 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/coef_M2.csv +14 −14
Large diff (29 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/coef_M3.csv +22 −22
Large diff (45 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/coef_M5.csv +25 −25
Large diff (51 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/ext2.json +11 −11
Large diff (33 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/fit.json +12 −10
Large diff (35 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/fsa_premia.csv +870 −869
Large diff (1,740 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/gradient_bins.csv +8 −8
Large diff (17 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/gradient_metro.json +59 −0
Large diff (60 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/grand_model.parquet +0 −0

Binary file not shown.

modified results/reproduced/heterogeneity.csv +9 −8
Large diff (18 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/lopo.csv +9 −8
Large diff (18 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/moran_coords.npy +0 −0

Binary file not shown.

modified results/reproduced/moran_resid_grand.npy +0 −0

Binary file not shown.

modified results/reproduced/moran_resid_struct.npy +0 −0

Binary file not shown.

added results/reproduced/moran_sensitivity.csv +13 −0
Large diff (13 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/nonlinear_band.csv +60 −60
Large diff (121 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/oos.json +9 −9
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/quantile.csv +6 −6
Large diff (13 lines) is not loaded by default to keep the page fast.Load diff
modified results/reproduced/robustness.csv +8 −6
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/se_comparison.csv +6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/shapley.csv +9 −0
Large diff (9 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/spatial_holdout.json +236 −0
Large diff (237 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/spline.csv +6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
added results/reproduced/summary_stats.csv +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/gradient.tex +31 −0
Large diff (31 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/lopo.tex +11 −10
Large diff (27 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/moran_sensitivity.tex +19 −0
Large diff (19 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/oos.tex +10 −10
Large diff (31 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/quantile.tex +8 −8
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/regression.tex +11 −11
Large diff (39 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/robustness.tex +10 −8
Large diff (29 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/se_comparison.tex +21 −0
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/shapley.tex +27 −0
Large diff (27 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/spatial_holdout.tex +22 −0
Large diff (22 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/spline.tex +21 −0
Large diff (21 lines) is not loaded by default to keep the page fast.Load diff
modified results/tables/summary_stats.tex +11 −11
Large diff (33 lines) is not loaded by default to keep the page fast.Load diff
added results/tables/type_effects.tex +29 −0
Large diff (29 lines) is not loaded by default to keep the page fast.Load diff
modified scripts/02_estimate_core.py +2 −0
Large diff (8 lines) is not loaded by default to keep the page fast.Load diff
modified scripts/03_estimate_extended.py +13 −1
Large diff (26 lines) is not loaded by default to keep the page fast.Load diff
modified scripts/04_make_figures.py +49 −26
Large diff (113 lines) is not loaded by default to keep the page fast.Load diff
modified scripts/05_make_tables.py +270 −23
Large diff (385 lines) is not loaded by default to keep the page fast.Load diff
added scripts/06_revision_analyses.py +393 −0
Large diff (393 lines) is not loaded by default to keep the page fast.Load diff
modified src/wp9/config.py +9 −0
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
modified src/wp9/sample.py +10 −4
Large diff (39 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme