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