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 1 # 🏘️ A Grand Hedonic Model of the Canadian Housing Market
2 2
3 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 7 [![Python](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white)](requirements.txt)
8 8 [![DuckDB](https://img.shields.io/badge/data-DuckDB%20·%20172%2C019%20listings-FFF000?logo=duckdb&logoColor=black)](data/raw/README.md)
9 9 [![Estimation](https://img.shields.io/badge/estimation-statsmodels%20·%20linearmodels%20(AbsorbingLS)-4051b5)](src/wp9/models.py)
10 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 12 [![Institution](https://img.shields.io/badge/UQO-D%C3%A9pt.%20des%20sciences%20administratives-16365c)](https://uqo.ca)
13 13 [![Author](https://img.shields.io/badge/author-Simon--Pierre%20Boucher-16365c)](mailto:simon-pierre.boucher@uqo.ca)
14 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
17 −> effects lifts explained log-price variance from **46% → 77%**. Location alone is worth
18 −> ~30 percentage points of R² — more than every structural attribute combined. The model
19 −> values held-out homes with a median absolute error of **15.8%** (OOS R² = 0.764),
20 −> competitive with commercial AVMs, while staying fully transparent.
16 +> **TL;DR** — On 142,121 Canadian MLS listings (asking prices), absorbing 1,155
17 +> neighbourhood (FSA) fixed effects lifts explained log-price variance from **44% → 78%**.
18 +> A Shapley–Owen decomposition assigns **≈34 pp to structure and ≈36 pp to location**: the
19 +> two are of comparable importance, and location is the single largest block once province
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 29 | Item | Value |
27 30 |---|---|
28 −| Version | 1.2 (May 2026) |
29 −| SSRN | [7626678](https://ssrn.com/abstract=7626678) — submitted 2026-10-17 (preliminary upload) |
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` |
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 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 36 ## 📖 Table of contents
34 37
@@ -40,12 +43,11 @@
40 43 5. [The pipeline, step by step](#-the-pipeline-step-by-step)
41 44 6. [Data](#-data)
42 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 47 9. [Figures & tables inventory](#-figures--tables-inventory)
45 −10. [Reproduction verification](#-reproduction-verification)
46 −11. [Limitations](#-limitations)
47 −12. [Citation](#-citation)
48 −13. [Author & contact](#-author--contact)
48 +10. [Limitations](#-limitations)
49 +11. [Citation](#-citation)
50 +12. [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 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
63 −characters of the postal code) of listing *i*. With 1,153 absorbed FSA intercepts, every
64 +where `P_i` is the **asking price** of listing *i* and `μ_f(i)` is a fixed effect for its
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 67 neighbourhood gets an arbitrary price level that soaks up schools, transit, coastline,
65 68 employment density — observed or not — and the structural implicit prices (β, γ) are
66 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.
68 −
69 −Beyond the headline decomposition the paper delivers: out-of-sample valuation accuracy
70 −(80/20 split, Duan-smeared retransformation), robustness across six sample cuts, quantile
71 −hedonic regressions, a quadratic test of diminishing returns to floor space, an urban
72 −price gradient in distance to the nine major metros, Moran's I spatial diagnostics,
73 −leave-one-province-out transferability, and a ranked map of Canada's most and least
74 −expensive neighbourhoods net of structure.
70 +least squares (numerically identical to full-dummy OLS); baseline inference is clustered by FSA.
71 +
72 +Beyond the headline decomposition the paper delivers: a **Shapley–Owen decomposition** of
73 +R² across regressor blocks (order-free alternative to the sequential ladder); inference
74 +under HC1 / FSA-cluster / province-cluster / two-way SEs and a **province-level wild-cluster
75 +bootstrap**; out-of-sample valuation accuracy (repeated random 80/20 splits *and* a
76 +**spatial holdout of entire FSAs** with interpolated effects, Duan-smeared retransformation);
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 84 ## 🏆 Headline results
77 85
78 86 | Quantity | Value |
79 87 |---|---|
80 −| Estimation sample | **140,931** listings — 82,334 houses, 57,857 condos, 9 provinces |
81 −| Absorbed neighbourhood effects | **1,153** FSAs |
82 −| R²: structural only (M1) | 0.464 |
83 −| R²: + dwelling type & ownership (M2) | 0.469 |
84 −| R²: + province FE (M3) | 0.567 |
85 −| R²: grand model, FSA FE (M5) | **0.767** |
86 −| Living-area elasticity (M5) | **0.547** (cluster SE 0.009) |
87 −| Full-bathroom premium | **0.109 log points ≈ +11%** per bathroom |
88 −| Bedrooms, conditional on area | ≈ 0 (the textbook hedonic result) |
89 −| Out-of-sample R² (log price) | **0.764** |
90 −| Median absolute valuation error | **15.8%** (59% of homes priced within ±20%) |
91 −| Moran's I of residuals, structural → grand | **0.46 → 0.08** (−82%) |
92 −| Urban gradient | −8.5% location premium per doubling of distance to metro |
93 −| Neighbourhood premia span | ×9 between the most and least expensive FSAs |
94 −
95 −The most expensive neighbourhoods net of structure are all in the **City of Vancouver**
96 −(V6S, V8E, V6T: +150–200% vs. the national median); the cheapest are in rural
97 −Saskatchewan, Manitoba and Newfoundland (−60 to −67%).
88 +| Estimation sample | **142,121** listings — 83,524 houses, 57,853 condos, 744 other; 9 provinces (province from FSA letter) |
89 +| Absorbed neighbourhood effects | **1,155** (1,146 FSAs ≥ 25 listings + 9 pooled residual categories) |
90 +| R² houses: M1 structural / M2 +type / M3 +province / M4 +FSA | 0.467 / 0.470 / 0.605 / 0.769 |
91 +| R²: grand model, all residential, FSA FE (M5) | **0.776** (structure-only on the same sample: 0.436) |
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** |
93 +| Living-area elasticity (M5) | **0.529** (FSA-cluster SE 0.009; province-cluster 0.037; wild-cluster p = 0.004) |
94 +| Full-bathroom premium | **0.112 log points ≈ +11.9%** per bathroom (0.148 ≈ +16% on houses with province FE) |
95 +| Bedrooms, half baths (conditional on area) | −0.006, −0.034 — not significant under province-level inference |
96 +| Dwelling type (vs apartment, same size & FSA) | house +46%, triplex +43%, fourplex +39%, duplex +16%, townhouse ≈ 0 (Kennedy-corrected) |
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%) |
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%** |
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 |
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 |
101 +| Urban gradient | −0.082 per log unit of distance ⇒ **−5.5% per doubling**; +21% within 5 km, −38% beyond 320 km |
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** |
103 +| Neighbourhood premia span | ×10.5 between extremes (V6S +226% vs A0B −69%), ×6.7 between P99 and P1 |
104 +
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 110 ## 📁 Repository layout
100 111
101 112 ```
102 113 wp9_uqo/
103 114 ├── README.md ← you are here
104 −├── docs/ AUDIT.md (forensic audit + verification), CHANGES.md,
105 −│ PAPER_REVIEW.md, UPGRADE_REPORT.md
115 +├── docs/ REVIEW-REPORT.md + CHANGELOG-REVISION.md (editorial-board
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 118 ├── requirements.txt pinned Python dependencies
107 119 ├── .gitignore
108 120 ├── data/
@@ -121,19 +133,22 @@ wp9_uqo/
121 133 │ ├── 01_build_sample.py
122 134 │ ├── 02_estimate_core.py
123 135 │ ├── 03_estimate_extended.py
124 −│ ├── 04_make_figures.py (--results reference|reproduced)
125 −│ └── 05_make_tables.py (--results reference|reproduced)
136 +│ ├── 04_make_figures.py (--results reproduced|reference; default 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 140 ├── figures/ all 17 paper figures (PNG, generated)
127 141 ├── results/
128 −│ ├── reference/ ORIGINAL published outputs — canonical paper numbers
129 −│ ├── reproduced/ outputs regenerated end-to-end by this pipeline
130 −│ └── tables/ the 6 LaTeX tables consumed by the paper
142 +│ ├── reference/ archived outputs of the May 2026 version (v1.2)
143 +│ ├── reproduced/ outputs of the current pipeline — THE PAPER'S NUMBERS (v1.3)
144 +│ └── tables/ the 13 LaTeX tables consumed by the paper
131 145 └── paper/
132 146 ├── main.tex preamble + metadata; \input's the sections
133 − ├── main.pdf compiled paper (34 pages)
147 + ├── main.pdf compiled paper (52 pages)
134 148 ├── sections/ titlepage, introduction, literature, data,
135 − │ methodology, results, robustness, conclusion
136 − ├── references.bib 32 entries, natbib author-year, aer style
149 + │ methodology, results, robustness, discussion, conclusion
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 152 ├── Makefile / .latexmkrc build config
138 153 └── uq_logo.jpg
139 154 ```
@@ -149,15 +164,17 @@ python3 -m pip install -r requirements.txt
149 164 python3 scripts/01_build_sample.py # duckdb → data/processed/analysis.parquet
150 165 python3 scripts/02_estimate_core.py # M1–M5 ladder → results/reproduced/
151 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 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 171 # Paper:
156 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 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 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 183 | 01 | `01_build_sample.py` | raw DuckDB (172,019 rows) | `analysis.parquet` (142k rows, 21 cols) | ~40 s |
167 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 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 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 199 `"50 x 120"` frontage×depth) with a missingness indicator; the top 1% of positive
182 200 parsed lots (multi-acre rural acreage strings) treated as "no usable lot info";
183 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 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 210 ## 📊 Data
189 211
@@ -197,89 +219,79 @@ file limit, plus its content is scraped listing data). It lives on the author's
197 219 place it at `data/raw/realtor_mls_unique.duckdb` to run step 01. All downstream artifacts
198 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**;
201 −median living area ≈ **135 m²**; 3 bedrooms; 2 full bathrooms. Both price and price/m²
202 −are strongly right-skewed, motivating the log transformation. Ontario, Quebec, BC and
203 −Alberta dominate; PEI and the territories have no listings in this snapshot.
222 +Estimation-sample snapshot (Table 1 of the paper): median asking price **$639,900**;
223 +median living area **135 m²**; 3 bedrooms; 2 full bathrooms. Both price and price/m² are
224 +strongly right-skewed, motivating the log transformation. ON 55,897 · BC 32,994 · QC 19,949
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 229 ## 📐 Methodology
206 230
207 231 - **Specification ladder** — M1 structural only → M2 + type/ownership → M3 + province FE
208 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.
210 −- **Absorbing least squares** (`linearmodels.AbsorbingLS`) sweeps out the 1,153 FSA
211 − intercepts without materialising dummies; slopes are numerically identical to
212 − full-dummy OLS. SEs clustered by FSA throughout.
213 −- **Retransformation** — predictions in levels use Duan's (1983) smearing estimator (no
214 − log-normality assumption).
215 −- **Validation** — random 80/20 split, evaluation restricted to FSAs observed in
216 − training (out-of-support FE are not identified); leave-one-province-out CV with
217 − province-specific intercepts; Moran's I with row-standardised k-NN weights (k = 10,
218 − 15,000-listing sample, 199 permutations).
219 −
220 −## 🧭 The two results tiers (reference vs. reproduced)
221 −
222 −The original upstream cleaning code (`RE_DB_QC/hedonic`) was **lost** before this
223 −repository was assembled; `src/wp9/sample.py` is a careful reconstruction from the
224 −paper's own data section, calibrated against every stored output (see `docs/AUDIT.md`). It
225 −reproduces the published sample to **+0.86%** and all headline estimates closely — but
226 −not to the last digit. To keep the published record intact:
227 −
228 −- **`results/reference/`** — the original outputs (verbatim files, plus values
229 − transcribed from the published tables). **Default** source for figures/tables, so the
230 − paper always shows exactly the published numbers.
231 −- **`results/reproduced/`** — regenerated end-to-end by scripts 02–03 on the
232 − reconstructed sample.
233 −
234 −```bash
235 −python3 scripts/04_make_figures.py --results reproduced # opt in to regenerated numbers
236 −python3 scripts/05_make_tables.py --results reproduced
237 −```
233 +- **Variance decomposition** — sequential increments *and* Shapley values over the four
234 + blocks (16 regressions) plus Owen values grouping province + FSA into one location block
235 + (Israeli 2007; Huettner & Sunder 2012). The sequential ladder credits the ~10 pp shared by
236 + structure and location to whichever enters first.
237 +- **Absorbing least squares** (`linearmodels.AbsorbingLS`) sweeps out the 1,155 FSA
238 + intercepts; slopes identical to full-dummy OLS. Baseline SEs clustered by FSA; also HC1,
239 + province-cluster, two-way, and a restricted wild-cluster bootstrap-t at the province level
240 + (Rademacher, full enumeration of 2⁹ = 512 draws).
241 +- **Percentage effects** — e^γ − 1 for counts; Kennedy (1981) correction for indicators.
242 +- **Functional form** — quadratic in ln(area) and a linear spline with quintile knots.
243 +- **Retransformation** — Duan (1983) smearing.
244 +- **Validation** — (i) random 80/20 splits × 5 seeds, evaluation on FSAs seen in training;
245 + (ii) **spatial holdout**: 20% of FSAs held out entirely × 5 reps, FSA effect imputed as the
246 + province mean or as the inverse-distance mean of the 5 nearest training FSAs; (iii)
247 + leave-one-province-out with province intercepts.
248 +- **Spatial diagnostics** — Moran's I, row-standardised k-NN weights (k = 5, 10, 20), two
249 + 15,000-listing subsamples, 199 permutations.
250 +- **Urban gradient** — location residual on ln(distance to nearest of 9 metros): pooled,
251 + with nearest-metro intercepts, quadratic; FSA-clustered SEs.
252 +
253 +## 🧭 The two results tiers (reproduced vs. reference)
254 +
255 +- **`results/reproduced/`** — **the paper's numbers since v1.3.** Regenerated end-to-end by
256 + scripts 01–06 on the committed sample, with the province derived from the FSA.
257 +- **`results/reference/`** — the archived outputs of the May 2026 version (v1.2), whose
258 + upstream cleaning code was lost (see `docs/AUDIT.md`). Kept for the reconciliation table
259 + in Appendix C of the paper. `python3 scripts/0{4,5}_*.py --results reference` rebuilds
260 + the v1.2 figures/tables (the six original tables only).
238 261
239 262 ## 🖼️ Figures & tables inventory
240 263
241 −| # | Figure | Shows | Numbers from |
242 −|---|---|---|---|
243 −| 1 | `fig_price_dist` | raw vs. log price distribution | micro sample |
244 −| 2 | `fig_province_ppm2` | median $/m² by province | micro sample |
245 −| 3 | `fig_r2` | R² across the M1–M5 ladder | reference |
246 −| 4 | `fig_forest` | structural implicit prices, 95% CI (M3) | reference |
247 −| 5 | `fig_size_gradient` | median price by size bin × dwelling type | micro sample |
248 −| 6a/6b | `fig_map` / `fig_fsa_map` | listing map & FSA medians, coloured by ln $/m² | micro sample |
249 −| 7 | `fig_premia` | top/bottom 12 FSA premia vs. national median | reference |
250 −| 8 | `fig_decomp` | variance decomposition bar | reference |
251 −| 9 | `fig_nonlinear` | marginal elasticity vs. size (quadratic model) | reproduced band + reference anchor |
252 −| 10 | `fig_gradient` | location premium vs. distance to metro | reproduced |
253 −| 11 | `fig_quantile` | quantile coefficients τ = 0.1…0.9 | reference |
254 −| 12 | `fig_moran` | Moran scatterplots, structural vs. grand | reproduced clouds, reference I |
255 −| 13 | `fig_heterogeneity` | size elasticity by province, 95% CI | reference |
256 −| 14 | `fig_oos` | OOS error buckets (±10/±20%) | reference |
257 −| 15/16 | `fig_fit` / `fig_resid` | predicted vs. actual; residual diagnostics | reproduced |
258 −
259 −(The leave-one-province-out results appear as a table only.)
260 −
261 −Tables (`results/tables/`): `summary_stats`, `regression` (M1/M2/M3/M5),
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.
264 +| # | Figure | Shows |
265 +|---|---|---|
266 +| 1 | `fig_price_dist` | raw vs. log asking price |
267 +| 2 | `fig_province_ppm2` | median $/m² by province (FSA-derived) |
268 +| 3 | `fig_r2` | R² across the M1–M5 ladder |
269 +| 4 | `fig_decomp` | sequential vs. Shapley variance decomposition |
270 +| 5 | `fig_forest` | structural implicit prices, 95% CI (M3) |
271 +| 6 | `fig_size_gradient` | median price by size bin × dwelling type |
272 +| 7a/7b | `fig_map` / `fig_fsa_map` | listing map & FSA medians, ln $/m² |
273 +| 8 | `fig_premia` | top/bottom 12 FSA premia vs. median FSA |
274 +| 9 | `fig_nonlinear` | marginal elasticity vs. size: quadratic + spline |
275 +| 10 | `fig_gradient` | location premium by distance band to metro |
276 +| 11 | `fig_quantile` | quantile coefficients τ = 0.1…0.9 |
277 +| 12 | `fig_moran` | Moran scatterplots, structural vs. grand |
278 +| 13 | `fig_heterogeneity` | size elasticity by province, 95% CI |
279 +| 14 | `fig_oos` | OOS error buckets (±10/±20%) |
280 +| 15 | `fig_fit` / `fig_resid` | predicted vs. actual; residual diagnostics |
281 +
282 +Tables (`results/tables/`, 13): `summary_stats`, `shapley`, `regression` (M1/M2/M3/M5),
283 +`type_effects`, `spline`, `gradient`, `robustness` (8 cuts), `se_comparison`, `quantile`,
284 +`lopo`, `oos`, `spatial_holdout`, `moran_sensitivity` (appendix).
276 285
277 286 ## ⚠️ Limitations
278 287
279 −List prices, not transactions; no construction year / renovation status / interior
280 −quality (absorbed into FSA effects and the residual); lot information sparse and noisy;
281 −a single cross-section — levels, not dynamics. See the paper's conclusion for the
282 −research agenda these imply.
288 +Asking prices, not transactions (implicit *list* prices; accuracy is an upper bound for
289 +transaction-price models); no construction year / renovation / interior quality (within-FSA
290 +sorting remains); noisy fields (lot parsed from free text, storeys/parking with implausible
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 296 ## 📚 Citation
285 297
@@ -288,14 +300,15 @@ research agenda these imply.
288 300 author = {Boucher, Simon-Pierre},
289 301 title = {A Grand Hedonic Model of the Canadian Housing Market:
290 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 304 Fixed Effects},
293 305 institution = {Universit\'e du Qu\'ebec en Outaouais,
294 306 D\'epartement des sciences administratives},
295 307 type = {Working Paper},
296 308 number = {9},
297 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 330 - Numbering: UQO Working Paper No. 9 since the first version (May 2026).
318 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 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 4 % A Grand Hedonic Model of the Canadian Housing Market
5 5 %
6 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 8 % Figures are read from ../figures/, tables from ../results/tables/.
8 9 % ============================================================================
9 10 \documentclass[12pt,letterpaper]{article}
@@ -29,11 +30,18 @@
29 30 \usepackage{booktabs}
30 31 \usepackage{threeparttable}
31 32 \usepackage{makecell}
33 +\usepackage{multirow}
32 34
33 35 % ---------------------------------------------------------------- figures
34 36 \usepackage{graphicx}
35 37 \usepackage{subcaption}
36 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 46 % ---------------------------------------------------------------- captions
39 47 \usepackage[font=small,labelfont=bf,labelsep=period,justification=justified,singlelinecheck=false]{caption}
@@ -58,16 +66,19 @@
58 66 \usepackage{enumitem}
59 67 \setlist{nosep,leftmargin=*}
60 68
69 +% ---------------------------------------------------------------- appendix
70 +\usepackage[toc,page]{appendix}
71 +
61 72 % ============================================================================
62 73 % METADATA
63 74 % ============================================================================
64 75 \newcommand{\WPnumber}{9}
65 76 \newcommand{\WPtitle}{A Grand Hedonic Model of the Canadian Housing Market}
66 77 \newcommand{\WPsubtitle}{Decomposing the Value of Structure and Location across
67 − 140{,}931 MLS Listings with High-Dimensional Neighbourhood Fixed Effects}
68 −\newcommand{\WPdate}{May 2026}
69 −\newcommand{\WPversion}{1.2}
70 −\newcommand{\WPkeywords}{hedonic pricing, housing markets, Canada, fixed effects, spatial heterogeneity, automated valuation}
78 + 142{,}121 MLS Listings with High-Dimensional Neighbourhood Fixed Effects}
79 +\newcommand{\WPdate}{October 2026}
80 +\newcommand{\WPversion}{1.3}
81 +\newcommand{\WPkeywords}{hedonic pricing, housing markets, Canada, high-dimensional fixed effects, neighbourhood effects, spatial autocorrelation, automated valuation model, list prices}
71 82 \newcommand{\WPjel}{R31, R21, C21, C55}
72 83
73 84 \newcommand{\WPauthor}{Simon-Pierre Boucher}
@@ -78,24 +89,30 @@
78 89 283, boulevard Alexandre-Tach\'e\\ Gatineau, Qu\'ebec, Canada J9A 1L8}
79 90
80 91 \newcommand{\WPabstract}{%
81 −We estimate a large-scale hedonic price model for the Canadian residential real-estate
82 −market using a cross-section of 140{,}931 active MLS listings drawn from the nine provinces
83 −present in the data. A semi-logarithmic specification decomposes dwelling prices into
84 −structural attributes, dwelling type and ownership form, and 1{,}153 neighbourhood
85 −(Forward Sortation Area) fixed effects estimated by absorbing least squares. Moving from a
86 −purely structural model to the full specification raises the explained share of price
87 −variation from 46\% to 77\%, establishing that location is the dominant price determinant
88 −in Canada: neighbourhood effects alone account for roughly thirty percentage points of
89 −explanatory power. The living-area elasticity is 0.51--0.62, each full bathroom commands a
90 −premium of about 11--15\%, and---conditional on floor space---bedroom counts are
91 −economically negligible. The implicit prices are stable across alternative samples and
92 −trimming rules, and the model delivers strong out-of-sample valuation accuracy (held-out
93 −$R^2=0.76$; median absolute error of 16\%). The neighbourhood effects absorb the bulk of
94 −the spatial dependence in prices---Moran's~$I$ falls from 0.46 to 0.08---and we further
95 −document diminishing returns to floor space, an urban price gradient that decays with
96 −distance to major metros, and quantile and cross-province heterogeneity in the implicit
97 −prices. We map the resulting neighbourhood premia, which span a factor of roughly nine
98 −between the most and least expensive areas.}
92 +We estimate a national hedonic price function for the Canadian residential market on a
93 +cross-section of 142{,}121 active MLS listings from nine provinces. A semi-logarithmic
94 +specification relates the log list price to structural attributes, dwelling type and
95 +ownership form, and 1{,}155 absorbed neighbourhood (Forward Sortation Area) fixed effects
96 +estimated by absorbing least squares with neighbourhood-clustered inference. Moving from a
97 +structural model to the full specification raises the explained share of log-price
98 +variation from 44\% to 78\%. Because structure and location are correlated, the attribution
99 +of this gain depends on the order in which blocks enter: a Shapley--Owen decomposition
100 +assigns about 34 percentage points to structure and 36 to location, so that the two are of
101 +comparable importance and the neighbourhood is the single largest block once province and
102 +neighbourhood are grouped. Conditional on location, the living-area elasticity is 0.53
103 +(0.49--0.62 across samples), each full bathroom adds about 12\%, and bedroom counts are
104 +economically negligible. The implicit prices of area and bathrooms survive province-level
105 +wild-cluster bootstrap inference, whereas the small half-bathroom and bedroom effects do not.
106 +Neighbourhood effects remove 87\% of the spatial autocorrelation in residuals (Moran's~$I$
107 +0.50 to 0.06). The model values held-out listings in neighbourhoods seen in training with
108 +an out-of-sample $R^2$ of 0.77 and a median absolute percentage error of 15.6\%; for
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 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 130 \input{sections/discussion}
114 131 \input{sections/conclusion}
115 132
116 −\newpage
133 +\clearpage
117 134 \bibliography{references}
118 135
136 +\input{appendix/appendix}
137 +
119 138 \end{document}
modified paper/references.bib +382 −63
@@ -9,7 +9,8 @@
9 9 volume = {82},
10 10 number = {1},
11 11 pages = {34--55},
12 − year = {1974}
12 + year = {1974},
13 + doi = {10.1086/260169}
13 14 }
14 15
15 16 @article{lancaster1966new,
@@ -19,23 +20,28 @@
19 20 volume = {74},
20 21 number = {2},
21 22 pages = {132--157},
22 − year = {1966}
23 + year = {1966},
24 + doi = {10.1086/259131}
23 25 }
24 26
25 −@article{court1939hedonic,
26 − author = {Court, Andrew T.},
27 − title = {Hedonic Price Indexes with Automotive Examples},
28 − journal = {The Dynamics of Automobile Demand, General Motors},
29 − pages = {99--117},
30 − year = {1939}
27 +@incollection{court1939hedonic,
28 + author = {Court, Andrew T.},
29 + title = {Hedonic Price Indexes with Automotive Examples},
30 + booktitle = {The Dynamics of Automobile Demand},
31 + publisher = {General Motors Corporation},
32 + address = {New York},
33 + pages = {99--117},
34 + year = {1939}
31 35 }
32 36
33 −@article{griliches1961hedonic,
34 − author = {Griliches, Zvi},
35 − title = {Hedonic Price Indexes for Automobiles: An Econometric Analysis of Quality Change},
36 − journal = {The Price Statistics of the Federal Government, NBER},
37 − pages = {173--196},
38 − year = {1961}
37 +@incollection{griliches1961hedonic,
38 + author = {Griliches, Zvi},
39 + title = {Hedonic Price Indexes for Automobiles: An Econometric Analysis of Quality Change},
40 + booktitle = {The Price Statistics of the Federal Government},
41 + publisher = {National Bureau of Economic Research},
42 + address = {New York},
43 + pages = {173--196},
44 + year = {1961}
39 45 }
40 46
41 47 @article{halvorsen1980interpretation,
@@ -54,8 +60,9 @@
54 60 journal = {Journal of Real Estate Literature},
55 61 volume = {13},
56 62 number = {1},
57 − pages = {3--43},
58 − year = {2005}
63 + pages = {1--44},
64 + year = {2005},
65 + doi = {10.1080/10835547.2005.12090154}
59 66 }
60 67
61 68 @incollection{malpezzi2003hedonic,
@@ -65,7 +72,8 @@
65 72 editor = {O'Sullivan, Tony and Gibb, Kenneth},
66 73 publisher = {Blackwell},
67 74 pages = {67--89},
68 − year = {2003}
75 + year = {2003},
76 + doi = {10.1002/9780470690680.ch5}
69 77 }
70 78
71 79 @article{can1992specification,
@@ -75,7 +83,8 @@
75 83 volume = {22},
76 84 number = {3},
77 85 pages = {453--474},
78 − year = {1992}
86 + year = {1992},
87 + doi = {10.1016/0166-0462(92)90039-4}
79 88 }
80 89
81 90 @book{anselin1988spatial,
@@ -92,7 +101,8 @@
92 101 volume = {35},
93 102 number = {2},
94 103 pages = {143--160},
95 − year = {2007}
104 + year = {2007},
105 + doi = {10.1007/s11146-007-9036-8}
96 106 }
97 107
98 108 @article{case2004modeling,
@@ -102,7 +112,8 @@
102 112 volume = {29},
103 113 number = {2},
104 114 pages = {167--191},
105 − year = {2004}
115 + year = {2004},
116 + doi = {10.1023/B:REAL.0000035309.60607.53}
106 117 }
107 118
108 119 @article{kuminoff2010which,
@@ -112,7 +123,8 @@
112 123 volume = {60},
113 124 number = {3},
114 125 pages = {145--160},
115 − year = {2010}
126 + year = {2010},
127 + doi = {10.1016/j.jeem.2010.06.001}
116 128 }
117 129
118 130 @article{glaeser2005why,
@@ -122,7 +134,8 @@
122 134 volume = {95},
123 135 number = {2},
124 136 pages = {329--333},
125 − year = {2005}
137 + year = {2005},
138 + doi = {10.1257/000282805774669961}
126 139 }
127 140
128 141 @article{duan1983smearing,
@@ -132,7 +145,8 @@
132 145 volume = {78},
133 146 number = {383},
134 147 pages = {605--610},
135 − year = {1983}
148 + year = {1983},
149 + doi = {10.1080/01621459.1983.10478017}
136 150 }
137 151
138 152 @article{cameron2015practitioner,
@@ -142,25 +156,17 @@
142 156 volume = {50},
143 157 number = {2},
144 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 164 author = {Correia, Sergio},
150 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 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 171 @article{mullainathan2017machine,
166 172 author = {Mullainathan, Sendhil and Spiess, Jann},
@@ -169,18 +175,10 @@
169 175 volume = {31},
170 176 number = {2},
171 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 183 @article{ekeland2004identification,
186 184 author = {Ekeland, Ivar and Heckman, James J. and Nesheim, Lars},
@@ -189,7 +187,8 @@
189 187 volume = {112},
190 188 number = {S1},
191 189 pages = {S60--S109},
192 − year = {2004}
190 + year = {2004},
191 + doi = {10.1086/379947}
193 192 }
194 193
195 194 @article{bajari2005hedonic,
@@ -199,7 +198,8 @@
199 198 volume = {113},
200 199 number = {6},
201 200 pages = {1239--1276},
202 − year = {2005}
201 + year = {2005},
202 + doi = {10.1086/498586}
203 203 }
204 204
205 205 @article{black1999better,
@@ -209,7 +209,8 @@
209 209 volume = {114},
210 210 number = {2},
211 211 pages = {577--599},
212 − year = {1999}
212 + year = {1999},
213 + doi = {10.1162/003355399556070}
213 214 }
214 215
215 216 @article{chay2005does,
@@ -219,7 +220,8 @@
219 220 volume = {113},
220 221 number = {2},
221 222 pages = {376--424},
222 − year = {2005}
223 + year = {2005},
224 + doi = {10.1086/427462}
223 225 }
224 226
225 227 @article{linden2008estimates,
@@ -229,7 +231,8 @@
229 231 volume = {98},
230 232 number = {3},
231 233 pages = {1103--1127},
232 − year = {2008}
234 + year = {2008},
235 + doi = {10.1257/aer.98.3.1103}
233 236 }
234 237
235 238 @book{lesage2009introduction,
@@ -246,16 +249,20 @@
246 249 volume = {52},
247 250 number = {2},
248 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,
253 − author = {Combes, Pierre-Philippe and Gobillon, Laurent},
254 − title = {The Empirics of Agglomeration Economies},
255 − journal = {Handbook of Regional and Urban Economics},
256 − volume = {5},
257 − pages = {247--348},
258 − year = {2015}
256 +@incollection{combes2015empirics,
257 + author = {Combes, Pierre-Philippe and Gobillon, Laurent},
258 + title = {The Empirics of Agglomeration Economies},
259 + booktitle = {Handbook of Regional and Urban Economics},
260 + editor = {Duranton, Gilles and Henderson, J. Vernon and Strange, William C.},
261 + volume = {5},
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 268 @article{moran1950notes,
@@ -265,7 +272,8 @@
265 272 volume = {37},
266 273 number = {1/2},
267 274 pages = {17--23},
268 − year = {1950}
275 + year = {1950},
276 + doi = {10.1093/biomet/37.1-2.17}
269 277 }
270 278
271 279 @article{koenker1978regression,
@@ -275,7 +283,8 @@
275 283 volume = {46},
276 284 number = {1},
277 285 pages = {33--50},
278 − year = {1978}
286 + year = {1978},
287 + doi = {10.2307/1913643}
279 288 }
280 289
281 290 @article{zietz2008determinants,
@@ -285,7 +294,8 @@
285 294 volume = {37},
286 295 number = {4},
287 296 pages = {317--333},
288 − year = {2008}
297 + year = {2008},
298 + doi = {10.1007/s11146-007-9053-7}
289 299 }
290 300
291 301 @article{mcmillen2010issues,
@@ -295,7 +305,8 @@
295 305 volume = {50},
296 306 number = {3},
297 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 312 @article{pace1998spatiotemporal,
@@ -305,7 +316,8 @@
305 316 volume = {17},
306 317 number = {1},
307 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 660 pages = {628--649},
649 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 4 \label{sec:conclusion}
5 5 % ============================================================================
6 6
7 −Using a nationwide cross-section of 140{,}931 MLS listings and 1{,}153 absorbed
8 −neighbourhood fixed effects, we estimate a grand hedonic model of the Canadian
9 −residential housing market. The exercise yields three robust conclusions. First,
10 −location dominates: resolving geography from the provincial to the neighbourhood scale
11 −raises explained price variation from 57\% to 77\%, and location as a whole accounts for
12 −roughly thirty percentage points of $R^2$---more than every structural attribute
13 −combined, and a listing-level counterpart to the large land shares documented in
14 −aggregate data \citep{davis2007price,knoll2017no}. Second, the structural implicit
15 −prices behave as hedonic theory predicts and are strikingly stable across samples:
16 −living area carries an elasticity near 0.55, each full bathroom adds about 11--15\%, and
17 −bedroom counts are economically negligible once floor space is held
18 −fixed---magnitudes squarely within the range catalogued by decades of hedonic work
19 −\citep{sirmans2005composition}. Third, the neighbourhood premia are vast---a factor of
20 −roughly nine separates the most and least expensive FSAs---and the model translates into
21 −a credible valuation tool, predicting held-out prices with an out-of-sample $R^2$ of
22 −0.76 and a median error of 16\%. These conclusions survive an extensive battery of
23 −checks: the implicit prices are stable across subsamples and across the price
24 −distribution, the neighbourhood effects absorb 82\% of the spatial autocorrelation in
25 −residuals, floor space displays diminishing returns, value decays with distance to major
26 −metros as the monocentric tradition predicts, and the structural prices transfer across
27 −provinces in leave-one-province-out cross-validation.
7 +Using a nationwide cross-section of 142{,}121 MLS listings and 1{,}155 absorbed
8 +neighbourhood fixed effects, we estimate a hedonic price function for the Canadian
9 +residential market and decompose the variance of log asking prices into structure and
10 +location. The exercise yields four conclusions. First, location and structure are of
11 +comparable importance: resolving geography from the provincial to the neighbourhood scale
12 +raises explained variation from 60\% to 77\%, and a Shapley--Owen decomposition assigns
13 +about 34 percentage points of $R^2$ to structure and 36 to location, so that the
14 +neighbourhood is the single largest block once province and neighbourhood are grouped,
15 +while the sequential ladder that most hedonic papers report would credit structure with 44
16 +points and location with 32. The answer to ``how much is location worth?'' is therefore
17 +inseparable from the attribution rule, and we have made that rule explicit. Second, the
18 +structural implicit list prices behave as hedonic theory predicts and are stable across
19 +eight samples: living area carries an elasticity of 0.53, each full bathroom adds about
20 +12\%, and bedroom counts are economically negligible once floor space is held fixed. The
21 +area and bathroom effects survive province-level wild-cluster bootstrap inference; the
22 +small half-bathroom and bedroom effects do not. Third, the neighbourhood premia are
23 +vast---a factor of about ten separates Vancouver's west side from rural Newfoundland for an
24 +identical dwelling---and the neighbourhood effects remove 87\% of the spatial
25 +autocorrelation in residuals. Fourth, the model is a credible valuation tool whose accuracy
26 +depends on spatial support: it values held-out listings in known neighbourhoods with an
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
30 −Canada, the single largest priced component of a home is its neighbourhood. That fact
31 −is simultaneously a measurement result (for assessment, taxation and index
32 −construction), a validation result (a transparent fixed-effects design removes the
33 −spatial dependence that motivates far more elaborate machinery), and a policy result
34 −(the premium dispersion that supply constraints and agglomeration generate is the
35 −dominant term in the decomposition). Section~\ref{sec:discussion} details the
36 −limitations---list prices, unobserved quality, noisy lot data, a single
37 −cross-section---and the research agenda they imply. Even within those bounds, the model
38 −provides a transparent, reproducible benchmark for automated valuation, market
39 −monitoring and the welfare analysis of local amenities across the Canadian residential
40 −market.
35 +The reading we propose is deliberately modest. In Canada, the neighbourhood is at least as
36 +large a component of a dwelling's asking price as the dwelling itself, and it is the
37 +component whose dispersion is greatest. That fact is simultaneously a measurement result
38 +(for assessment, taxation and index construction), a validation result (a transparent
39 +fixed-effects design removes most of the spatial dependence that motivates far more
40 +elaborate machinery, and its fixed effects are smooth enough to be interpolated), and a
41 +policy result (the premium dispersion that supply constraints and agglomeration generate is
42 +largest precisely in the most expensive markets). Section~\ref{sec:discussion} details the
43 +limitations---asking rather than transaction prices, unobserved quality, noisy fields, a
44 +single cross-section, postal rather than planning geography---and the research agenda they
45 +imply. Within those bounds, the model provides a transparent and reproducible benchmark for
46 +automated valuation, market monitoring and the analysis of location value across the
47 +Canadian residential market.
41 48
42 49 \vspace{0.6em}
43 50 \noindent\textbf{Reproducibility.} Data engineering was performed in \texttt{DuckDB} and
44 −\texttt{pandas}; estimation used \texttt{statsmodels} (cluster-robust OLS) and
45 −\texttt{linearmodels} (absorbing least squares); figures were produced in
46 −\texttt{matplotlib}. All tables and figures are generated programmatically from the
47 −source database by the numbered scripts in the accompanying repository.
51 +\texttt{pandas}; estimation used \texttt{statsmodels} for cluster-robust OLS and quantile
52 +regression and \texttt{linearmodels} for absorbing least squares; figures were produced
53 +in \texttt{matplotlib}. All tables and figures are generated programmatically from the source
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