⚖️ The Assessment Gap in Quebec
UQO Working Paper No. 10 — Vertical and Horizontal Inequity in Municipal Property Valuation: Evidence from 522,769 Sales Matched to the Assessment Roll
TL;DR — Matching 522,769 Quebec residential sales (2021–2026) to the triennial assessment rolls that tax them, this paper delivers the first province-wide ratio study of assessment equity for a Canadian province. Its central finding is that the measured regressivity hinges on the treatment of extreme assessment ratios. Under a lenient 1/99 trim the within-market elasticity of the assessment ratio w.r.t. price is −0.34 (Cheng FE) and −0.08 under Clapp's rank IV, and 95% of municipalities fail the IAAO vertical-equity band. Under the IAAO outlier rule (1.5 × IQR within cell, 9% of sales, 53% of the bottom price decile) the elasticity is −0.09 (IV: −0.01, n.s.), the province-wide PRB is +0.02, the COD is 17, the ten largest cities post CODs of 9–12 and three quarters of municipalities comply. Proportionality holds across the upper 80% of each market's price distribution under either treatment. Invariant to the rule: condos are assessed proportionally, single-family/plex/old/land-heavy/small-market dwellings are (mildly) regressive, and within-municipality PRB widened in 2021–2022. The bottom decile overpays 6–65% depending on the treatment; the top decile underpays 3–5%.
📌 Status
| Item | Value |
|---|---|
| Version | 1.1 (October 2026) — revised 2026-10-17 by the editorial-board review (see docs/) |
| SSRN | not yet submitted |
| Journal | not yet submitted — target Regional Science and Urban Economics (fallback National Tax Journal); anonymous PDF in Recherche-UQO/_soumissions/revues/assessment-gap-quebec/ |
| Code & data | reproducible from scripts/ (see Quick start); raw parquet snapshot not redistributed |
📖 Table of contents
- Status
- What this paper does
- Headline results
- Repository layout
- Quick start
- The pipeline, step by step
- Data
- Methodology
- Figures & tables inventory
- Limitations
- Citation
- Author & contact
🎯 What this paper does
Quebec taxes every dwelling in proportion to its assessed value, redrawn on a triennial roll whose values must, by statute (art. 46 LFM), reflect market conditions at a single reference date. If assessments are regressive — cheap homes overvalued relative to expensive ones — the effective tax rate falls with wealth, silently. This project measures that gap at province scale:
ln AV_i = α_c(i) + β · ln SP_i + ε_i (c = municipality × roll × sale-year)- γ = β − 1 is the elasticity of the assessment ratio w.r.t. price (γ < 0 ⇒ regressive), identified within 2,884 market-timing cells;
- the Clapp (1990) rank IV purges the attenuation bias that pushes naïve ratio studies toward spurious regressivity;
- the full IAAO ratio-study battery (median ratio, COD, PRD, PRB) with bootstrap CIs is computed for every municipality with ≥ 100 usable sales;
- the Kochin–Parks reverse-regression bound and the Clapp first stage make the measurement-error problem explicit (Appendix A);
- every statistic is re-computed under five outlier-trimming rules (baseline 1/99 by vintage, 3 × IQR, 1.5 × IQR = IAAO Appendix B, 2.5/97.5 and 5/95 within cell);
- piecewise-linear and quantile profiles, subgroup elasticities (baseline and trimmed), horizontal-dispersion regressions and an intra-municipal tax-shift calculation under three sorting variables and two benchmarks complete the audit.
🏆 Headline results
| Object | Baseline (1/99 trim by vintage) | IAAO-trimmed (1.5 × IQR within cell) |
|---|---|---|
| Sales | 522,769 | 471,148 (9.2% dropped; 53% of bottom price decile) |
| Cheng elasticity, cell FE: γ = β − 1 | −0.344 (0.029) | −0.088 (0.013) |
| Clapp rank-IV γ | −0.083 (0.021) | −0.013 (0.009), n.s. |
| Kochin–Parks bracket [β_F, 1/β_R] | [0.656, 1.137] — contains 1 | — |
| Province-wide COD / PRD / PRB | 28.5 / 1.072 / −0.029 | 17.0 / 1.004 / +0.025 |
| Municipalities (≥100 sales): COD > 15 | 99% of 261 | 30% of 241 |
| Municipalities: PRB < −0.05 / < −0.10 | 95% / 84% | 24% / 5% |
| Piecewise β by within-market price quintile (Q1 … Q5) | 0.07, 0.89, 0.71, 1.00, 0.95 | Q1 0.87, Q5 0.95 |
| Quantile β(τ), τ = .10 → .90 (conditional ln AV) | 0.87 → 0.49 | — |
| Ten largest cities: COD / PRB | 16.9–30.5 / −0.39 to +0.07 | 9.2–12.3 / −0.056 to +0.027 |
| Within-municipality median PRB, 2021–22 vs 2024–26 | ≈ −0.2 every year (no gradient) | −0.04 vs ≈ 0 |
| Excess tax, bottom ↔ top decile (sorted on price, median) | +65% ↔ −5% | +6.6% ↔ −3.2% |
| Excess tax, sorted on IAAO blended proxy | +5.6% ↔ −0.2% | — |
Sub-group anatomy (baseline → trimmed γ_FE): condos −0.12 → 0.00; single-family −0.45 → −0.12; plex −0.49 → −0.12; land share > 0.4: −0.50 → −0.14; age > 60 y: −0.43 → −0.14; munis > 10k sales (8 clusters): −0.27 → −0.05. Montréal is the least regressive large city (γ_FE −0.18 → −0.03), not an exception.
🗂 Repository layout
wp10_uqo/
├── data/
│ ├── raw/ # matched sales–roll snapshot (see data/raw/README.md)
│ └── processed/ # analysis.parquet (built by step 01)
├── src/wp10/ # reusable package
│ ├── config.py # paths, thresholds, constants
│ ├── sample.py # sample construction & variable definitions
│ ├── iaao.py # COD / PRD / PRB + bootstrap CIs
│ ├── models.py # Cheng FE, Clapp IV, quantiles, horizontal, tax shift
│ └── plotstyle.py # journal-calibre matplotlib style (validated palette)
├── scripts/ # the pipeline, in order
│ ├── 01_build_sample.py
│ ├── 02_iaao_stats.py
│ ├── 03_estimate_regressions.py
│ ├── 04_make_figures.py
│ ├── 05_make_tables.py
│ └── 06_revision_analyses.py # bounds, trimming grid, spline, alt. tax shift (2026-10-17)
├── results/
│ ├── reproduced/ # every CSV the scripts emit (rev_*.csv from step 06)
│ └── tables/ # 18 LaTeX tables input by the paper
├── figures/ # 10 publication figures (PNG, 300 dpi)
├── docs/ # REVIEW-REPORT.md, CHANGELOG-REVISION.md, pre-revision PDF
└── paper/ # main.tex + sections/ + appendix/ + references.bib → main.pdf🚀 Quick start
cd wp10_uqo
python3 -m pip install -r requirements.txt
# place the parquet snapshot in data/raw/ (see data/raw/README.md), then:
python3 scripts/01_build_sample.py # 745,119 → 522,769 sales
python3 scripts/02_iaao_stats.py # IAAO diagnostics + bootstrap
python3 scripts/03_estimate_regressions.py # FE / IV / quantile / heterogeneity / tax shift
python3 scripts/04_make_figures.py # 10 figures
python3 scripts/06_revision_analyses.py # bounds, trimming grid, spline, tax-shift variants (~40 s)
python3 scripts/05_make_tables.py # 18 LaTeX tables
cd paper && make # compile main.pdf (latexmk)Total runtime ≈ 6 minutes on an Apple-silicon laptop; peak RAM ≈ 6 GB.
🗃 Data
745,119 residential-market transactions (Jan 2021 – Jul 2026) matched at the parcel level to the assessment roll in force at the sale date (median match distance 0.6 m; every retained sale reproduces the roll value exactly). From the roll: total/land/building assessed values, lot & floor areas, year built, unit count, CUBF use code, roll vintage and the statutory market-condition date. Sample cascade (details in the paper, §4): residential CUBF → match quality → valid AV/SP → 1/99% ratio trim within roll vintage → cells ≥ 20 sales ⇒ 522,769 sales, 625 municipalities, 2,884 cells.
🔬 Methodology
- IAAO diagnostics (Standard on Ratio Studies, 2013) within
municipality × sale-year blocks, aggregated by median — COD, PRD, PRB with
percentile-bootstrap CIs (
src/wp10/iaao.py). - Cheng (1974) log-log regression with 2,884 absorbed fixed effects
(linearmodels
AbsorbingLS), SEs clustered on 625 municipalities. - Clapp (1990) rank IV — Z ∈ {−1,0,+1} from within-cell rank agreement of
ln AV and ln SP, 2SLS on demeaned data (
IV2SLS) — the conservative bound. - Quantile regressions on within-cell demeaned data (τ = .10….90).
- Heterogeneity: separate FE estimates by class, age, land share, roll lag, municipality size, sale year.
- Horizontal inequity: |ln r − cell median| regressed on characteristics.
- Tax shift: r / benchmark − 1 by within-cell decile of a sorting variable (sale price, IAAO blended proxy, assessed value), cell-median or revenue-neutral aggregate benchmark — statutory incidence under the residual-category rate.
- Revision analyses (
scripts/06_revision_analyses.py): Kochin–Parks reverse bound and implied noise shares, Clapp first stage, piecewise-linear (Sunderman) profile, five outlier rules × full battery, trimmed heterogeneity and city diagnostics, PRB by lag band/year within municipalities, time-adjusted CODs.
🖼 Figures & tables inventory
| Figure | Content |
|---|---|
fig_ratio_dist |
ratio distribution + by roll lag (Panels A/B) |
fig_time |
median ratio by month × roll vintage (staleness drift) |
fig_binscatter |
within-cell ln ratio vs ln price, 20 bins — the core fact |
fig_quantile |
β(τ) profile with FE/IV benchmarks |
fig_heterogeneity |
forest plot of subgroup γ |
fig_prb_muni, fig_cod |
municipal PRB / COD distributions vs IAAO bands |
fig_map |
province map of municipal PRB (Montréal exception) |
fig_taxshift |
excess tax burden by local price decile |
fig_robustness |
γ_FE vs γ_IV across 10 sample variants |
Tables (results/tables/*.tex): summary stats, IAAO province-wide, ten largest
markets, vertical regressions, quantiles, heterogeneity, horizontal, tax shift,
robustness, Paglin–Fogarty, plus the revision tables rev_trim_grid, rev_spline,
rev_taxshift_alt, rev_het_trimmed, rev_cities, rev_cod, rev_prb_blocks,
rev_bounds (Appendix A). Figures are drawn on the baseline sample; the trimmed
counterparts are tabulated.
⚠️ Limitations
- No arm's-length flag in Quebec transaction records: 9% of sales have ratios the IAAO rule classifies as outliers, concentrated in the bottom price decile; whether they are over-assessed dwellings or nominal transfers cannot be settled, so results are reported as bounds (baseline = upper bound, IAAO-trimmed = lower bound).
- Sales < $50k absent from the source registry.
- 2021–2026 is an unusually turbulent market — level statistics are period-specific.
- No appeals, renovations, owner demographics or phase-in (étalement) resolutions observed; tax-shift figures are statutory, not economic, incidence.
- Cluster-robust SEs rest on 8 clusters for the >10k-sales band and on one municipality (HC-robust) for the city-level estimates.
📝 Citation
@techreport{boucher2026assessmentgap,
author = {Boucher, Simon-Pierre},
title = {The Assessment Gap in Quebec: Vertical and Horizontal Inequity
in Municipal Property Valuation},
institution = {Universit\'e du Qu\'ebec en Outaouais,
D\'epartement des sciences administratives},
type = {Working Paper},
number = {10},
year = {2026},
month = {October},
note = {Version 1.1}
}👤 Author & contact
Simon-Pierre Boucher — Département des sciences administratives, Université du Québec en Outaouais (UQO), Gatineau, QC. 📧 simon-pierre.boucher@uqo.ca
🗒 Notes
- Numbering: UQO Working Paper No. 10. (A June 2026 VQuant methodology paper also carried the label "WP 10"; it is now WP 13.)
- Cover page, metadata and layout follow
Recherche-UQO/HARMONISATION.md(2026-10-17). - Scientific revision 2026-10-17 (v1.0 → v1.1): editorial-board review report in
docs/REVIEW-REPORT.md, audit trail indocs/CHANGELOG-REVISION.md; pre-revision PDF preserved asdocs/main_pre-revision-20261017.pdf(git tagpre-revision-20261017). Headline conclusions changed: regressivity is now reported as bounds that depend on the outlier rule; the "Montréal exception" and the "staleness doubles inequity" claims of v1.0 were withdrawn after re-analysis. - Figures are read by the paper from
figures/(notpaper/figures/), a deviation from the standard layout kept to avoid duplicating 10 PNG files.