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