% ============================================================================ \section{Methodology} \label{sec:methodology} % ============================================================================ Our empirical strategy has two parts: a feature-engineering pipeline that turns raw listings into an analysis-ready design matrix (Sections~\ref{subsec:structural}--% \ref{subsec:vision}), and a hedonic regression that maps those features to price (Section~\ref{subsec:econometrics}). \subsection{Theoretical Framework} \label{subsec:theory} Following \citet{rosen1974hedonic}, a house is a bundle of $K$ characteristics $\mathbf{z}=(z_1,\dots,z_K)$, and the market clears through a hedonic price function $P(\mathbf{z})$ that equates the marginal bid of buyers to the marginal offer of sellers. A buyer with income $y$ and preferences $U(\mathbf{x},\mathbf{z})$ over a numéraire good $\mathbf{x}$ and housing attributes chooses $\mathbf{z}$ to solve % \begin{equation} \max_{\mathbf{x},\,\mathbf{z}}\; U(\mathbf{x},\mathbf{z}) \quad\text{s.t.}\quad y = \mathbf{x} + P(\mathbf{z}), \label{eq:consumer} \end{equation} % which yields the first-order condition that, at the optimum, the implicit (\emph{marginal}) price of each attribute equals the buyer's marginal willingness to pay: % \begin{equation} p_k(\mathbf{z}) \;\equiv\; \frac{\partial P(\mathbf{z})}{\partial z_k} \;=\; \frac{\partial U/\partial z_k}{\partial U/\partial x}, \qquad k = 1,\dots,K. \label{eq:implicit} \end{equation} % Equation~\eqref{eq:implicit} is the object of interest: the slope of the hedonic surface in the direction of attribute~$z_k$. The empirical task is to recover $P(\mathbf{z})$---and hence its gradient---from observed prices and characteristics. The linear model of Section~\ref{subsec:econometrics} imposes a parametric form on $P(\cdot)$ and reads the implicit prices off its coefficients; the machine-learning estimators of Section~\ref{sec:benchmark} approximate $P(\cdot)$ nonparametrically, trading the closed-form gradient for predictive flexibility. \subsection{Structural and Locational Attributes} \label{subsec:structural} Structural attributes are extracted by deterministic rules. Living area and lot area are reported in heterogeneous units (\texttt{"1535 sqft"}, \texttt{"1,333.2 ft²"}, \texttt{"11 561.52 ft²"}, \texttt{"961.6 m2"}); we parse each string and convert all areas to square feet. For Realtor.ca listings that report room-by-room dimensions (e.g.\ \texttt{"23 ft ,4 in x 13 ft ,8 in"}) but no aggregate living area, we sum the parsed room areas and calibrate the total against listings where both are observed; the median ratio of reported area to summed-room area is~0.98, so the reconstructed value is used directly to fill missing living area. Age is computed as $2026-\text{year built}$, entered together with its square to allow a non-monotone depreciation profile. Bedrooms, bathrooms, parking spaces, and storeys are taken from the attribute block. Missing values are imputed by the within-property-type median, and each imputed field is accompanied by a ``\texttt{has\_}'' indicator so that the regression can distinguish observed from imputed values. Location is captured by \textbf{municipality fixed effects}. City names are normalized (Realtor.ca appends neighborhood qualifiers in parentheses, which we strip), and municipalities with fewer than 20 listings are pooled into a residual category, leaving 195 city effects. Property-type fixed effects and a source indicator complete the locational and platform controls. \subsection{Rule-Based Amenities and Room Detail} \label{subsec:amenities} Seventeen amenity indicators are detected by bilingual (French/English) keyword matching over the concatenated feature list, description, and title: swimming pool, waterfront, garage, fireplace, central air conditioning or heat pump, finished basement, cul-de-sac, proximity to a golf course, ski hill, park, school, highway, and public transit, among others. From the Realtor.ca room block we additionally construct room-detail indicators---presence of a primary bedroom, a basement, an office, a family room, a workshop, a wine cellar, a sunroom, a mezzanine, a library, and a laundry room---together with the room and storey counts. Two listing-quality signals, the number of photographs (capped at~60) and the presence of a virtual tour, proxy for the marketing tier of the listing. \subsection{Language-Model Specifications from Text} \label{subsec:llm} Free-text descriptions contain valuation-relevant information that resists keyword extraction: whether the home is turnkey or a fixer-upper, whether the kitchen or bathroom has been renovated, the flooring and countertop materials, the heating system, the presence of a water view, and income potential. We extract these as a fixed set of structured specifications using a large language model (\texttt{gpt-4o-mini}) with \emph{schema-constrained decoding}: the request specifies a strict JSON schema with closed enumerations and required fields, so the API validates the output at generation time and the model returns exactly the expected fields in the expected value domains. Decoding temperature is set to zero for determinism, and the system instruction constrains the model to report only what the text supports, coding absent information as \texttt{false}/\texttt{unknown}/empty. Each call consumes roughly 600 input and 110 output tokens; the extraction is run in parallel, is resumable through an on-disk cache keyed by the listing identifier, and retries transient errors with exponential backoff, for a total cost of about \$3 across the sample. \subsection{Vision Attributes from the Façade Photograph} \label{subsec:vision} To capture the visual quality that neither structured fields nor text convey, we analyze one photograph per listing---the façade---with a vision--language model (\texttt{claude-haiku-4-5}). For Realtor.ca the first image is the exterior shot; for DuProprio, whose images are captioned, we select the image whose caption is the address rather than a room. The model returns twelve objective attributes under a strict JSON schema: an overall condition score (1--10), a curb-appeal score (1--10), a renovation level, exterior materials, landscaping quality, visible garage, storeys, setting (urban/suburban/rural/waterfront/wooded), a luxury indicator, and photo quality. The system instruction directs the model to ground each score in concrete, reproducible criteria (surface condition, materials, landscaping) rather than subjective taste, and to flag non-exterior images. Images are passed by URL without local download; each call consumes roughly 2{,}470 input and 100 output tokens, for a total cost of about \$57 across the sample. As with the text layer, the pass is parallelized, resumable, and retried. \paragraph{Why schema-constrained decoding matters.} Imposing a typed schema with enumerations, required fields, and \texttt{additionalProperties:false} moves validation into the API layer. The models are forced to emit exactly the expected fields within the expected value domains, so their outputs behave as ordinary tabulated variables---reproducible and free of free-text post-processing. The outputs are then mapped to numeric regressors: booleans to $0/1$, the ordinal condition scale to $0$--$5$, materials to indicator variables, and so on, each with an availability flag. \subsection{Econometric Specification} \label{subsec:econometrics} We adopt a semi-logarithmic functional form, the standard workhorse in the hedonic literature \citep{malpezzi2003hedonic}. Collect the attributes of listing~$i$ into disjoint blocks, % \begin{equation} \resizebox{.94\textwidth}{!}{$\displaystyle \mathbf{X}_i = \big(\underbrace{\ln\text{Area}_i,\ \ln\text{Lot}_i}_{\text{size (logged)}},\ \underbrace{\mathbf{s}_i}_{\text{structural}},\ \underbrace{\mathbf{a}_i}_{\text{amenities}},\ \underbrace{\mathbf{r}_i}_{\text{rooms}},\ \underbrace{\mathbf{m}_i}_{\text{listing}},\ \underbrace{\mathbf{g}_i}_{\text{LLM text}},\ \underbrace{\mathbf{v}_i}_{\text{vision}}\big) $} \label{eq:blocks} \end{equation} % and estimate, by ordinary least squares, % \begin{equation} \ln P_i \;=\; \alpha \;+\; \beta\,\ln\text{Area}_i \;+\; \gamma\,\ln\text{Lot}_i \;+\; \mathbf{X}_i^{\!\top}\bm{\delta} \;+\; \underbrace{\mu_{c(i)}}_{\text{city FE}} \;+\; \underbrace{\tau_{t(i)}}_{\text{type FE}} \;+\; \varepsilon_i , \label{eq:hedonic} \end{equation} % where $c(i)$ and $t(i)$ index the municipality and property type of listing~$i$, and $\mu_c$, $\tau_t$ are the corresponding fixed effects that sweep out location- and type-specific price levels. In matrix form $\mathbf{y}=\mathbf{Z}\bm{\theta}+\bm{\varepsilon}$ with $\widehat{\bm{\theta}}=(\mathbf{Z}^{\!\top}\mathbf{Z})^{-1}\mathbf{Z}^{\!\top}\mathbf{y}$. \paragraph{Interpretation of the coefficients.} Because the size variables enter in logs, $\beta$ and $\gamma$ are \emph{elasticities}: $\partial \ln P/\partial \ln\text{Area}=\beta$. For an indicator regressor $d$ with coefficient $b$, the exact percentage price effect is not $b$ but % \begin{equation} \%\Delta P \;=\; \big(e^{\,b}-1\big)\times 100, \label{eq:halvorsen} \end{equation} % the \citet{halvorsen1980interpretation} correction we apply throughout (for small $b$, $e^{b}-1\approx b$). Under Equation~\eqref{eq:hedonic} the implicit price of a continuous attribute $z_k$ from \eqref{eq:implicit} is $p_k=\delta_k\,P/z_k$, so the semi-log form lets the \emph{dollar} marginal price scale with the price level while keeping the \emph{percentage} effect constant. \paragraph{Two-part coverage design.} Because living area is reported for only about 38\% of Realtor.ca listings, we estimate two nested versions of \eqref{eq:hedonic} and combine their predictions: % \begin{equation} \widehat{\ln P}_i = \begin{cases} \widehat{\ln P}_i^{\,A} & \text{if area is measured (Model A, rich),}\\[2pt] \widehat{\ln P}_i^{\,B} & \text{otherwise (Model B, broad; }\beta\equiv 0). \end{cases} \label{eq:twopart} \end{equation} % Model~A includes $\ln\text{Area}$ and is fit on the measured-area subsample; Model~B drops it and is fit on the full cleaned sample, so every listing can be priced. \paragraph{Inference.} House-price residuals are strongly heteroskedastic, and listings within a municipality share unobserved local shocks that induce within-cluster error correlation. Our preferred standard errors are therefore clustered at the municipality level (195 clusters), the same level as the fixed effects \citep{cameron2015cluster}: % \begin{equation} \widehat{\mathrm{Var}}_{\text{CL}}(\widehat{\bm{\theta}}) = (\mathbf{Z}^{\!\top}\mathbf{Z})^{-1} \Bigg(\sum_{c=1}^{C} \mathbf{Z}_c^{\!\top}\hat{\bm{\varepsilon}}_c \hat{\bm{\varepsilon}}_c^{\!\top}\mathbf{Z}_c\Bigg) (\mathbf{Z}^{\!\top}\mathbf{Z})^{-1}, \label{eq:cluster} \end{equation} % where $\mathbf{Z}_c$ and $\hat{\bm{\varepsilon}}_c$ stack the regressors and residuals of cluster $c$. As a complement we also compute heteroskedasticity-consistent (HC3) standard errors \citep{white1980heteroskedasticity,mackinnon1985some}, which inflate the contribution of high-leverage points; Section~\ref{subsec:robust} shows that the two choices agree on the significance of the property-level AI attributes and differ only for keyword amenities with a strong spatial component. \paragraph{Retransformation.} Predicting the \emph{level} of price requires undoing the log. Because $\mathbb{E}[P\mid\mathbf{Z}]=\exp(\mathbf{Z}\bm{\theta})\,\mathbb{E}[e^{\varepsilon}] \neq \exp(\mathbf{Z}\bm{\theta})$, naive exponentiation is biased downward. Under $\varepsilon\sim\mathcal N(0,\sigma^2)$ we use the closed-form correction, and more generally Duan's nonparametric smearing estimate \citep{duan1983smearing}: % \begin{equation} \widehat{P}_i = \exp\!\big(\widehat{\ln P}_i\big)\cdot \underbrace{\exp\!\big(\tfrac12\hat\sigma^{2}\big)}_{\text{normal}} \qquad\text{or}\qquad \widehat{P}_i = \exp\!\big(\widehat{\ln P}_i\big)\cdot \underbrace{\frac1n\sum_{j=1}^{n} e^{\hat\varepsilon_j}}_{\text{smearing }\hat\phi}. \label{eq:smearing} \end{equation}