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.

11.1 KB

# CHANGELOG-REVISION — Audit trail of the 2026-10-17 editorial-board revision (v1.2 → v1.3)

All original files are preserved under git tag pre-revision-20261017; the v1.2 PDF is docs/main_pre-revision-20261017.pdf; the v1.2 numerical outputs remain in results/reference/ (untouched). Every number in the v1.3 paper comes from results/reproduced/ produced by scripts/01…06.

# 1. Decision to switch the paper to the reproduced tier

Why. (a) The v1.2 numbers came from an upstream pipeline that no longer exists (docs/AUDIT.md); the shipped code reproduced them only approximately (+0.86 % sample). (b) The province variable used by v1.2 (_province, the scraper's regional seed) mislabels 16,558 of 142,121 listings (11.7 %): e.g. 13,600 listings with A/B/E/K/P FSAs (NL, NS, NB, Ottawa-area and northern ON) labelled "QC"; 4,278 V-FSAs (BC) labelled "AB"; 1,326 T-FSAs (AB) labelled "BC". This affected M3 (province FE), LOPO, provincial heterogeneity, the ON/QC/BC cut, the <PROV>_other pooling, and the province labels in the premia figure (v1.2 showed "E2A (QC)", "R0M (SK)"). (c) Fixing (b) requires re-running everything, which is only possible on the reconstructed sample. Evidence: cross-tab FSA letter × seed province, 2026-10-17 (reproduced in scripts/01_build_sample.py logic; see §2).

Consequence. N changes 140,931 → 142,121 (title, abstract, README, BibTeX). All headline magnitudes preserved (Appendix C of the paper, Table A2).

# 2. Code changes

File Change
src/wp9/config.py FSA_PROVINCE map (Canada Post first letter → province)
src/wp9/sample.py prov derived from FSA letter; seed kept as prov_seed; FSAs with letters O/W/X/Y → dropped (27 records)
scripts/02_estimate_core.py records n_fe in fit.json
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)
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
scripts/04_make_figures.py default tier reproduced; fig_decomp = sequential vs Shapley; fig_nonlinear adds spline segments
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]
paper/main.tex v1.3, October 2026, subtitle N, abstract, keywords (8), multirow, appendix, float parameters, \clearpage before bibliography, appendix input
paper/sections/*.tex all eight sections rewritten (see §3)
paper/appendix/appendix.tex new (variable construction; Moran sensitivity; reconciliation v1.2 ↔ v1.3)
paper/references.bib 64 → 91 entries (§4)
README.md Status, TL;DR, headline table, pipeline, tiers, inventory, limitations, citation, notes

# 3. Major corrections (where · before · after · why · evidence)

# Where Before (v1.2) After (v1.3) Why / evidence
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
2 Data §3.2 province = scraper seed province = FSA letter; 27 territory/invalid records dropped §1
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)
4 Data "nine provinces" with NB absent from tables NB 2,980 listings (was hidden under "QC") cross-tab
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
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
23 Throughout "list price" / "price" interchangeably "asking price" / "implicit list price" consistently; limitation (i) expanded with mechanisms master prompt priority

# 4. References added (29) — verification source

Crossref REST API works?query.bibliographic= on 2026-10-17 unless noted; DOI recorded in .bib.

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).

Removed: cmhc2018canadian (unverifiable), gabaix2016power (uncited). 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.

# 5. Re-analyses executed

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.

# 6. Items for the author's attention

  1. Title N on SSRN (7626678): v1.2 says 140,931; v1.3 says 142,121 — upload v1.3 and update the title there.
  2. The repository's .gitignore excludes data/processed/*.parquet but the file is tracked (6 MB) — intentional for reproducibility; left as is.
  3. The scraper seed is retained as prov_seed in the parquet for audit only; it is not used anywhere.
  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.

# 7. Not modified for lack of data

Transaction prices, time on market, age/renovation/quality fields, finer-than-FSA geography, amenity data for premium decomposition, additional snapshots for dynamics.

Files · main
Menu

Theme