WP23: protocol, data/evaluation modules, Task A/B models and runners, simulation, draft sections
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
56 changed files +7,489 −0
added
.gitignore
+44 −0
@@ -0,0 +1,44 @@ | ||
| 1 | +# Raw & processed data — never committed (see data/raw/README.md for provenance) | |
| 2 | +data/raw/* | |
| 3 | +!data/raw/README.md | |
| 4 | +data/processed/* | |
| 5 | +!data/processed/.gitkeep | |
| 6 | + | |
| 7 | +# Python | |
| 8 | +__pycache__/ | |
| 9 | +*.pyc | |
| 10 | +.pytest_cache/ | |
| 11 | +.venv/ | |
| 12 | +*.egg-info/ | |
| 13 | + | |
| 14 | +# LaTeX build artifacts (paper/main.pdf IS committed) | |
| 15 | +paper/*.aux | |
| 16 | +paper/*.log | |
| 17 | +paper/*.out | |
| 18 | +paper/*.toc | |
| 19 | +paper/*.lof | |
| 20 | +paper/*.lot | |
| 21 | +paper/*.fls | |
| 22 | +paper/*.fdb_latexmk | |
| 23 | +paper/*.bbl | |
| 24 | +paper/*.blg | |
| 25 | +paper/*.spl | |
| 26 | +paper/*.synctex.gz | |
| 27 | +paper/*.run.xml | |
| 28 | +paper/*.bcf | |
| 29 | + | |
| 30 | +# Logs | |
| 31 | +logs/ | |
| 32 | +*.log | |
| 33 | + | |
| 34 | +# macOS | |
| 35 | +.DS_Store | |
| 36 | +data/processed/* | |
| 37 | +!data/processed/.gitkeep | |
| 38 | +logs/ | |
| 39 | +*.log | |
| 40 | +results/task_a/predictions_*.parquet | |
| 41 | +results/task_a/targets_*.parquet | |
| 42 | +results/simulation/panel_*.parquet | |
| 43 | +results/simulation/predictions_*.parquet | |
| 44 | +paper/tables/numbers_missing.tex | |
added
CLAUDE.md
+43 −0
@@ -0,0 +1,43 @@ | ||
| 1 | +# CLAUDE.md — WP23: Next-Generation Real Estate Price Forecasting | |
| 2 | + | |
| 3 | +> Protocol as received on 2026-10-21 (the pasted text ended at section 17 "11. Prob"; sections 17–end were completed from the UQO working-paper conventions, see docs/PLAN.md). WP22 (`../sharp-hpi-quebec`) is read-only for this project. | |
| 4 | + | |
| 5 | +## Research Program: WP23 — UQO Working Paper Series | |
| 6 | + | |
| 7 | +**Proposed title:** *Beyond Hedonic Models: Novel Spatiotemporal, Hierarchical and Probabilistic Architectures for Residential Real Estate Price Forecasting* | |
| 8 | +**Alternative title:** *Forecasting Housing Markets with Transaction-Level Data: New Machine Learning Architectures, Spatial Dependence and Dynamic Market Signals* | |
| 9 | +**Paper number:** WP23 · **Language:** English · **Output:** complete academic LaTeX manuscript, reproducible Python research pipeline, original forecasting models, empirical results, tables, figures and supplementary material. | |
| 10 | + | |
| 11 | +# 1. MISSION | |
| 12 | +Autonomous interdisciplinary research team (real estate economist, forecasting econometrician, ML architect, spatial econometrician, Bayesian statistician, time-series specialist, research engineer, scientific software developer, methodological referee). Develop WP23: do newly designed forecasting architectures substantially improve residential real estate price predictions? Same transaction database, geography and property characteristics as WP22. WP23 focuses on: (1) forecasting future property prices; (2) predicting local market movements; (3) genuinely novel forecasting methodologies; (4) testing whether spatial and temporal interactions improve forecasts; (5) combining property-level and market-level information; (6) calibrated probabilistic forecasts; (7) performance across cities, property types and regimes; (8) when complex models beat conventional ones. Prioritise originality, validity, performance, reproducibility. Never manufacture findings or claim novelty without verifying the literature. | |
| 13 | + | |
| 14 | +# 2. DATA: REUSE THE WP22 INFRASTRUCTURE | |
| 15 | +2.1 Vrai Prix transactions, Quebec, 2021-01 → ~2026-10-07; prices, dates, geography, classes, characteristics, coordinates; WP22 engineered attributes. Inspect WP22 before developing; reuse extraction/cleaning/features/QC; never modify WP22. | |
| 16 | +2.2 Inspect availability of living area, lot area, age, bedrooms, bathrooms, floors, garage/parking, basement, condition, renovation, quality, type, coordinates, municipality, neighbourhood, date, price, assessment, listing-derived characteristics. Never assume a variable exists. | |
| 17 | +2.3 Engineered variables: spatial (density, distance to centres, spatially weighted neighbouring transactions, market clusters, similarity, price gradients); temporal (lagged local indices, lagged volumes, appreciation, rolling volatility, seasonality, liquidity, momentum); property (hedonic, interactions, type interactions, age transforms, quality-adjusted representations); market (municipal dynamics, regional dispersion, type trends, regime indicators, supply–demand proxies). Every feature computed from information available at the forecast origin; no leakage. | |
| 18 | + | |
| 19 | +# 3. FORECASTING PROBLEM | |
| 20 | +Task A — future transaction price: P(i,t+h) = f(X(i,t), S(i,t), M(t), h); address transaction selection explicitly. | |
| 21 | +Task B — quality-adjusted market price forecasting: WP22 indices where compatible with real-time forecasting; horizons 1, 3, 6, 12 months; targets = municipal, regional, type-specific indices, monthly growth, cumulative appreciation. | |
| 22 | +Task C — probabilistic forecasting: predictive distributions (mean, median, intervals, quantiles, downside risk, P(decline), P(appreciation > thresholds)); distinguish estimation, transaction-noise, market-dynamics and macro uncertainty. | |
| 23 | + | |
| 24 | +# 4. ORIGINAL ARCHITECTURES (≥ 5 candidates; literature search first; refine to a defensible contribution) | |
| 25 | +Model 1 HSHN — hierarchical spatiotemporal hedonic network: log P_it = fθ(X_it, Z_mt, G_m, h) + ε; hierarchical parameter sharing; compare full / partial / municipality-specific pooling. | |
| 26 | +Model 2 DSGFN — dynamic spatial graph forecasting network: nodes = municipalities/submarkets; edges = proximity, co-movement, market similarity, composition similarity, spillovers; graph attention, temporal convolution, adaptive weights; test against SAR / spatial-lag forecasting. | |
| 27 | +Model 3 RAREF — regime-adaptive forecasting: HMM, Bayesian regime switching, mixture of experts, gated architectures; regimes from information available at the origin only. | |
| 28 | +Model 4 BHPF — Bayesian hierarchical probabilistic forecasting: hierarchical Bayes, hedonic information, dynamic local factors, spatial partial pooling, time-varying parameters; VI / Laplace / HMC on subsets; calibration, coverage, uncertainty decomposition. | |
| 29 | +Model 5 QANSS — quality-adjusted neural state-space: price = quality + latent market + noise; neural hedonic representation + Kalman / nonlinear transitions + municipal latent factors; compare with the WP22 index forecasting framework. | |
| 30 | +# 5. SIXTH MODEL — QREFA integrated architecture (hedonic encoder, spatial graph encoder, temporal state-space, hierarchical effects, regime head, probabilistic layer); keep only components with incremental out-of-sample value; ablations. | |
| 31 | +# 6. BENCHMARKS — econometric (hedonic OLS, ridge/EN, SAR, ARIMA/SARIMA/ARIMAX, VAR/BVAR, DFM, local linear trend, state space), ML (RF, XGBoost, LightGBM, CatBoost, SVR, MLP), deep (LSTM, GRU, TCN, TFT, modern TS), simple (random walk, no change, mean growth, seasonal naive, momentum); fair common origins/information sets; no over-complex benchmarks the data cannot estimate. | |
| 32 | +# 7. EXPERIMENTAL DESIGN — strict pseudo-real-time expanding/rolling windows; for each origin: information set → estimate → forecast → store → compare. Never random splits. Short 2021–2026 sample: every 12-month evaluation origin must have an observed target; no late-2026 12-month evaluations. Prevent leakage from WP22: reconstruct index vintages from transactions observable at the origin; audit hedonics, clustering, normalisation, feature selection, imputation, target encoding, graph estimation, tuning, revisions. | |
| 33 | +# 8. EVALUATION — MAE, RMSE, MedAE, RMSLE, MASE, bias; CRPS, pinball, coverage, WIS, calibration; Diebold–Mariano, Giacomini–White, Model Confidence Set, block bootstrap, multiple-testing adjustment; overlapping horizons, spatial and serial dependence; significance and economic magnitude. | |
| 34 | +# 9. HETEROGENEITY — by municipality, region, urban/rural, volume, type, price segment, horizon, volatility, liquidity, connectivity; no granular results for inadequate cells. | |
| 35 | +# 10. ECONOMIC INTERPRETATION — spillovers, momentum persistence, characteristics vs market forecasts, regimes, pooling in small municipalities, uncertainty in low-volume periods, quality-adjusted vs median targets, turning points; predictive importance ≠ causality. | |
| 36 | +# 11. INTERPRETABILITY — SHAP, ALE, PDP, importance stability, spatial attention, temporal attribution, counterfactual sensitivity; stability over time. | |
| 37 | +# 12. ABLATION AND ROBUSTNESS — remove spatial, characteristics, market variables, temporal representations, pooling, regime adaptation, probabilistic layers; robustness to aggregation, horizons, outliers, low-volume cells, windows, adjacency, training periods, transformations, missing characteristics, selection, seeds; uncertainty around all comparisons. | |
| 38 | +# 13. LITERATURE REVIEW — hedonic, repeat sales, index forecasting, spatial econometrics, housing forecasting, ML valuation, deep learning, GNNs, hierarchical forecasting, probabilistic forecasting, Bayesian state space, regime switching, forecast combination, neural spatiotemporal models; verify every reference; classify contributions (existing / adapted / new combination / original). | |
| 39 | +# 14. SIMULATION STUDY — synthetic markets (heterogeneous characteristics, spatial dependence, trends, municipal factors, selection, regimes, sparsity, nonlinear dynamics); recovery of signals; when methods succeed or fail; explain mechanisms. | |
| 40 | +# 15. FIGURES — coverage map, density, regional dynamics, architecture diagrams, performance by horizon, spatial error maps, actual vs predicted, calibration, regime accuracy, ablations, MCS, uncertainty bands, municipal performance distributions, error evolution; vector; reproducible. | |
| 41 | +# 16. TABLES — coverage/descriptives, variables, targets, specifications, benchmarks, point and probabilistic accuracy, comparison tests, geographic and type heterogeneity, ablations, robustness, computational cost, simulation; observation counts; estimated vs simulated. | |
| 42 | +# 17. LATEX MANUSCRIPT — professional academic English; sections: 1 Introduction; 2 Related literature; 3 Data and institutional context; 4 Forecasting targets and information sets; 5 Proposed architectures; 6 Benchmarks; 7 Simulation design and results; 8 Empirical forecasting framework; 9 Main results; 10 Spatial and regional heterogeneity; 11 Probabilistic forecasting and calibration; 12 Interpretation and economic mechanisms; 13 Ablations and robustness; 14 Limitations; 15 Conclusion; appendices (architectures, hyper-parameters, tests, supplementary tables). [Sections 11–15 and the remainder of the protocol were reconstructed by the author's assistant because the pasted protocol was truncated.] | |
| 43 | +# 18. QUALITY GATE — reproducible figures/tables, verified references, leakage audit passed, strict chronology, uncertainty reported, honest novelty statement, manuscript compiles. | |
added
data/processed/.gitkeep
+0 −0
added
docs/PLAN.md
+25 −0
@@ -0,0 +1,25 @@ | ||
| 1 | +<!-- Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca --> | |
| 2 | +# WP23 — plan (2026-10-21) | |
| 3 | + | |
| 4 | +## Inputs (WP22, read-only) | |
| 5 | +- `analytic_transactions.parquet` (632,006 headline sales, roll characteristics, coordinates, nested grid cells, classes). | |
| 6 | +- `index_panel.parquet` (retrospective SHARP-HPI, 2,696 cells × 69 months) — used only as the *target* (final estimate of the quality-adjusted market movement), never as a predictor. | |
| 7 | +- `index_vintages.parquet` (real-time SHARP-HPI at each monthly publication date, province / regions / municipalities ≥ 1,500 sales, filtered and smoothed modes) — the only admissible index *predictors* at an origin. | |
| 8 | +- SDA boundaries and municipal centroids (graph construction), external indices (not used as predictors: current-vintage). | |
| 9 | + | |
| 10 | +## Variables actually available (WP22 data dictionary) | |
| 11 | +Floor area, lot area, year built / age, storeys, building genre, physical link / subtype, number of units (plex), coordinates, municipality / MRC / region, assessment at sale (used only as a feature for Task A with care: it is in force at the sale date and known before the sale). **Not available:** bedrooms, bathrooms, parking, basement, condition, renovations, quality grade, listing attributes. | |
| 12 | + | |
| 13 | +## Tasks | |
| 14 | +- **A** property-level price at sale: origin = month o; train on sales dated ≤ o (features at origin: hedonic + municipal real-time index level/momentum/volume at o + spatial neighbours' past prices ≤ o); test on sales in months o+1…o+h grouped by horizon. Selection: sold-property population only; selection documented via comparison of sold vs stock characteristics (roll) and a Heckman-style diagnostic where feasible. | |
| 15 | +- **B** quality-adjusted index growth: cell × origin × horizon; target = final smoothed log index change over h; predictors from the vintage at o. | |
| 16 | +- **C** probabilistic versions of A and B (quantile / distributional heads, Bayesian posterior predictive, conformal calibration on past origins only). | |
| 17 | + | |
| 18 | +## Architectures (torch 2.12 available; PyMC/JAX/catboost/hmmlearn absent → own implementations) | |
| 19 | +HSHN (embedding-based hierarchical MLP with partial pooling by shrinkage of municipality embeddings to MRC/region), DSGFN (graph attention over municipality graph with distance + co-movement + composition edges, temporal convolution), RAREF (Gaussian-HMM regimes on province/region growth estimated at origin + gated mixture of experts), BHPF (hierarchical Bayesian linear-Gaussian model with conjugate/Laplace posteriors; posterior predictive), QANSS (neural hedonic encoder + per-cell Kalman latent market state with learned transition), QREFA (integration with ablations). Benchmarks: naive family, AR/ARIMA/local linear trend, VAR/BVAR (small, regions), DFM (PCA factors), hedonic OLS/ridge/EN, SAR-lag, RF, XGBoost, LightGBM, SVR (subsample), MLP, LSTM/GRU/TCN/TFT-lite. | |
| 20 | + | |
| 21 | +## Evaluation | |
| 22 | +Expanding window, monthly origins 2022-12 → 2025-09 (12-month targets must exist by 2026-09); metrics MAE/RMSE/MedAE/MASE/bias; CRPS/pinball/WIS/coverage; DM (HAC with h−1 lags), GW conditional test, MCS (bootstrap), moving-block bootstrap; heterogeneity by region/size/type/horizon/regime. | |
| 23 | + | |
| 24 | +## Phases | |
| 25 | +0 discovery & plan → 1 datasets & leakage audit → 2 benchmarks → 3 architectures → 4 simulation → 5 empirical runs → 6 tests/heterogeneity/interpretability/ablations → 7 manuscript. | |
added
docs/literature/novelty_scan.md
+178 −0
@@ -0,0 +1,178 @@ | ||
| 1 | +# Novelty scan: closest existing work for the six proposed WP23 architectures | |
| 2 | + | |
| 3 | +Scope: for each architecture in `CLAUDE.md` §4–5, the closest published predecessors (citation keys refer | |
| 4 | +to `paper/references.bib`; metadata verified 2026-10-21, see `references_verified.json`) and what would have | |
| 5 | +to be demonstrated for the proposal to be a contribution rather than a re-labelling. Descriptions rest on | |
| 6 | +verified titles and, where retrievable, on published abstracts (availability listed in `unverified.md` §C); | |
| 7 | +where only the title is available this is stated. No novelty is claimed here; the purpose is to delimit the | |
| 8 | +existing frontier so that the manuscript's "existing / adapted / new combination / original" classification | |
| 9 | +(§13 of the protocol) can be defended. | |
| 10 | + | |
| 11 | +--- | |
| 12 | + | |
| 13 | +## 1. HSHN — hierarchical spatiotemporal hedonic network | |
| 14 | + | |
| 15 | +**Closest work.** Hierarchical (partially pooled) price models are established in the index literature: | |
| 16 | +Francke & van de Minne (2017, `francke2017hierarchical`) estimate a hierarchical repeat-sales model in which | |
| 17 | +granular (municipal/segment) indices are shrunk towards a common trend, and Francke (2010, `francke2010thin`) | |
| 18 | +uses a structural time-series model for thin markets; the general machinery is Gelman & Hill (2007, | |
| 19 | +`gelmanhill2007`) and the small-area tradition (Fay & Herriot 1979, `fayherriot1979`). On the ML side, | |
| 20 | +Mayer et al. (2019, `mayer2019updating`; abstract) compare six estimators including mixed-effects | |
| 21 | +regression, random forests, gradient boosting and neural networks on 123,000 Swiss sales and two updating | |
| 22 | +schemes (moving vs. extending windows), finding boosting most accurate and robust regression least | |
| 23 | +volatile; Lorenz et al. (2023, `lorenz2023interpretable`; abstract) apply interpretable ML to hedonic rent | |
| 24 | +models; Deppner & Cajias (2024, `deppnercajias2024spatialcv`; abstract) show that random cross-validation | |
| 25 | +of ML hedonic models is biased by spatial dependence and propose spatial cross-validation; Pace & Hayunga | |
| 26 | +(2020, `pacehayunga2020residuals`; title only) test whether trees/forests extract information left in the | |
| 27 | +residuals of hedonic and spatial models. A neural hedonic model with explicit municipality-level sharing | |
| 28 | +exists in Zhang et al. (2021, `zhang2021mugrep`; abstract): MugRep builds community-level graphs and a | |
| 29 | +hierarchical, multi-task representation for appraisal. Sijp & Francke (2026, `sijpfrancke2026laplacian`; | |
| 30 | +abstract) model spatiotemporal random effects in hedonic and repeat-sales models through graph-Laplacian | |
| 31 | +priors (Bayesian or ridge), which is a parametric form of hierarchical spatiotemporal pooling. | |
| 32 | + | |
| 33 | +**What must be shown.** (i) That embedding the horizon *h* and the market state Z_mt in a single | |
| 34 | +property-level network forecasting *future* transaction prices (not contemporaneous valuation, which is what | |
| 35 | +Mayer, Lorenz, Deppner, MugRep do) yields out-of-sample gains in a strict pseudo-real-time design; (ii) that | |
| 36 | +the learned partial pooling beats the parametric alternatives it mimics — a mixed-effects hedonic model | |
| 37 | +(Mayer et al.), a hierarchical Bayesian hedonic model (Gelman & Hill) and graph-Laplacian regularisation | |
| 38 | +(Sijp & Francke) — especially in low-volume municipalities, which is the stated rationale; (iii) that the | |
| 39 | +comparison uses spatially/temporally blocked validation (Deppner & Cajias), otherwise the gain is not | |
| 40 | +credible. Without (ii) the architecture is an adaptation of known hierarchical hedonics to a neural | |
| 41 | +parameterisation. | |
| 42 | + | |
| 43 | +## 2. DSGFN — dynamic spatial graph forecasting network | |
| 44 | + | |
| 45 | +**Closest work.** The deep spatiotemporal graph models DSGFN would reuse are DCRNN (`li2018dcrnn`), STGCN | |
| 46 | +(`yu2018stgcn`), Graph WaveNet (`wu2019graphwavenet`, which learns an adaptive adjacency matrix) and AGCRN | |
| 47 | +(`bai2020agcrn`, node-adaptive parameters and data-driven graph), surveyed in `wu2021gnnsurvey`, | |
| 48 | +`jin2024urbanstgnn` and `jin2024tsgnnsurvey`. In housing economics, cross-regional spatial–temporal | |
| 49 | +dependence of prices is documented by Pace et al. (1998, 2000; `pace1998spatiotemporal`, | |
| 50 | +`pace2000spatiotemporal`, spatiotemporal autoregressions for forecasting), Holly, Pesaran & Yamagata | |
| 51 | +(2010, 2011; `hollypesaran2010`, `holly2011uk`, spatial diffusion of house prices with common factors) and | |
| 52 | +Brady (2011, `brady2011diffusion`, impulse responses of regional price diffusion). Regional index | |
| 53 | +forecasting with cross-sectional information is done by Rapach & Strauss (2009, `rapachstrauss2009`), | |
| 54 | +Gupta, Kabundi & Miller (2011, `gupta2011large`; abstract: factor-augmented VAR/BVAR and large BVAR for 20 | |
| 55 | +states), Bork & Møller (2015, `borkmoller2015`, dynamic model averaging across 50 states) and, most | |
| 56 | +directly, Yeo, Stitsyuk & Choi (2025, `yeo2025deepdfvar`; title only) who combine a dynamic-factor VAR with | |
| 57 | +deep learning for regional house price index forecasting. Property-level GNN valuation models that build | |
| 58 | +graphs from transactions or POIs exist (`viana2021attention`, `das2021gsne`, `bin2019peer`, | |
| 59 | +`yang2022gcnvaluation`, `guo2026heteroroadnet`), but they value houses cross-sectionally rather than | |
| 60 | +forecasting municipal index dynamics. | |
| 61 | + | |
| 62 | +**What must be shown.** (i) That an adaptive-graph ST model on monthly municipal/submarket nodes built from | |
| 63 | +transaction data beats the econometric spatial benchmarks that encode the same idea parametrically — a | |
| 64 | +spatial-lag/STAR forecasting model (Pace et al. 2000), a FAVAR/BVAR (Gupta et al. 2011; `banbura2010bvar`) | |
| 65 | +and a DFM-based model in the spirit of Yeo et al. (2025) — under Diebold–Mariano/Giacomini–White tests and | |
| 66 | +a model confidence set; (ii) that the learned edges carry information beyond contiguity/distance | |
| 67 | +(e.g. co-movement or composition similarity), demonstrated by ablating each edge type; (iii) that gains | |
| 68 | +survive the short 2021–2026 sample, because AGCRN/Graph WaveNet were developed for thousands of | |
| 69 | +high-frequency traffic observations per node. If (i) fails, DSGFN is an application of existing traffic | |
| 70 | +models to housing, which `jin2024urbanstgnn` already anticipates as a domain. | |
| 71 | + | |
| 72 | +## 3. RAREF — regime-adaptive mixture of experts | |
| 73 | + | |
| 74 | +**Closest work.** Regime switching in house price dynamics is standard: Hamilton (1989, `hamilton1989regime`) | |
| 75 | +and Kim & Nelson (1999, `kimnelson1999statespace`) provide Markov-switching (state-space) models; Capozza, | |
| 76 | +Hendershott & Mack (2004, `capozza2004anatomy`) show that serial correlation and mean reversion of | |
| 77 | +metropolitan prices vary with market conditions; Kouwenberg & Zwinkels (2014, `kouwenbergzwinkels2014`; | |
| 78 | +title only — known to use a heterogeneous-agent switching model) forecast the US market with time-varying | |
| 79 | +behavioural regimes; Plakandaras et al. (2015, `plakandaras2015forecasting`) forecast the US real house | |
| 80 | +price index around the crisis; Bork & Møller (2015) let model weights vary over time (dynamic model | |
| 81 | +averaging), which is a soft regime mechanism. Mixtures of experts with a gating network are Jacobs et al. | |
| 82 | +(1991, `jacobs1991moe`), Jordan & Jacobs (1994, `jordanjacobs1994hme`) and sparsely gated MoE (Shazeer et | |
| 83 | +al. 2017, `shazeer2017moe`); deep switching state-space models for forecasting exist in the time-series | |
| 84 | +literature (the DSSM line, `rangapuram2018dssm`). | |
| 85 | + | |
| 86 | +**What must be shown.** (i) That regimes are inferred only from information available at the forecast | |
| 87 | +origin (no look-ahead through full-sample smoothing), and that the gating reproduces economically | |
| 88 | +interpretable states (e.g. the 2022–2023 rate-driven slowdown in Quebec); (ii) that the gain is | |
| 89 | +concentrated around regime transitions and exceeds what a Markov-switching AR, a DMA scheme (Bork & | |
| 90 | +Møller) and a time-varying-parameter model deliver; (iii) that with roughly 60–70 monthly observations per | |
| 91 | +municipality the number of experts is small enough to be estimable, with robustness to seeds and to the | |
| 92 | +choice of regime proxies. Otherwise RAREF is a known MoE applied with housing covariates. | |
| 93 | + | |
| 94 | +## 4. BHPF — Bayesian hierarchical probabilistic forecasting | |
| 95 | + | |
| 96 | +**Closest work.** Hierarchical Bayesian pooling of local price indices and hedonic effects is already in | |
| 97 | +Francke & van de Minne (2017) and Francke et al. (2022/2025, `francke2022daily`, `francke2025censustract`), | |
| 98 | +with variance priors from Gelman (2006, `gelman2006prior`); small-area estimation (Fay & Herriot 1979; | |
| 99 | +Datta & Lahiri 2000, `dattalahiri2000`; Pfeffermann 2013, `pfeffermann2013sae`) is the statistical basis. | |
| 100 | +Computation would rely on NUTS (`hoffmangelman2014nuts`), variational inference (`blei2017vi`) or INLA | |
| 101 | +(`rue2009inla`); the evaluation toolkit is Gneiting & Raftery (2007, `gneitingraftery2007scoring`), | |
| 102 | +Gneiting, Balabdaoui & Raftery (2007, `gneiting2007calibration`), Gneiting & Katzfuss (2014, | |
| 103 | +`gneitingkatzfuss2014probabilistic`) and the weighted interval score (`bracher2021wis`). Probabilistic | |
| 104 | +deep forecasters that would be the ML comparators are DeepAR (`salinas2020deepar`), TFT (`lim2021tft`), | |
| 105 | +quantile-regression networks (`taylor2000quantilenn`) and conformalized quantile regression | |
| 106 | +(`romano2019cqr`, `vovk2005conformal`). Coherent probabilistic forecasts across a municipal→regional→ | |
| 107 | +provincial hierarchy are the subject of forecast reconciliation (`hyndman2011hierarchical`, | |
| 108 | +`wickramasuriya2019mint`, `athanasopoulos2024reconciliation`). The M5 uncertainty competition | |
| 109 | +(`makridakis2022m5uncertainty`) is the reference for evaluating quantile forecasts over a hierarchy. | |
| 110 | + | |
| 111 | +**What must be shown.** (i) Calibration and sharpness (PIT histograms, coverage of 50/80/95% intervals, | |
| 112 | +CRPS/WIS) in pseudo-real-time against DeepAR/TFT/CQR and against a reconciled (MinT) set of univariate | |
| 113 | +probabilistic forecasts — the latter is the natural null for "hierarchical" claims; (ii) a decomposition | |
| 114 | +of predictive variance into parameter, transaction-noise, market-dynamics and macro components that is | |
| 115 | +identified by the model rather than asserted; (iii) evidence that partial pooling improves calibration in | |
| 116 | +low-volume municipalities (where Francke & van de Minne already show gains for point indices). A Bayesian | |
| 117 | +hierarchical model that only reproduces (i) at the municipal level is an application of existing | |
| 118 | +small-area/hierarchical methods. | |
| 119 | + | |
| 120 | +## 5. QANSS — quality-adjusted neural state-space model | |
| 121 | + | |
| 122 | +**Closest work.** The decomposition "price = quality + latent market + noise" is exactly the hedonic | |
| 123 | +state-space / structural time-series index tradition: Francke (2010), Francke & van de Minne (2017), | |
| 124 | +Nagaraja, Brown & Zhao (2011, `nagaraja2011autoregressive`, autoregressive hedonic with a latent index), | |
| 125 | +Hwang & Quigley (2004, `hwangquigley2004`, selectivity, quality adjustment and mean reversion), Clapp & | |
| 126 | +Giaccotto (1992, `clappgiaccotto1992`), all built on Harvey (1989, `harvey1989`), Durbin & Koopman (2012, | |
| 127 | +`durbinkoopman2012`) and the Kalman filter (`kalman1960`). Neural state-space models in the forecasting | |
| 128 | +literature are the deep state-space model (Rangapuram et al. 2018, `rangapuram2018dssm`: an RNN emits | |
| 129 | +the parameters of a linear Gaussian state-space model per series), normalizing Kalman filters (de Bézenac | |
| 130 | +et al. 2020, `debezenac2020nkf`) and structured inference networks / deep Kalman filters (Krishnan, | |
| 131 | +Shalit & Sontag 2017, `krishnan2017dkf`). Sijp & Francke (2026) combine a hedonic model with | |
| 132 | +graph-Laplacian spatiotemporal effects, which is the parametric counterpart of a latent municipal factor | |
| 133 | +with spatial smoothing. | |
| 134 | + | |
| 135 | +**What must be shown.** (i) Identification: that the neural hedonic encoder and the latent market state | |
| 136 | +are separately identified (e.g. by constraining the encoder to be time-invariant within a window, or by | |
| 137 | +anchoring to repeat sales), otherwise "quality" absorbs market movements and the index is not | |
| 138 | +interpretable; (ii) that the latent-state forecasts beat the WP22 index forecasting benchmark (same | |
| 139 | +transactions, same vintages) and a Francke-type structural time-series model at horizons 1–12 months; | |
| 140 | +(iii) that the nonlinear transition (if any) adds value over the linear Kalman transition used by | |
| 141 | +Rangapuram et al. The "neural + Kalman" combination per se exists (DSSM); the contribution would be the | |
| 142 | +quality/market separation on transaction-level data and its forecasting value. | |
| 143 | + | |
| 144 | +## 6. QREFA — integrated architecture | |
| 145 | + | |
| 146 | +**Closest work.** Integrated multi-component architectures for real estate exist in the KDD/SIGSPATIAL | |
| 147 | +literature: MugRep (Zhang et al. 2021) combines a hedonic feature set, a transaction graph with | |
| 148 | +asynchronous spatiotemporal dependencies and a community-level graph in a multi-task hierarchical model; | |
| 149 | +HeteroRoadNet (Guo & vanden Broucke 2026; abstract) integrates roads, target locations and POIs in a | |
| 150 | +heterogeneous GNN; Viana & Barbosa (2021) use hybrid attention over neighbours. In time-series forecasting, | |
| 151 | +the Temporal Fusion Transformer (`lim2021tft`) already integrates static covariates, gating, variable | |
| 152 | +selection and quantile outputs, and Zeng et al. (2023, `zeng2023transformers`) and PatchTST | |
| 153 | +(`nie2023patchtst`) show that simple linear or patch models can beat complex transformers, which is a | |
| 154 | +warning for any "integrated" design. Forecast combination (Bates & Granger 1969, `batesgranger1969combination`; | |
| 155 | +Timmermann 2006, `timmermann2006combinations`) is the null hypothesis for any architecture that merges | |
| 156 | +component forecasts. | |
| 157 | + | |
| 158 | +**What must be shown.** (i) Component-wise ablations in which each block (hedonic encoder, spatial graph | |
| 159 | +encoder, temporal state-space, hierarchical effects, regime head, probabilistic layer) is removed and the | |
| 160 | +loss in CRPS/RMSE is reported with block-bootstrap uncertainty (`politisromano1994stationary`, | |
| 161 | +`kunsch1989jackknife`) and an MCS (`hansen2011mcs`); (ii) that the integrated model beats a simple equal- or | |
| 162 | +MinT-weighted combination of the five component models — if it does not, the integration has no incremental | |
| 163 | +value (the protocol's own rule in §5); (iii) computational cost and stability across seeds, since the | |
| 164 | +sample is small relative to the parameter count. Positioned against MugRep and TFT, the defensible claim | |
| 165 | +is at most "a new combination" unless (ii) holds with statistically significant margins. | |
| 166 | + | |
| 167 | +--- | |
| 168 | + | |
| 169 | +### Cross-cutting evaluation requirements (apply to all six) | |
| 170 | + | |
| 171 | +Pseudo-real-time design with no leakage from WP22 vintages; tests from `dieboldmariano1995`, | |
| 172 | +`harvey1997equality`, `giacominiwhite2006`, `clarkmccracken2001nested` (for nested comparisons with the | |
| 173 | +random walk), `hansen2011mcs`; scale-free accuracy via MASE (`hyndmankoehler2006mase`); interpretation via | |
| 174 | +SHAP/TreeExplainer and ALE (`lundberglee2017shap`, `lundberg2020treeexplainer`, `apleyzhu2020ale`); | |
| 175 | +transaction-selection correction following `heckman1979selection`, `gatzlaffhaurin1997`, `gatzlaffhaurin1998`, | |
| 176 | +`judseaks1994selection`, `munnekeslade2000selection`; momentum/predictability benchmarks motivated by | |
| 177 | +`caseshiller1989`, `caseshiller1990forecasting`, `capozza2004anatomy`, `glaeser2014dynamics`, `head2014search`, | |
| 178 | +`guren2018momentum`, `berachaskiba2011momentum`, `titman2014dynamics`. | |
added
docs/literature/references_verified.json
+3197 −0
@@ -0,0 +1,3197 @@ | ||
| 1 | +[ | |
| 2 | + { | |
| 3 | + "key": "caseshiller1987", | |
| 4 | + "type": "article", | |
| 5 | + "authors": [ | |
| 6 | + "Case, Karl E.", | |
| 7 | + "Shiller, Robert J." | |
| 8 | + ], | |
| 9 | + "title": "Prices of Single-Family Homes Since 1970: New Indexes for Four Cities", | |
| 10 | + "container": "New England Economic Review", | |
| 11 | + "year": 1987, | |
| 12 | + "volume": null, | |
| 13 | + "issue": null, | |
| 14 | + "pages": "45-56", | |
| 15 | + "doi": null, | |
| 16 | + "url": "https://ideas.repec.org/a/fip/fedbne/y1987isepp45-56.html", | |
| 17 | + "publisher": null, | |
| 18 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): RePEc fip:fedbne:y:1987:i:sep:p:45-56 (https://ideas.repec.org/a/fip/fedbne/y1987isepp45-56.html); NBER WP 2393 (10.3386/w2393)", | |
| 19 | + "verified": true, | |
| 20 | + "notes": "Weighted repeat sales (WRS). Issue: September/October 1987, pp. 45-56.", | |
| 21 | + "month": "September" | |
| 22 | + }, | |
| 23 | + { | |
| 24 | + "key": "caseshiller1989", | |
| 25 | + "type": "article", | |
| 26 | + "authors": [ | |
| 27 | + "Case, Karl E.", | |
| 28 | + "Shiller, Robert J." | |
| 29 | + ], | |
| 30 | + "title": "The Efficiency of the Market for Single-Family Homes", | |
| 31 | + "container": "American Economic Review", | |
| 32 | + "year": 1989, | |
| 33 | + "volume": "79", | |
| 34 | + "issue": "1", | |
| 35 | + "pages": "125-137", | |
| 36 | + "doi": null, | |
| 37 | + "url": "https://ideas.repec.org/a/aea/aecrev/v79y1989i1p125-37.html", | |
| 38 | + "publisher": null, | |
| 39 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): RePEc aea:aecrev:v:79:y:1989:i:1:p:125-37 (https://ideas.repec.org/a/aea/aecrev/v79y1989i1p125-37.html); NBER WP 2506 (10.3386/w2506)", | |
| 40 | + "verified": true, | |
| 41 | + "notes": "No DOI for AER 1989." | |
| 42 | + }, | |
| 43 | + { | |
| 44 | + "key": "hollypesaran2010", | |
| 45 | + "type": "article", | |
| 46 | + "authors": [ | |
| 47 | + "Holly, Sean", | |
| 48 | + "Pesaran, M. Hashem", | |
| 49 | + "Yamagata, Takashi" | |
| 50 | + ], | |
| 51 | + "title": "A spatio-temporal model of house prices in the USA", | |
| 52 | + "container": "Journal of Econometrics", | |
| 53 | + "year": 2010, | |
| 54 | + "volume": "158", | |
| 55 | + "issue": "1", | |
| 56 | + "pages": "160-173", | |
| 57 | + "doi": "10.1016/j.jeconom.2010.03.040", | |
| 58 | + "url": "https://doi.org/10.1016/j.jeconom.2010.03.040", | |
| 59 | + "publisher": "Elsevier BV", | |
| 60 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 61 | + "verified": true, | |
| 62 | + "notes": "" | |
| 63 | + }, | |
| 64 | + { | |
| 65 | + "key": "pace2000spatiotemporal", | |
| 66 | + "type": "article", | |
| 67 | + "authors": [ | |
| 68 | + "Pace, R. Kelley", | |
| 69 | + "Barry, Ronald", | |
| 70 | + "Gilley, Otis W.", | |
| 71 | + "Sirmans, C. F." | |
| 72 | + ], | |
| 73 | + "title": "A method for spatial–temporal forecasting with an application to real estate prices", | |
| 74 | + "container": "International Journal of Forecasting", | |
| 75 | + "year": 2000, | |
| 76 | + "volume": "16", | |
| 77 | + "issue": "2", | |
| 78 | + "pages": "229-246", | |
| 79 | + "doi": "10.1016/s0169-2070(99)00047-3", | |
| 80 | + "url": "https://doi.org/10.1016/s0169-2070(99)00047-3", | |
| 81 | + "publisher": "Elsevier BV", | |
| 82 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 83 | + "verified": true, | |
| 84 | + "notes": "" | |
| 85 | + }, | |
| 86 | + { | |
| 87 | + "key": "anselin1988", | |
| 88 | + "type": "book", | |
| 89 | + "authors": [ | |
| 90 | + "Anselin, Luc" | |
| 91 | + ], | |
| 92 | + "title": "Spatial Econometrics: Methods and Models", | |
| 93 | + "container": "Studies in Operational Regional Science", | |
| 94 | + "year": 1988, | |
| 95 | + "volume": null, | |
| 96 | + "issue": null, | |
| 97 | + "pages": null, | |
| 98 | + "doi": "10.1007/978-94-015-7799-1", | |
| 99 | + "url": "https://doi.org/10.1007/978-94-015-7799-1", | |
| 100 | + "publisher": "Kluwer Academic Publishers", | |
| 101 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 102 | + "verified": true, | |
| 103 | + "notes": "Studies in Operational Regional Science." | |
| 104 | + }, | |
| 105 | + { | |
| 106 | + "key": "kelejianprucha2010", | |
| 107 | + "type": "article", | |
| 108 | + "authors": [ | |
| 109 | + "Kelejian, Harry H.", | |
| 110 | + "Prucha, Ingmar R." | |
| 111 | + ], | |
| 112 | + "title": "Specification and estimation of spatial autoregressive models with autoregressive and heteroskedastic disturbances", | |
| 113 | + "container": "Journal of Econometrics", | |
| 114 | + "year": 2010, | |
| 115 | + "volume": "157", | |
| 116 | + "issue": "1", | |
| 117 | + "pages": "53-67", | |
| 118 | + "doi": "10.1016/j.jeconom.2009.10.025", | |
| 119 | + "url": "https://doi.org/10.1016/j.jeconom.2009.10.025", | |
| 120 | + "publisher": "Elsevier BV", | |
| 121 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 122 | + "verified": true, | |
| 123 | + "notes": "" | |
| 124 | + }, | |
| 125 | + { | |
| 126 | + "key": "lesagepace2009", | |
| 127 | + "type": "book", | |
| 128 | + "authors": [ | |
| 129 | + "LeSage, James", | |
| 130 | + "Pace, Robert Kelley" | |
| 131 | + ], | |
| 132 | + "title": "Introduction to Spatial Econometrics", | |
| 133 | + "container": null, | |
| 134 | + "year": 2009, | |
| 135 | + "volume": null, | |
| 136 | + "issue": null, | |
| 137 | + "pages": null, | |
| 138 | + "doi": "10.1201/9781420064254", | |
| 139 | + "url": "https://doi.org/10.1201/9781420064254", | |
| 140 | + "publisher": "Chapman and Hall/CRC", | |
| 141 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 142 | + "verified": true, | |
| 143 | + "notes": "" | |
| 144 | + }, | |
| 145 | + { | |
| 146 | + "key": "hyndman2011hierarchical", | |
| 147 | + "type": "article", | |
| 148 | + "authors": [ | |
| 149 | + "Hyndman, Rob J.", | |
| 150 | + "Ahmed, Roman A.", | |
| 151 | + "Athanasopoulos, George", | |
| 152 | + "Shang, Han Lin" | |
| 153 | + ], | |
| 154 | + "title": "Optimal combination forecasts for hierarchical time series", | |
| 155 | + "container": "Computational Statistics & Data Analysis", | |
| 156 | + "year": 2011, | |
| 157 | + "volume": "55", | |
| 158 | + "issue": "9", | |
| 159 | + "pages": "2579-2589", | |
| 160 | + "doi": "10.1016/j.csda.2011.03.006", | |
| 161 | + "url": "https://doi.org/10.1016/j.csda.2011.03.006", | |
| 162 | + "publisher": "Elsevier BV", | |
| 163 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 164 | + "verified": true, | |
| 165 | + "notes": "" | |
| 166 | + }, | |
| 167 | + { | |
| 168 | + "key": "wickramasuriya2019mint", | |
| 169 | + "type": "article", | |
| 170 | + "authors": [ | |
| 171 | + "Wickramasuriya, Shanika L.", | |
| 172 | + "Athanasopoulos, George", | |
| 173 | + "Hyndman, Rob J." | |
| 174 | + ], | |
| 175 | + "title": "Optimal Forecast Reconciliation for Hierarchical and Grouped Time Series Through Trace Minimization", | |
| 176 | + "container": "Journal of the American Statistical Association", | |
| 177 | + "year": 2019, | |
| 178 | + "volume": "114", | |
| 179 | + "issue": "526", | |
| 180 | + "pages": "804-819", | |
| 181 | + "doi": "10.1080/01621459.2018.1448825", | |
| 182 | + "url": "https://doi.org/10.1080/01621459.2018.1448825", | |
| 183 | + "publisher": "Informa UK Limited", | |
| 184 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 185 | + "verified": true, | |
| 186 | + "notes": "MinT. Print April 2019 (online 2018)." | |
| 187 | + }, | |
| 188 | + { | |
| 189 | + "key": "athanasopoulos2024reconciliation", | |
| 190 | + "type": "article", | |
| 191 | + "authors": [ | |
| 192 | + "Athanasopoulos, George", | |
| 193 | + "Hyndman, Rob J.", | |
| 194 | + "Kourentzes, Nikolaos", | |
| 195 | + "Panagiotelis, Anastasios" | |
| 196 | + ], | |
| 197 | + "title": "Forecast reconciliation: A review", | |
| 198 | + "container": "International Journal of Forecasting", | |
| 199 | + "year": 2024, | |
| 200 | + "volume": "40", | |
| 201 | + "issue": "2", | |
| 202 | + "pages": "430-456", | |
| 203 | + "doi": "10.1016/j.ijforecast.2023.10.010", | |
| 204 | + "url": "https://doi.org/10.1016/j.ijforecast.2023.10.010", | |
| 205 | + "publisher": "Elsevier BV", | |
| 206 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 207 | + "verified": true, | |
| 208 | + "notes": "" | |
| 209 | + }, | |
| 210 | + { | |
| 211 | + "key": "durbinkoopman2012", | |
| 212 | + "type": "book", | |
| 213 | + "authors": [ | |
| 214 | + "Durbin, James", | |
| 215 | + "Koopman, Siem Jan" | |
| 216 | + ], | |
| 217 | + "title": "Time Series Analysis by State Space Methods", | |
| 218 | + "container": null, | |
| 219 | + "year": 2012, | |
| 220 | + "volume": null, | |
| 221 | + "issue": null, | |
| 222 | + "pages": null, | |
| 223 | + "doi": "10.1093/acprof:oso/9780199641178.001.0001", | |
| 224 | + "url": "https://doi.org/10.1093/acprof:oso/9780199641178.001.0001", | |
| 225 | + "publisher": "Oxford University Press", | |
| 226 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 227 | + "verified": true, | |
| 228 | + "notes": "", | |
| 229 | + "edition": "2" | |
| 230 | + }, | |
| 231 | + { | |
| 232 | + "key": "harvey1989", | |
| 233 | + "type": "book", | |
| 234 | + "authors": [ | |
| 235 | + "Harvey, Andrew C." | |
| 236 | + ], | |
| 237 | + "title": "Forecasting, Structural Time Series Models and the Kalman Filter", | |
| 238 | + "container": null, | |
| 239 | + "year": 1989, | |
| 240 | + "volume": null, | |
| 241 | + "issue": null, | |
| 242 | + "pages": null, | |
| 243 | + "doi": "10.1017/CBO9781107049994", | |
| 244 | + "url": "https://doi.org/10.1017/CBO9781107049994", | |
| 245 | + "publisher": "Cambridge University Press", | |
| 246 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 247 | + "verified": true, | |
| 248 | + "notes": "Crossref DOI record is the 1990 paperback printing; first edition 1989." | |
| 249 | + }, | |
| 250 | + { | |
| 251 | + "key": "kalman1960", | |
| 252 | + "type": "article", | |
| 253 | + "authors": [ | |
| 254 | + "Kalman, R. E." | |
| 255 | + ], | |
| 256 | + "title": "A New Approach to Linear Filtering and Prediction Problems", | |
| 257 | + "container": "Journal of Basic Engineering", | |
| 258 | + "year": 1960, | |
| 259 | + "volume": "82", | |
| 260 | + "issue": "1", | |
| 261 | + "pages": "35-45", | |
| 262 | + "doi": "10.1115/1.3662552", | |
| 263 | + "url": "https://doi.org/10.1115/1.3662552", | |
| 264 | + "publisher": "ASME International", | |
| 265 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 266 | + "verified": true, | |
| 267 | + "notes": "" | |
| 268 | + }, | |
| 269 | + { | |
| 270 | + "key": "ke2017lightgbm", | |
| 271 | + "type": "inproceedings", | |
| 272 | + "authors": [ | |
| 273 | + "Ke, Guolin", | |
| 274 | + "Meng, Qi", | |
| 275 | + "Finley, Thomas", | |
| 276 | + "Wang, Taifeng", | |
| 277 | + "Chen, Wei", | |
| 278 | + "Ma, Weidong", | |
| 279 | + "Ye, Qiwei", | |
| 280 | + "Liu, Tie-Yan" | |
| 281 | + ], | |
| 282 | + "title": "LightGBM: A Highly Efficient Gradient Boosting Decision Tree", | |
| 283 | + "container": null, | |
| 284 | + "year": 2017, | |
| 285 | + "volume": null, | |
| 286 | + "issue": null, | |
| 287 | + "pages": "3146-3154", | |
| 288 | + "doi": null, | |
| 289 | + "url": "https://proceedings.neurips.cc/paper/2017/hash/6449f44a102fde848669bdd9eb6b76fa-Abstract.html", | |
| 290 | + "publisher": null, | |
| 291 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): NeurIPS proceedings page https://proceedings.neurips.cc/paper/2017/hash/6449f44a102fde848669bdd9eb6b76fa-Abstract.html (citation_author meta tags); pages 3146-3154 from the proceedings metadata JSON", | |
| 292 | + "verified": true, | |
| 293 | + "notes": "", | |
| 294 | + "booktitle": "Advances in Neural Information Processing Systems 30 (NIPS 2017)" | |
| 295 | + }, | |
| 296 | + { | |
| 297 | + "key": "gatzlaffhaurin1997", | |
| 298 | + "type": "article", | |
| 299 | + "authors": [ | |
| 300 | + "Gatzlaff, Dean H.", | |
| 301 | + "Haurin, Donald R." | |
| 302 | + ], | |
| 303 | + "title": "Sample Selection Bias and Repeat-Sales Index Estimates", | |
| 304 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 305 | + "year": 1997, | |
| 306 | + "volume": "14", | |
| 307 | + "issue": "1-2", | |
| 308 | + "pages": "33-50", | |
| 309 | + "doi": "10.1023/a:1007763816289", | |
| 310 | + "url": "https://doi.org/10.1023/a:1007763816289", | |
| 311 | + "publisher": "Springer Science and Business Media LLC", | |
| 312 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 313 | + "verified": true, | |
| 314 | + "notes": "" | |
| 315 | + }, | |
| 316 | + { | |
| 317 | + "key": "gatzlaffhaurin1998", | |
| 318 | + "type": "article", | |
| 319 | + "authors": [ | |
| 320 | + "Gatzlaff, Dean H.", | |
| 321 | + "Haurin, Donald R." | |
| 322 | + ], | |
| 323 | + "title": "Sample Selection and Biases in Local House Value Indices", | |
| 324 | + "container": "Journal of Urban Economics", | |
| 325 | + "year": 1998, | |
| 326 | + "volume": "43", | |
| 327 | + "issue": "2", | |
| 328 | + "pages": "199-222", | |
| 329 | + "doi": "10.1006/juec.1997.2045", | |
| 330 | + "url": "https://doi.org/10.1006/juec.1997.2045", | |
| 331 | + "publisher": "Elsevier BV", | |
| 332 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 333 | + "verified": true, | |
| 334 | + "notes": "" | |
| 335 | + }, | |
| 336 | + { | |
| 337 | + "key": "hwangquigley2004", | |
| 338 | + "type": "article", | |
| 339 | + "authors": [ | |
| 340 | + "Hwang, Min", | |
| 341 | + "Quigley, John M." | |
| 342 | + ], | |
| 343 | + "title": "Selectivity, Quality Adjustment and Mean Reversion in the Measurement of House Values", | |
| 344 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 345 | + "year": 2004, | |
| 346 | + "volume": "28", | |
| 347 | + "issue": "2-3", | |
| 348 | + "pages": "161-178", | |
| 349 | + "doi": "10.1023/b:real.0000011152.40485.12", | |
| 350 | + "url": "https://doi.org/10.1023/b:real.0000011152.40485.12", | |
| 351 | + "publisher": "Springer Science and Business Media LLC", | |
| 352 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 353 | + "verified": true, | |
| 354 | + "notes": "Crossref title carries a trailing asterisk (footnote marker), removed." | |
| 355 | + }, | |
| 356 | + { | |
| 357 | + "key": "clapp1991alltransactions", | |
| 358 | + "type": "article", | |
| 359 | + "authors": [ | |
| 360 | + "Clapp, John M.", | |
| 361 | + "Giaccotto, Carmelo", | |
| 362 | + "Tirtiroglu, Dogan" | |
| 363 | + ], | |
| 364 | + "title": "Housing Price Indices Based on All Transactions Compared to Repeat Subsamples", | |
| 365 | + "container": "Real Estate Economics", | |
| 366 | + "year": 1991, | |
| 367 | + "volume": "19", | |
| 368 | + "issue": "3", | |
| 369 | + "pages": "270-285", | |
| 370 | + "doi": "10.1111/1540-6229.00553", | |
| 371 | + "url": "https://doi.org/10.1111/1540-6229.00553", | |
| 372 | + "publisher": "Wiley", | |
| 373 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 374 | + "verified": true, | |
| 375 | + "notes": "Published in the AREUEA Journal (vol. 19), the journal now titled Real Estate Economics (Crossref container)." | |
| 376 | + }, | |
| 377 | + { | |
| 378 | + "key": "gelmanhill2007", | |
| 379 | + "type": "book", | |
| 380 | + "authors": [ | |
| 381 | + "Gelman, Andrew", | |
| 382 | + "Hill, Jennifer" | |
| 383 | + ], | |
| 384 | + "title": "Data Analysis Using Regression and Multilevel/Hierarchical Models", | |
| 385 | + "container": null, | |
| 386 | + "year": 2007, | |
| 387 | + "volume": null, | |
| 388 | + "issue": null, | |
| 389 | + "pages": null, | |
| 390 | + "doi": "10.1017/CBO9780511790942", | |
| 391 | + "url": "https://doi.org/10.1017/CBO9780511790942", | |
| 392 | + "publisher": "Cambridge University Press", | |
| 393 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 394 | + "verified": true, | |
| 395 | + "notes": "Crossref issued date 2006-12-18 (online); book carries 2007 imprint." | |
| 396 | + }, | |
| 397 | + { | |
| 398 | + "key": "gelman2006prior", | |
| 399 | + "type": "article", | |
| 400 | + "authors": [ | |
| 401 | + "Gelman, Andrew" | |
| 402 | + ], | |
| 403 | + "title": "Prior distributions for variance parameters in hierarchical models (comment on article by Browne and Draper)", | |
| 404 | + "container": "Bayesian Analysis", | |
| 405 | + "year": 2006, | |
| 406 | + "volume": "1", | |
| 407 | + "issue": "3", | |
| 408 | + "pages": "515-534", | |
| 409 | + "doi": "10.1214/06-ba117a", | |
| 410 | + "url": "https://doi.org/10.1214/06-ba117a", | |
| 411 | + "publisher": "Institute of Mathematical Statistics", | |
| 412 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 413 | + "verified": true, | |
| 414 | + "notes": "" | |
| 415 | + }, | |
| 416 | + { | |
| 417 | + "key": "rosen1974", | |
| 418 | + "type": "article", | |
| 419 | + "authors": [ | |
| 420 | + "Rosen, Sherwin" | |
| 421 | + ], | |
| 422 | + "title": "Hedonic Prices and Implicit Markets: Product Differentiation in Pure Competition", | |
| 423 | + "container": "Journal of Political Economy", | |
| 424 | + "year": 1974, | |
| 425 | + "volume": "82", | |
| 426 | + "issue": "1", | |
| 427 | + "pages": "34-55", | |
| 428 | + "doi": "10.1086/260169", | |
| 429 | + "url": "https://doi.org/10.1086/260169", | |
| 430 | + "publisher": "University of Chicago Press", | |
| 431 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 432 | + "verified": true, | |
| 433 | + "notes": "" | |
| 434 | + }, | |
| 435 | + { | |
| 436 | + "key": "francke2017hierarchical", | |
| 437 | + "type": "article", | |
| 438 | + "authors": [ | |
| 439 | + "Francke, Marc K.", | |
| 440 | + "van de Minne, Alex" | |
| 441 | + ], | |
| 442 | + "title": "The Hierarchical Repeat Sales Model for Granular Commercial Real Estate and Residential Price Indices", | |
| 443 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 444 | + "year": 2017, | |
| 445 | + "volume": "55", | |
| 446 | + "issue": "4", | |
| 447 | + "pages": "511-532", | |
| 448 | + "doi": "10.1007/s11146-017-9632-1", | |
| 449 | + "url": "https://doi.org/10.1007/s11146-017-9632-1", | |
| 450 | + "publisher": "Springer Science and Business Media LLC", | |
| 451 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 452 | + "verified": true, | |
| 453 | + "notes": "Hierarchical repeat sales model for granular (local) indices." | |
| 454 | + }, | |
| 455 | + { | |
| 456 | + "key": "francke2010thin", | |
| 457 | + "type": "article", | |
| 458 | + "authors": [ | |
| 459 | + "Francke, Marc K." | |
| 460 | + ], | |
| 461 | + "title": "Repeat Sales Index for Thin Markets", | |
| 462 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 463 | + "year": 2010, | |
| 464 | + "volume": "41", | |
| 465 | + "issue": "1", | |
| 466 | + "pages": "24-52", | |
| 467 | + "doi": "10.1007/s11146-009-9203-1", | |
| 468 | + "url": "https://doi.org/10.1007/s11146-009-9203-1", | |
| 469 | + "publisher": "Springer Science and Business Media LLC", | |
| 470 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 471 | + "verified": true, | |
| 472 | + "notes": "Published title is 'Repeat Sales Index for Thin Markets' (subtitle 'A Structural Time Series Approach' appears in the 2007 ERES version). Print July 2010." | |
| 473 | + }, | |
| 474 | + { | |
| 475 | + "key": "francke2021heterogeneity", | |
| 476 | + "type": "article", | |
| 477 | + "authors": [ | |
| 478 | + "Francke, Marc", | |
| 479 | + "van de Minne, Alex" | |
| 480 | + ], | |
| 481 | + "title": "Modeling unobserved heterogeneity in hedonic price models", | |
| 482 | + "container": "Real Estate Economics", | |
| 483 | + "year": 2021, | |
| 484 | + "volume": "49", | |
| 485 | + "issue": "4", | |
| 486 | + "pages": "1315-1339", | |
| 487 | + "doi": "10.1111/1540-6229.12320", | |
| 488 | + "url": "https://doi.org/10.1111/1540-6229.12320", | |
| 489 | + "publisher": "Wiley", | |
| 490 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 491 | + "verified": true, | |
| 492 | + "notes": "Print December 2021 (online 2020)." | |
| 493 | + }, | |
| 494 | + { | |
| 495 | + "key": "bailey1963", | |
| 496 | + "type": "article", | |
| 497 | + "authors": [ | |
| 498 | + "Bailey, Martin J.", | |
| 499 | + "Muth, Richard F.", | |
| 500 | + "Nourse, Hugh O." | |
| 501 | + ], | |
| 502 | + "title": "A Regression Method for Real Estate Price Index Construction", | |
| 503 | + "container": "Journal of the American Statistical Association", | |
| 504 | + "year": 1963, | |
| 505 | + "volume": "58", | |
| 506 | + "issue": "304", | |
| 507 | + "pages": "933-942", | |
| 508 | + "doi": "10.1080/01621459.1963.10480679", | |
| 509 | + "url": "https://doi.org/10.1080/01621459.1963.10480679", | |
| 510 | + "publisher": "Informa UK Limited", | |
| 511 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 512 | + "verified": true, | |
| 513 | + "notes": "" | |
| 514 | + }, | |
| 515 | + { | |
| 516 | + "key": "goetzmann1992", | |
| 517 | + "type": "article", | |
| 518 | + "authors": [ | |
| 519 | + "Goetzmann, William Nelson" | |
| 520 | + ], | |
| 521 | + "title": "The accuracy of real estate indices: Repeat sale estimators", | |
| 522 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 523 | + "year": 1992, | |
| 524 | + "volume": "5", | |
| 525 | + "issue": "1", | |
| 526 | + "pages": "5-53", | |
| 527 | + "doi": "10.1007/bf00153997", | |
| 528 | + "url": "https://doi.org/10.1007/bf00153997", | |
| 529 | + "publisher": "Springer Science and Business Media LLC", | |
| 530 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 531 | + "verified": true, | |
| 532 | + "notes": "" | |
| 533 | + }, | |
| 534 | + { | |
| 535 | + "key": "clappgiaccotto1992", | |
| 536 | + "type": "article", | |
| 537 | + "authors": [ | |
| 538 | + "Clapp, John M.", | |
| 539 | + "Giaccotto, Carmelo" | |
| 540 | + ], | |
| 541 | + "title": "Estimating Price Indices for Residential Property: A Comparison of Repeat Sales and Assessed Value Methods", | |
| 542 | + "container": "Journal of the American Statistical Association", | |
| 543 | + "year": 1992, | |
| 544 | + "volume": "87", | |
| 545 | + "issue": "418", | |
| 546 | + "pages": "300-306", | |
| 547 | + "doi": "10.1080/01621459.1992.10475209", | |
| 548 | + "url": "https://doi.org/10.1080/01621459.1992.10475209", | |
| 549 | + "publisher": "Informa UK Limited", | |
| 550 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 551 | + "verified": true, | |
| 552 | + "notes": "" | |
| 553 | + }, | |
| 554 | + { | |
| 555 | + "key": "bourassa2006simple", | |
| 556 | + "type": "article", | |
| 557 | + "authors": [ | |
| 558 | + "Bourassa, Steven C.", | |
| 559 | + "Hoesli, Martin", | |
| 560 | + "Sun, Jian" | |
| 561 | + ], | |
| 562 | + "title": "A simple alternative house price index method", | |
| 563 | + "container": "Journal of Housing Economics", | |
| 564 | + "year": 2006, | |
| 565 | + "volume": "15", | |
| 566 | + "issue": "1", | |
| 567 | + "pages": "80-97", | |
| 568 | + "doi": "10.1016/j.jhe.2006.03.001", | |
| 569 | + "url": "https://doi.org/10.1016/j.jhe.2006.03.001", | |
| 570 | + "publisher": "Elsevier BV", | |
| 571 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 572 | + "verified": true, | |
| 573 | + "notes": "" | |
| 574 | + }, | |
| 575 | + { | |
| 576 | + "key": "wood2017gam", | |
| 577 | + "type": "book", | |
| 578 | + "authors": [ | |
| 579 | + "Wood, Simon N." | |
| 580 | + ], | |
| 581 | + "title": "Generalized Additive Models", | |
| 582 | + "container": null, | |
| 583 | + "year": 2017, | |
| 584 | + "volume": null, | |
| 585 | + "issue": null, | |
| 586 | + "pages": null, | |
| 587 | + "doi": "10.1201/9781315370279", | |
| 588 | + "url": "https://doi.org/10.1201/9781315370279", | |
| 589 | + "publisher": "Chapman and Hall/CRC", | |
| 590 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 591 | + "verified": true, | |
| 592 | + "notes": "", | |
| 593 | + "edition": "2" | |
| 594 | + }, | |
| 595 | + { | |
| 596 | + "key": "chernozhukov2018dml", | |
| 597 | + "type": "article", | |
| 598 | + "authors": [ | |
| 599 | + "Chernozhukov, Victor", | |
| 600 | + "Chetverikov, Denis", | |
| 601 | + "Demirer, Mert", | |
| 602 | + "Duflo, Esther", | |
| 603 | + "Hansen, Christian", | |
| 604 | + "Newey, Whitney", | |
| 605 | + "Robins, James" | |
| 606 | + ], | |
| 607 | + "title": "Double/debiased machine learning for treatment and structural parameters", | |
| 608 | + "container": "The Econometrics Journal", | |
| 609 | + "year": 2018, | |
| 610 | + "volume": "21", | |
| 611 | + "issue": "1", | |
| 612 | + "pages": "C1-C68", | |
| 613 | + "doi": "10.1111/ectj.12097", | |
| 614 | + "url": "https://doi.org/10.1111/ectj.12097", | |
| 615 | + "publisher": "Oxford University Press (OUP)", | |
| 616 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 617 | + "verified": true, | |
| 618 | + "notes": "" | |
| 619 | + }, | |
| 620 | + { | |
| 621 | + "key": "hill2013survey", | |
| 622 | + "type": "article", | |
| 623 | + "authors": [ | |
| 624 | + "Hill, Robert J." | |
| 625 | + ], | |
| 626 | + "title": "Hedonic Price Indexes for Residential Housing: A Survey, Evaluation and Taxonomy", | |
| 627 | + "container": "Journal of Economic Surveys", | |
| 628 | + "year": 2013, | |
| 629 | + "volume": "27", | |
| 630 | + "issue": "5", | |
| 631 | + "pages": "879-914", | |
| 632 | + "doi": "10.1111/j.1467-6419.2012.00731.x", | |
| 633 | + "url": "https://doi.org/10.1111/j.1467-6419.2012.00731.x", | |
| 634 | + "publisher": "Wiley", | |
| 635 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 636 | + "verified": true, | |
| 637 | + "notes": "Crossref title is all-caps; print issue December 2013 (online 2012)." | |
| 638 | + }, | |
| 639 | + { | |
| 640 | + "key": "hill2026survey", | |
| 641 | + "type": "article", | |
| 642 | + "authors": [ | |
| 643 | + "Hill, Robert J.", | |
| 644 | + "Steurer, Miriam" | |
| 645 | + ], | |
| 646 | + "title": "Real Estate Price Measurement Since the Global Financial Crisis: Methods, Data and Policy Developments", | |
| 647 | + "container": "Review of Income and Wealth", | |
| 648 | + "year": 2026, | |
| 649 | + "volume": "72", | |
| 650 | + "issue": "1", | |
| 651 | + "pages": null, | |
| 652 | + "doi": "10.1111/roiw.70055", | |
| 653 | + "url": "https://doi.org/10.1111/roiw.70055", | |
| 654 | + "publisher": "Wiley", | |
| 655 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>); University of Graz publication list", | |
| 656 | + "verified": true, | |
| 657 | + "notes": "Latest Hill survey of real-estate price measurement. Article number e70055 (no page range in Crossref). Published in Review of Income and Wealth, not JEL/JES." | |
| 658 | + }, | |
| 659 | + { | |
| 660 | + "key": "eurostat2013handbook", | |
| 661 | + "type": "book", | |
| 662 | + "authors": [ | |
| 663 | + "{Eurostat}", | |
| 664 | + "{ILO}", | |
| 665 | + "{IMF}", | |
| 666 | + "{OECD}", | |
| 667 | + "{UNECE}", | |
| 668 | + "{World Bank}" | |
| 669 | + ], | |
| 670 | + "title": "Handbook on Residential Property Price Indices (RPPIs)", | |
| 671 | + "container": null, | |
| 672 | + "year": 2013, | |
| 673 | + "volume": null, | |
| 674 | + "issue": null, | |
| 675 | + "pages": null, | |
| 676 | + "doi": "10.1787/9789264197183-en", | |
| 677 | + "url": "https://doi.org/10.1787/9789264197183-en", | |
| 678 | + "publisher": "OECD Publishing / Eurostat", | |
| 679 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>) (OECD DOI; Crossref author field empty); Eurostat edition ISBN 978-92-79-25984-5, DOI 10.2785/34007 cited by CBS REPS manual (10.2785 DOI not resolvable via Crossref API)", | |
| 680 | + "verified": true, | |
| 681 | + "notes": "Joint Eurostat/ILO/IMF/OECD/UNECE/World Bank handbook. Crossref title: 'Handbook on Residential Property Price Indices'." | |
| 682 | + }, | |
| 683 | + { | |
| 684 | + "key": "nagaraja2011autoregressive", | |
| 685 | + "type": "article", | |
| 686 | + "authors": [ | |
| 687 | + "Nagaraja, Chaitra H.", | |
| 688 | + "Brown, Lawrence D.", | |
| 689 | + "Zhao, Linda H." | |
| 690 | + ], | |
| 691 | + "title": "An autoregressive approach to house price modeling", | |
| 692 | + "container": "The Annals of Applied Statistics", | |
| 693 | + "year": 2011, | |
| 694 | + "volume": "5", | |
| 695 | + "issue": "1", | |
| 696 | + "pages": "124-149", | |
| 697 | + "doi": "10.1214/10-aoas380", | |
| 698 | + "url": "https://doi.org/10.1214/10-aoas380", | |
| 699 | + "publisher": "Institute of Mathematical Statistics", | |
| 700 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 701 | + "verified": true, | |
| 702 | + "notes": "" | |
| 703 | + }, | |
| 704 | + { | |
| 705 | + "key": "bogin2019local", | |
| 706 | + "type": "article", | |
| 707 | + "authors": [ | |
| 708 | + "Bogin, Alexander", | |
| 709 | + "Doerner, William", | |
| 710 | + "Larson, William" | |
| 711 | + ], | |
| 712 | + "title": "Local House Price Dynamics: New Indices and Stylized Facts", | |
| 713 | + "container": "Real Estate Economics", | |
| 714 | + "year": 2019, | |
| 715 | + "volume": "47", | |
| 716 | + "issue": "2", | |
| 717 | + "pages": "365-398", | |
| 718 | + "doi": "10.1111/1540-6229.12233", | |
| 719 | + "url": "https://doi.org/10.1111/1540-6229.12233", | |
| 720 | + "publisher": "Wiley", | |
| 721 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 722 | + "verified": true, | |
| 723 | + "notes": "FHFA ZIP-code / county / tract repeat-sales indices. Print June 2019 (online 2018)." | |
| 724 | + }, | |
| 725 | + { | |
| 726 | + "key": "mcmillen2012matching", | |
| 727 | + "type": "article", | |
| 728 | + "authors": [ | |
| 729 | + "McMillen, Daniel P." | |
| 730 | + ], | |
| 731 | + "title": "Repeat Sales as a Matching Estimator", | |
| 732 | + "container": "Real Estate Economics", | |
| 733 | + "year": 2012, | |
| 734 | + "volume": "40", | |
| 735 | + "issue": "4", | |
| 736 | + "pages": "745-773", | |
| 737 | + "doi": "10.1111/j.1540-6229.2012.00343.x", | |
| 738 | + "url": "https://doi.org/10.1111/j.1540-6229.2012.00343.x", | |
| 739 | + "publisher": "Wiley", | |
| 740 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 741 | + "verified": true, | |
| 742 | + "notes": "" | |
| 743 | + }, | |
| 744 | + { | |
| 745 | + "key": "fayherriot1979", | |
| 746 | + "type": "article", | |
| 747 | + "authors": [ | |
| 748 | + "Fay, Robert E.", | |
| 749 | + "Herriot, Roger A." | |
| 750 | + ], | |
| 751 | + "title": "Estimates of Income for Small Places: An Application of James-Stein Procedures to Census Data", | |
| 752 | + "container": "Journal of the American Statistical Association", | |
| 753 | + "year": 1979, | |
| 754 | + "volume": "74", | |
| 755 | + "issue": "366", | |
| 756 | + "pages": "269-277", | |
| 757 | + "doi": "10.1080/01621459.1979.10482505", | |
| 758 | + "url": "https://doi.org/10.1080/01621459.1979.10482505", | |
| 759 | + "publisher": "Informa UK Limited", | |
| 760 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 761 | + "verified": true, | |
| 762 | + "notes": "Crossref issue code '366a'; printed issue 366." | |
| 763 | + }, | |
| 764 | + { | |
| 765 | + "key": "efronmorris1973", | |
| 766 | + "type": "article", | |
| 767 | + "authors": [ | |
| 768 | + "Efron, Bradley", | |
| 769 | + "Morris, Carl" | |
| 770 | + ], | |
| 771 | + "title": "Stein's Estimation Rule and its Competitors—An Empirical Bayes Approach", | |
| 772 | + "container": "Journal of the American Statistical Association", | |
| 773 | + "year": 1973, | |
| 774 | + "volume": "68", | |
| 775 | + "issue": "341", | |
| 776 | + "pages": "117-130", | |
| 777 | + "doi": "10.1080/01621459.1973.10481350", | |
| 778 | + "url": "https://doi.org/10.1080/01621459.1973.10481350", | |
| 779 | + "publisher": "Informa UK Limited", | |
| 780 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 781 | + "verified": true, | |
| 782 | + "notes": "" | |
| 783 | + }, | |
| 784 | + { | |
| 785 | + "key": "francke2022daily", | |
| 786 | + "type": "article", | |
| 787 | + "authors": [ | |
| 788 | + "Francke, Marc", | |
| 789 | + "van de Minne, Alex" | |
| 790 | + ], | |
| 791 | + "title": "Daily appraisal of commercial real estate a new mixed frequency approach", | |
| 792 | + "container": "Real Estate Economics", | |
| 793 | + "year": 2022, | |
| 794 | + "volume": "50", | |
| 795 | + "issue": "5", | |
| 796 | + "pages": "1257-1281", | |
| 797 | + "doi": "10.1111/1540-6229.12378", | |
| 798 | + "url": "https://doi.org/10.1111/1540-6229.12378", | |
| 799 | + "publisher": "Wiley", | |
| 800 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 801 | + "verified": true, | |
| 802 | + "notes": "" | |
| 803 | + }, | |
| 804 | + { | |
| 805 | + "key": "francke2025censustract", | |
| 806 | + "type": "article", | |
| 807 | + "authors": [ | |
| 808 | + "Francke, Marc", | |
| 809 | + "Rolheiser, Lyndsey", | |
| 810 | + "van de Minne, Alex" | |
| 811 | + ], | |
| 812 | + "title": "Estimating Census Tract House Price Indexes: A New Spatial Dynamic Factor Approach", | |
| 813 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 814 | + "year": 2025, | |
| 815 | + "volume": "70", | |
| 816 | + "issue": "3", | |
| 817 | + "pages": "483-514", | |
| 818 | + "doi": "10.1007/s11146-023-09957-w", | |
| 819 | + "url": "https://doi.org/10.1007/s11146-023-09957-w", | |
| 820 | + "publisher": "Springer Science and Business Media LLC", | |
| 821 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 822 | + "verified": true, | |
| 823 | + "notes": "Print April 2025 (online 2023). Spatial dynamic factor repeat-sales model for census-tract indexes." | |
| 824 | + }, | |
| 825 | + { | |
| 826 | + "key": "dattalahiri2000", | |
| 827 | + "type": "article", | |
| 828 | + "authors": [ | |
| 829 | + "Datta, Gauri Sankar", | |
| 830 | + "Lahiri, Partha" | |
| 831 | + ], | |
| 832 | + "title": "A Unified Measure of Uncertainty of Estimated Best Linear Unbiased Predictors in Small Area Estimation Problems", | |
| 833 | + "container": "Statistica Sinica", | |
| 834 | + "year": 2000, | |
| 835 | + "volume": "10", | |
| 836 | + "issue": "2", | |
| 837 | + "pages": "613-627", | |
| 838 | + "doi": null, | |
| 839 | + "url": "https://www3.stat.sinica.edu.tw/statistica/J10n2/j10n214/j10n214.htm", | |
| 840 | + "publisher": null, | |
| 841 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Journal web page https://www3.stat.sinica.edu.tw/statistica/J10n2/j10n214/j10n214.htm (G. S. Datta and P. Lahiri, Statistica Sinica 10 (2000), 613-627)", | |
| 842 | + "verified": true, | |
| 843 | + "notes": "Journal page gives initials only (G. S. Datta, P. Lahiri); full first names from the authors' standard forms." | |
| 844 | + }, | |
| 845 | + { | |
| 846 | + "key": "pfeffermann2013sae", | |
| 847 | + "type": "article", | |
| 848 | + "authors": [ | |
| 849 | + "Pfeffermann, Danny" | |
| 850 | + ], | |
| 851 | + "title": "New Important Developments in Small Area Estimation", | |
| 852 | + "container": "Statistical Science", | |
| 853 | + "year": 2013, | |
| 854 | + "volume": "28", | |
| 855 | + "issue": "1", | |
| 856 | + "pages": "40-68", | |
| 857 | + "doi": "10.1214/12-sts395", | |
| 858 | + "url": "https://doi.org/10.1214/12-sts395", | |
| 859 | + "publisher": "Institute of Mathematical Statistics", | |
| 860 | + "verification_source": "Reused from WP22 (sharp-hpi-quebec/docs/literature/references_verified.json): Crossref API (https://api.crossref.org/works/<DOI>)", | |
| 861 | + "verified": true, | |
| 862 | + "notes": "" | |
| 863 | + }, | |
| 864 | + { | |
| 865 | + "key": "rapachstrauss2009", | |
| 866 | + "type": "article", | |
| 867 | + "authors": [ | |
| 868 | + "Rapach, David E.", | |
| 869 | + "Strauss, Jack K." | |
| 870 | + ], | |
| 871 | + "title": "Differences in housing price forecastability across US states", | |
| 872 | + "container": "International Journal of Forecasting", | |
| 873 | + "year": 2009, | |
| 874 | + "volume": "25", | |
| 875 | + "issue": "2", | |
| 876 | + "pages": "351--372", | |
| 877 | + "doi": "10.1016/j.ijforecast.2009.01.009", | |
| 878 | + "url": "https://doi.org/10.1016/j.ijforecast.2009.01.009", | |
| 879 | + "publisher": "Elsevier BV", | |
| 880 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 881 | + "verified": true, | |
| 882 | + "notes": "Requested as J. Forecasting; published in International Journal of Forecasting 25(2)." | |
| 883 | + }, | |
| 884 | + { | |
| 885 | + "key": "borkmoller2015", | |
| 886 | + "type": "article", | |
| 887 | + "authors": [ | |
| 888 | + "Bork, Lasse", | |
| 889 | + "Møller, Stig V." | |
| 890 | + ], | |
| 891 | + "title": "Forecasting house prices in the 50 states using Dynamic Model Averaging and Dynamic Model Selection", | |
| 892 | + "container": "International Journal of Forecasting", | |
| 893 | + "year": 2015, | |
| 894 | + "volume": "31", | |
| 895 | + "issue": "1", | |
| 896 | + "pages": "63--78", | |
| 897 | + "doi": "10.1016/j.ijforecast.2014.05.005", | |
| 898 | + "url": "https://doi.org/10.1016/j.ijforecast.2014.05.005", | |
| 899 | + "publisher": "Elsevier BV", | |
| 900 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 901 | + "verified": true, | |
| 902 | + "notes": "" | |
| 903 | + }, | |
| 904 | + { | |
| 905 | + "key": "ghysels2013forecasting", | |
| 906 | + "type": "incollection", | |
| 907 | + "authors": [ | |
| 908 | + "Ghysels, Eric", | |
| 909 | + "Plazzi, Alberto", | |
| 910 | + "Valkanov, Rossen", | |
| 911 | + "Torous, Walter" | |
| 912 | + ], | |
| 913 | + "title": "Forecasting Real Estate Prices", | |
| 914 | + "container": "Handbook of Economic Forecasting, Volume 2A", | |
| 915 | + "year": 2013, | |
| 916 | + "volume": "2", | |
| 917 | + "issue": null, | |
| 918 | + "pages": "509--580", | |
| 919 | + "doi": "10.1016/b978-0-444-53683-9.00009-8", | |
| 920 | + "url": "https://doi.org/10.1016/b978-0-444-53683-9.00009-8", | |
| 921 | + "publisher": "Elsevier", | |
| 922 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 923 | + "verified": true, | |
| 924 | + "notes": "Author order as registered in Crossref (Ghysels, Plazzi, Valkanov, Torous). Editors/volume from the handbook series (Elliott and Timmermann, eds.)." | |
| 925 | + }, | |
| 926 | + { | |
| 927 | + "key": "gupta2011forecasting", | |
| 928 | + "type": "article", | |
| 929 | + "authors": [ | |
| 930 | + "Gupta, Rangan", | |
| 931 | + "Kabundi, Alain", | |
| 932 | + "Miller, Stephen M." | |
| 933 | + ], | |
| 934 | + "title": "Forecasting the US real house price index: Structural and non-structural models with and without fundamentals", | |
| 935 | + "container": "Economic Modelling", | |
| 936 | + "year": 2011, | |
| 937 | + "volume": "28", | |
| 938 | + "issue": "4", | |
| 939 | + "pages": "2013--2021", | |
| 940 | + "doi": "10.1016/j.econmod.2011.04.005", | |
| 941 | + "url": "https://doi.org/10.1016/j.econmod.2011.04.005", | |
| 942 | + "publisher": "Elsevier BV", | |
| 943 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 944 | + "verified": true, | |
| 945 | + "notes": "" | |
| 946 | + }, | |
| 947 | + { | |
| 948 | + "key": "gupta2011large", | |
| 949 | + "type": "article", | |
| 950 | + "authors": [ | |
| 951 | + "Gupta, Rangan", | |
| 952 | + "Kabundi, Alain", | |
| 953 | + "Miller, Stephen" | |
| 954 | + ], | |
| 955 | + "title": "Using Large Data Sets to Forecast House Prices: A Case Study of Twenty U.S. States", | |
| 956 | + "container": "Journal of Housing Research", | |
| 957 | + "year": 2011, | |
| 958 | + "volume": "20", | |
| 959 | + "issue": "2", | |
| 960 | + "pages": "161--190", | |
| 961 | + "doi": "10.1080/10835547.2011.12092042", | |
| 962 | + "url": "https://doi.org/10.1080/10835547.2011.12092042", | |
| 963 | + "publisher": "Informa UK Limited", | |
| 964 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 965 | + "verified": true, | |
| 966 | + "notes": "" | |
| 967 | + }, | |
| 968 | + { | |
| 969 | + "key": "plakandaras2015forecasting", | |
| 970 | + "type": "article", | |
| 971 | + "authors": [ | |
| 972 | + "Plakandaras, Vasilios", | |
| 973 | + "Gupta, Rangan", | |
| 974 | + "Gogas, Periklis", | |
| 975 | + "Papadimitriou, Theophilos" | |
| 976 | + ], | |
| 977 | + "title": "Forecasting the U.S. real house price index", | |
| 978 | + "container": "Economic Modelling", | |
| 979 | + "year": 2015, | |
| 980 | + "volume": "45", | |
| 981 | + "issue": null, | |
| 982 | + "pages": "259--267", | |
| 983 | + "doi": "10.1016/j.econmod.2014.10.050", | |
| 984 | + "url": "https://doi.org/10.1016/j.econmod.2014.10.050", | |
| 985 | + "publisher": "Elsevier BV", | |
| 986 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 987 | + "verified": true, | |
| 988 | + "notes": "" | |
| 989 | + }, | |
| 990 | + { | |
| 991 | + "key": "milunovich2020forecasting", | |
| 992 | + "type": "article", | |
| 993 | + "authors": [ | |
| 994 | + "Milunovich, George" | |
| 995 | + ], | |
| 996 | + "title": "Forecasting Australia's real house price index: A comparison of time series and machine learning methods", | |
| 997 | + "container": "Journal of Forecasting", | |
| 998 | + "year": 2020, | |
| 999 | + "volume": "39", | |
| 1000 | + "issue": "7", | |
| 1001 | + "pages": "1098--1118", | |
| 1002 | + "doi": "10.1002/for.2678", | |
| 1003 | + "url": "https://doi.org/10.1002/for.2678", | |
| 1004 | + "publisher": "Wiley", | |
| 1005 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1006 | + "verified": true, | |
| 1007 | + "notes": "" | |
| 1008 | + }, | |
| 1009 | + { | |
| 1010 | + "key": "kouwenbergzwinkels2014", | |
| 1011 | + "type": "article", | |
| 1012 | + "authors": [ | |
| 1013 | + "Kouwenberg, Roy", | |
| 1014 | + "Zwinkels, Remco" | |
| 1015 | + ], | |
| 1016 | + "title": "Forecasting the US housing market", | |
| 1017 | + "container": "International Journal of Forecasting", | |
| 1018 | + "year": 2014, | |
| 1019 | + "volume": "30", | |
| 1020 | + "issue": "3", | |
| 1021 | + "pages": "415--425", | |
| 1022 | + "doi": "10.1016/j.ijforecast.2013.12.010", | |
| 1023 | + "url": "https://doi.org/10.1016/j.ijforecast.2013.12.010", | |
| 1024 | + "publisher": "Elsevier BV", | |
| 1025 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1026 | + "verified": true, | |
| 1027 | + "notes": "" | |
| 1028 | + }, | |
| 1029 | + { | |
| 1030 | + "key": "caseshiller1990forecasting", | |
| 1031 | + "type": "article", | |
| 1032 | + "authors": [ | |
| 1033 | + "Case, Karl E.", | |
| 1034 | + "Shiller, Robert J." | |
| 1035 | + ], | |
| 1036 | + "title": "Forecasting Prices and Excess Returns in the Housing Market", | |
| 1037 | + "container": "Real Estate Economics", | |
| 1038 | + "year": 1990, | |
| 1039 | + "volume": "18", | |
| 1040 | + "issue": "3", | |
| 1041 | + "pages": "253--273", | |
| 1042 | + "doi": "10.1111/1540-6229.00521", | |
| 1043 | + "url": "https://doi.org/10.1111/1540-6229.00521", | |
| 1044 | + "publisher": "Wiley", | |
| 1045 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1046 | + "verified": true, | |
| 1047 | + "notes": "Journal was then titled AREUEA Journal (Crossref registers it under Real Estate Economics)." | |
| 1048 | + }, | |
| 1049 | + { | |
| 1050 | + "key": "xuzhang2022hpi", | |
| 1051 | + "type": "article", | |
| 1052 | + "authors": [ | |
| 1053 | + "Xu, Xiaojie", | |
| 1054 | + "Zhang, Yun" | |
| 1055 | + ], | |
| 1056 | + "title": "Residential housing price index forecasting via neural networks", | |
| 1057 | + "container": "Neural Computing and Applications", | |
| 1058 | + "year": 2022, | |
| 1059 | + "volume": "34", | |
| 1060 | + "issue": "17", | |
| 1061 | + "pages": "14763--14776", | |
| 1062 | + "doi": "10.1007/s00521-022-07309-y", | |
| 1063 | + "url": "https://doi.org/10.1007/s00521-022-07309-y", | |
| 1064 | + "publisher": "Springer Science and Business Media LLC", | |
| 1065 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1066 | + "verified": true, | |
| 1067 | + "notes": "" | |
| 1068 | + }, | |
| 1069 | + { | |
| 1070 | + "key": "yeo2025deepdfvar", | |
| 1071 | + "type": "article", | |
| 1072 | + "authors": [ | |
| 1073 | + "Yeo, Jisu", | |
| 1074 | + "Stitsyuk, Artyom", | |
| 1075 | + "Choi, Jaesik" | |
| 1076 | + ], | |
| 1077 | + "title": "Deep-DFVAR: Dynamic factor vector autoregression with deep learning for regional house price index forecasting", | |
| 1078 | + "container": "Neurocomputing", | |
| 1079 | + "year": 2025, | |
| 1080 | + "volume": "656", | |
| 1081 | + "issue": null, | |
| 1082 | + "pages": "131103", | |
| 1083 | + "doi": "10.1016/j.neucom.2025.131103", | |
| 1084 | + "url": "https://doi.org/10.1016/j.neucom.2025.131103", | |
| 1085 | + "publisher": "Elsevier BV", | |
| 1086 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1087 | + "verified": true, | |
| 1088 | + "notes": "" | |
| 1089 | + }, | |
| 1090 | + { | |
| 1091 | + "key": "bourassa2010spatial", | |
| 1092 | + "type": "article", | |
| 1093 | + "authors": [ | |
| 1094 | + "Bourassa, Steven", | |
| 1095 | + "Cantoni, Eva", | |
| 1096 | + "Hoesli, Martin" | |
| 1097 | + ], | |
| 1098 | + "title": "Predicting House Prices with Spatial Dependence: A Comparison of Alternative Methods", | |
| 1099 | + "container": "Journal of Real Estate Research", | |
| 1100 | + "year": 2010, | |
| 1101 | + "volume": "32", | |
| 1102 | + "issue": "2", | |
| 1103 | + "pages": "139--160", | |
| 1104 | + "doi": "10.1080/10835547.2010.12091276", | |
| 1105 | + "url": "https://doi.org/10.1080/10835547.2010.12091276", | |
| 1106 | + "publisher": "Informa UK Limited", | |
| 1107 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1108 | + "verified": true, | |
| 1109 | + "notes": "" | |
| 1110 | + }, | |
| 1111 | + { | |
| 1112 | + "key": "pacehayunga2020residuals", | |
| 1113 | + "type": "article", | |
| 1114 | + "authors": [ | |
| 1115 | + "Pace, R. Kelley", | |
| 1116 | + "Hayunga, Darren" | |
| 1117 | + ], | |
| 1118 | + "title": "Examining the Information Content of Residuals from Hedonic and Spatial Models Using Trees and Forests", | |
| 1119 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 1120 | + "year": 2020, | |
| 1121 | + "volume": "60", | |
| 1122 | + "issue": "1-2", | |
| 1123 | + "pages": "170--180", | |
| 1124 | + "doi": "10.1007/s11146-019-09724-w", | |
| 1125 | + "url": "https://doi.org/10.1007/s11146-019-09724-w", | |
| 1126 | + "publisher": "Springer Science and Business Media LLC", | |
| 1127 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1128 | + "verified": true, | |
| 1129 | + "notes": "" | |
| 1130 | + }, | |
| 1131 | + { | |
| 1132 | + "key": "mayer2019updating", | |
| 1133 | + "type": "article", | |
| 1134 | + "authors": [ | |
| 1135 | + "Mayer, Michael", | |
| 1136 | + "Bourassa, Steven C.", | |
| 1137 | + "Hoesli, Martin", | |
| 1138 | + "Scognamiglio, Donato" | |
| 1139 | + ], | |
| 1140 | + "title": "Estimation and updating methods for hedonic valuation", | |
| 1141 | + "container": "Journal of European Real Estate Research", | |
| 1142 | + "year": 2019, | |
| 1143 | + "volume": "12", | |
| 1144 | + "issue": "1", | |
| 1145 | + "pages": "134--150", | |
| 1146 | + "doi": "10.1108/jerer-08-2018-0035", | |
| 1147 | + "url": "https://doi.org/10.1108/jerer-08-2018-0035", | |
| 1148 | + "publisher": "Emerald", | |
| 1149 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1150 | + "verified": true, | |
| 1151 | + "notes": "" | |
| 1152 | + }, | |
| 1153 | + { | |
| 1154 | + "key": "hu2019rental", | |
| 1155 | + "type": "article", | |
| 1156 | + "authors": [ | |
| 1157 | + "Hu, Lirong", | |
| 1158 | + "He, Shenjing", | |
| 1159 | + "Han, Zixuan", | |
| 1160 | + "Xiao, He", | |
| 1161 | + "Su, Shiliang", | |
| 1162 | + "Weng, Min", | |
| 1163 | + "Cai, Zhongliang" | |
| 1164 | + ], | |
| 1165 | + "title": "Monitoring housing rental prices based on social media: An integrated approach of machine-learning algorithms and hedonic modeling to inform equitable housing policies", | |
| 1166 | + "container": "Land Use Policy", | |
| 1167 | + "year": 2019, | |
| 1168 | + "volume": "82", | |
| 1169 | + "issue": null, | |
| 1170 | + "pages": "657--673", | |
| 1171 | + "doi": "10.1016/j.landusepol.2018.12.030", | |
| 1172 | + "url": "https://doi.org/10.1016/j.landusepol.2018.12.030", | |
| 1173 | + "publisher": "Elsevier BV", | |
| 1174 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1175 | + "verified": true, | |
| 1176 | + "notes": "Requested as 'Hu, Yang et al.'; actual authors Hu, He, Han, Xiao, Su, Weng. Crossref title lacks a space after the colon; corrected." | |
| 1177 | + }, | |
| 1178 | + { | |
| 1179 | + "key": "kok2017bigdata", | |
| 1180 | + "type": "article", | |
| 1181 | + "authors": [ | |
| 1182 | + "Kok, Nils", | |
| 1183 | + "Koponen, Eija-Leena", | |
| 1184 | + "Martínez-Barbosa, Carmen Adriana" | |
| 1185 | + ], | |
| 1186 | + "title": "Big Data in Real Estate? From Manual Appraisal to Automated Valuation", | |
| 1187 | + "container": "The Journal of Portfolio Management", | |
| 1188 | + "year": 2017, | |
| 1189 | + "volume": "43", | |
| 1190 | + "issue": "6", | |
| 1191 | + "pages": "202--211", | |
| 1192 | + "doi": "10.3905/jpm.2017.43.6.202", | |
| 1193 | + "url": "https://doi.org/10.3905/jpm.2017.43.6.202", | |
| 1194 | + "publisher": "With Intelligence LLC", | |
| 1195 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1196 | + "verified": true, | |
| 1197 | + "notes": "Crossref title contains HTML italics; flattened." | |
| 1198 | + }, | |
| 1199 | + { | |
| 1200 | + "key": "baldominos2018opportunities", | |
| 1201 | + "type": "article", | |
| 1202 | + "authors": [ | |
| 1203 | + "Baldominos, Alejandro", | |
| 1204 | + "Blanco, Iván", | |
| 1205 | + "Moreno, Antonio José", | |
| 1206 | + "Iturrarte, Rubén", | |
| 1207 | + "Bernárdez, Óscar", | |
| 1208 | + "Afonso, Carlos" | |
| 1209 | + ], | |
| 1210 | + "title": "Identifying Real Estate Opportunities Using Machine Learning", | |
| 1211 | + "container": "Applied Sciences", | |
| 1212 | + "year": 2018, | |
| 1213 | + "volume": "8", | |
| 1214 | + "issue": "11", | |
| 1215 | + "pages": "2321", | |
| 1216 | + "doi": "10.3390/app8112321", | |
| 1217 | + "url": "https://doi.org/10.3390/app8112321", | |
| 1218 | + "publisher": "MDPI AG", | |
| 1219 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1220 | + "verified": true, | |
| 1221 | + "notes": "" | |
| 1222 | + }, | |
| 1223 | + { | |
| 1224 | + "key": "hong2020randomforest", | |
| 1225 | + "type": "article", | |
| 1226 | + "authors": [ | |
| 1227 | + "Hong, Jengei", | |
| 1228 | + "Choi, Heeyoul", | |
| 1229 | + "Kim, Woo-sung" | |
| 1230 | + ], | |
| 1231 | + "title": "A house price valuation based on the random forest approach: The mass appraisal of residential property in South Korea", | |
| 1232 | + "container": "International Journal of Strategic Property Management", | |
| 1233 | + "year": 2020, | |
| 1234 | + "volume": "24", | |
| 1235 | + "issue": "3", | |
| 1236 | + "pages": "140--152", | |
| 1237 | + "doi": "10.3846/ijspm.2020.11544", | |
| 1238 | + "url": "https://doi.org/10.3846/ijspm.2020.11544", | |
| 1239 | + "publisher": "Vilnius Gediminas Technical University", | |
| 1240 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1241 | + "verified": true, | |
| 1242 | + "notes": "Crossref registers the title in capitals; converted to sentence case." | |
| 1243 | + }, | |
| 1244 | + { | |
| 1245 | + "key": "lorenz2023interpretable", | |
| 1246 | + "type": "article", | |
| 1247 | + "authors": [ | |
| 1248 | + "Lorenz, Felix", | |
| 1249 | + "Willwersch, Jonas", | |
| 1250 | + "Cajias, Marcelo", | |
| 1251 | + "Fuerst, Franz" | |
| 1252 | + ], | |
| 1253 | + "title": "Interpretable machine learning for real estate market analysis", | |
| 1254 | + "container": "Real Estate Economics", | |
| 1255 | + "year": 2023, | |
| 1256 | + "volume": "51", | |
| 1257 | + "issue": "5", | |
| 1258 | + "pages": "1178--1208", | |
| 1259 | + "doi": "10.1111/1540-6229.12397", | |
| 1260 | + "url": "https://doi.org/10.1111/1540-6229.12397", | |
| 1261 | + "publisher": "Wiley", | |
| 1262 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1263 | + "verified": true, | |
| 1264 | + "notes": "Online 2022; print issue 51(5), September 2023." | |
| 1265 | + }, | |
| 1266 | + { | |
| 1267 | + "key": "lenaers2023xai", | |
| 1268 | + "type": "article", | |
| 1269 | + "authors": [ | |
| 1270 | + "Lenaers, Ian", | |
| 1271 | + "De Moor, Lieven" | |
| 1272 | + ], | |
| 1273 | + "title": "Exploring XAI techniques for enhancing model transparency and interpretability in real estate rent prediction: A comparative study", | |
| 1274 | + "container": "Finance Research Letters", | |
| 1275 | + "year": 2023, | |
| 1276 | + "volume": "58", | |
| 1277 | + "issue": null, | |
| 1278 | + "pages": "104306", | |
| 1279 | + "doi": "10.1016/j.frl.2023.104306", | |
| 1280 | + "url": "https://doi.org/10.1016/j.frl.2023.104306", | |
| 1281 | + "publisher": "Elsevier BV", | |
| 1282 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1283 | + "verified": true, | |
| 1284 | + "notes": "Requested as 'Lenaers & De Moor (2023?)'; the 2023 paper is in Finance Research Letters 58, article 104306." | |
| 1285 | + }, | |
| 1286 | + { | |
| 1287 | + "key": "deppnercajias2024spatialcv", | |
| 1288 | + "type": "article", | |
| 1289 | + "authors": [ | |
| 1290 | + "Deppner, Juergen", | |
| 1291 | + "Cajias, Marcelo" | |
| 1292 | + ], | |
| 1293 | + "title": "Accounting for Spatial Autocorrelation in Algorithm-Driven Hedonic Models: A Spatial Cross-Validation Approach", | |
| 1294 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 1295 | + "year": 2024, | |
| 1296 | + "volume": "68", | |
| 1297 | + "issue": "2", | |
| 1298 | + "pages": "235--273", | |
| 1299 | + "doi": "10.1007/s11146-022-09915-y", | |
| 1300 | + "url": "https://doi.org/10.1007/s11146-022-09915-y", | |
| 1301 | + "publisher": "Springer Science and Business Media LLC", | |
| 1302 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1303 | + "verified": true, | |
| 1304 | + "notes": "Online 2022; print issue 68(2), February 2024." | |
| 1305 | + }, | |
| 1306 | + { | |
| 1307 | + "key": "boginshui2020rural", | |
| 1308 | + "type": "article", | |
| 1309 | + "authors": [ | |
| 1310 | + "Bogin, Alexander N.", | |
| 1311 | + "Shui, Jessica" | |
| 1312 | + ], | |
| 1313 | + "title": "Appraisal Accuracy and Automated Valuation Models in Rural Areas", | |
| 1314 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 1315 | + "year": 2020, | |
| 1316 | + "volume": "60", | |
| 1317 | + "issue": "1-2", | |
| 1318 | + "pages": "40--52", | |
| 1319 | + "doi": "10.1007/s11146-019-09712-0", | |
| 1320 | + "url": "https://doi.org/10.1007/s11146-019-09712-0", | |
| 1321 | + "publisher": "Springer Science and Business Media LLC", | |
| 1322 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1323 | + "verified": true, | |
| 1324 | + "notes": "A correction was published in JREFE 61(4), 730-731 (10.1007/s11146-019-09727-7)." | |
| 1325 | + }, | |
| 1326 | + { | |
| 1327 | + "key": "kang2021appreciation", | |
| 1328 | + "type": "article", | |
| 1329 | + "authors": [ | |
| 1330 | + "Kang, Yuhao", | |
| 1331 | + "Zhang, Fan", | |
| 1332 | + "Peng, Wenzhe", | |
| 1333 | + "Gao, Song", | |
| 1334 | + "Rao, Jinmeng", | |
| 1335 | + "Duarte, Fabio", | |
| 1336 | + "Ratti, Carlo" | |
| 1337 | + ], | |
| 1338 | + "title": "Understanding house price appreciation using multi-source big geo-data and machine learning", | |
| 1339 | + "container": "Land Use Policy", | |
| 1340 | + "year": 2021, | |
| 1341 | + "volume": "111", | |
| 1342 | + "issue": null, | |
| 1343 | + "pages": "104919", | |
| 1344 | + "doi": "10.1016/j.landusepol.2020.104919", | |
| 1345 | + "url": "https://doi.org/10.1016/j.landusepol.2020.104919", | |
| 1346 | + "publisher": "Elsevier BV", | |
| 1347 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1348 | + "verified": true, | |
| 1349 | + "notes": "" | |
| 1350 | + }, | |
| 1351 | + { | |
| 1352 | + "key": "pace1998spatiotemporal", | |
| 1353 | + "type": "article", | |
| 1354 | + "authors": [ | |
| 1355 | + "Pace, R. Kelley", | |
| 1356 | + "Barry, Ronald", | |
| 1357 | + "Clapp, John M.", | |
| 1358 | + "Rodriquez, Mauricio" | |
| 1359 | + ], | |
| 1360 | + "title": "Spatiotemporal Autoregressive Models of Neighborhood Effects", | |
| 1361 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 1362 | + "year": 1998, | |
| 1363 | + "volume": "17", | |
| 1364 | + "issue": "1", | |
| 1365 | + "pages": "15--33", | |
| 1366 | + "doi": "10.1023/a:1007799028599", | |
| 1367 | + "url": "https://doi.org/10.1023/a:1007799028599", | |
| 1368 | + "publisher": "Springer Science and Business Media LLC", | |
| 1369 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1370 | + "verified": true, | |
| 1371 | + "notes": "" | |
| 1372 | + }, | |
| 1373 | + { | |
| 1374 | + "key": "elhorst2014spatial", | |
| 1375 | + "type": "book", | |
| 1376 | + "authors": [ | |
| 1377 | + "Elhorst, J. Paul" | |
| 1378 | + ], | |
| 1379 | + "title": "Spatial Econometrics: From Cross-Sectional Data to Spatial Panels", | |
| 1380 | + "container": "Springer Berlin Heidelberg", | |
| 1381 | + "year": 2014, | |
| 1382 | + "volume": null, | |
| 1383 | + "issue": null, | |
| 1384 | + "pages": null, | |
| 1385 | + "doi": "10.1007/978-3-642-40340-8", | |
| 1386 | + "url": "https://doi.org/10.1007/978-3-642-40340-8", | |
| 1387 | + "publisher": "Springer Berlin Heidelberg", | |
| 1388 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1389 | + "verified": true, | |
| 1390 | + "notes": "Title + subtitle from Crossref record." | |
| 1391 | + }, | |
| 1392 | + { | |
| 1393 | + "key": "holly2011uk", | |
| 1394 | + "type": "article", | |
| 1395 | + "authors": [ | |
| 1396 | + "Holly, Sean", | |
| 1397 | + "Pesaran, M. Hashem", | |
| 1398 | + "Yamagata, Takashi" | |
| 1399 | + ], | |
| 1400 | + "title": "The spatial and temporal diffusion of house prices in the UK", | |
| 1401 | + "container": "Journal of Urban Economics", | |
| 1402 | + "year": 2011, | |
| 1403 | + "volume": "69", | |
| 1404 | + "issue": "1", | |
| 1405 | + "pages": "2--23", | |
| 1406 | + "doi": "10.1016/j.jue.2010.08.002", | |
| 1407 | + "url": "https://doi.org/10.1016/j.jue.2010.08.002", | |
| 1408 | + "publisher": "Elsevier BV", | |
| 1409 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1410 | + "verified": true, | |
| 1411 | + "notes": "Crossref registers the second author as 'Hashem Pesaran, M.'; normalised to Pesaran, M. Hashem." | |
| 1412 | + }, | |
| 1413 | + { | |
| 1414 | + "key": "brady2011diffusion", | |
| 1415 | + "type": "article", | |
| 1416 | + "authors": [ | |
| 1417 | + "Brady, Ryan R." | |
| 1418 | + ], | |
| 1419 | + "title": "Measuring the diffusion of housing prices across space and over time", | |
| 1420 | + "container": "Journal of Applied Econometrics", | |
| 1421 | + "year": 2011, | |
| 1422 | + "volume": "26", | |
| 1423 | + "issue": "2", | |
| 1424 | + "pages": "213--231", | |
| 1425 | + "doi": "10.1002/jae.1118", | |
| 1426 | + "url": "https://doi.org/10.1002/jae.1118", | |
| 1427 | + "publisher": "Wiley", | |
| 1428 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1429 | + "verified": true, | |
| 1430 | + "notes": "" | |
| 1431 | + }, | |
| 1432 | + { | |
| 1433 | + "key": "sijpfrancke2026laplacian", | |
| 1434 | + "type": "article", | |
| 1435 | + "authors": [ | |
| 1436 | + "Sijp, Willem P", | |
| 1437 | + "Francke, Marc K." | |
| 1438 | + ], | |
| 1439 | + "title": "Graph‐Laplacian modeling of spatiotemporal effects for house price estimation", | |
| 1440 | + "container": "Real Estate Economics", | |
| 1441 | + "year": 2026, | |
| 1442 | + "volume": null, | |
| 1443 | + "issue": null, | |
| 1444 | + "pages": null, | |
| 1445 | + "doi": "10.1111/1540-6229.70062", | |
| 1446 | + "url": "https://doi.org/10.1111/1540-6229.70062", | |
| 1447 | + "publisher": "Wiley", | |
| 1448 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1449 | + "verified": true, | |
| 1450 | + "notes": "Early-view article (published online 2026-06-27), article number 1540-6229.70062; no volume/issue/pages yet." | |
| 1451 | + }, | |
| 1452 | + { | |
| 1453 | + "key": "kipfwelling2017gcn", | |
| 1454 | + "type": "inproceedings", | |
| 1455 | + "authors": [ | |
| 1456 | + "Kipf, Thomas N.", | |
| 1457 | + "Welling, Max" | |
| 1458 | + ], | |
| 1459 | + "title": "Semi-Supervised Classification with Graph Convolutional Networks", | |
| 1460 | + "container": "Proceedings of the 5th International Conference on Learning Representations (ICLR 2017)", | |
| 1461 | + "year": 2017, | |
| 1462 | + "volume": null, | |
| 1463 | + "issue": null, | |
| 1464 | + "pages": null, | |
| 1465 | + "doi": null, | |
| 1466 | + "url": "https://arxiv.org/abs/1609.02907", | |
| 1467 | + "publisher": null, | |
| 1468 | + "verification_source": "arXiv API (id 1609.02907; comment 'Published as a conference paper at ICLR 2017')", | |
| 1469 | + "verified": true, | |
| 1470 | + "notes": "" | |
| 1471 | + }, | |
| 1472 | + { | |
| 1473 | + "key": "velickovic2018gat", | |
| 1474 | + "type": "inproceedings", | |
| 1475 | + "authors": [ | |
| 1476 | + "Veličković, Petar", | |
| 1477 | + "Cucurull, Guillem", | |
| 1478 | + "Casanova, Arantxa", | |
| 1479 | + "Romero, Adriana", | |
| 1480 | + "Liò, Pietro", | |
| 1481 | + "Bengio, Yoshua" | |
| 1482 | + ], | |
| 1483 | + "title": "Graph Attention Networks", | |
| 1484 | + "container": "Proceedings of the 6th International Conference on Learning Representations (ICLR 2018)", | |
| 1485 | + "year": 2018, | |
| 1486 | + "volume": null, | |
| 1487 | + "issue": null, | |
| 1488 | + "pages": null, | |
| 1489 | + "doi": null, | |
| 1490 | + "url": "https://arxiv.org/abs/1710.10903", | |
| 1491 | + "publisher": null, | |
| 1492 | + "verification_source": "arXiv API (id 1710.10903; comment 'To appear at ICLR 2018')", | |
| 1493 | + "verified": true, | |
| 1494 | + "notes": "" | |
| 1495 | + }, | |
| 1496 | + { | |
| 1497 | + "key": "wu2019graphwavenet", | |
| 1498 | + "type": "inproceedings", | |
| 1499 | + "authors": [ | |
| 1500 | + "Wu, Zonghan", | |
| 1501 | + "Pan, Shirui", | |
| 1502 | + "Long, Guodong", | |
| 1503 | + "Jiang, Jing", | |
| 1504 | + "Zhang, Chengqi" | |
| 1505 | + ], | |
| 1506 | + "title": "Graph WaveNet for Deep Spatial-Temporal Graph Modeling", | |
| 1507 | + "container": "Proceedings of the Twenty-Eighth International Joint Conference on Artificial Intelligence (IJCAI-19)", | |
| 1508 | + "year": 2019, | |
| 1509 | + "volume": null, | |
| 1510 | + "issue": null, | |
| 1511 | + "pages": "1907--1913", | |
| 1512 | + "doi": "10.24963/ijcai.2019/264", | |
| 1513 | + "url": "https://doi.org/10.24963/ijcai.2019/264", | |
| 1514 | + "publisher": "International Joint Conferences on Artificial Intelligence Organization", | |
| 1515 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1516 | + "verified": true, | |
| 1517 | + "notes": "" | |
| 1518 | + }, | |
| 1519 | + { | |
| 1520 | + "key": "li2018dcrnn", | |
| 1521 | + "type": "inproceedings", | |
| 1522 | + "authors": [ | |
| 1523 | + "Li, Yaguang", | |
| 1524 | + "Yu, Rose", | |
| 1525 | + "Shahabi, Cyrus", | |
| 1526 | + "Liu, Yan" | |
| 1527 | + ], | |
| 1528 | + "title": "Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting", | |
| 1529 | + "container": "Proceedings of the 6th International Conference on Learning Representations (ICLR 2018)", | |
| 1530 | + "year": 2018, | |
| 1531 | + "volume": null, | |
| 1532 | + "issue": null, | |
| 1533 | + "pages": null, | |
| 1534 | + "doi": null, | |
| 1535 | + "url": "https://arxiv.org/abs/1707.01926", | |
| 1536 | + "publisher": null, | |
| 1537 | + "verification_source": "arXiv API (id 1707.01926; comment 'Published as a conference paper at ICLR 2018')", | |
| 1538 | + "verified": true, | |
| 1539 | + "notes": "" | |
| 1540 | + }, | |
| 1541 | + { | |
| 1542 | + "key": "yu2018stgcn", | |
| 1543 | + "type": "inproceedings", | |
| 1544 | + "authors": [ | |
| 1545 | + "Yu, Bing", | |
| 1546 | + "Yin, Haoteng", | |
| 1547 | + "Zhu, Zhanxing" | |
| 1548 | + ], | |
| 1549 | + "title": "Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting", | |
| 1550 | + "container": "Proceedings of the Twenty-Seventh International Joint Conference on Artificial Intelligence (IJCAI-18)", | |
| 1551 | + "year": 2018, | |
| 1552 | + "volume": null, | |
| 1553 | + "issue": null, | |
| 1554 | + "pages": "3634--3640", | |
| 1555 | + "doi": "10.24963/ijcai.2018/505", | |
| 1556 | + "url": "https://doi.org/10.24963/ijcai.2018/505", | |
| 1557 | + "publisher": "International Joint Conferences on Artificial Intelligence Organization", | |
| 1558 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1559 | + "verified": true, | |
| 1560 | + "notes": "" | |
| 1561 | + }, | |
| 1562 | + { | |
| 1563 | + "key": "bai2020agcrn", | |
| 1564 | + "type": "inproceedings", | |
| 1565 | + "authors": [ | |
| 1566 | + "Bai, Lei", | |
| 1567 | + "Yao, Lina", | |
| 1568 | + "Li, Can", | |
| 1569 | + "Wang, Xianzhi", | |
| 1570 | + "Wang, Can" | |
| 1571 | + ], | |
| 1572 | + "title": "Adaptive Graph Convolutional Recurrent Network for Traffic Forecasting", | |
| 1573 | + "container": "Advances in Neural Information Processing Systems 33 (NeurIPS 2020)", | |
| 1574 | + "year": 2020, | |
| 1575 | + "volume": null, | |
| 1576 | + "issue": null, | |
| 1577 | + "pages": null, | |
| 1578 | + "doi": null, | |
| 1579 | + "url": "https://proceedings.neurips.cc/paper/2020/hash/ce1aad92b939420fc17005e5461e6f48-Abstract.html", | |
| 1580 | + "publisher": null, | |
| 1581 | + "verification_source": "proceedings.neurips.cc abstract page (fetched 2026-10-21) + arXiv API 2007.02842", | |
| 1582 | + "verified": true, | |
| 1583 | + "notes": "" | |
| 1584 | + }, | |
| 1585 | + { | |
| 1586 | + "key": "wu2021gnnsurvey", | |
| 1587 | + "type": "article", | |
| 1588 | + "authors": [ | |
| 1589 | + "Wu, Zonghan", | |
| 1590 | + "Pan, Shirui", | |
| 1591 | + "Chen, Fengwen", | |
| 1592 | + "Long, Guodong", | |
| 1593 | + "Zhang, Chengqi", | |
| 1594 | + "Yu, Philip S." | |
| 1595 | + ], | |
| 1596 | + "title": "A Comprehensive Survey on Graph Neural Networks", | |
| 1597 | + "container": "IEEE Transactions on Neural Networks and Learning Systems", | |
| 1598 | + "year": 2021, | |
| 1599 | + "volume": "32", | |
| 1600 | + "issue": "1", | |
| 1601 | + "pages": "4--24", | |
| 1602 | + "doi": "10.1109/tnnls.2020.2978386", | |
| 1603 | + "url": "https://doi.org/10.1109/tnnls.2020.2978386", | |
| 1604 | + "publisher": "Institute of Electrical and Electronics Engineers (IEEE)", | |
| 1605 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1606 | + "verified": true, | |
| 1607 | + "notes": "" | |
| 1608 | + }, | |
| 1609 | + { | |
| 1610 | + "key": "jin2024urbanstgnn", | |
| 1611 | + "type": "article", | |
| 1612 | + "authors": [ | |
| 1613 | + "Jin, Guangyin", | |
| 1614 | + "Liang, Yuxuan", | |
| 1615 | + "Fang, Yuchen", | |
| 1616 | + "Shao, Zezhi", | |
| 1617 | + "Huang, Jincai", | |
| 1618 | + "Zhang, Junbo", | |
| 1619 | + "Zheng, Yu" | |
| 1620 | + ], | |
| 1621 | + "title": "Spatio-Temporal Graph Neural Networks for Predictive Learning in Urban Computing: A Survey", | |
| 1622 | + "container": "IEEE Transactions on Knowledge and Data Engineering", | |
| 1623 | + "year": 2024, | |
| 1624 | + "volume": "36", | |
| 1625 | + "issue": "10", | |
| 1626 | + "pages": "5388--5408", | |
| 1627 | + "doi": "10.1109/tkde.2023.3333824", | |
| 1628 | + "url": "https://doi.org/10.1109/tkde.2023.3333824", | |
| 1629 | + "publisher": "Institute of Electrical and Electronics Engineers (IEEE)", | |
| 1630 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1631 | + "verified": true, | |
| 1632 | + "notes": "" | |
| 1633 | + }, | |
| 1634 | + { | |
| 1635 | + "key": "jin2024tsgnnsurvey", | |
| 1636 | + "type": "article", | |
| 1637 | + "authors": [ | |
| 1638 | + "Jin, Ming", | |
| 1639 | + "Koh, Huan Yee", | |
| 1640 | + "Wen, Qingsong", | |
| 1641 | + "Zambon, Daniele", | |
| 1642 | + "Alippi, Cesare", | |
| 1643 | + "Webb, Geoffrey I.", | |
| 1644 | + "King, Irwin", | |
| 1645 | + "Pan, Shirui" | |
| 1646 | + ], | |
| 1647 | + "title": "A Survey on Graph Neural Networks for Time Series: Forecasting, Classification, Imputation, and Anomaly Detection", | |
| 1648 | + "container": "IEEE Transactions on Pattern Analysis and Machine Intelligence", | |
| 1649 | + "year": 2024, | |
| 1650 | + "volume": "46", | |
| 1651 | + "issue": "12", | |
| 1652 | + "pages": "10466--10485", | |
| 1653 | + "doi": "10.1109/tpami.2024.3443141", | |
| 1654 | + "url": "https://doi.org/10.1109/tpami.2024.3443141", | |
| 1655 | + "publisher": "Institute of Electrical and Electronics Engineers (IEEE)", | |
| 1656 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1657 | + "verified": true, | |
| 1658 | + "notes": "Requested as 'Jin et al. (2023/2024) survey ... (IEEE TPAMI?)': confirmed TPAMI 46(12), 2024. The urban-computing STGNN survey by a different Jin (Guangyin) is in TKDE 36(10), 2024 (jin2024urbanstgnn)." | |
| 1659 | + }, | |
| 1660 | + { | |
| 1661 | + "key": "viana2021attention", | |
| 1662 | + "type": "inproceedings", | |
| 1663 | + "authors": [ | |
| 1664 | + "Viana, Darniton", | |
| 1665 | + "Barbosa, Luciano" | |
| 1666 | + ], | |
| 1667 | + "title": "Attention-Based Spatial Interpolation for House Price Prediction", | |
| 1668 | + "container": "Proceedings of the 29th International Conference on Advances in Geographic Information Systems (SIGSPATIAL '21)", | |
| 1669 | + "year": 2021, | |
| 1670 | + "volume": null, | |
| 1671 | + "issue": null, | |
| 1672 | + "pages": "540--549", | |
| 1673 | + "doi": "10.1145/3474717.3484257", | |
| 1674 | + "url": "https://doi.org/10.1145/3474717.3484257", | |
| 1675 | + "publisher": "ACM", | |
| 1676 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1677 | + "verified": true, | |
| 1678 | + "notes": "" | |
| 1679 | + }, | |
| 1680 | + { | |
| 1681 | + "key": "zhang2021mugrep", | |
| 1682 | + "type": "inproceedings", | |
| 1683 | + "authors": [ | |
| 1684 | + "Zhang, Weijia", | |
| 1685 | + "Liu, Hao", | |
| 1686 | + "Zha, Lijun", | |
| 1687 | + "Zhu, Hengshu", | |
| 1688 | + "Liu, Ji", | |
| 1689 | + "Dou, Dejing", | |
| 1690 | + "Xiong, Hui" | |
| 1691 | + ], | |
| 1692 | + "title": "MugRep: A Multi-Task Hierarchical Graph Representation Learning Framework for Real Estate Appraisal", | |
| 1693 | + "container": "Proceedings of the 27th ACM SIGKDD Conference on Knowledge Discovery and Data Mining (KDD '21)", | |
| 1694 | + "year": 2021, | |
| 1695 | + "volume": null, | |
| 1696 | + "issue": null, | |
| 1697 | + "pages": "3937--3947", | |
| 1698 | + "doi": "10.1145/3447548.3467187", | |
| 1699 | + "url": "https://doi.org/10.1145/3447548.3467187", | |
| 1700 | + "publisher": "ACM", | |
| 1701 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1702 | + "verified": true, | |
| 1703 | + "notes": "" | |
| 1704 | + }, | |
| 1705 | + { | |
| 1706 | + "key": "das2021gsne", | |
| 1707 | + "type": "article", | |
| 1708 | + "authors": [ | |
| 1709 | + "Das, Sarkar Snigdha Sarathi", | |
| 1710 | + "Ali, Mohammed Eunus", | |
| 1711 | + "Li, Yuan-Fang", | |
| 1712 | + "Kang, Yong-Bin", | |
| 1713 | + "Sellis, Timos" | |
| 1714 | + ], | |
| 1715 | + "title": "Boosting house price predictions using geo-spatial network embedding", | |
| 1716 | + "container": "Data Mining and Knowledge Discovery", | |
| 1717 | + "year": 2021, | |
| 1718 | + "volume": "35", | |
| 1719 | + "issue": "6", | |
| 1720 | + "pages": "2221--2250", | |
| 1721 | + "doi": "10.1007/s10618-021-00789-x", | |
| 1722 | + "url": "https://doi.org/10.1007/s10618-021-00789-x", | |
| 1723 | + "publisher": "Springer Science and Business Media LLC", | |
| 1724 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1725 | + "verified": true, | |
| 1726 | + "notes": "" | |
| 1727 | + }, | |
| 1728 | + { | |
| 1729 | + "key": "bin2019peer", | |
| 1730 | + "type": "article", | |
| 1731 | + "authors": [ | |
| 1732 | + "Bin, Junchi", | |
| 1733 | + "Gardiner, Bryan", | |
| 1734 | + "Li, Eric", | |
| 1735 | + "Liu, Zheng" | |
| 1736 | + ], | |
| 1737 | + "title": "Peer-Dependence Valuation Model for Real Estate Appraisal", | |
| 1738 | + "container": "Data-Enabled Discovery and Applications", | |
| 1739 | + "year": 2019, | |
| 1740 | + "volume": "3", | |
| 1741 | + "issue": "1", | |
| 1742 | + "pages": "2", | |
| 1743 | + "doi": "10.1007/s41688-018-0027-0", | |
| 1744 | + "url": "https://doi.org/10.1007/s41688-018-0027-0", | |
| 1745 | + "publisher": "Springer Science and Business Media LLC", | |
| 1746 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1747 | + "verified": true, | |
| 1748 | + "notes": "Article number 2 (no page range registered)." | |
| 1749 | + }, | |
| 1750 | + { | |
| 1751 | + "key": "yang2022gcnvaluation", | |
| 1752 | + "type": "article", | |
| 1753 | + "authors": [ | |
| 1754 | + "Yang, Zongyan", | |
| 1755 | + "Hong, Zhonghua", | |
| 1756 | + "Zhou, Ruyan", | |
| 1757 | + "Ai, Hong" | |
| 1758 | + ], | |
| 1759 | + "title": "Graph Convolutional Network-Based Model for Megacity Real Estate Valuation", | |
| 1760 | + "container": "IEEE Access", | |
| 1761 | + "year": 2022, | |
| 1762 | + "volume": "10", | |
| 1763 | + "issue": null, | |
| 1764 | + "pages": "104811--104828", | |
| 1765 | + "doi": "10.1109/access.2022.3210281", | |
| 1766 | + "url": "https://doi.org/10.1109/access.2022.3210281", | |
| 1767 | + "publisher": "Institute of Electrical and Electronics Engineers (IEEE)", | |
| 1768 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1769 | + "verified": true, | |
| 1770 | + "notes": "" | |
| 1771 | + }, | |
| 1772 | + { | |
| 1773 | + "key": "wang2022gnnwrhouse", | |
| 1774 | + "type": "article", | |
| 1775 | + "authors": [ | |
| 1776 | + "Wang, Zimo", | |
| 1777 | + "Wang, Yicheng", | |
| 1778 | + "Wu, Sensen", | |
| 1779 | + "Du, Zhenhong" | |
| 1780 | + ], | |
| 1781 | + "title": "House Price Valuation Model Based on Geographically Neural Network Weighted Regression: The Case Study of Shenzhen, China", | |
| 1782 | + "container": "ISPRS International Journal of Geo-Information", | |
| 1783 | + "year": 2022, | |
| 1784 | + "volume": "11", | |
| 1785 | + "issue": "8", | |
| 1786 | + "pages": "450", | |
| 1787 | + "doi": "10.3390/ijgi11080450", | |
| 1788 | + "url": "https://doi.org/10.3390/ijgi11080450", | |
| 1789 | + "publisher": "MDPI AG", | |
| 1790 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1791 | + "verified": true, | |
| 1792 | + "notes": "" | |
| 1793 | + }, | |
| 1794 | + { | |
| 1795 | + "key": "du2020gnnwr", | |
| 1796 | + "type": "article", | |
| 1797 | + "authors": [ | |
| 1798 | + "Du, Zhenhong", | |
| 1799 | + "Wang, Zhongyi", | |
| 1800 | + "Wu, Sensen", | |
| 1801 | + "Zhang, Feng", | |
| 1802 | + "Liu, Renyi" | |
| 1803 | + ], | |
| 1804 | + "title": "Geographically neural network weighted regression for the accurate estimation of spatial non-stationarity", | |
| 1805 | + "container": "International Journal of Geographical Information Science", | |
| 1806 | + "year": 2020, | |
| 1807 | + "volume": "34", | |
| 1808 | + "issue": "7", | |
| 1809 | + "pages": "1353--1377", | |
| 1810 | + "doi": "10.1080/13658816.2019.1707834", | |
| 1811 | + "url": "https://doi.org/10.1080/13658816.2019.1707834", | |
| 1812 | + "publisher": "Informa UK Limited", | |
| 1813 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1814 | + "verified": true, | |
| 1815 | + "notes": "" | |
| 1816 | + }, | |
| 1817 | + { | |
| 1818 | + "key": "guo2026heteroroadnet", | |
| 1819 | + "type": "article", | |
| 1820 | + "authors": [ | |
| 1821 | + "Guo, Yameng", | |
| 1822 | + "vanden Broucke, Seppe" | |
| 1823 | + ], | |
| 1824 | + "title": "HeteroRoadNet: A Heterogenous Road-based Graph Neural Network Approach for Property Price Prediction", | |
| 1825 | + "container": "ACM Transactions on Spatial Algorithms and Systems", | |
| 1826 | + "year": 2026, | |
| 1827 | + "volume": "12", | |
| 1828 | + "issue": "3", | |
| 1829 | + "pages": "1--21", | |
| 1830 | + "doi": "10.1145/3785326", | |
| 1831 | + "url": "https://doi.org/10.1145/3785326", | |
| 1832 | + "publisher": "Association for Computing Machinery (ACM)", | |
| 1833 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1834 | + "verified": true, | |
| 1835 | + "notes": "" | |
| 1836 | + }, | |
| 1837 | + { | |
| 1838 | + "key": "hochreiter1997lstm", | |
| 1839 | + "type": "article", | |
| 1840 | + "authors": [ | |
| 1841 | + "Hochreiter, Sepp", | |
| 1842 | + "Schmidhuber, Jürgen" | |
| 1843 | + ], | |
| 1844 | + "title": "Long Short-Term Memory", | |
| 1845 | + "container": "Neural Computation", | |
| 1846 | + "year": 1997, | |
| 1847 | + "volume": "9", | |
| 1848 | + "issue": "8", | |
| 1849 | + "pages": "1735--1780", | |
| 1850 | + "doi": "10.1162/neco.1997.9.8.1735", | |
| 1851 | + "url": "https://doi.org/10.1162/neco.1997.9.8.1735", | |
| 1852 | + "publisher": "MIT Press", | |
| 1853 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1854 | + "verified": true, | |
| 1855 | + "notes": "" | |
| 1856 | + }, | |
| 1857 | + { | |
| 1858 | + "key": "cho2014gru", | |
| 1859 | + "type": "inproceedings", | |
| 1860 | + "authors": [ | |
| 1861 | + "Cho, Kyunghyun", | |
| 1862 | + "van Merrienboer, Bart", | |
| 1863 | + "Gulcehre, Caglar", | |
| 1864 | + "Bahdanau, Dzmitry", | |
| 1865 | + "Bougares, Fethi", | |
| 1866 | + "Schwenk, Holger", | |
| 1867 | + "Bengio, Yoshua" | |
| 1868 | + ], | |
| 1869 | + "title": "Learning Phrase Representations using RNN Encoder--Decoder for Statistical Machine Translation", | |
| 1870 | + "container": "Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP)", | |
| 1871 | + "year": 2014, | |
| 1872 | + "volume": null, | |
| 1873 | + "issue": null, | |
| 1874 | + "pages": "1724--1734", | |
| 1875 | + "doi": "10.3115/v1/d14-1179", | |
| 1876 | + "url": "https://doi.org/10.3115/v1/d14-1179", | |
| 1877 | + "publisher": "Association for Computational Linguistics", | |
| 1878 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1879 | + "verified": true, | |
| 1880 | + "notes": "" | |
| 1881 | + }, | |
| 1882 | + { | |
| 1883 | + "key": "bai2018tcn", | |
| 1884 | + "type": "misc", | |
| 1885 | + "authors": [ | |
| 1886 | + "Bai, Shaojie", | |
| 1887 | + "Kolter, J. Zico", | |
| 1888 | + "Koltun, Vladlen" | |
| 1889 | + ], | |
| 1890 | + "title": "An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling", | |
| 1891 | + "container": null, | |
| 1892 | + "year": 2018, | |
| 1893 | + "volume": null, | |
| 1894 | + "issue": null, | |
| 1895 | + "pages": null, | |
| 1896 | + "doi": null, | |
| 1897 | + "url": "https://arxiv.org/abs/1803.01271", | |
| 1898 | + "publisher": null, | |
| 1899 | + "verification_source": "arXiv API (id 1803.01271, v2 2018-04-19)", | |
| 1900 | + "verified": true, | |
| 1901 | + "notes": "arXiv-only preprint (no peer-reviewed version located)." | |
| 1902 | + }, | |
| 1903 | + { | |
| 1904 | + "key": "lim2021tft", | |
| 1905 | + "type": "article", | |
| 1906 | + "authors": [ | |
| 1907 | + "Lim, Bryan", | |
| 1908 | + "Arık, Sercan Ö.", | |
| 1909 | + "Loeff, Nicolas", | |
| 1910 | + "Pfister, Tomas" | |
| 1911 | + ], | |
| 1912 | + "title": "Temporal Fusion Transformers for interpretable multi-horizon time series forecasting", | |
| 1913 | + "container": "International Journal of Forecasting", | |
| 1914 | + "year": 2021, | |
| 1915 | + "volume": "37", | |
| 1916 | + "issue": "4", | |
| 1917 | + "pages": "1748--1764", | |
| 1918 | + "doi": "10.1016/j.ijforecast.2021.03.012", | |
| 1919 | + "url": "https://doi.org/10.1016/j.ijforecast.2021.03.012", | |
| 1920 | + "publisher": "Elsevier BV", | |
| 1921 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1922 | + "verified": true, | |
| 1923 | + "notes": "" | |
| 1924 | + }, | |
| 1925 | + { | |
| 1926 | + "key": "oreshkin2020nbeats", | |
| 1927 | + "type": "inproceedings", | |
| 1928 | + "authors": [ | |
| 1929 | + "Oreshkin, Boris N.", | |
| 1930 | + "Carpov, Dmitri", | |
| 1931 | + "Chapados, Nicolas", | |
| 1932 | + "Bengio, Yoshua" | |
| 1933 | + ], | |
| 1934 | + "title": "N-BEATS: Neural basis expansion analysis for interpretable time series forecasting", | |
| 1935 | + "container": "Proceedings of the 8th International Conference on Learning Representations (ICLR 2020)", | |
| 1936 | + "year": 2020, | |
| 1937 | + "volume": null, | |
| 1938 | + "issue": null, | |
| 1939 | + "pages": null, | |
| 1940 | + "doi": null, | |
| 1941 | + "url": "https://arxiv.org/abs/1905.10437", | |
| 1942 | + "publisher": null, | |
| 1943 | + "verification_source": "arXiv API (id 1905.10437, v4 2020-02-20) + Semantic Scholar API (publicationVenue: International Conference on Learning Representations)", | |
| 1944 | + "verified": true, | |
| 1945 | + "notes": "OpenReview blocked automated access; ICLR venue taken from Semantic Scholar." | |
| 1946 | + }, | |
| 1947 | + { | |
| 1948 | + "key": "salinas2020deepar", | |
| 1949 | + "type": "article", | |
| 1950 | + "authors": [ | |
| 1951 | + "Salinas, David", | |
| 1952 | + "Flunkert, Valentin", | |
| 1953 | + "Gasthaus, Jan", | |
| 1954 | + "Januschowski, Tim" | |
| 1955 | + ], | |
| 1956 | + "title": "DeepAR: Probabilistic forecasting with autoregressive recurrent networks", | |
| 1957 | + "container": "International Journal of Forecasting", | |
| 1958 | + "year": 2020, | |
| 1959 | + "volume": "36", | |
| 1960 | + "issue": "3", | |
| 1961 | + "pages": "1181--1191", | |
| 1962 | + "doi": "10.1016/j.ijforecast.2019.07.001", | |
| 1963 | + "url": "https://doi.org/10.1016/j.ijforecast.2019.07.001", | |
| 1964 | + "publisher": "Elsevier BV", | |
| 1965 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1966 | + "verified": true, | |
| 1967 | + "notes": "" | |
| 1968 | + }, | |
| 1969 | + { | |
| 1970 | + "key": "zeng2023transformers", | |
| 1971 | + "type": "inproceedings", | |
| 1972 | + "authors": [ | |
| 1973 | + "Zeng, Ailing", | |
| 1974 | + "Chen, Muxi", | |
| 1975 | + "Zhang, Lei", | |
| 1976 | + "Xu, Qiang" | |
| 1977 | + ], | |
| 1978 | + "title": "Are Transformers Effective for Time Series Forecasting?", | |
| 1979 | + "container": "Proceedings of the AAAI Conference on Artificial Intelligence", | |
| 1980 | + "year": 2023, | |
| 1981 | + "volume": "37", | |
| 1982 | + "issue": "9", | |
| 1983 | + "pages": "11121--11128", | |
| 1984 | + "doi": "10.1609/aaai.v37i9.26317", | |
| 1985 | + "url": "https://doi.org/10.1609/aaai.v37i9.26317", | |
| 1986 | + "publisher": "Association for the Advancement of Artificial Intelligence (AAAI)", | |
| 1987 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 1988 | + "verified": true, | |
| 1989 | + "notes": " In the .bib the AAAI volume/number are placed in the note field because aer.bst rejects volume+number on @inproceedings." | |
| 1990 | + }, | |
| 1991 | + { | |
| 1992 | + "key": "makridakis2020m4", | |
| 1993 | + "type": "article", | |
| 1994 | + "authors": [ | |
| 1995 | + "Makridakis, Spyros", | |
| 1996 | + "Spiliotis, Evangelos", | |
| 1997 | + "Assimakopoulos, Vassilios" | |
| 1998 | + ], | |
| 1999 | + "title": "The M4 Competition: 100,000 time series and 61 forecasting methods", | |
| 2000 | + "container": "International Journal of Forecasting", | |
| 2001 | + "year": 2020, | |
| 2002 | + "volume": "36", | |
| 2003 | + "issue": "1", | |
| 2004 | + "pages": "54--74", | |
| 2005 | + "doi": "10.1016/j.ijforecast.2019.04.014", | |
| 2006 | + "url": "https://doi.org/10.1016/j.ijforecast.2019.04.014", | |
| 2007 | + "publisher": "Elsevier BV", | |
| 2008 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2009 | + "verified": true, | |
| 2010 | + "notes": "" | |
| 2011 | + }, | |
| 2012 | + { | |
| 2013 | + "key": "makridakis2022m5accuracy", | |
| 2014 | + "type": "article", | |
| 2015 | + "authors": [ | |
| 2016 | + "Makridakis, Spyros", | |
| 2017 | + "Spiliotis, Evangelos", | |
| 2018 | + "Assimakopoulos, Vassilios" | |
| 2019 | + ], | |
| 2020 | + "title": "M5 accuracy competition: Results, findings, and conclusions", | |
| 2021 | + "container": "International Journal of Forecasting", | |
| 2022 | + "year": 2022, | |
| 2023 | + "volume": "38", | |
| 2024 | + "issue": "4", | |
| 2025 | + "pages": "1346--1364", | |
| 2026 | + "doi": "10.1016/j.ijforecast.2021.11.013", | |
| 2027 | + "url": "https://doi.org/10.1016/j.ijforecast.2021.11.013", | |
| 2028 | + "publisher": "Elsevier BV", | |
| 2029 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2030 | + "verified": true, | |
| 2031 | + "notes": "" | |
| 2032 | + }, | |
| 2033 | + { | |
| 2034 | + "key": "makridakis2022m5uncertainty", | |
| 2035 | + "type": "article", | |
| 2036 | + "authors": [ | |
| 2037 | + "Makridakis, Spyros", | |
| 2038 | + "Spiliotis, Evangelos", | |
| 2039 | + "Assimakopoulos, Vassilios", | |
| 2040 | + "Chen, Zhi", | |
| 2041 | + "Gaba, Anil", | |
| 2042 | + "Tsetlin, Ilia", | |
| 2043 | + "Winkler, Robert L." | |
| 2044 | + ], | |
| 2045 | + "title": "The M5 uncertainty competition: Results, findings and conclusions", | |
| 2046 | + "container": "International Journal of Forecasting", | |
| 2047 | + "year": 2022, | |
| 2048 | + "volume": "38", | |
| 2049 | + "issue": "4", | |
| 2050 | + "pages": "1365--1385", | |
| 2051 | + "doi": "10.1016/j.ijforecast.2021.10.009", | |
| 2052 | + "url": "https://doi.org/10.1016/j.ijforecast.2021.10.009", | |
| 2053 | + "publisher": "Elsevier BV", | |
| 2054 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2055 | + "verified": true, | |
| 2056 | + "notes": "" | |
| 2057 | + }, | |
| 2058 | + { | |
| 2059 | + "key": "nie2023patchtst", | |
| 2060 | + "type": "inproceedings", | |
| 2061 | + "authors": [ | |
| 2062 | + "Nie, Yuqi", | |
| 2063 | + "Nguyen, Nam H.", | |
| 2064 | + "Sinthong, Phanwadee", | |
| 2065 | + "Kalagnanam, Jayant" | |
| 2066 | + ], | |
| 2067 | + "title": "A Time Series is Worth 64 Words: Long-term Forecasting with Transformers", | |
| 2068 | + "container": "Proceedings of the 11th International Conference on Learning Representations (ICLR 2023)", | |
| 2069 | + "year": 2023, | |
| 2070 | + "volume": null, | |
| 2071 | + "issue": null, | |
| 2072 | + "pages": null, | |
| 2073 | + "doi": null, | |
| 2074 | + "url": "https://arxiv.org/abs/2211.14730", | |
| 2075 | + "publisher": null, | |
| 2076 | + "verification_source": "arXiv API (id 2211.14730; comment 'Accepted by ICLR 2023')", | |
| 2077 | + "verified": true, | |
| 2078 | + "notes": "" | |
| 2079 | + }, | |
| 2080 | + { | |
| 2081 | + "key": "gneitingraftery2007scoring", | |
| 2082 | + "type": "article", | |
| 2083 | + "authors": [ | |
| 2084 | + "Gneiting, Tilmann", | |
| 2085 | + "Raftery, Adrian E" | |
| 2086 | + ], | |
| 2087 | + "title": "Strictly Proper Scoring Rules, Prediction, and Estimation", | |
| 2088 | + "container": "Journal of the American Statistical Association", | |
| 2089 | + "year": 2007, | |
| 2090 | + "volume": "102", | |
| 2091 | + "issue": "477", | |
| 2092 | + "pages": "359--378", | |
| 2093 | + "doi": "10.1198/016214506000001437", | |
| 2094 | + "url": "https://doi.org/10.1198/016214506000001437", | |
| 2095 | + "publisher": "Informa UK Limited", | |
| 2096 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2097 | + "verified": true, | |
| 2098 | + "notes": "" | |
| 2099 | + }, | |
| 2100 | + { | |
| 2101 | + "key": "gneiting2007calibration", | |
| 2102 | + "type": "article", | |
| 2103 | + "authors": [ | |
| 2104 | + "Gneiting, Tilmann", | |
| 2105 | + "Balabdaoui, Fadoua", | |
| 2106 | + "Raftery, Adrian E." | |
| 2107 | + ], | |
| 2108 | + "title": "Probabilistic Forecasts, Calibration and Sharpness", | |
| 2109 | + "container": "Journal of the Royal Statistical Society: Series B (Statistical Methodology)", | |
| 2110 | + "year": 2007, | |
| 2111 | + "volume": "69", | |
| 2112 | + "issue": "2", | |
| 2113 | + "pages": "243--268", | |
| 2114 | + "doi": "10.1111/j.1467-9868.2007.00587.x", | |
| 2115 | + "url": "https://doi.org/10.1111/j.1467-9868.2007.00587.x", | |
| 2116 | + "publisher": "Oxford University Press (OUP)", | |
| 2117 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2118 | + "verified": true, | |
| 2119 | + "notes": "" | |
| 2120 | + }, | |
| 2121 | + { | |
| 2122 | + "key": "gneitingkatzfuss2014probabilistic", | |
| 2123 | + "type": "article", | |
| 2124 | + "authors": [ | |
| 2125 | + "Gneiting, Tilmann", | |
| 2126 | + "Katzfuss, Matthias" | |
| 2127 | + ], | |
| 2128 | + "title": "Probabilistic Forecasting", | |
| 2129 | + "container": "Annual Review of Statistics and Its Application", | |
| 2130 | + "year": 2014, | |
| 2131 | + "volume": "1", | |
| 2132 | + "issue": "1", | |
| 2133 | + "pages": "125--151", | |
| 2134 | + "doi": "10.1146/annurev-statistics-062713-085831", | |
| 2135 | + "url": "https://doi.org/10.1146/annurev-statistics-062713-085831", | |
| 2136 | + "publisher": "Annual Reviews", | |
| 2137 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2138 | + "verified": true, | |
| 2139 | + "notes": "" | |
| 2140 | + }, | |
| 2141 | + { | |
| 2142 | + "key": "koenkerbassett1978quantiles", | |
| 2143 | + "type": "article", | |
| 2144 | + "authors": [ | |
| 2145 | + "Koenker, Roger", | |
| 2146 | + "Bassett, Gilbert" | |
| 2147 | + ], | |
| 2148 | + "title": "Regression Quantiles", | |
| 2149 | + "container": "Econometrica", | |
| 2150 | + "year": 1978, | |
| 2151 | + "volume": "46", | |
| 2152 | + "issue": "1", | |
| 2153 | + "pages": "33--50", | |
| 2154 | + "doi": "10.2307/1913643", | |
| 2155 | + "url": "https://doi.org/10.2307/1913643", | |
| 2156 | + "publisher": "JSTOR", | |
| 2157 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2158 | + "verified": true, | |
| 2159 | + "notes": "Crossref/OpenAlex register only the first page; full range 33-50 confirmed from RePEc record ecm:emetrp:v:46:y:1978:i:1:p:33-50." | |
| 2160 | + }, | |
| 2161 | + { | |
| 2162 | + "key": "bracher2021wis", | |
| 2163 | + "type": "article", | |
| 2164 | + "authors": [ | |
| 2165 | + "Bracher, Johannes", | |
| 2166 | + "Ray, Evan L.", | |
| 2167 | + "Gneiting, Tilmann", | |
| 2168 | + "Reich, Nicholas G." | |
| 2169 | + ], | |
| 2170 | + "title": "Evaluating epidemic forecasts in an interval format", | |
| 2171 | + "container": "PLOS Computational Biology", | |
| 2172 | + "year": 2021, | |
| 2173 | + "volume": "17", | |
| 2174 | + "issue": "2", | |
| 2175 | + "pages": "e1008618", | |
| 2176 | + "doi": "10.1371/journal.pcbi.1008618", | |
| 2177 | + "url": "https://doi.org/10.1371/journal.pcbi.1008618", | |
| 2178 | + "publisher": "Public Library of Science (PLoS)", | |
| 2179 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2180 | + "verified": true, | |
| 2181 | + "notes": "" | |
| 2182 | + }, | |
| 2183 | + { | |
| 2184 | + "key": "romano2019cqr", | |
| 2185 | + "type": "inproceedings", | |
| 2186 | + "authors": [ | |
| 2187 | + "Romano, Yaniv", | |
| 2188 | + "Patterson, Evan", | |
| 2189 | + "Candès, Emmanuel J." | |
| 2190 | + ], | |
| 2191 | + "title": "Conformalized Quantile Regression", | |
| 2192 | + "container": "Advances in Neural Information Processing Systems 32 (NeurIPS 2019)", | |
| 2193 | + "year": 2019, | |
| 2194 | + "volume": null, | |
| 2195 | + "issue": null, | |
| 2196 | + "pages": null, | |
| 2197 | + "doi": null, | |
| 2198 | + "url": "https://proceedings.neurips.cc/paper/2019/hash/5103c3584b063c431bd1268e9b5e76fb-Abstract.html", | |
| 2199 | + "publisher": null, | |
| 2200 | + "verification_source": "proceedings.neurips.cc abstract page (fetched 2026-10-21) + arXiv API 1905.03222", | |
| 2201 | + "verified": true, | |
| 2202 | + "notes": "" | |
| 2203 | + }, | |
| 2204 | + { | |
| 2205 | + "key": "vovk2005conformal", | |
| 2206 | + "type": "book", | |
| 2207 | + "authors": [ | |
| 2208 | + "Vovk, Vladimir", | |
| 2209 | + "Gammerman, Alexander", | |
| 2210 | + "Shafer, Glenn" | |
| 2211 | + ], | |
| 2212 | + "title": "Algorithmic Learning in a Random World", | |
| 2213 | + "container": "Springer", | |
| 2214 | + "year": 2005, | |
| 2215 | + "volume": null, | |
| 2216 | + "issue": null, | |
| 2217 | + "pages": null, | |
| 2218 | + "doi": "10.1007/b106715", | |
| 2219 | + "url": "https://doi.org/10.1007/b106715", | |
| 2220 | + "publisher": "Springer", | |
| 2221 | + "verification_source": "Crossref /works/10.1007/b106715 (title, Springer, 2005, ISBN 0387001522; author field empty) + Open Library ISBN:0387001522 (authors Vovk, Gammerman, Shafer)", | |
| 2222 | + "verified": true, | |
| 2223 | + "notes": "Springer page returned 403; authors confirmed from Open Library and from the Crossref record of the 2022 second edition (10.1007/978-3-031-06649-8)." | |
| 2224 | + }, | |
| 2225 | + { | |
| 2226 | + "key": "taylor2000quantilenn", | |
| 2227 | + "type": "article", | |
| 2228 | + "authors": [ | |
| 2229 | + "Taylor, James W." | |
| 2230 | + ], | |
| 2231 | + "title": "A quantile regression neural network approach to estimating the conditional density of multiperiod returns", | |
| 2232 | + "container": "Journal of Forecasting", | |
| 2233 | + "year": 2000, | |
| 2234 | + "volume": "19", | |
| 2235 | + "issue": "4", | |
| 2236 | + "pages": "299--311", | |
| 2237 | + "doi": "10.1002/1099-131x(200007)19:4<299::aid-for775>3.0.co;2-v", | |
| 2238 | + "url": "https://doi.org/10.1002/1099-131x(200007)19:4<299::aid-for775>3.0.co;2-v", | |
| 2239 | + "publisher": "Wiley", | |
| 2240 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2241 | + "verified": true, | |
| 2242 | + "notes": "" | |
| 2243 | + }, | |
| 2244 | + { | |
| 2245 | + "key": "gelman2013bda", | |
| 2246 | + "type": "book", | |
| 2247 | + "authors": [ | |
| 2248 | + "Gelman, Andrew", | |
| 2249 | + "Carlin, John B.", | |
| 2250 | + "Stern, Hal S.", | |
| 2251 | + "Dunson, David B.", | |
| 2252 | + "Vehtari, Aki", | |
| 2253 | + "Rubin, Donald B." | |
| 2254 | + ], | |
| 2255 | + "title": "Bayesian Data Analysis", | |
| 2256 | + "container": "Chapman and Hall/CRC", | |
| 2257 | + "year": 2013, | |
| 2258 | + "volume": null, | |
| 2259 | + "issue": null, | |
| 2260 | + "pages": null, | |
| 2261 | + "doi": "10.1201/b16018", | |
| 2262 | + "url": "https://doi.org/10.1201/b16018", | |
| 2263 | + "publisher": "Chapman and Hall/CRC", | |
| 2264 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2265 | + "verified": true, | |
| 2266 | + "notes": "Third edition (Crossref 2013-11-27)." | |
| 2267 | + }, | |
| 2268 | + { | |
| 2269 | + "key": "blei2017vi", | |
| 2270 | + "type": "article", | |
| 2271 | + "authors": [ | |
| 2272 | + "Blei, David M.", | |
| 2273 | + "Kucukelbir, Alp", | |
| 2274 | + "McAuliffe, Jon D." | |
| 2275 | + ], | |
| 2276 | + "title": "Variational Inference: A Review for Statisticians", | |
| 2277 | + "container": "Journal of the American Statistical Association", | |
| 2278 | + "year": 2017, | |
| 2279 | + "volume": "112", | |
| 2280 | + "issue": "518", | |
| 2281 | + "pages": "859--877", | |
| 2282 | + "doi": "10.1080/01621459.2017.1285773", | |
| 2283 | + "url": "https://doi.org/10.1080/01621459.2017.1285773", | |
| 2284 | + "publisher": "Informa UK Limited", | |
| 2285 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2286 | + "verified": true, | |
| 2287 | + "notes": "" | |
| 2288 | + }, | |
| 2289 | + { | |
| 2290 | + "key": "hoffmangelman2014nuts", | |
| 2291 | + "type": "article", | |
| 2292 | + "authors": [ | |
| 2293 | + "Hoffman, Matthew D.", | |
| 2294 | + "Gelman, Andrew" | |
| 2295 | + ], | |
| 2296 | + "title": "The No-U-Turn Sampler: Adaptively Setting Path Lengths in Hamiltonian Monte Carlo", | |
| 2297 | + "container": "Journal of Machine Learning Research", | |
| 2298 | + "year": 2014, | |
| 2299 | + "volume": "15", | |
| 2300 | + "issue": "47", | |
| 2301 | + "pages": "1593--1623", | |
| 2302 | + "doi": null, | |
| 2303 | + "url": "https://jmlr.org/papers/v15/hoffman14a.html", | |
| 2304 | + "publisher": null, | |
| 2305 | + "verification_source": "jmlr.org/papers/v15/hoffman14a.html (fetched 2026-10-21) + arXiv API 1111.4246", | |
| 2306 | + "verified": true, | |
| 2307 | + "notes": "" | |
| 2308 | + }, | |
| 2309 | + { | |
| 2310 | + "key": "rue2009inla", | |
| 2311 | + "type": "article", | |
| 2312 | + "authors": [ | |
| 2313 | + "Rue, Håvard", | |
| 2314 | + "Martino, Sara", | |
| 2315 | + "Chopin, Nicolas" | |
| 2316 | + ], | |
| 2317 | + "title": "Approximate Bayesian Inference for Latent Gaussian models by using Integrated Nested Laplace Approximations", | |
| 2318 | + "container": "Journal of the Royal Statistical Society: Series B (Statistical Methodology)", | |
| 2319 | + "year": 2009, | |
| 2320 | + "volume": "71", | |
| 2321 | + "issue": "2", | |
| 2322 | + "pages": "319--392", | |
| 2323 | + "doi": "10.1111/j.1467-9868.2008.00700.x", | |
| 2324 | + "url": "https://doi.org/10.1111/j.1467-9868.2008.00700.x", | |
| 2325 | + "publisher": "Oxford University Press (OUP)", | |
| 2326 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2327 | + "verified": true, | |
| 2328 | + "notes": "" | |
| 2329 | + }, | |
| 2330 | + { | |
| 2331 | + "key": "hamilton1989regime", | |
| 2332 | + "type": "article", | |
| 2333 | + "authors": [ | |
| 2334 | + "Hamilton, James D." | |
| 2335 | + ], | |
| 2336 | + "title": "A New Approach to the Economic Analysis of Nonstationary Time Series and the Business Cycle", | |
| 2337 | + "container": "Econometrica", | |
| 2338 | + "year": 1989, | |
| 2339 | + "volume": "57", | |
| 2340 | + "issue": "2", | |
| 2341 | + "pages": "357--384", | |
| 2342 | + "doi": "10.2307/1912559", | |
| 2343 | + "url": "https://doi.org/10.2307/1912559", | |
| 2344 | + "publisher": "JSTOR", | |
| 2345 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2346 | + "verified": true, | |
| 2347 | + "notes": "Full page range from RePEc ecm:emetrp:v:57:y:1989:i:2:p:357-84 and Semantic Scholar." | |
| 2348 | + }, | |
| 2349 | + { | |
| 2350 | + "key": "kimnelson1999statespace", | |
| 2351 | + "type": "book", | |
| 2352 | + "authors": [ | |
| 2353 | + "Kim, Chang-Jin", | |
| 2354 | + "Nelson, Charles R." | |
| 2355 | + ], | |
| 2356 | + "title": "State-Space Models with Regime Switching: Classical and Gibbs-Sampling Approaches with Applications", | |
| 2357 | + "container": "MIT Press", | |
| 2358 | + "year": 1999, | |
| 2359 | + "volume": null, | |
| 2360 | + "issue": null, | |
| 2361 | + "pages": null, | |
| 2362 | + "doi": "10.7551/mitpress/6444.001.0001", | |
| 2363 | + "url": "https://doi.org/10.7551/mitpress/6444.001.0001", | |
| 2364 | + "publisher": "MIT Press", | |
| 2365 | + "verification_source": "Crossref /works/10.7551/mitpress/6444.001.0001 (title, subtitle, MIT Press, 1999, ISBN 9780262277112) + Open Library ISBN:0262112388 (Kim) + OpenAlex record of the JASA 2000 review listing Kim and Nelson as authors", | |
| 2366 | + "verified": true, | |
| 2367 | + "notes": "Crossref author field is garbled ('Kim, Halbert'); MIT Press page returned 403; co-authorship confirmed via Open Library and the review record 10.2307/2669796." | |
| 2368 | + }, | |
| 2369 | + { | |
| 2370 | + "key": "jacobs1991moe", | |
| 2371 | + "type": "article", | |
| 2372 | + "authors": [ | |
| 2373 | + "Jacobs, Robert A.", | |
| 2374 | + "Jordan, Michael I.", | |
| 2375 | + "Nowlan, Steven J.", | |
| 2376 | + "Hinton, Geoffrey E." | |
| 2377 | + ], | |
| 2378 | + "title": "Adaptive Mixtures of Local Experts", | |
| 2379 | + "container": "Neural Computation", | |
| 2380 | + "year": 1991, | |
| 2381 | + "volume": "3", | |
| 2382 | + "issue": "1", | |
| 2383 | + "pages": "79--87", | |
| 2384 | + "doi": "10.1162/neco.1991.3.1.79", | |
| 2385 | + "url": "https://doi.org/10.1162/neco.1991.3.1.79", | |
| 2386 | + "publisher": "MIT Press", | |
| 2387 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2388 | + "verified": true, | |
| 2389 | + "notes": "" | |
| 2390 | + }, | |
| 2391 | + { | |
| 2392 | + "key": "jordanjacobs1994hme", | |
| 2393 | + "type": "article", | |
| 2394 | + "authors": [ | |
| 2395 | + "Jordan, Michael I.", | |
| 2396 | + "Jacobs, Robert A." | |
| 2397 | + ], | |
| 2398 | + "title": "Hierarchical Mixtures of Experts and the EM Algorithm", | |
| 2399 | + "container": "Neural Computation", | |
| 2400 | + "year": 1994, | |
| 2401 | + "volume": "6", | |
| 2402 | + "issue": "2", | |
| 2403 | + "pages": "181--214", | |
| 2404 | + "doi": "10.1162/neco.1994.6.2.181", | |
| 2405 | + "url": "https://doi.org/10.1162/neco.1994.6.2.181", | |
| 2406 | + "publisher": "MIT Press", | |
| 2407 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2408 | + "verified": true, | |
| 2409 | + "notes": "" | |
| 2410 | + }, | |
| 2411 | + { | |
| 2412 | + "key": "shazeer2017moe", | |
| 2413 | + "type": "misc", | |
| 2414 | + "authors": [ | |
| 2415 | + "Shazeer, Noam", | |
| 2416 | + "Mirhoseini, Azalia", | |
| 2417 | + "Maziarz, Krzysztof", | |
| 2418 | + "Davis, Andy", | |
| 2419 | + "Le, Quoc", | |
| 2420 | + "Hinton, Geoffrey", | |
| 2421 | + "Dean, Jeff" | |
| 2422 | + ], | |
| 2423 | + "title": "Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer", | |
| 2424 | + "container": null, | |
| 2425 | + "year": 2017, | |
| 2426 | + "volume": null, | |
| 2427 | + "issue": null, | |
| 2428 | + "pages": null, | |
| 2429 | + "doi": null, | |
| 2430 | + "url": "https://arxiv.org/abs/1701.06538", | |
| 2431 | + "publisher": null, | |
| 2432 | + "verification_source": "arXiv API (id 1701.06538, 2017-01-23)", | |
| 2433 | + "verified": true, | |
| 2434 | + "notes": "Commonly cited as ICLR 2017; the ICLR venue could not be verified (OpenReview and DBLP blocked, Semantic Scholar rate-limited), so cited as the arXiv preprint." | |
| 2435 | + }, | |
| 2436 | + { | |
| 2437 | + "key": "rangapuram2018dssm", | |
| 2438 | + "type": "inproceedings", | |
| 2439 | + "authors": [ | |
| 2440 | + "Rangapuram, Syama Sundar", | |
| 2441 | + "Seeger, Matthias W.", | |
| 2442 | + "Gasthaus, Jan", | |
| 2443 | + "Stella, Lorenzo", | |
| 2444 | + "Wang, Yuyang", | |
| 2445 | + "Januschowski, Tim" | |
| 2446 | + ], | |
| 2447 | + "title": "Deep State Space Models for Time Series Forecasting", | |
| 2448 | + "container": "Advances in Neural Information Processing Systems 31 (NeurIPS 2018)", | |
| 2449 | + "year": 2018, | |
| 2450 | + "volume": null, | |
| 2451 | + "issue": null, | |
| 2452 | + "pages": null, | |
| 2453 | + "doi": null, | |
| 2454 | + "url": "https://proceedings.neurips.cc/paper/2018/hash/5cf68969fb67aa6082363a6d4e6468e2-Abstract.html", | |
| 2455 | + "publisher": null, | |
| 2456 | + "verification_source": "proceedings.neurips.cc abstract page (fetched 2026-10-21)", | |
| 2457 | + "verified": true, | |
| 2458 | + "notes": "" | |
| 2459 | + }, | |
| 2460 | + { | |
| 2461 | + "key": "debezenac2020nkf", | |
| 2462 | + "type": "inproceedings", | |
| 2463 | + "authors": [ | |
| 2464 | + "de Bézenac, Emmanuel", | |
| 2465 | + "Rangapuram, Syama Sundar", | |
| 2466 | + "Benidis, Konstantinos", | |
| 2467 | + "Bohlke-Schneider, Michael", | |
| 2468 | + "Kurle, Richard", | |
| 2469 | + "Stella, Lorenzo", | |
| 2470 | + "Hasson, Hilaf", | |
| 2471 | + "Gallinari, Patrick", | |
| 2472 | + "Januschowski, Tim" | |
| 2473 | + ], | |
| 2474 | + "title": "Normalizing Kalman Filters for Multivariate Time Series Analysis", | |
| 2475 | + "container": "Advances in Neural Information Processing Systems 33 (NeurIPS 2020)", | |
| 2476 | + "year": 2020, | |
| 2477 | + "volume": null, | |
| 2478 | + "issue": null, | |
| 2479 | + "pages": null, | |
| 2480 | + "doi": null, | |
| 2481 | + "url": "https://proceedings.neurips.cc/paper/2020/hash/1f47cef5e38c952f94c5d61726027439-Abstract.html", | |
| 2482 | + "publisher": null, | |
| 2483 | + "verification_source": "proceedings.neurips.cc abstract page (fetched 2026-10-21)", | |
| 2484 | + "verified": true, | |
| 2485 | + "notes": "" | |
| 2486 | + }, | |
| 2487 | + { | |
| 2488 | + "key": "krishnan2017dkf", | |
| 2489 | + "type": "inproceedings", | |
| 2490 | + "authors": [ | |
| 2491 | + "Krishnan, Rahul", | |
| 2492 | + "Shalit, Uri", | |
| 2493 | + "Sontag, David" | |
| 2494 | + ], | |
| 2495 | + "title": "Structured Inference Networks for Nonlinear State Space Models", | |
| 2496 | + "container": "Proceedings of the Thirty-First AAAI Conference on Artificial Intelligence (AAAI-17)", | |
| 2497 | + "year": 2017, | |
| 2498 | + "volume": "31", | |
| 2499 | + "issue": "1", | |
| 2500 | + "pages": null, | |
| 2501 | + "doi": "10.1609/aaai.v31i1.10779", | |
| 2502 | + "url": "https://doi.org/10.1609/aaai.v31i1.10779", | |
| 2503 | + "publisher": "Association for the Advancement of Artificial Intelligence (AAAI)", | |
| 2504 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2505 | + "verified": true, | |
| 2506 | + "notes": "No page range registered in Crossref. In the .bib the AAAI volume/number are placed in the note field because aer.bst rejects volume+number on @inproceedings." | |
| 2507 | + }, | |
| 2508 | + { | |
| 2509 | + "key": "dieboldmariano1995", | |
| 2510 | + "type": "article", | |
| 2511 | + "authors": [ | |
| 2512 | + "Diebold, Francis X.", | |
| 2513 | + "Mariano, Roberto S." | |
| 2514 | + ], | |
| 2515 | + "title": "Comparing Predictive Accuracy", | |
| 2516 | + "container": "Journal of Business & Economic Statistics", | |
| 2517 | + "year": 1995, | |
| 2518 | + "volume": "13", | |
| 2519 | + "issue": "3", | |
| 2520 | + "pages": "253--263", | |
| 2521 | + "doi": "10.1080/07350015.1995.10524599", | |
| 2522 | + "url": "https://doi.org/10.1080/07350015.1995.10524599", | |
| 2523 | + "publisher": "Informa UK Limited", | |
| 2524 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2525 | + "verified": true, | |
| 2526 | + "notes": "" | |
| 2527 | + }, | |
| 2528 | + { | |
| 2529 | + "key": "harvey1997equality", | |
| 2530 | + "type": "article", | |
| 2531 | + "authors": [ | |
| 2532 | + "Harvey, David", | |
| 2533 | + "Leybourne, Stephen", | |
| 2534 | + "Newbold, Paul" | |
| 2535 | + ], | |
| 2536 | + "title": "Testing the equality of prediction mean squared errors", | |
| 2537 | + "container": "International Journal of Forecasting", | |
| 2538 | + "year": 1997, | |
| 2539 | + "volume": "13", | |
| 2540 | + "issue": "2", | |
| 2541 | + "pages": "281--291", | |
| 2542 | + "doi": "10.1016/s0169-2070(96)00719-4", | |
| 2543 | + "url": "https://doi.org/10.1016/s0169-2070(96)00719-4", | |
| 2544 | + "publisher": "Elsevier BV", | |
| 2545 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2546 | + "verified": true, | |
| 2547 | + "notes": "" | |
| 2548 | + }, | |
| 2549 | + { | |
| 2550 | + "key": "giacominiwhite2006", | |
| 2551 | + "type": "article", | |
| 2552 | + "authors": [ | |
| 2553 | + "Giacomini, Raffaella", | |
| 2554 | + "White, Halbert" | |
| 2555 | + ], | |
| 2556 | + "title": "Tests of Conditional Predictive Ability", | |
| 2557 | + "container": "Econometrica", | |
| 2558 | + "year": 2006, | |
| 2559 | + "volume": "74", | |
| 2560 | + "issue": "6", | |
| 2561 | + "pages": "1545--1578", | |
| 2562 | + "doi": "10.1111/j.1468-0262.2006.00718.x", | |
| 2563 | + "url": "https://doi.org/10.1111/j.1468-0262.2006.00718.x", | |
| 2564 | + "publisher": "The Econometric Society", | |
| 2565 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2566 | + "verified": true, | |
| 2567 | + "notes": "" | |
| 2568 | + }, | |
| 2569 | + { | |
| 2570 | + "key": "hansen2011mcs", | |
| 2571 | + "type": "article", | |
| 2572 | + "authors": [ | |
| 2573 | + "Hansen, Peter R.", | |
| 2574 | + "Lunde, Asger", | |
| 2575 | + "Nason, James M." | |
| 2576 | + ], | |
| 2577 | + "title": "The Model Confidence Set", | |
| 2578 | + "container": "Econometrica", | |
| 2579 | + "year": 2011, | |
| 2580 | + "volume": "79", | |
| 2581 | + "issue": "2", | |
| 2582 | + "pages": "453--497", | |
| 2583 | + "doi": "10.3982/ECTA5771", | |
| 2584 | + "url": "https://doi.org/10.3982/ECTA5771", | |
| 2585 | + "publisher": null, | |
| 2586 | + "verification_source": "Crossref /works/10.3982/ECTA5771 (title, journal, 2011, 79(2), 453-497; author field empty) + Crossref SSRN record 10.2139/ssrn.522382 of the same title listing Hansen, Lunde, Nason", | |
| 2587 | + "verified": true, | |
| 2588 | + "notes": "Crossref journal record has no author field; authors confirmed from the working-paper record of the same title and RePEc ecm:emetrp:v:79:y:2011:i:2:p:453-497." | |
| 2589 | + }, | |
| 2590 | + { | |
| 2591 | + "key": "clarkmccracken2001nested", | |
| 2592 | + "type": "article", | |
| 2593 | + "authors": [ | |
| 2594 | + "Clark, Todd E", | |
| 2595 | + "McCracken, Michael W" | |
| 2596 | + ], | |
| 2597 | + "title": "Tests of equal forecast accuracy and encompassing for nested models", | |
| 2598 | + "container": "Journal of Econometrics", | |
| 2599 | + "year": 2001, | |
| 2600 | + "volume": "105", | |
| 2601 | + "issue": "1", | |
| 2602 | + "pages": "85--110", | |
| 2603 | + "doi": "10.1016/s0304-4076(01)00071-9", | |
| 2604 | + "url": "https://doi.org/10.1016/s0304-4076(01)00071-9", | |
| 2605 | + "publisher": "Elsevier BV", | |
| 2606 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2607 | + "verified": true, | |
| 2608 | + "notes": "" | |
| 2609 | + }, | |
| 2610 | + { | |
| 2611 | + "key": "clarkmccracken2013advances", | |
| 2612 | + "type": "incollection", | |
| 2613 | + "authors": [ | |
| 2614 | + "Clark, Todd", | |
| 2615 | + "McCracken, Michael" | |
| 2616 | + ], | |
| 2617 | + "title": "Advances in Forecast Evaluation", | |
| 2618 | + "container": "Handbook of Economic Forecasting, Volume 2B", | |
| 2619 | + "year": 2013, | |
| 2620 | + "volume": "2", | |
| 2621 | + "issue": null, | |
| 2622 | + "pages": "1107--1201", | |
| 2623 | + "doi": "10.1016/b978-0-444-62731-5.00020-8", | |
| 2624 | + "url": "https://doi.org/10.1016/b978-0-444-62731-5.00020-8", | |
| 2625 | + "publisher": "Elsevier", | |
| 2626 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2627 | + "verified": true, | |
| 2628 | + "notes": "" | |
| 2629 | + }, | |
| 2630 | + { | |
| 2631 | + "key": "west1996asymptotic", | |
| 2632 | + "type": "article", | |
| 2633 | + "authors": [ | |
| 2634 | + "West, Kenneth D." | |
| 2635 | + ], | |
| 2636 | + "title": "Asymptotic Inference about Predictive Ability", | |
| 2637 | + "container": "Econometrica", | |
| 2638 | + "year": 1996, | |
| 2639 | + "volume": "64", | |
| 2640 | + "issue": "5", | |
| 2641 | + "pages": "1067--1084", | |
| 2642 | + "doi": "10.2307/2171956", | |
| 2643 | + "url": "https://doi.org/10.2307/2171956", | |
| 2644 | + "publisher": "JSTOR", | |
| 2645 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2646 | + "verified": true, | |
| 2647 | + "notes": "Full page range from RePEc ecm:emetrp:v:64:y:1996:i:5:p:1067-84 and Semantic Scholar." | |
| 2648 | + }, | |
| 2649 | + { | |
| 2650 | + "key": "hyndmankoehler2006mase", | |
| 2651 | + "type": "article", | |
| 2652 | + "authors": [ | |
| 2653 | + "Hyndman, Rob J.", | |
| 2654 | + "Koehler, Anne B." | |
| 2655 | + ], | |
| 2656 | + "title": "Another look at measures of forecast accuracy", | |
| 2657 | + "container": "International Journal of Forecasting", | |
| 2658 | + "year": 2006, | |
| 2659 | + "volume": "22", | |
| 2660 | + "issue": "4", | |
| 2661 | + "pages": "679--688", | |
| 2662 | + "doi": "10.1016/j.ijforecast.2006.03.001", | |
| 2663 | + "url": "https://doi.org/10.1016/j.ijforecast.2006.03.001", | |
| 2664 | + "publisher": "Elsevier BV", | |
| 2665 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2666 | + "verified": true, | |
| 2667 | + "notes": "" | |
| 2668 | + }, | |
| 2669 | + { | |
| 2670 | + "key": "politisromano1994stationary", | |
| 2671 | + "type": "article", | |
| 2672 | + "authors": [ | |
| 2673 | + "Politis, Dimitris N.", | |
| 2674 | + "Romano, Joseph P." | |
| 2675 | + ], | |
| 2676 | + "title": "The Stationary Bootstrap", | |
| 2677 | + "container": "Journal of the American Statistical Association", | |
| 2678 | + "year": 1994, | |
| 2679 | + "volume": "89", | |
| 2680 | + "issue": "428", | |
| 2681 | + "pages": "1303--1313", | |
| 2682 | + "doi": "10.1080/01621459.1994.10476870", | |
| 2683 | + "url": "https://doi.org/10.1080/01621459.1994.10476870", | |
| 2684 | + "publisher": "Informa UK Limited", | |
| 2685 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2686 | + "verified": true, | |
| 2687 | + "notes": "" | |
| 2688 | + }, | |
| 2689 | + { | |
| 2690 | + "key": "kunsch1989jackknife", | |
| 2691 | + "type": "article", | |
| 2692 | + "authors": [ | |
| 2693 | + "Künsch, Hans R." | |
| 2694 | + ], | |
| 2695 | + "title": "The Jackknife and the Bootstrap for General Stationary Observations", | |
| 2696 | + "container": "The Annals of Statistics", | |
| 2697 | + "year": 1989, | |
| 2698 | + "volume": "17", | |
| 2699 | + "issue": "3", | |
| 2700 | + "pages": "1217--1241", | |
| 2701 | + "doi": "10.1214/aos/1176347265", | |
| 2702 | + "url": "https://doi.org/10.1214/aos/1176347265", | |
| 2703 | + "publisher": "Institute of Mathematical Statistics", | |
| 2704 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2705 | + "verified": true, | |
| 2706 | + "notes": "Crossref drops the umlaut (Kunsch); restored." | |
| 2707 | + }, | |
| 2708 | + { | |
| 2709 | + "key": "diebold2015twenty", | |
| 2710 | + "type": "article", | |
| 2711 | + "authors": [ | |
| 2712 | + "Diebold, Francis X." | |
| 2713 | + ], | |
| 2714 | + "title": "Comparing Predictive Accuracy, Twenty Years Later: A Personal Perspective on the Use and Abuse of Diebold–Mariano Tests", | |
| 2715 | + "container": "Journal of Business & Economic Statistics", | |
| 2716 | + "year": 2015, | |
| 2717 | + "volume": "33", | |
| 2718 | + "issue": "1", | |
| 2719 | + "pages": null, | |
| 2720 | + "doi": "10.1080/07350015.2014.983236", | |
| 2721 | + "url": "https://doi.org/10.1080/07350015.2014.983236", | |
| 2722 | + "publisher": "Informa UK Limited", | |
| 2723 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2724 | + "verified": true, | |
| 2725 | + "notes": "Crossref, RePEc, OpenAlex and the NBER page all register only first page 1 (no last page); publisher page returned 403, so the page range is omitted rather than guessed." | |
| 2726 | + }, | |
| 2727 | + { | |
| 2728 | + "key": "timmermann2006combinations", | |
| 2729 | + "type": "incollection", | |
| 2730 | + "authors": [ | |
| 2731 | + "Timmermann, Allan" | |
| 2732 | + ], | |
| 2733 | + "title": "Forecast Combinations", | |
| 2734 | + "container": "Handbook of Economic Forecasting, Volume 1", | |
| 2735 | + "year": 2006, | |
| 2736 | + "volume": "1", | |
| 2737 | + "issue": null, | |
| 2738 | + "pages": "135--196", | |
| 2739 | + "doi": "10.1016/s1574-0706(05)01004-9", | |
| 2740 | + "url": "https://doi.org/10.1016/s1574-0706(05)01004-9", | |
| 2741 | + "publisher": "Elsevier", | |
| 2742 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2743 | + "verified": true, | |
| 2744 | + "notes": "Crossref title 'Chapter 4 Forecast Combinations'; chapter label dropped." | |
| 2745 | + }, | |
| 2746 | + { | |
| 2747 | + "key": "batesgranger1969combination", | |
| 2748 | + "type": "article", | |
| 2749 | + "authors": [ | |
| 2750 | + "Bates, J. M.", | |
| 2751 | + "Granger, C. W. J." | |
| 2752 | + ], | |
| 2753 | + "title": "The Combination of Forecasts", | |
| 2754 | + "container": "Journal of the Operational Research Society", | |
| 2755 | + "year": 1969, | |
| 2756 | + "volume": "20", | |
| 2757 | + "issue": "4", | |
| 2758 | + "pages": "451--468", | |
| 2759 | + "doi": "10.1057/jors.1969.103", | |
| 2760 | + "url": "https://doi.org/10.1057/jors.1969.103", | |
| 2761 | + "publisher": "Informa UK Limited", | |
| 2762 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2763 | + "verified": true, | |
| 2764 | + "notes": "Published in Operational Research Quarterly 20(4); Crossref registers the journal under its later name (Journal of the Operational Research Society)." | |
| 2765 | + }, | |
| 2766 | + { | |
| 2767 | + "key": "stockwatson2002principal", | |
| 2768 | + "type": "article", | |
| 2769 | + "authors": [ | |
| 2770 | + "Stock, James H", | |
| 2771 | + "Watson, Mark W" | |
| 2772 | + ], | |
| 2773 | + "title": "Forecasting Using Principal Components From a Large Number of Predictors", | |
| 2774 | + "container": "Journal of the American Statistical Association", | |
| 2775 | + "year": 2002, | |
| 2776 | + "volume": "97", | |
| 2777 | + "issue": "460", | |
| 2778 | + "pages": "1167--1179", | |
| 2779 | + "doi": "10.1198/016214502388618960", | |
| 2780 | + "url": "https://doi.org/10.1198/016214502388618960", | |
| 2781 | + "publisher": "Informa UK Limited", | |
| 2782 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2783 | + "verified": true, | |
| 2784 | + "notes": "" | |
| 2785 | + }, | |
| 2786 | + { | |
| 2787 | + "key": "stockwatson2002diffusion", | |
| 2788 | + "type": "article", | |
| 2789 | + "authors": [ | |
| 2790 | + "Stock, James H", | |
| 2791 | + "Watson, Mark W" | |
| 2792 | + ], | |
| 2793 | + "title": "Macroeconomic Forecasting Using Diffusion Indexes", | |
| 2794 | + "container": "Journal of Business & Economic Statistics", | |
| 2795 | + "year": 2002, | |
| 2796 | + "volume": "20", | |
| 2797 | + "issue": "2", | |
| 2798 | + "pages": "147--162", | |
| 2799 | + "doi": "10.1198/073500102317351921", | |
| 2800 | + "url": "https://doi.org/10.1198/073500102317351921", | |
| 2801 | + "publisher": "Informa UK Limited", | |
| 2802 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2803 | + "verified": true, | |
| 2804 | + "notes": "" | |
| 2805 | + }, | |
| 2806 | + { | |
| 2807 | + "key": "banbura2010bvar", | |
| 2808 | + "type": "article", | |
| 2809 | + "authors": [ | |
| 2810 | + "Bańbura, Marta", | |
| 2811 | + "Giannone, Domenico", | |
| 2812 | + "Reichlin, Lucrezia" | |
| 2813 | + ], | |
| 2814 | + "title": "Large Bayesian vector auto regressions", | |
| 2815 | + "container": "Journal of Applied Econometrics", | |
| 2816 | + "year": 2010, | |
| 2817 | + "volume": "25", | |
| 2818 | + "issue": "1", | |
| 2819 | + "pages": "71--92", | |
| 2820 | + "doi": "10.1002/jae.1137", | |
| 2821 | + "url": "https://doi.org/10.1002/jae.1137", | |
| 2822 | + "publisher": "Wiley", | |
| 2823 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2824 | + "verified": true, | |
| 2825 | + "notes": "" | |
| 2826 | + }, | |
| 2827 | + { | |
| 2828 | + "key": "litterman1986bvar", | |
| 2829 | + "type": "article", | |
| 2830 | + "authors": [ | |
| 2831 | + "Litterman, Robert B." | |
| 2832 | + ], | |
| 2833 | + "title": "Forecasting With Bayesian Vector Autoregressions—Five Years of Experience", | |
| 2834 | + "container": "Journal of Business & Economic Statistics", | |
| 2835 | + "year": 1986, | |
| 2836 | + "volume": "4", | |
| 2837 | + "issue": "1", | |
| 2838 | + "pages": "25--38", | |
| 2839 | + "doi": "10.1080/07350015.1986.10509491", | |
| 2840 | + "url": "https://doi.org/10.1080/07350015.1986.10509491", | |
| 2841 | + "publisher": "Informa UK Limited", | |
| 2842 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2843 | + "verified": true, | |
| 2844 | + "notes": "Two DOIs exist (JSTOR 10.2307/1391384 and T&F 10.1080/...); the T&F record carries the full page range 25-38." | |
| 2845 | + }, | |
| 2846 | + { | |
| 2847 | + "key": "lundberglee2017shap", | |
| 2848 | + "type": "inproceedings", | |
| 2849 | + "authors": [ | |
| 2850 | + "Lundberg, Scott M.", | |
| 2851 | + "Lee, Su-In" | |
| 2852 | + ], | |
| 2853 | + "title": "A Unified Approach to Interpreting Model Predictions", | |
| 2854 | + "container": "Advances in Neural Information Processing Systems 30 (NIPS 2017)", | |
| 2855 | + "year": 2017, | |
| 2856 | + "volume": null, | |
| 2857 | + "issue": null, | |
| 2858 | + "pages": null, | |
| 2859 | + "doi": null, | |
| 2860 | + "url": "https://proceedings.neurips.cc/paper/2017/hash/8a20a8621978632d76c43dfd28b67767-Abstract.html", | |
| 2861 | + "publisher": null, | |
| 2862 | + "verification_source": "proceedings.neurips.cc abstract page (fetched 2026-10-21) + arXiv API 1705.07874", | |
| 2863 | + "verified": true, | |
| 2864 | + "notes": "" | |
| 2865 | + }, | |
| 2866 | + { | |
| 2867 | + "key": "lundberg2020treeexplainer", | |
| 2868 | + "type": "article", | |
| 2869 | + "authors": [ | |
| 2870 | + "Lundberg, Scott M.", | |
| 2871 | + "Erion, Gabriel", | |
| 2872 | + "Chen, Hugh", | |
| 2873 | + "DeGrave, Alex", | |
| 2874 | + "Prutkin, Jordan M.", | |
| 2875 | + "Nair, Bala", | |
| 2876 | + "Katz, Ronit", | |
| 2877 | + "Himmelfarb, Jonathan", | |
| 2878 | + "Bansal, Nisha", | |
| 2879 | + "Lee, Su-In" | |
| 2880 | + ], | |
| 2881 | + "title": "From local explanations to global understanding with explainable AI for trees", | |
| 2882 | + "container": "Nature Machine Intelligence", | |
| 2883 | + "year": 2020, | |
| 2884 | + "volume": "2", | |
| 2885 | + "issue": "1", | |
| 2886 | + "pages": "56--67", | |
| 2887 | + "doi": "10.1038/s42256-019-0138-9", | |
| 2888 | + "url": "https://doi.org/10.1038/s42256-019-0138-9", | |
| 2889 | + "publisher": "Springer Science and Business Media LLC", | |
| 2890 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2891 | + "verified": true, | |
| 2892 | + "notes": "" | |
| 2893 | + }, | |
| 2894 | + { | |
| 2895 | + "key": "apleyzhu2020ale", | |
| 2896 | + "type": "article", | |
| 2897 | + "authors": [ | |
| 2898 | + "Apley, Daniel W.", | |
| 2899 | + "Zhu, Jingyu" | |
| 2900 | + ], | |
| 2901 | + "title": "Visualizing the Effects of Predictor Variables in Black Box Supervised Learning Models", | |
| 2902 | + "container": "Journal of the Royal Statistical Society: Series B (Statistical Methodology)", | |
| 2903 | + "year": 2020, | |
| 2904 | + "volume": "82", | |
| 2905 | + "issue": "4", | |
| 2906 | + "pages": "1059--1086", | |
| 2907 | + "doi": "10.1111/rssb.12377", | |
| 2908 | + "url": "https://doi.org/10.1111/rssb.12377", | |
| 2909 | + "publisher": "Oxford University Press (OUP)", | |
| 2910 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2911 | + "verified": true, | |
| 2912 | + "notes": "" | |
| 2913 | + }, | |
| 2914 | + { | |
| 2915 | + "key": "friedman2001gbm", | |
| 2916 | + "type": "article", | |
| 2917 | + "authors": [ | |
| 2918 | + "Friedman, Jerome H." | |
| 2919 | + ], | |
| 2920 | + "title": "Greedy function approximation: A gradient boosting machine", | |
| 2921 | + "container": "The Annals of Statistics", | |
| 2922 | + "year": 2001, | |
| 2923 | + "volume": "29", | |
| 2924 | + "issue": "5", | |
| 2925 | + "pages": "1189--1232", | |
| 2926 | + "doi": "10.1214/aos/1013203451", | |
| 2927 | + "url": "https://doi.org/10.1214/aos/1013203451", | |
| 2928 | + "publisher": "Institute of Mathematical Statistics", | |
| 2929 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2930 | + "verified": true, | |
| 2931 | + "notes": "" | |
| 2932 | + }, | |
| 2933 | + { | |
| 2934 | + "key": "breiman2001rf", | |
| 2935 | + "type": "article", | |
| 2936 | + "authors": [ | |
| 2937 | + "Breiman, Leo" | |
| 2938 | + ], | |
| 2939 | + "title": "Random Forests", | |
| 2940 | + "container": "Machine Learning", | |
| 2941 | + "year": 2001, | |
| 2942 | + "volume": "45", | |
| 2943 | + "issue": "1", | |
| 2944 | + "pages": "5--32", | |
| 2945 | + "doi": "10.1023/a:1010933404324", | |
| 2946 | + "url": "https://doi.org/10.1023/a:1010933404324", | |
| 2947 | + "publisher": "Springer Science and Business Media LLC", | |
| 2948 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2949 | + "verified": true, | |
| 2950 | + "notes": "" | |
| 2951 | + }, | |
| 2952 | + { | |
| 2953 | + "key": "chenguestrin2016xgboost", | |
| 2954 | + "type": "inproceedings", | |
| 2955 | + "authors": [ | |
| 2956 | + "Chen, Tianqi", | |
| 2957 | + "Guestrin, Carlos" | |
| 2958 | + ], | |
| 2959 | + "title": "XGBoost: A Scalable Tree Boosting System", | |
| 2960 | + "container": "Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD '16)", | |
| 2961 | + "year": 2016, | |
| 2962 | + "volume": null, | |
| 2963 | + "issue": null, | |
| 2964 | + "pages": "785--794", | |
| 2965 | + "doi": "10.1145/2939672.2939785", | |
| 2966 | + "url": "https://doi.org/10.1145/2939672.2939785", | |
| 2967 | + "publisher": "ACM", | |
| 2968 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 2969 | + "verified": true, | |
| 2970 | + "notes": "Crossref splits title/subtitle; joined." | |
| 2971 | + }, | |
| 2972 | + { | |
| 2973 | + "key": "prokhorenkova2018catboost", | |
| 2974 | + "type": "inproceedings", | |
| 2975 | + "authors": [ | |
| 2976 | + "Prokhorenkova, Liudmila", | |
| 2977 | + "Gusev, Gleb", | |
| 2978 | + "Vorobev, Aleksandr", | |
| 2979 | + "Dorogush, Anna Veronika", | |
| 2980 | + "Gulin, Andrey" | |
| 2981 | + ], | |
| 2982 | + "title": "CatBoost: unbiased boosting with categorical features", | |
| 2983 | + "container": "Advances in Neural Information Processing Systems 31 (NeurIPS 2018)", | |
| 2984 | + "year": 2018, | |
| 2985 | + "volume": null, | |
| 2986 | + "issue": null, | |
| 2987 | + "pages": null, | |
| 2988 | + "doi": null, | |
| 2989 | + "url": "https://proceedings.neurips.cc/paper/2018/hash/14491b756b3a51daac41c24863285549-Abstract.html", | |
| 2990 | + "publisher": null, | |
| 2991 | + "verification_source": "proceedings.neurips.cc abstract page (fetched 2026-10-21) + arXiv API 1706.09516", | |
| 2992 | + "verified": true, | |
| 2993 | + "notes": "" | |
| 2994 | + }, | |
| 2995 | + { | |
| 2996 | + "key": "molnar2025iml", | |
| 2997 | + "type": "book", | |
| 2998 | + "authors": [ | |
| 2999 | + "Molnar, Christoph" | |
| 3000 | + ], | |
| 3001 | + "title": "Interpretable Machine Learning: A Guide for Making Black Box Models Explainable", | |
| 3002 | + "container": "Self-published", | |
| 3003 | + "year": 2025, | |
| 3004 | + "volume": null, | |
| 3005 | + "issue": null, | |
| 3006 | + "pages": null, | |
| 3007 | + "doi": null, | |
| 3008 | + "url": "https://christophm.github.io/interpretable-ml-book/", | |
| 3009 | + "publisher": "Self-published", | |
| 3010 | + "verification_source": "christophm.github.io/interpretable-ml-book/cite.html (fetched 2026-10-21; recommended citation: Molnar, C. (2025), 3rd ed.)", | |
| 3011 | + "verified": true, | |
| 3012 | + "notes": "Requested as 'Molnar (2022)'; the current edition is the 3rd (2025). The 2nd edition (2022) is superseded." | |
| 3013 | + }, | |
| 3014 | + { | |
| 3015 | + "key": "heckman1979selection", | |
| 3016 | + "type": "article", | |
| 3017 | + "authors": [ | |
| 3018 | + "Heckman, James J." | |
| 3019 | + ], | |
| 3020 | + "title": "Sample Selection Bias as a Specification Error", | |
| 3021 | + "container": "Econometrica", | |
| 3022 | + "year": 1979, | |
| 3023 | + "volume": "47", | |
| 3024 | + "issue": "1", | |
| 3025 | + "pages": "153--161", | |
| 3026 | + "doi": "10.2307/1912352", | |
| 3027 | + "url": "https://doi.org/10.2307/1912352", | |
| 3028 | + "publisher": "JSTOR", | |
| 3029 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 3030 | + "verified": true, | |
| 3031 | + "notes": "Full page range from RePEc ecm:emetrp:v:47:y:1979:i:1:p:153-61." | |
| 3032 | + }, | |
| 3033 | + { | |
| 3034 | + "key": "judseaks1994selection", | |
| 3035 | + "type": "article", | |
| 3036 | + "authors": [ | |
| 3037 | + "Jud, Donald", | |
| 3038 | + "Seaks, Terry" | |
| 3039 | + ], | |
| 3040 | + "title": "Sample Selection Bias in Estimating Housing Sales Prices", | |
| 3041 | + "container": "Journal of Real Estate Research", | |
| 3042 | + "year": 1994, | |
| 3043 | + "volume": "9", | |
| 3044 | + "issue": "3", | |
| 3045 | + "pages": "289--298", | |
| 3046 | + "doi": "10.1080/10835547.1994.12090753", | |
| 3047 | + "url": "https://doi.org/10.1080/10835547.1994.12090753", | |
| 3048 | + "publisher": "Informa UK Limited", | |
| 3049 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 3050 | + "verified": true, | |
| 3051 | + "notes": "" | |
| 3052 | + }, | |
| 3053 | + { | |
| 3054 | + "key": "munnekeslade2000selection", | |
| 3055 | + "type": "article", | |
| 3056 | + "authors": [ | |
| 3057 | + "Munneke, Henry J.", | |
| 3058 | + "Slade, Barrett A." | |
| 3059 | + ], | |
| 3060 | + "title": "An Empirical Study of Sample-Selection Bias in Indices of Commercial Real Estate", | |
| 3061 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 3062 | + "year": 2000, | |
| 3063 | + "volume": "21", | |
| 3064 | + "issue": "1", | |
| 3065 | + "pages": "45--64", | |
| 3066 | + "doi": "10.1023/a:1007861303058", | |
| 3067 | + "url": "https://doi.org/10.1023/a:1007861303058", | |
| 3068 | + "publisher": "Springer Science and Business Media LLC", | |
| 3069 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 3070 | + "verified": true, | |
| 3071 | + "notes": "" | |
| 3072 | + }, | |
| 3073 | + { | |
| 3074 | + "key": "glaeser2014dynamics", | |
| 3075 | + "type": "article", | |
| 3076 | + "authors": [ | |
| 3077 | + "Glaeser, Edward L.", | |
| 3078 | + "Gyourko, Joseph", | |
| 3079 | + "Morales, Eduardo", | |
| 3080 | + "Nathanson, Charles G." | |
| 3081 | + ], | |
| 3082 | + "title": "Housing dynamics: An urban approach", | |
| 3083 | + "container": "Journal of Urban Economics", | |
| 3084 | + "year": 2014, | |
| 3085 | + "volume": "81", | |
| 3086 | + "issue": null, | |
| 3087 | + "pages": "45--56", | |
| 3088 | + "doi": "10.1016/j.jue.2014.02.003", | |
| 3089 | + "url": "https://doi.org/10.1016/j.jue.2014.02.003", | |
| 3090 | + "publisher": "Elsevier BV", | |
| 3091 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 3092 | + "verified": true, | |
| 3093 | + "notes": "" | |
| 3094 | + }, | |
| 3095 | + { | |
| 3096 | + "key": "head2014search", | |
| 3097 | + "type": "article", | |
| 3098 | + "authors": [ | |
| 3099 | + "Head, Allen", | |
| 3100 | + "Lloyd-Ellis, Huw", | |
| 3101 | + "Sun, Hongfei" | |
| 3102 | + ], | |
| 3103 | + "title": "Search, Liquidity, and the Dynamics of House Prices and Construction", | |
| 3104 | + "container": "American Economic Review", | |
| 3105 | + "year": 2014, | |
| 3106 | + "volume": "104", | |
| 3107 | + "issue": "4", | |
| 3108 | + "pages": "1172--1210", | |
| 3109 | + "doi": "10.1257/aer.104.4.1172", | |
| 3110 | + "url": "https://doi.org/10.1257/aer.104.4.1172", | |
| 3111 | + "publisher": "American Economic Association", | |
| 3112 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 3113 | + "verified": true, | |
| 3114 | + "notes": "" | |
| 3115 | + }, | |
| 3116 | + { | |
| 3117 | + "key": "guren2018momentum", | |
| 3118 | + "type": "article", | |
| 3119 | + "authors": [ | |
| 3120 | + "Guren, Adam M." | |
| 3121 | + ], | |
| 3122 | + "title": "House Price Momentum and Strategic Complementarity", | |
| 3123 | + "container": "Journal of Political Economy", | |
| 3124 | + "year": 2018, | |
| 3125 | + "volume": "126", | |
| 3126 | + "issue": "3", | |
| 3127 | + "pages": "1172--1218", | |
| 3128 | + "doi": "10.1086/697207", | |
| 3129 | + "url": "https://doi.org/10.1086/697207", | |
| 3130 | + "publisher": "University of Chicago Press", | |
| 3131 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 3132 | + "verified": true, | |
| 3133 | + "notes": "" | |
| 3134 | + }, | |
| 3135 | + { | |
| 3136 | + "key": "berachaskiba2011momentum", | |
| 3137 | + "type": "article", | |
| 3138 | + "authors": [ | |
| 3139 | + "Beracha, Eli", | |
| 3140 | + "Skiba, Hilla" | |
| 3141 | + ], | |
| 3142 | + "title": "Momentum in Residential Real Estate", | |
| 3143 | + "container": "The Journal of Real Estate Finance and Economics", | |
| 3144 | + "year": 2011, | |
| 3145 | + "volume": "43", | |
| 3146 | + "issue": "3", | |
| 3147 | + "pages": "299--320", | |
| 3148 | + "doi": "10.1007/s11146-009-9210-2", | |
| 3149 | + "url": "https://doi.org/10.1007/s11146-009-9210-2", | |
| 3150 | + "publisher": "Springer Science and Business Media LLC", | |
| 3151 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 3152 | + "verified": true, | |
| 3153 | + "notes": "Online 2009; print issue 43(3), October 2011." | |
| 3154 | + }, | |
| 3155 | + { | |
| 3156 | + "key": "titman2014dynamics", | |
| 3157 | + "type": "article", | |
| 3158 | + "authors": [ | |
| 3159 | + "Titman, Sheridan", | |
| 3160 | + "Wang, Ko", | |
| 3161 | + "Yang, Jing" | |
| 3162 | + ], | |
| 3163 | + "title": "The Dynamics of Housing Prices", | |
| 3164 | + "container": "Journal of Real Estate Research", | |
| 3165 | + "year": 2014, | |
| 3166 | + "volume": "36", | |
| 3167 | + "issue": "3", | |
| 3168 | + "pages": "283--318", | |
| 3169 | + "doi": "10.1080/10835547.2014.12091394", | |
| 3170 | + "url": "https://doi.org/10.1080/10835547.2014.12091394", | |
| 3171 | + "publisher": "Informa UK Limited", | |
| 3172 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 3173 | + "verified": true, | |
| 3174 | + "notes": "Requested as JREFE; published in Journal of Real Estate Research 36(3)." | |
| 3175 | + }, | |
| 3176 | + { | |
| 3177 | + "key": "capozza2004anatomy", | |
| 3178 | + "type": "article", | |
| 3179 | + "authors": [ | |
| 3180 | + "Capozza, Dennis R.", | |
| 3181 | + "Hendershott, Patric H.", | |
| 3182 | + "Mack, Charlotte" | |
| 3183 | + ], | |
| 3184 | + "title": "An Anatomy of Price Dynamics in Illiquid Markets: Analysis and Evidence from Local Housing Markets", | |
| 3185 | + "container": "Real Estate Economics", | |
| 3186 | + "year": 2004, | |
| 3187 | + "volume": "32", | |
| 3188 | + "issue": "1", | |
| 3189 | + "pages": "1--32", | |
| 3190 | + "doi": "10.1111/j.1080-8620.2004.00082.x", | |
| 3191 | + "url": "https://doi.org/10.1111/j.1080-8620.2004.00082.x", | |
| 3192 | + "publisher": "Wiley", | |
| 3193 | + "verification_source": "Crossref API (https://api.crossref.org/works/<DOI>), 2026-10-21", | |
| 3194 | + "verified": true, | |
| 3195 | + "notes": "" | |
| 3196 | + } | |
| 3197 | +] | |
| \ No newline at end of file | ||
added
docs/literature/unverified.md
+67 −0
@@ -0,0 +1,67 @@ | ||
| 1 | +# Unverified, re-attributed or caveated items (WP23, forecasting-architectures-quebec) | |
| 2 | + | |
| 3 | +Date of search: 2026-10-21. Tools: Crossref REST API (`query.bibliographic`, `/works/<DOI>`, polite pool | |
| 4 | +`mailto=simon-pierre.boucher@uqo.ca`), arXiv API (`export.arxiv.org/api/query?id_list=`), OpenAlex API, | |
| 5 | +Semantic Scholar Graph API, RePEc/IDEAS and EconPapers records, proceedings.neurips.cc abstract pages, | |
| 6 | +jmlr.org, Open Library (ISBN), the Molnar book site, NBER paper pages. Blocked for automated access on | |
| 7 | +2026-10-21: DBLP (anti-bot challenge), OpenReview (browser check), MIT Press, Springer Link (login | |
| 8 | +redirect), Taylor & Francis (403), Diebold's UPenn page (403), Google Books API (empty). | |
| 9 | + | |
| 10 | +Nothing in section A is cited in `paper/references.bib`. Items in sections B–C **are** in the .bib but with | |
| 11 | +a caveat that is also recorded in the `notes` field of `references_verified.json`. | |
| 12 | + | |
| 13 | +## A. Requested items NOT included (not found, not verifiable, or intentionally skipped) | |
| 14 | + | |
| 15 | +| Requested item | What was searched | Outcome | | |
| 16 | +|---|---|---| | |
| 17 | +| "GeoGNN" / "geographically weighted graph neural network house price" (named GNN-housing papers) | Crossref bibliographic queries (12 phrasings), OpenAlex | No paper titled "GeoGNN" for house prices was found. The GNN/attention house-price papers that **were** verified and included are: Viana & Barbosa (2021, SIGSPATIAL), Zhang et al. (2021, KDD "MugRep"), Das et al. (2021, DMKD "GSNE"), Bin et al. (2019, DEDA), Yang et al. (2022, IEEE Access), Wang et al. (2022, IJGI, GNNWR house price), Du et al. (2020, IJGIS, GNNWR method), Guo & vanden Broucke (2026, ACM TSAS "HeteroRoadNet"), Sijp & Francke (2026, REE, graph-Laplacian). | | |
| 18 | +| Cohen, Coughlin, Zabel (housing forecasting) | Not searched (instruction: skip unless found incidentally; nothing surfaced) | Skipped. | | |
| 19 | +| Anundsen; Krause | Not searched (instruction: skip) | Skipped. | | |
| 20 | +| "Taylor (2000) quantile regression neural networks? (J. Forecasting)" | Crossref | Verified and included (`taylor2000quantilenn`, *J. Forecasting* 19(4), 299–311). Listed here only because the request carried a question mark. | | |
| 21 | +| Shazeer et al. (2017) sparsely-gated MoE **as an ICLR 2017 paper** | arXiv API (no venue in comment field), OpenReview (blocked), DBLP (blocked), Semantic Scholar (HTTP 429 on three attempts) | ICLR venue **not verified**; included as the arXiv preprint only (`shazeer2017moe`, `@misc`). If the ICLR 2017 citation is required, verify on openreview.net (forum id B1ckMDqlg) manually. | | |
| 22 | +| Bai, Kolter, Koltun (2018) TCN | arXiv API | arXiv-only preprint (no peer-reviewed version); included as `@misc` (`bai2018tcn`). | | |
| 23 | +| Molnar (2022) *Interpretable Machine Learning* (2nd ed.) | Book site `cite.html` | The author's recommended citation is now the **3rd edition (2025)**, ISBN 978-3-911578-03-5; included as `molnar2025iml`. Cite the 2025 edition, not 2022. | | |
| 24 | +| Rapach & Strauss (2009) "in *J. Forecasting*" | Crossref | Published in *International Journal of Forecasting* 25(2), 351–372 (`rapachstrauss2009`). The *J. Forecasting* attribution is wrong. | | |
| 25 | +| Titman, Wang, Yang (2014) "JREFE?" | Crossref | Published in *Journal of Real Estate Research* 36(3), 283–318 (`titman2014dynamics`), not JREFE. | | |
| 26 | +| "Hu, Yang et al. (2019?)" rental prices from social media | Crossref | Authors are Hu, He, Han, Xiao, Su, Weng, Cai (2019), *Land Use Policy* 82, 657–673 (`hu2019rental`). No author "Yang". | | |
| 27 | +| Lenaers & De Moor (2023?) in *Real Estate Economics* | Crossref | Their 2023 paper is in *Finance Research Letters* 58, 104306 (`lenaers2023xai`); nothing by them in REE. Lorenz, Willwersch, Cajias & Fuerst (2023) is the REE paper (`lorenz2023interpretable`). | | |
| 28 | +| Jin et al. (2023/2024) STGNN survey "(IEEE TPAMI?)" | Crossref | Two different surveys exist: Jin, Koh, Wen et al. (2024) *IEEE TPAMI* 46(12) on GNNs for time series (`jin2024tsgnnsurvey`), and Jin, Liang, Fang et al. (2024) *IEEE TKDE* 36(10) on STGNNs for urban computing (`jin2024urbanstgnn`). Both included. | | |
| 29 | +| Clark & McCracken (2013?) nested models | Crossref | 2013 item is the *Handbook of Economic Forecasting* vol. 2B chapter "Advances in Forecast Evaluation", 1107–1201 (`clarkmccracken2013advances`); the nested-models test paper is *J. Econometrics* 105(1), 2001 (`clarkmccracken2001nested`). | | |
| 30 | +| Munneke & Slade (2000/2001) | Crossref | The sample-selection paper is *JREFE* 21(1), 45–64, **2000** (`munnekeslade2000selection`); their 2001 REE paper is a different (time-varying-parameter index) paper, not included. | | |
| 31 | +| Deppner & Cajias (2024?) | Crossref | *JREFE* 68(2), 235–273, print **2024** (online 2022) (`deppnercajias2024spatialcv`). | | |
| 32 | +| Beracha & Skiba (2011) | Crossref | *JREFE* 43(3), 299–320, print **2011** (online 2009). | | |
| 33 | +| Case & Shiller (1989) DOI | RePEc (reused from WP22) | AER 1989 has no DOI; RePEc URL only. | | |
| 34 | +| Kim & Nelson (1999) DOI record | Crossref `/works/10.7551/mitpress/6444.001.0001` | Crossref author field is garbled ("Kim, Halbert"); MIT Press page 403. Authors confirmed from Open Library (ISBN 0262112388) and the OpenAlex record of the JASA 2000 review (10.2307/2669796) that names Kim and Nelson. Included with this caveat. | | |
| 35 | +| Vovk, Gammerman, Shafer (2005) | Crossref `/works/10.1007/b106715` (no author field); Springer page (login redirect) | Authors confirmed from Open Library (ISBN 0387001522) and the Crossref record of the 2022 2nd edition. Included with caveat. | | |
| 36 | +| Hansen, Lunde, Nason (2011) MCS | Crossref `/works/10.3982/ECTA5771` (no author field); OpenAlex (no authors) | Venue/volume/pages verified; authors confirmed from the Crossref SSRN record of the same title (10.2139/ssrn.522382) and RePEc `ecm:emetrp:v:79:y:2011:i:2:p:453-497`. Included with caveat. | | |
| 37 | +| Diebold (2015) page range | Crossref, RePEc, OpenAlex, NBER w18391 page (all register first page 1 only); T&F 403 | **Page range omitted** in the .bib (volume 33, issue 1, 2015, DOI given). Do not add "1–9" without checking the publisher page. | | |
| 38 | +| Ghysels, Plazzi, Torous, Valkanov (2013) author order | Crossref | Crossref registers Ghysels, Plazzi, **Valkanov, Torous**; that order is used. Editors (Elliott & Timmermann) and "Volume 2A" are from the handbook series, not from the chapter record. | | |
| 39 | +| Bates & Granger (1969) journal | Crossref | Registered under *Journal of the Operational Research Society* 20(4); the issue was published as *Operational Research Quarterly*. Crossref name kept. | | |
| 40 | +| Litterman (1986) | Crossref (two DOIs) | T&F DOI 10.1080/07350015.1986.10509491 used (carries pages 25–38); JSTOR DOI 10.2307/1391384 registers first page only. | | |
| 41 | +| Koenker & Bassett 1978; Hamilton 1989; West 1996; Heckman 1979 page ranges | Crossref/OpenAlex (first page only) | Full ranges taken from RePEc `ecm:emetrp` records (33–50; 357–384; 1067–1084; 153–161), confirmed for Hamilton/West by Semantic Scholar. | | |
| 42 | +| Krishnan, Shalit, Sontag (2017) AAAI pages | Crossref/OpenAlex | No page range registered; cited with volume/number in a note. | | |
| 43 | +| Bin et al. (2019) pages | Crossref | Article number 2 (Springer), no page range. | | |
| 44 | +| Sijp & Francke (2026) | Crossref | Early-view article (online 2026-06-27), no volume/issue/pages yet. | | |
| 45 | +| Oreshkin et al. (2020) N-BEATS ICLR venue | arXiv (no comment), Semantic Scholar (publicationVenue = ICLR), OpenReview blocked | Included as ICLR 2020 on the strength of the Semantic Scholar venue record + arXiv v4 (Feb 2020). | | |
| 46 | + | |
| 47 | +## B. Verified entries whose metadata differ from the request (all included in the .bib) | |
| 48 | + | |
| 49 | +- `kouwenbergzwinkels2014`: IJF 30(3), 415–425 (July 2014). | |
| 50 | +- `gupta2011forecasting` (Economic Modelling 28(4)) and `gupta2011large` (J. Housing Research 20(2)) are two distinct 2011 papers; the "large data sets" one is the JHR paper. | |
| 51 | +- `holly2011uk`: Crossref registers the second author as "Hashem Pesaran, M."; normalised to "Pesaran, M. Hashem". | |
| 52 | +- `kunsch1989jackknife`: Crossref drops the umlaut; restored. | |
| 53 | +- `hong2020randomforest`: Crossref title in capitals; converted to sentence case. | |
| 54 | +- `kok2017bigdata`: Crossref title contains HTML italics; flattened. | |
| 55 | +- `friedman2001gbm`, `timmermann2006combinations`, `chenguestrin2016xgboost`: trailing period / "Chapter 4" label / split subtitle cleaned. | |
| 56 | +- `caseshiller1990forecasting`: journal was *AREUEA Journal* in 1990; Crossref registers it as *Real Estate Economics*. | |
| 57 | +- `boginshui2020rural`: a correction exists (JREFE 61(4), 730–731, 10.1007/s11146-019-09727-7), not cited. | |
| 58 | + | |
| 59 | +## C. Abstract availability for the novelty scan | |
| 60 | + | |
| 61 | +Abstracts could be retrieved (Crossref/OpenAlex) for: Lorenz et al. 2023, Deppner & Cajias 2024, Viana & | |
| 62 | +Barbosa 2021, Zhang et al. 2021, Milunovich 2020, Yang et al. 2022, Wang et al. 2022, Bourassa et al. 2010, | |
| 63 | +Mayer et al. 2019, Hong et al. 2020, Gupta et al. 2011 (JHR), Sijp & Francke 2026, Guo & vanden Broucke 2026. | |
| 64 | +**No abstract** could be retrieved for Pace & Hayunga 2020, Yeo et al. 2025, Das et al. 2021, Xu & Zhang 2022, | |
| 65 | +Bork & Møller 2015, Kouwenberg & Zwinkels 2014, Rapach & Strauss 2009, Plakandaras et al. 2015, Holly et al. | |
| 66 | +2011, Bin et al. 2019, Kang et al. 2021, Lenaers & De Moor 2023; for these the novelty scan relies on the | |
| 67 | +verified title and, where stated, on general knowledge of the paper flagged as such. | |
added
figures/fig_map_density.pdf
+0 −0
Binary file not shown.
added
figures/fig_map_density.png
+0 −0
Binary file not shown.
added
paper/.latexmkrc
+5 −0
@@ -0,0 +1,5 @@ | ||
| 1 | +$pdf_mode = 1; | |
| 2 | +$pdflatex = 'pdflatex -interaction=nonstopmode -halt-on-error -synctex=1 %O %S'; | |
| 3 | +$bibtex_use = 2; | |
| 4 | +$clean_ext = 'synctex.gz run.xml bbl bcf fdb_latexmk fls log aux out toc lof lot blg'; | |
| 5 | +@default_files = ('main.tex'); | |
added
paper/Makefile
+11 −0
@@ -0,0 +1,11 @@ | ||
| 1 | +.PHONY: all clean distclean | |
| 2 | + | |
| 3 | +all: | |
| 4 | + latexmk | |
| 5 | + | |
| 6 | +clean: | |
| 7 | + latexmk -c | |
| 8 | + | |
| 9 | +distclean: | |
| 10 | + latexmk -C | |
| 11 | + rm -f *.synctex.gz *.run.xml *.bbl *.bcf | |
added
paper/appendix/appendix.tex
+7 −0
@@ -0,0 +1,7 @@ | ||
| 1 | +\begin{appendices} | |
| 2 | +\section{Hyper-parameters}\label{app:hyper} | |
| 3 | +\input{tables/tab_hyper} | |
| 4 | +\section{Leakage audit}\label{app:leakage} | |
| 5 | +\input{tables/tab_leakage} | |
| 6 | +\section{Supplementary tables}\label{app:supp} | |
| 7 | +\end{appendices} | |
added
paper/figures/fig_map_density.pdf
+0 −0
Binary file not shown.
added
paper/main.pdf
+0 −0
Binary file not shown.
added
paper/main.tex
+153 −0
@@ -0,0 +1,153 @@ | ||
| 1 | +% ============================================================================ | |
| 2 | +% UQO Working Paper Template — Economics / Finance | |
| 3 | +% ============================================================================ | |
| 4 | +\documentclass[12pt,letterpaper]{article} | |
| 5 | + | |
| 6 | +% --- Encoding & Language --- | |
| 7 | +\usepackage[utf8]{inputenc} | |
| 8 | +\usepackage[T1]{fontenc} | |
| 9 | +\usepackage[english]{babel} | |
| 10 | + | |
| 11 | +% --- Page Layout --- | |
| 12 | +\usepackage[ | |
| 13 | + letterpaper, | |
| 14 | + top=1in, | |
| 15 | + bottom=1in, | |
| 16 | + left=1in, | |
| 17 | + right=1in | |
| 18 | +]{geometry} | |
| 19 | + | |
| 20 | +% --- Typography --- | |
| 21 | +\usepackage{mathptmx} % Times-like font (text + math) | |
| 22 | +\usepackage{microtype} % Improved typographic refinements | |
| 23 | +\usepackage{setspace} | |
| 24 | +\onehalfspacing % 1.5 line spacing | |
| 25 | + | |
| 26 | +% --- Math --- | |
| 27 | +\usepackage{amsmath,amssymb,amsthm} | |
| 28 | + | |
| 29 | +% --- Tables --- | |
| 30 | +\usepackage{booktabs} | |
| 31 | +\usepackage{tabularx} | |
| 32 | +\usepackage{multirow} | |
| 33 | +\usepackage{threeparttable} | |
| 34 | +\usepackage{siunitx} | |
| 35 | +\sisetup{ | |
| 36 | + input-symbols = {()}, | |
| 37 | + table-format = -1.3, | |
| 38 | + parse-numbers = false | |
| 39 | +} | |
| 40 | + | |
| 41 | +% --- Figures --- | |
| 42 | +\usepackage{graphicx} | |
| 43 | +\usepackage{subcaption} | |
| 44 | +\usepackage{float} | |
| 45 | + | |
| 46 | +% --- Colors & Links --- | |
| 47 | +\usepackage[dvipsnames]{xcolor} | |
| 48 | +\usepackage[ | |
| 49 | + colorlinks = true, | |
| 50 | + linkcolor = NavyBlue, | |
| 51 | + citecolor = NavyBlue, | |
| 52 | + urlcolor = NavyBlue, | |
| 53 | + breaklinks = true | |
| 54 | +]{hyperref} | |
| 55 | +\hypersetup{pdftitle={Beyond Hedonic Models: Spatiotemporal, Hierarchical and Probabilistic Architectures for Residential Real Estate Price Forecasting}, pdfauthor={Simon-Pierre Boucher}} | |
| 56 | + | |
| 57 | +% --- Bibliography --- | |
| 58 | +\usepackage[authoryear,round,semicolon]{natbib} | |
| 59 | +\bibliographystyle{aer} | |
| 60 | + | |
| 61 | +% --- Captions --- | |
| 62 | +\usepackage[ | |
| 63 | + font = small, | |
| 64 | + labelfont = bf, | |
| 65 | + labelsep = period, | |
| 66 | + justification = justified, | |
| 67 | + singlelinecheck = false | |
| 68 | +]{caption} | |
| 69 | + | |
| 70 | +% --- Headers & Footers --- | |
| 71 | +\usepackage{fancyhdr} | |
| 72 | +\pagestyle{fancy} | |
| 73 | +\fancyhf{} | |
| 74 | +\renewcommand{\headrulewidth}{0pt} | |
| 75 | +\fancyfoot[C]{\thepage} | |
| 76 | + | |
| 77 | +% --- Section Formatting --- | |
| 78 | +\usepackage{titlesec} | |
| 79 | +\titleformat{\section}{\large\bfseries}{\thesection.}{0.5em}{} | |
| 80 | +\titleformat{\subsection}{\normalsize\bfseries}{\thesubsection.}{0.5em}{} | |
| 81 | +\titleformat{\subsubsection}{\normalsize\itshape}{\thesubsubsection.}{0.5em}{} | |
| 82 | + | |
| 83 | +% --- Appendix Support --- | |
| 84 | +\usepackage[toc,page]{appendix} | |
| 85 | +\usepackage{longtable} | |
| 86 | +\usepackage{bm} | |
| 87 | +\input{tables/numbers} | |
| 88 | +\input{tables/numbers_missing} | |
| 89 | +\newcommand{\E}{\mathbb{E}} | |
| 90 | +\newcommand{\Var}{\mathrm{Var}} | |
| 91 | +\DeclareMathOperator*{\argmin}{arg\,min} | |
| 92 | + | |
| 93 | +% --- Misc --- | |
| 94 | +\usepackage{enumitem} | |
| 95 | +\setlist{nosep,leftmargin=*} | |
| 96 | + | |
| 97 | +% ============================================================================ | |
| 98 | +% METADATA — Edit these fields for each working paper | |
| 99 | +% ============================================================================ | |
| 100 | +\newcommand{\WPnumber}{23} | |
| 101 | +\newcommand{\WPtitle}{Beyond Hedonic Models: Spatiotemporal, Hierarchical and Probabilistic Architectures for Residential Real Estate Price Forecasting} | |
| 102 | +\newcommand{\WPsubtitle}{A pseudo-real-time evaluation on 632{,}000 Quebec transactions and 82 local market indices, 2021--2026} | |
| 103 | +\newcommand{\WPdate}{October 2026} | |
| 104 | +\newcommand{\WPversion}{1.0} | |
| 105 | +\input{sections/abstract} | |
| 106 | +\newcommand{\WPkeywords}{house price forecasting, machine learning, graph neural networks, state-space models, hierarchical Bayes, regime switching, probabilistic forecasting, Quebec} | |
| 107 | +\newcommand{\WPjel}{R31, C53, C45, C11, C21, C55} | |
| 108 | + | |
| 109 | +% --- Author --- | |
| 110 | +\newcommand{\WPauthor}{Simon-Pierre Boucher} | |
| 111 | +\newcommand{\WPaffiliation}{% | |
| 112 | + Département des sciences administratives\\ | |
| 113 | + Université du Québec en Outaouais% | |
| 114 | +} | |
| 115 | +\newcommand{\WPemail}{simon-pierre.boucher@uqo.ca} | |
| 116 | +\newcommand{\WPaddress}{% | |
| 117 | + Gatineau -- Pavillon Alexandre-Taché\\ | |
| 118 | + 283, boulevard Alexandre-Taché\\ | |
| 119 | + Gatineau, Québec, Canada J9A 1L8% | |
| 120 | +} | |
| 121 | + | |
| 122 | +% ============================================================================ | |
| 123 | +% DOCUMENT | |
| 124 | +% ============================================================================ | |
| 125 | +\begin{document} | |
| 126 | + | |
| 127 | +% --- Title Page --- | |
| 128 | +\input{sections/titlepage} | |
| 129 | + | |
| 130 | +% --- Main Body --- | |
| 131 | +\input{sections/introduction} | |
| 132 | +\input{sections/literature} | |
| 133 | +\input{sections/data} | |
| 134 | +\input{sections/targets} | |
| 135 | +\input{sections/architectures} | |
| 136 | +\input{sections/benchmarks} | |
| 137 | +\input{sections/simulation} | |
| 138 | +\input{sections/framework} | |
| 139 | +\input{sections/results} | |
| 140 | +\input{sections/heterogeneity} | |
| 141 | +\input{sections/probabilistic} | |
| 142 | +\input{sections/interpretation} | |
| 143 | +\input{sections/ablation} | |
| 144 | +\input{sections/conclusion} | |
| 145 | + | |
| 146 | +% --- References --- | |
| 147 | +\newpage | |
| 148 | +\bibliography{references} | |
| 149 | + | |
| 150 | +% --- Appendix --- | |
| 151 | +\input{appendix/appendix} | |
| 152 | + | |
| 153 | +\end{document} | |
added
paper/references.bib
+1605 −0
@@ -0,0 +1,1605 @@ | ||
| 1 | +% WP23 (forecasting-architectures-quebec) -- verified references only. | |
| 2 | +% Every entry was checked on 2026-10-21 against Crossref (/works/<DOI>), the arXiv API, proceedings.neurips.cc, | |
| 3 | +% jmlr.org, RePEc or the publisher page; sources and caveats are recorded in docs/literature/references_verified.json | |
| 4 | +% and docs/literature/unverified.md. The first block (42 entries) is reused verbatim from WP22 | |
| 5 | +% (../sharp-hpi-quebec/paper/references.bib, verified there); the second block (110 entries) is new. | |
| 6 | +% Keys: lowercase author+year+word. natbib/aer.bst compatible; non-ASCII characters are LaTeX-escaped. | |
| 7 | + | |
| 8 | +%% ===================== Block 1: entries reused from WP22 ===================== | |
| 9 | + | |
| 10 | +@article{caseshiller1987, | |
| 11 | + author = {Case, Karl E. and Shiller, Robert J.}, | |
| 12 | + title = {Prices of Single-Family Homes Since 1970: New Indexes for Four Cities}, | |
| 13 | + journal = {New England Economic Review}, | |
| 14 | + year = {1987}, | |
| 15 | + pages = {45--56}, | |
| 16 | + month = {September}, | |
| 17 | + url = {https://ideas.repec.org/a/fip/fedbne/y1987isepp45-56.html} | |
| 18 | +} | |
| 19 | + | |
| 20 | +@article{caseshiller1989, | |
| 21 | + author = {Case, Karl E. and Shiller, Robert J.}, | |
| 22 | + title = {The Efficiency of the Market for Single-Family Homes}, | |
| 23 | + journal = {American Economic Review}, | |
| 24 | + year = {1989}, | |
| 25 | + volume = {79}, | |
| 26 | + number = {1}, | |
| 27 | + pages = {125--137}, | |
| 28 | + url = {https://ideas.repec.org/a/aea/aecrev/v79y1989i1p125-37.html} | |
| 29 | +} | |
| 30 | + | |
| 31 | +@article{hollypesaran2010, | |
| 32 | + author = {Holly, Sean and Pesaran, M. Hashem and Yamagata, Takashi}, | |
| 33 | + title = {A spatio-temporal model of house prices in the {USA}}, | |
| 34 | + journal = {Journal of Econometrics}, | |
| 35 | + year = {2010}, | |
| 36 | + volume = {158}, | |
| 37 | + number = {1}, | |
| 38 | + pages = {160--173}, | |
| 39 | + doi = {10.1016/j.jeconom.2010.03.040} | |
| 40 | +} | |
| 41 | + | |
| 42 | +@article{pace2000spatiotemporal, | |
| 43 | + author = {Pace, R. Kelley and Barry, Ronald and Gilley, Otis W. and Sirmans, C. F.}, | |
| 44 | + title = {A method for spatial--temporal forecasting with an application to real estate prices}, | |
| 45 | + journal = {International Journal of Forecasting}, | |
| 46 | + year = {2000}, | |
| 47 | + volume = {16}, | |
| 48 | + number = {2}, | |
| 49 | + pages = {229--246}, | |
| 50 | + doi = {10.1016/s0169-2070(99)00047-3} | |
| 51 | +} | |
| 52 | + | |
| 53 | +@book{anselin1988, | |
| 54 | + author = {Anselin, Luc}, | |
| 55 | + title = {Spatial Econometrics: Methods and Models}, | |
| 56 | + year = {1988}, | |
| 57 | + publisher = {Kluwer Academic Publishers}, | |
| 58 | + doi = {10.1007/978-94-015-7799-1} | |
| 59 | +} | |
| 60 | + | |
| 61 | +@article{kelejianprucha2010, | |
| 62 | + author = {Kelejian, Harry H. and Prucha, Ingmar R.}, | |
| 63 | + title = {Specification and estimation of spatial autoregressive models with autoregressive and heteroskedastic disturbances}, | |
| 64 | + journal = {Journal of Econometrics}, | |
| 65 | + year = {2010}, | |
| 66 | + volume = {157}, | |
| 67 | + number = {1}, | |
| 68 | + pages = {53--67}, | |
| 69 | + doi = {10.1016/j.jeconom.2009.10.025} | |
| 70 | +} | |
| 71 | + | |
| 72 | +@book{lesagepace2009, | |
| 73 | + author = {LeSage, James and Pace, Robert Kelley}, | |
| 74 | + title = {Introduction to Spatial Econometrics}, | |
| 75 | + year = {2009}, | |
| 76 | + publisher = {Chapman and Hall/CRC}, | |
| 77 | + doi = {10.1201/9781420064254} | |
| 78 | +} | |
| 79 | + | |
| 80 | +@article{hyndman2011hierarchical, | |
| 81 | + author = {Hyndman, Rob J. and Ahmed, Roman A. and Athanasopoulos, George and Shang, Han Lin}, | |
| 82 | + title = {Optimal combination forecasts for hierarchical time series}, | |
| 83 | + journal = {Computational Statistics \& Data Analysis}, | |
| 84 | + year = {2011}, | |
| 85 | + volume = {55}, | |
| 86 | + number = {9}, | |
| 87 | + pages = {2579--2589}, | |
| 88 | + doi = {10.1016/j.csda.2011.03.006} | |
| 89 | +} | |
| 90 | + | |
| 91 | +@article{wickramasuriya2019mint, | |
| 92 | + author = {Wickramasuriya, Shanika L. and Athanasopoulos, George and Hyndman, Rob J.}, | |
| 93 | + title = {Optimal Forecast Reconciliation for Hierarchical and Grouped Time Series Through Trace Minimization}, | |
| 94 | + journal = {Journal of the American Statistical Association}, | |
| 95 | + year = {2019}, | |
| 96 | + volume = {114}, | |
| 97 | + number = {526}, | |
| 98 | + pages = {804--819}, | |
| 99 | + doi = {10.1080/01621459.2018.1448825} | |
| 100 | +} | |
| 101 | + | |
| 102 | +@article{athanasopoulos2024reconciliation, | |
| 103 | + author = {Athanasopoulos, George and Hyndman, Rob J. and Kourentzes, Nikolaos and Panagiotelis, Anastasios}, | |
| 104 | + title = {Forecast reconciliation: A review}, | |
| 105 | + journal = {International Journal of Forecasting}, | |
| 106 | + year = {2024}, | |
| 107 | + volume = {40}, | |
| 108 | + number = {2}, | |
| 109 | + pages = {430--456}, | |
| 110 | + doi = {10.1016/j.ijforecast.2023.10.010} | |
| 111 | +} | |
| 112 | + | |
| 113 | +@book{durbinkoopman2012, | |
| 114 | + author = {Durbin, James and Koopman, Siem Jan}, | |
| 115 | + title = {Time Series Analysis by State Space Methods}, | |
| 116 | + year = {2012}, | |
| 117 | + publisher = {Oxford University Press}, | |
| 118 | + edition = {2}, | |
| 119 | + doi = {10.1093/acprof:oso/9780199641178.001.0001} | |
| 120 | +} | |
| 121 | + | |
| 122 | +@book{harvey1989, | |
| 123 | + author = {Harvey, Andrew C.}, | |
| 124 | + title = {Forecasting, Structural Time Series Models and the {Kalman} Filter}, | |
| 125 | + year = {1989}, | |
| 126 | + publisher = {Cambridge University Press}, | |
| 127 | + doi = {10.1017/CBO9781107049994} | |
| 128 | +} | |
| 129 | + | |
| 130 | +@article{kalman1960, | |
| 131 | + author = {Kalman, R. E.}, | |
| 132 | + title = {A New Approach to Linear Filtering and Prediction Problems}, | |
| 133 | + journal = {Journal of Basic Engineering}, | |
| 134 | + year = {1960}, | |
| 135 | + volume = {82}, | |
| 136 | + number = {1}, | |
| 137 | + pages = {35--45}, | |
| 138 | + doi = {10.1115/1.3662552} | |
| 139 | +} | |
| 140 | + | |
| 141 | +@inproceedings{ke2017lightgbm, | |
| 142 | + author = {Ke, Guolin and Meng, Qi and Finley, Thomas and Wang, Taifeng and Chen, Wei and Ma, Weidong and Ye, Qiwei and Liu, Tie-Yan}, | |
| 143 | + title = {LightGBM: A Highly Efficient Gradient Boosting Decision Tree}, | |
| 144 | + booktitle = {Advances in Neural Information Processing Systems 30 (NIPS 2017)}, | |
| 145 | + year = {2017}, | |
| 146 | + pages = {3146--3154}, | |
| 147 | + url = {https://proceedings.neurips.cc/paper/2017/hash/6449f44a102fde848669bdd9eb6b76fa-Abstract.html} | |
| 148 | +} | |
| 149 | + | |
| 150 | +@article{gatzlaffhaurin1997, | |
| 151 | + author = {Gatzlaff, Dean H. and Haurin, Donald R.}, | |
| 152 | + title = {Sample Selection Bias and Repeat-Sales Index Estimates}, | |
| 153 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 154 | + year = {1997}, | |
| 155 | + volume = {14}, | |
| 156 | + number = {1-2}, | |
| 157 | + pages = {33--50}, | |
| 158 | + doi = {10.1023/a:1007763816289} | |
| 159 | +} | |
| 160 | + | |
| 161 | +@article{gatzlaffhaurin1998, | |
| 162 | + author = {Gatzlaff, Dean H. and Haurin, Donald R.}, | |
| 163 | + title = {Sample Selection and Biases in Local House Value Indices}, | |
| 164 | + journal = {Journal of Urban Economics}, | |
| 165 | + year = {1998}, | |
| 166 | + volume = {43}, | |
| 167 | + number = {2}, | |
| 168 | + pages = {199--222}, | |
| 169 | + doi = {10.1006/juec.1997.2045} | |
| 170 | +} | |
| 171 | + | |
| 172 | +@article{hwangquigley2004, | |
| 173 | + author = {Hwang, Min and Quigley, John M.}, | |
| 174 | + title = {Selectivity, Quality Adjustment and Mean Reversion in the Measurement of House Values}, | |
| 175 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 176 | + year = {2004}, | |
| 177 | + volume = {28}, | |
| 178 | + number = {2-3}, | |
| 179 | + pages = {161--178}, | |
| 180 | + doi = {10.1023/b:real.0000011152.40485.12} | |
| 181 | +} | |
| 182 | + | |
| 183 | +@article{clapp1991alltransactions, | |
| 184 | + author = {Clapp, John M. and Giaccotto, Carmelo and Tirtiroglu, Dogan}, | |
| 185 | + title = {Housing Price Indices Based on All Transactions Compared to Repeat Subsamples}, | |
| 186 | + journal = {Real Estate Economics}, | |
| 187 | + year = {1991}, | |
| 188 | + volume = {19}, | |
| 189 | + number = {3}, | |
| 190 | + pages = {270--285}, | |
| 191 | + doi = {10.1111/1540-6229.00553} | |
| 192 | +} | |
| 193 | + | |
| 194 | +@book{gelmanhill2007, | |
| 195 | + author = {Gelman, Andrew and Hill, Jennifer}, | |
| 196 | + title = {Data Analysis Using Regression and {Multilevel/Hierarchical} Models}, | |
| 197 | + year = {2007}, | |
| 198 | + publisher = {Cambridge University Press}, | |
| 199 | + doi = {10.1017/CBO9780511790942} | |
| 200 | +} | |
| 201 | + | |
| 202 | +@article{gelman2006prior, | |
| 203 | + author = {Gelman, Andrew}, | |
| 204 | + title = {Prior distributions for variance parameters in hierarchical models (comment on article by Browne and Draper)}, | |
| 205 | + journal = {Bayesian Analysis}, | |
| 206 | + year = {2006}, | |
| 207 | + volume = {1}, | |
| 208 | + number = {3}, | |
| 209 | + pages = {515--534}, | |
| 210 | + doi = {10.1214/06-ba117a} | |
| 211 | +} | |
| 212 | + | |
| 213 | +@article{rosen1974, | |
| 214 | + author = {Rosen, Sherwin}, | |
| 215 | + title = {Hedonic Prices and Implicit Markets: Product Differentiation in Pure Competition}, | |
| 216 | + journal = {Journal of Political Economy}, | |
| 217 | + year = {1974}, | |
| 218 | + volume = {82}, | |
| 219 | + number = {1}, | |
| 220 | + pages = {34--55}, | |
| 221 | + doi = {10.1086/260169} | |
| 222 | +} | |
| 223 | + | |
| 224 | +@article{francke2017hierarchical, | |
| 225 | + author = {Francke, Marc K. and van de Minne, Alex}, | |
| 226 | + title = {The Hierarchical Repeat Sales Model for Granular Commercial Real Estate and Residential Price Indices}, | |
| 227 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 228 | + year = {2017}, | |
| 229 | + volume = {55}, | |
| 230 | + number = {4}, | |
| 231 | + pages = {511--532}, | |
| 232 | + doi = {10.1007/s11146-017-9632-1} | |
| 233 | +} | |
| 234 | + | |
| 235 | +@article{francke2010thin, | |
| 236 | + author = {Francke, Marc K.}, | |
| 237 | + title = {Repeat Sales Index for Thin Markets}, | |
| 238 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 239 | + year = {2010}, | |
| 240 | + volume = {41}, | |
| 241 | + number = {1}, | |
| 242 | + pages = {24--52}, | |
| 243 | + doi = {10.1007/s11146-009-9203-1} | |
| 244 | +} | |
| 245 | + | |
| 246 | +@article{francke2021heterogeneity, | |
| 247 | + author = {Francke, Marc and van de Minne, Alex}, | |
| 248 | + title = {Modeling unobserved heterogeneity in hedonic price models}, | |
| 249 | + journal = {Real Estate Economics}, | |
| 250 | + year = {2021}, | |
| 251 | + volume = {49}, | |
| 252 | + number = {4}, | |
| 253 | + pages = {1315--1339}, | |
| 254 | + doi = {10.1111/1540-6229.12320} | |
| 255 | +} | |
| 256 | + | |
| 257 | +@article{bailey1963, | |
| 258 | + author = {Bailey, Martin J. and Muth, Richard F. and Nourse, Hugh O.}, | |
| 259 | + title = {A Regression Method for Real Estate Price Index Construction}, | |
| 260 | + journal = {Journal of the American Statistical Association}, | |
| 261 | + year = {1963}, | |
| 262 | + volume = {58}, | |
| 263 | + number = {304}, | |
| 264 | + pages = {933--942}, | |
| 265 | + doi = {10.1080/01621459.1963.10480679} | |
| 266 | +} | |
| 267 | + | |
| 268 | +@article{goetzmann1992, | |
| 269 | + author = {Goetzmann, William Nelson}, | |
| 270 | + title = {The accuracy of real estate indices: Repeat sale estimators}, | |
| 271 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 272 | + year = {1992}, | |
| 273 | + volume = {5}, | |
| 274 | + number = {1}, | |
| 275 | + pages = {5--53}, | |
| 276 | + doi = {10.1007/bf00153997} | |
| 277 | +} | |
| 278 | + | |
| 279 | +@article{clappgiaccotto1992, | |
| 280 | + author = {Clapp, John M. and Giaccotto, Carmelo}, | |
| 281 | + title = {Estimating Price Indices for Residential Property: A Comparison of Repeat Sales and Assessed Value Methods}, | |
| 282 | + journal = {Journal of the American Statistical Association}, | |
| 283 | + year = {1992}, | |
| 284 | + volume = {87}, | |
| 285 | + number = {418}, | |
| 286 | + pages = {300--306}, | |
| 287 | + doi = {10.1080/01621459.1992.10475209} | |
| 288 | +} | |
| 289 | + | |
| 290 | +@article{bourassa2006simple, | |
| 291 | + author = {Bourassa, Steven C. and Hoesli, Martin and Sun, Jian}, | |
| 292 | + title = {A simple alternative house price index method}, | |
| 293 | + journal = {Journal of Housing Economics}, | |
| 294 | + year = {2006}, | |
| 295 | + volume = {15}, | |
| 296 | + number = {1}, | |
| 297 | + pages = {80--97}, | |
| 298 | + doi = {10.1016/j.jhe.2006.03.001} | |
| 299 | +} | |
| 300 | + | |
| 301 | +@book{wood2017gam, | |
| 302 | + author = {Wood, Simon N.}, | |
| 303 | + title = {Generalized Additive Models}, | |
| 304 | + year = {2017}, | |
| 305 | + publisher = {Chapman and Hall/CRC}, | |
| 306 | + edition = {2}, | |
| 307 | + doi = {10.1201/9781315370279} | |
| 308 | +} | |
| 309 | + | |
| 310 | +@article{chernozhukov2018dml, | |
| 311 | + author = {Chernozhukov, Victor and Chetverikov, Denis and Demirer, Mert and Duflo, Esther and Hansen, Christian and Newey, Whitney and Robins, James}, | |
| 312 | + title = {Double/debiased machine learning for treatment and structural parameters}, | |
| 313 | + journal = {The Econometrics Journal}, | |
| 314 | + year = {2018}, | |
| 315 | + volume = {21}, | |
| 316 | + number = {1}, | |
| 317 | + pages = {C1-C68}, | |
| 318 | + doi = {10.1111/ectj.12097} | |
| 319 | +} | |
| 320 | + | |
| 321 | +@article{hill2013survey, | |
| 322 | + author = {Hill, Robert J.}, | |
| 323 | + title = {Hedonic Price Indexes for Residential Housing: A Survey, Evaluation and Taxonomy}, | |
| 324 | + journal = {Journal of Economic Surveys}, | |
| 325 | + year = {2013}, | |
| 326 | + volume = {27}, | |
| 327 | + number = {5}, | |
| 328 | + pages = {879--914}, | |
| 329 | + doi = {10.1111/j.1467-6419.2012.00731.x} | |
| 330 | +} | |
| 331 | + | |
| 332 | +@article{hill2026survey, | |
| 333 | + author = {Hill, Robert J. and Steurer, Miriam}, | |
| 334 | + title = {Real Estate Price Measurement Since the Global Financial Crisis: Methods, Data and Policy Developments}, | |
| 335 | + journal = {Review of Income and Wealth}, | |
| 336 | + year = {2026}, | |
| 337 | + volume = {72}, | |
| 338 | + number = {1}, | |
| 339 | + doi = {10.1111/roiw.70055}, | |
| 340 | + note = {Article e70055} | |
| 341 | +} | |
| 342 | + | |
| 343 | +@book{eurostat2013handbook, | |
| 344 | + author = {{Eurostat} and {ILO} and {IMF} and {OECD} and {UNECE} and {World Bank}}, | |
| 345 | + title = {Handbook on Residential Property Price Indices ({RPPIs})}, | |
| 346 | + year = {2013}, | |
| 347 | + publisher = {OECD Publishing / Eurostat}, | |
| 348 | + doi = {10.1787/9789264197183-en} | |
| 349 | +} | |
| 350 | + | |
| 351 | +@article{nagaraja2011autoregressive, | |
| 352 | + author = {Nagaraja, Chaitra H. and Brown, Lawrence D. and Zhao, Linda H.}, | |
| 353 | + title = {An autoregressive approach to house price modeling}, | |
| 354 | + journal = {The Annals of Applied Statistics}, | |
| 355 | + year = {2011}, | |
| 356 | + volume = {5}, | |
| 357 | + number = {1}, | |
| 358 | + pages = {124--149}, | |
| 359 | + doi = {10.1214/10-aoas380} | |
| 360 | +} | |
| 361 | + | |
| 362 | +@article{bogin2019local, | |
| 363 | + author = {Bogin, Alexander and Doerner, William and Larson, William}, | |
| 364 | + title = {Local House Price Dynamics: New Indices and Stylized Facts}, | |
| 365 | + journal = {Real Estate Economics}, | |
| 366 | + year = {2019}, | |
| 367 | + volume = {47}, | |
| 368 | + number = {2}, | |
| 369 | + pages = {365--398}, | |
| 370 | + doi = {10.1111/1540-6229.12233} | |
| 371 | +} | |
| 372 | + | |
| 373 | +@article{mcmillen2012matching, | |
| 374 | + author = {McMillen, Daniel P.}, | |
| 375 | + title = {Repeat Sales as a Matching Estimator}, | |
| 376 | + journal = {Real Estate Economics}, | |
| 377 | + year = {2012}, | |
| 378 | + volume = {40}, | |
| 379 | + number = {4}, | |
| 380 | + pages = {745--773}, | |
| 381 | + doi = {10.1111/j.1540-6229.2012.00343.x} | |
| 382 | +} | |
| 383 | + | |
| 384 | +@article{fayherriot1979, | |
| 385 | + author = {Fay, Robert E. and Herriot, Roger A.}, | |
| 386 | + title = {Estimates of Income for Small Places: An Application of {James-Stein} Procedures to Census Data}, | |
| 387 | + journal = {Journal of the American Statistical Association}, | |
| 388 | + year = {1979}, | |
| 389 | + volume = {74}, | |
| 390 | + number = {366}, | |
| 391 | + pages = {269--277}, | |
| 392 | + doi = {10.1080/01621459.1979.10482505} | |
| 393 | +} | |
| 394 | + | |
| 395 | +@article{efronmorris1973, | |
| 396 | + author = {Efron, Bradley and Morris, Carl}, | |
| 397 | + title = {Stein's Estimation Rule and its Competitors---An Empirical {Bayes} Approach}, | |
| 398 | + journal = {Journal of the American Statistical Association}, | |
| 399 | + year = {1973}, | |
| 400 | + volume = {68}, | |
| 401 | + number = {341}, | |
| 402 | + pages = {117--130}, | |
| 403 | + doi = {10.1080/01621459.1973.10481350} | |
| 404 | +} | |
| 405 | + | |
| 406 | +@article{francke2022daily, | |
| 407 | + author = {Francke, Marc and van de Minne, Alex}, | |
| 408 | + title = {Daily appraisal of commercial real estate a new mixed frequency approach}, | |
| 409 | + journal = {Real Estate Economics}, | |
| 410 | + year = {2022}, | |
| 411 | + volume = {50}, | |
| 412 | + number = {5}, | |
| 413 | + pages = {1257--1281}, | |
| 414 | + doi = {10.1111/1540-6229.12378} | |
| 415 | +} | |
| 416 | + | |
| 417 | +@article{francke2025censustract, | |
| 418 | + author = {Francke, Marc and Rolheiser, Lyndsey and van de Minne, Alex}, | |
| 419 | + title = {Estimating Census Tract House Price Indexes: A New Spatial Dynamic Factor Approach}, | |
| 420 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 421 | + year = {2025}, | |
| 422 | + volume = {70}, | |
| 423 | + number = {3}, | |
| 424 | + pages = {483--514}, | |
| 425 | + doi = {10.1007/s11146-023-09957-w} | |
| 426 | +} | |
| 427 | + | |
| 428 | +@article{dattalahiri2000, | |
| 429 | + author = {Datta, Gauri Sankar and Lahiri, Partha}, | |
| 430 | + title = {A Unified Measure of Uncertainty of Estimated Best Linear Unbiased Predictors in Small Area Estimation Problems}, | |
| 431 | + journal = {Statistica Sinica}, | |
| 432 | + year = {2000}, | |
| 433 | + volume = {10}, | |
| 434 | + number = {2}, | |
| 435 | + pages = {613--627}, | |
| 436 | + url = {https://www3.stat.sinica.edu.tw/statistica/J10n2/j10n214/j10n214.htm} | |
| 437 | +} | |
| 438 | + | |
| 439 | +@article{pfeffermann2013sae, | |
| 440 | + author = {Pfeffermann, Danny}, | |
| 441 | + title = {New Important Developments in Small Area Estimation}, | |
| 442 | + journal = {Statistical Science}, | |
| 443 | + year = {2013}, | |
| 444 | + volume = {28}, | |
| 445 | + number = {1}, | |
| 446 | + pages = {40--68}, | |
| 447 | + doi = {10.1214/12-sts395} | |
| 448 | +} | |
| 449 | + | |
| 450 | +%% ===================== Block 2: new entries verified for WP23 ===================== | |
| 451 | + | |
| 452 | +@article{rapachstrauss2009, | |
| 453 | + author = {Rapach, David E. and Strauss, Jack K.}, | |
| 454 | + title = {Differences in housing price forecastability across US states}, | |
| 455 | + journal = {International Journal of Forecasting}, | |
| 456 | + year = {2009}, | |
| 457 | + volume = {25}, | |
| 458 | + number = {2}, | |
| 459 | + pages = {351--372}, | |
| 460 | + doi = {10.1016/j.ijforecast.2009.01.009} | |
| 461 | +} | |
| 462 | + | |
| 463 | +@article{borkmoller2015, | |
| 464 | + author = {Bork, Lasse and M{\o}ller, Stig V.}, | |
| 465 | + title = {Forecasting house prices in the 50 states using Dynamic Model Averaging and Dynamic Model Selection}, | |
| 466 | + journal = {International Journal of Forecasting}, | |
| 467 | + year = {2015}, | |
| 468 | + volume = {31}, | |
| 469 | + number = {1}, | |
| 470 | + pages = {63--78}, | |
| 471 | + doi = {10.1016/j.ijforecast.2014.05.005} | |
| 472 | +} | |
| 473 | + | |
| 474 | +@incollection{ghysels2013forecasting, | |
| 475 | + author = {Ghysels, Eric and Plazzi, Alberto and Valkanov, Rossen and Torous, Walter}, | |
| 476 | + editor = {Elliott, Graham and Timmermann, Allan}, | |
| 477 | + title = {Forecasting Real Estate Prices}, | |
| 478 | + booktitle = {Handbook of Economic Forecasting, Volume 2A}, | |
| 479 | + year = {2013}, | |
| 480 | + volume = {2}, | |
| 481 | + pages = {509--580}, | |
| 482 | + publisher = {Elsevier}, | |
| 483 | + doi = {10.1016/b978-0-444-53683-9.00009-8} | |
| 484 | +} | |
| 485 | + | |
| 486 | +@article{gupta2011forecasting, | |
| 487 | + author = {Gupta, Rangan and Kabundi, Alain and Miller, Stephen M.}, | |
| 488 | + title = {Forecasting the US real house price index: Structural and non-structural models with and without fundamentals}, | |
| 489 | + journal = {Economic Modelling}, | |
| 490 | + year = {2011}, | |
| 491 | + volume = {28}, | |
| 492 | + number = {4}, | |
| 493 | + pages = {2013--2021}, | |
| 494 | + doi = {10.1016/j.econmod.2011.04.005} | |
| 495 | +} | |
| 496 | + | |
| 497 | +@article{gupta2011large, | |
| 498 | + author = {Gupta, Rangan and Kabundi, Alain and Miller, Stephen}, | |
| 499 | + title = {Using Large Data Sets to Forecast House Prices: A Case Study of Twenty U.S. States}, | |
| 500 | + journal = {Journal of Housing Research}, | |
| 501 | + year = {2011}, | |
| 502 | + volume = {20}, | |
| 503 | + number = {2}, | |
| 504 | + pages = {161--190}, | |
| 505 | + doi = {10.1080/10835547.2011.12092042} | |
| 506 | +} | |
| 507 | + | |
| 508 | +@article{plakandaras2015forecasting, | |
| 509 | + author = {Plakandaras, Vasilios and Gupta, Rangan and Gogas, Periklis and Papadimitriou, Theophilos}, | |
| 510 | + title = {Forecasting the U.S. real house price index}, | |
| 511 | + journal = {Economic Modelling}, | |
| 512 | + year = {2015}, | |
| 513 | + volume = {45}, | |
| 514 | + pages = {259--267}, | |
| 515 | + doi = {10.1016/j.econmod.2014.10.050} | |
| 516 | +} | |
| 517 | + | |
| 518 | +@article{milunovich2020forecasting, | |
| 519 | + author = {Milunovich, George}, | |
| 520 | + title = {Forecasting Australia's real house price index: A comparison of time series and machine learning methods}, | |
| 521 | + journal = {Journal of Forecasting}, | |
| 522 | + year = {2020}, | |
| 523 | + volume = {39}, | |
| 524 | + number = {7}, | |
| 525 | + pages = {1098--1118}, | |
| 526 | + doi = {10.1002/for.2678} | |
| 527 | +} | |
| 528 | + | |
| 529 | +@article{kouwenbergzwinkels2014, | |
| 530 | + author = {Kouwenberg, Roy and Zwinkels, Remco}, | |
| 531 | + title = {Forecasting the US housing market}, | |
| 532 | + journal = {International Journal of Forecasting}, | |
| 533 | + year = {2014}, | |
| 534 | + volume = {30}, | |
| 535 | + number = {3}, | |
| 536 | + pages = {415--425}, | |
| 537 | + doi = {10.1016/j.ijforecast.2013.12.010} | |
| 538 | +} | |
| 539 | + | |
| 540 | +@article{caseshiller1990forecasting, | |
| 541 | + author = {Case, Karl E. and Shiller, Robert J.}, | |
| 542 | + title = {Forecasting Prices and Excess Returns in the Housing Market}, | |
| 543 | + journal = {Real Estate Economics}, | |
| 544 | + year = {1990}, | |
| 545 | + volume = {18}, | |
| 546 | + number = {3}, | |
| 547 | + pages = {253--273}, | |
| 548 | + doi = {10.1111/1540-6229.00521} | |
| 549 | +} | |
| 550 | + | |
| 551 | +@article{xuzhang2022hpi, | |
| 552 | + author = {Xu, Xiaojie and Zhang, Yun}, | |
| 553 | + title = {Residential housing price index forecasting via neural networks}, | |
| 554 | + journal = {Neural Computing and Applications}, | |
| 555 | + year = {2022}, | |
| 556 | + volume = {34}, | |
| 557 | + number = {17}, | |
| 558 | + pages = {14763--14776}, | |
| 559 | + doi = {10.1007/s00521-022-07309-y} | |
| 560 | +} | |
| 561 | + | |
| 562 | +@article{yeo2025deepdfvar, | |
| 563 | + author = {Yeo, Jisu and Stitsyuk, Artyom and Choi, Jaesik}, | |
| 564 | + title = {Deep-DFVAR: Dynamic factor vector autoregression with deep learning for regional house price index forecasting}, | |
| 565 | + journal = {Neurocomputing}, | |
| 566 | + year = {2025}, | |
| 567 | + volume = {656}, | |
| 568 | + pages = {131103}, | |
| 569 | + doi = {10.1016/j.neucom.2025.131103} | |
| 570 | +} | |
| 571 | + | |
| 572 | +@article{bourassa2010spatial, | |
| 573 | + author = {Bourassa, Steven and Cantoni, Eva and Hoesli, Martin}, | |
| 574 | + title = {Predicting House Prices with Spatial Dependence: A Comparison of Alternative Methods}, | |
| 575 | + journal = {Journal of Real Estate Research}, | |
| 576 | + year = {2010}, | |
| 577 | + volume = {32}, | |
| 578 | + number = {2}, | |
| 579 | + pages = {139--160}, | |
| 580 | + doi = {10.1080/10835547.2010.12091276} | |
| 581 | +} | |
| 582 | + | |
| 583 | +@article{pacehayunga2020residuals, | |
| 584 | + author = {Pace, R. Kelley and Hayunga, Darren}, | |
| 585 | + title = {Examining the Information Content of Residuals from Hedonic and Spatial Models Using Trees and Forests}, | |
| 586 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 587 | + year = {2020}, | |
| 588 | + volume = {60}, | |
| 589 | + number = {1-2}, | |
| 590 | + pages = {170--180}, | |
| 591 | + doi = {10.1007/s11146-019-09724-w} | |
| 592 | +} | |
| 593 | + | |
| 594 | +@article{mayer2019updating, | |
| 595 | + author = {Mayer, Michael and Bourassa, Steven C. and Hoesli, Martin and Scognamiglio, Donato}, | |
| 596 | + title = {Estimation and updating methods for hedonic valuation}, | |
| 597 | + journal = {Journal of European Real Estate Research}, | |
| 598 | + year = {2019}, | |
| 599 | + volume = {12}, | |
| 600 | + number = {1}, | |
| 601 | + pages = {134--150}, | |
| 602 | + doi = {10.1108/jerer-08-2018-0035} | |
| 603 | +} | |
| 604 | + | |
| 605 | +@article{hu2019rental, | |
| 606 | + author = {Hu, Lirong and He, Shenjing and Han, Zixuan and Xiao, He and Su, Shiliang and Weng, Min and Cai, Zhongliang}, | |
| 607 | + title = {Monitoring housing rental prices based on social media: An integrated approach of machine-learning algorithms and hedonic modeling to inform equitable housing policies}, | |
| 608 | + journal = {Land Use Policy}, | |
| 609 | + year = {2019}, | |
| 610 | + volume = {82}, | |
| 611 | + pages = {657--673}, | |
| 612 | + doi = {10.1016/j.landusepol.2018.12.030} | |
| 613 | +} | |
| 614 | + | |
| 615 | +@article{kok2017bigdata, | |
| 616 | + author = {Kok, Nils and Koponen, Eija-Leena and Mart{\'{\i}}nez-Barbosa, Carmen Adriana}, | |
| 617 | + title = {Big Data in Real Estate? From Manual Appraisal to Automated Valuation}, | |
| 618 | + journal = {The Journal of Portfolio Management}, | |
| 619 | + year = {2017}, | |
| 620 | + volume = {43}, | |
| 621 | + number = {6}, | |
| 622 | + pages = {202--211}, | |
| 623 | + doi = {10.3905/jpm.2017.43.6.202} | |
| 624 | +} | |
| 625 | + | |
| 626 | +@article{baldominos2018opportunities, | |
| 627 | + author = {Baldominos, Alejandro and Blanco, Iv{\'a}n and Moreno, Antonio Jos{\'e} and Iturrarte, Rub{\'e}n and Bern{\'a}rdez, {\'O}scar and Afonso, Carlos}, | |
| 628 | + title = {Identifying Real Estate Opportunities Using Machine Learning}, | |
| 629 | + journal = {Applied Sciences}, | |
| 630 | + year = {2018}, | |
| 631 | + volume = {8}, | |
| 632 | + number = {11}, | |
| 633 | + pages = {2321}, | |
| 634 | + doi = {10.3390/app8112321} | |
| 635 | +} | |
| 636 | + | |
| 637 | +@article{hong2020randomforest, | |
| 638 | + author = {Hong, Jengei and Choi, Heeyoul and Kim, Woo-sung}, | |
| 639 | + title = {A house price valuation based on the random forest approach: The mass appraisal of residential property in South Korea}, | |
| 640 | + journal = {International Journal of Strategic Property Management}, | |
| 641 | + year = {2020}, | |
| 642 | + volume = {24}, | |
| 643 | + number = {3}, | |
| 644 | + pages = {140--152}, | |
| 645 | + doi = {10.3846/ijspm.2020.11544} | |
| 646 | +} | |
| 647 | + | |
| 648 | +@article{lorenz2023interpretable, | |
| 649 | + author = {Lorenz, Felix and Willwersch, Jonas and Cajias, Marcelo and Fuerst, Franz}, | |
| 650 | + title = {Interpretable machine learning for real estate market analysis}, | |
| 651 | + journal = {Real Estate Economics}, | |
| 652 | + year = {2023}, | |
| 653 | + volume = {51}, | |
| 654 | + number = {5}, | |
| 655 | + pages = {1178--1208}, | |
| 656 | + doi = {10.1111/1540-6229.12397} | |
| 657 | +} | |
| 658 | + | |
| 659 | +@article{lenaers2023xai, | |
| 660 | + author = {Lenaers, Ian and De Moor, Lieven}, | |
| 661 | + title = {Exploring XAI techniques for enhancing model transparency and interpretability in real estate rent prediction: A comparative study}, | |
| 662 | + journal = {Finance Research Letters}, | |
| 663 | + year = {2023}, | |
| 664 | + volume = {58}, | |
| 665 | + pages = {104306}, | |
| 666 | + doi = {10.1016/j.frl.2023.104306} | |
| 667 | +} | |
| 668 | + | |
| 669 | +@article{deppnercajias2024spatialcv, | |
| 670 | + author = {Deppner, Juergen and Cajias, Marcelo}, | |
| 671 | + title = {Accounting for Spatial Autocorrelation in Algorithm-Driven Hedonic Models: A Spatial Cross-Validation Approach}, | |
| 672 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 673 | + year = {2024}, | |
| 674 | + volume = {68}, | |
| 675 | + number = {2}, | |
| 676 | + pages = {235--273}, | |
| 677 | + doi = {10.1007/s11146-022-09915-y} | |
| 678 | +} | |
| 679 | + | |
| 680 | +@article{boginshui2020rural, | |
| 681 | + author = {Bogin, Alexander N. and Shui, Jessica}, | |
| 682 | + title = {Appraisal Accuracy and Automated Valuation Models in Rural Areas}, | |
| 683 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 684 | + year = {2020}, | |
| 685 | + volume = {60}, | |
| 686 | + number = {1-2}, | |
| 687 | + pages = {40--52}, | |
| 688 | + doi = {10.1007/s11146-019-09712-0} | |
| 689 | +} | |
| 690 | + | |
| 691 | +@article{kang2021appreciation, | |
| 692 | + author = {Kang, Yuhao and Zhang, Fan and Peng, Wenzhe and Gao, Song and Rao, Jinmeng and Duarte, Fabio and Ratti, Carlo}, | |
| 693 | + title = {Understanding house price appreciation using multi-source big geo-data and machine learning}, | |
| 694 | + journal = {Land Use Policy}, | |
| 695 | + year = {2021}, | |
| 696 | + volume = {111}, | |
| 697 | + pages = {104919}, | |
| 698 | + doi = {10.1016/j.landusepol.2020.104919} | |
| 699 | +} | |
| 700 | + | |
| 701 | +@article{pace1998spatiotemporal, | |
| 702 | + author = {Pace, R. Kelley and Barry, Ronald and Clapp, John M. and Rodriquez, Mauricio}, | |
| 703 | + title = {Spatiotemporal Autoregressive Models of Neighborhood Effects}, | |
| 704 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 705 | + year = {1998}, | |
| 706 | + volume = {17}, | |
| 707 | + number = {1}, | |
| 708 | + pages = {15--33}, | |
| 709 | + doi = {10.1023/a:1007799028599} | |
| 710 | +} | |
| 711 | + | |
| 712 | +@book{elhorst2014spatial, | |
| 713 | + author = {Elhorst, J. Paul}, | |
| 714 | + title = {Spatial Econometrics: From Cross-Sectional Data to Spatial Panels}, | |
| 715 | + year = {2014}, | |
| 716 | + series = {SpringerBriefs in Regional Science}, | |
| 717 | + publisher = {Springer Berlin Heidelberg}, | |
| 718 | + address = {Berlin, Heidelberg}, | |
| 719 | + doi = {10.1007/978-3-642-40340-8} | |
| 720 | +} | |
| 721 | + | |
| 722 | +@article{holly2011uk, | |
| 723 | + author = {Holly, Sean and Pesaran, M. Hashem and Yamagata, Takashi}, | |
| 724 | + title = {The spatial and temporal diffusion of house prices in the UK}, | |
| 725 | + journal = {Journal of Urban Economics}, | |
| 726 | + year = {2011}, | |
| 727 | + volume = {69}, | |
| 728 | + number = {1}, | |
| 729 | + pages = {2--23}, | |
| 730 | + doi = {10.1016/j.jue.2010.08.002} | |
| 731 | +} | |
| 732 | + | |
| 733 | +@article{brady2011diffusion, | |
| 734 | + author = {Brady, Ryan R.}, | |
| 735 | + title = {Measuring the diffusion of housing prices across space and over time}, | |
| 736 | + journal = {Journal of Applied Econometrics}, | |
| 737 | + year = {2011}, | |
| 738 | + volume = {26}, | |
| 739 | + number = {2}, | |
| 740 | + pages = {213--231}, | |
| 741 | + doi = {10.1002/jae.1118} | |
| 742 | +} | |
| 743 | + | |
| 744 | +@article{sijpfrancke2026laplacian, | |
| 745 | + author = {Sijp, Willem P and Francke, Marc K.}, | |
| 746 | + title = {Graph-Laplacian modeling of spatiotemporal effects for house price estimation}, | |
| 747 | + journal = {Real Estate Economics}, | |
| 748 | + year = {2026}, | |
| 749 | + note = {Early view, article 1540-6229.70062}, | |
| 750 | + doi = {10.1111/1540-6229.70062} | |
| 751 | +} | |
| 752 | + | |
| 753 | +@inproceedings{kipfwelling2017gcn, | |
| 754 | + author = {Kipf, Thomas N. and Welling, Max}, | |
| 755 | + title = {Semi-Supervised Classification with Graph Convolutional Networks}, | |
| 756 | + booktitle = {Proceedings of the 5th International Conference on Learning Representations (ICLR 2017)}, | |
| 757 | + year = {2017}, | |
| 758 | + note = {arXiv:1609.02907}, | |
| 759 | + url = {https://arxiv.org/abs/1609.02907} | |
| 760 | +} | |
| 761 | + | |
| 762 | +@inproceedings{velickovic2018gat, | |
| 763 | + author = {Veli{\v{c}}kovi{\'c}, Petar and Cucurull, Guillem and Casanova, Arantxa and Romero, Adriana and Li{\`o}, Pietro and Bengio, Yoshua}, | |
| 764 | + title = {Graph Attention Networks}, | |
| 765 | + booktitle = {Proceedings of the 6th International Conference on Learning Representations (ICLR 2018)}, | |
| 766 | + year = {2018}, | |
| 767 | + note = {arXiv:1710.10903}, | |
| 768 | + url = {https://arxiv.org/abs/1710.10903} | |
| 769 | +} | |
| 770 | + | |
| 771 | +@inproceedings{wu2019graphwavenet, | |
| 772 | + author = {Wu, Zonghan and Pan, Shirui and Long, Guodong and Jiang, Jing and Zhang, Chengqi}, | |
| 773 | + title = {Graph WaveNet for Deep Spatial-Temporal Graph Modeling}, | |
| 774 | + booktitle = {Proceedings of the Twenty-Eighth International Joint Conference on Artificial Intelligence (IJCAI-19)}, | |
| 775 | + year = {2019}, | |
| 776 | + pages = {1907--1913}, | |
| 777 | + publisher = {International Joint Conferences on Artificial Intelligence Organization}, | |
| 778 | + doi = {10.24963/ijcai.2019/264} | |
| 779 | +} | |
| 780 | + | |
| 781 | +@inproceedings{li2018dcrnn, | |
| 782 | + author = {Li, Yaguang and Yu, Rose and Shahabi, Cyrus and Liu, Yan}, | |
| 783 | + title = {Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting}, | |
| 784 | + booktitle = {Proceedings of the 6th International Conference on Learning Representations (ICLR 2018)}, | |
| 785 | + year = {2018}, | |
| 786 | + note = {arXiv:1707.01926}, | |
| 787 | + url = {https://arxiv.org/abs/1707.01926} | |
| 788 | +} | |
| 789 | + | |
| 790 | +@inproceedings{yu2018stgcn, | |
| 791 | + author = {Yu, Bing and Yin, Haoteng and Zhu, Zhanxing}, | |
| 792 | + title = {Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting}, | |
| 793 | + booktitle = {Proceedings of the Twenty-Seventh International Joint Conference on Artificial Intelligence (IJCAI-18)}, | |
| 794 | + year = {2018}, | |
| 795 | + pages = {3634--3640}, | |
| 796 | + publisher = {International Joint Conferences on Artificial Intelligence Organization}, | |
| 797 | + doi = {10.24963/ijcai.2018/505} | |
| 798 | +} | |
| 799 | + | |
| 800 | +@inproceedings{bai2020agcrn, | |
| 801 | + author = {Bai, Lei and Yao, Lina and Li, Can and Wang, Xianzhi and Wang, Can}, | |
| 802 | + title = {Adaptive Graph Convolutional Recurrent Network for Traffic Forecasting}, | |
| 803 | + booktitle = {Advances in Neural Information Processing Systems 33 (NeurIPS 2020)}, | |
| 804 | + year = {2020}, | |
| 805 | + url = {https://proceedings.neurips.cc/paper/2020/hash/ce1aad92b939420fc17005e5461e6f48-Abstract.html} | |
| 806 | +} | |
| 807 | + | |
| 808 | +@article{wu2021gnnsurvey, | |
| 809 | + author = {Wu, Zonghan and Pan, Shirui and Chen, Fengwen and Long, Guodong and Zhang, Chengqi and Yu, Philip S.}, | |
| 810 | + title = {A Comprehensive Survey on Graph Neural Networks}, | |
| 811 | + journal = {IEEE Transactions on Neural Networks and Learning Systems}, | |
| 812 | + year = {2021}, | |
| 813 | + volume = {32}, | |
| 814 | + number = {1}, | |
| 815 | + pages = {4--24}, | |
| 816 | + doi = {10.1109/tnnls.2020.2978386} | |
| 817 | +} | |
| 818 | + | |
| 819 | +@article{jin2024urbanstgnn, | |
| 820 | + author = {Jin, Guangyin and Liang, Yuxuan and Fang, Yuchen and Shao, Zezhi and Huang, Jincai and Zhang, Junbo and Zheng, Yu}, | |
| 821 | + title = {Spatio-Temporal Graph Neural Networks for Predictive Learning in Urban Computing: A Survey}, | |
| 822 | + journal = {IEEE Transactions on Knowledge and Data Engineering}, | |
| 823 | + year = {2024}, | |
| 824 | + volume = {36}, | |
| 825 | + number = {10}, | |
| 826 | + pages = {5388--5408}, | |
| 827 | + doi = {10.1109/tkde.2023.3333824} | |
| 828 | +} | |
| 829 | + | |
| 830 | +@article{jin2024tsgnnsurvey, | |
| 831 | + author = {Jin, Ming and Koh, Huan Yee and Wen, Qingsong and Zambon, Daniele and Alippi, Cesare and Webb, Geoffrey I. and King, Irwin and Pan, Shirui}, | |
| 832 | + title = {A Survey on Graph Neural Networks for Time Series: Forecasting, Classification, Imputation, and Anomaly Detection}, | |
| 833 | + journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence}, | |
| 834 | + year = {2024}, | |
| 835 | + volume = {46}, | |
| 836 | + number = {12}, | |
| 837 | + pages = {10466--10485}, | |
| 838 | + doi = {10.1109/tpami.2024.3443141} | |
| 839 | +} | |
| 840 | + | |
| 841 | +@inproceedings{viana2021attention, | |
| 842 | + author = {Viana, Darniton and Barbosa, Luciano}, | |
| 843 | + title = {Attention-Based Spatial Interpolation for House Price Prediction}, | |
| 844 | + booktitle = {Proceedings of the 29th International Conference on Advances in Geographic Information Systems (SIGSPATIAL '21)}, | |
| 845 | + year = {2021}, | |
| 846 | + pages = {540--549}, | |
| 847 | + publisher = {ACM}, | |
| 848 | + doi = {10.1145/3474717.3484257} | |
| 849 | +} | |
| 850 | + | |
| 851 | +@inproceedings{zhang2021mugrep, | |
| 852 | + author = {Zhang, Weijia and Liu, Hao and Zha, Lijun and Zhu, Hengshu and Liu, Ji and Dou, Dejing and Xiong, Hui}, | |
| 853 | + title = {MugRep: A Multi-Task Hierarchical Graph Representation Learning Framework for Real Estate Appraisal}, | |
| 854 | + booktitle = {Proceedings of the 27th ACM SIGKDD Conference on Knowledge Discovery and Data Mining (KDD '21)}, | |
| 855 | + year = {2021}, | |
| 856 | + pages = {3937--3947}, | |
| 857 | + publisher = {ACM}, | |
| 858 | + doi = {10.1145/3447548.3467187} | |
| 859 | +} | |
| 860 | + | |
| 861 | +@article{das2021gsne, | |
| 862 | + author = {Das, Sarkar Snigdha Sarathi and Ali, Mohammed Eunus and Li, Yuan-Fang and Kang, Yong-Bin and Sellis, Timos}, | |
| 863 | + title = {Boosting house price predictions using geo-spatial network embedding}, | |
| 864 | + journal = {Data Mining and Knowledge Discovery}, | |
| 865 | + year = {2021}, | |
| 866 | + volume = {35}, | |
| 867 | + number = {6}, | |
| 868 | + pages = {2221--2250}, | |
| 869 | + doi = {10.1007/s10618-021-00789-x} | |
| 870 | +} | |
| 871 | + | |
| 872 | +@article{bin2019peer, | |
| 873 | + author = {Bin, Junchi and Gardiner, Bryan and Li, Eric and Liu, Zheng}, | |
| 874 | + title = {Peer-Dependence Valuation Model for Real Estate Appraisal}, | |
| 875 | + journal = {Data-Enabled Discovery and Applications}, | |
| 876 | + year = {2019}, | |
| 877 | + volume = {3}, | |
| 878 | + number = {1}, | |
| 879 | + pages = {2}, | |
| 880 | + doi = {10.1007/s41688-018-0027-0} | |
| 881 | +} | |
| 882 | + | |
| 883 | +@article{yang2022gcnvaluation, | |
| 884 | + author = {Yang, Zongyan and Hong, Zhonghua and Zhou, Ruyan and Ai, Hong}, | |
| 885 | + title = {Graph Convolutional Network-Based Model for Megacity Real Estate Valuation}, | |
| 886 | + journal = {IEEE Access}, | |
| 887 | + year = {2022}, | |
| 888 | + volume = {10}, | |
| 889 | + pages = {104811--104828}, | |
| 890 | + doi = {10.1109/access.2022.3210281} | |
| 891 | +} | |
| 892 | + | |
| 893 | +@article{wang2022gnnwrhouse, | |
| 894 | + author = {Wang, Zimo and Wang, Yicheng and Wu, Sensen and Du, Zhenhong}, | |
| 895 | + title = {House Price Valuation Model Based on Geographically Neural Network Weighted Regression: The Case Study of Shenzhen, China}, | |
| 896 | + journal = {ISPRS International Journal of Geo-Information}, | |
| 897 | + year = {2022}, | |
| 898 | + volume = {11}, | |
| 899 | + number = {8}, | |
| 900 | + pages = {450}, | |
| 901 | + doi = {10.3390/ijgi11080450} | |
| 902 | +} | |
| 903 | + | |
| 904 | +@article{du2020gnnwr, | |
| 905 | + author = {Du, Zhenhong and Wang, Zhongyi and Wu, Sensen and Zhang, Feng and Liu, Renyi}, | |
| 906 | + title = {Geographically neural network weighted regression for the accurate estimation of spatial non-stationarity}, | |
| 907 | + journal = {International Journal of Geographical Information Science}, | |
| 908 | + year = {2020}, | |
| 909 | + volume = {34}, | |
| 910 | + number = {7}, | |
| 911 | + pages = {1353--1377}, | |
| 912 | + doi = {10.1080/13658816.2019.1707834} | |
| 913 | +} | |
| 914 | + | |
| 915 | +@article{guo2026heteroroadnet, | |
| 916 | + author = {Guo, Yameng and vanden Broucke, Seppe}, | |
| 917 | + title = {HeteroRoadNet: A Heterogenous Road-based Graph Neural Network Approach for Property Price Prediction}, | |
| 918 | + journal = {ACM Transactions on Spatial Algorithms and Systems}, | |
| 919 | + year = {2026}, | |
| 920 | + volume = {12}, | |
| 921 | + number = {3}, | |
| 922 | + pages = {1--21}, | |
| 923 | + doi = {10.1145/3785326} | |
| 924 | +} | |
| 925 | + | |
| 926 | +@article{hochreiter1997lstm, | |
| 927 | + author = {Hochreiter, Sepp and Schmidhuber, J{\"u}rgen}, | |
| 928 | + title = {Long Short-Term Memory}, | |
| 929 | + journal = {Neural Computation}, | |
| 930 | + year = {1997}, | |
| 931 | + volume = {9}, | |
| 932 | + number = {8}, | |
| 933 | + pages = {1735--1780}, | |
| 934 | + doi = {10.1162/neco.1997.9.8.1735} | |
| 935 | +} | |
| 936 | + | |
| 937 | +@inproceedings{cho2014gru, | |
| 938 | + author = {Cho, Kyunghyun and van Merrienboer, Bart and Gulcehre, Caglar and Bahdanau, Dzmitry and Bougares, Fethi and Schwenk, Holger and Bengio, Yoshua}, | |
| 939 | + title = {Learning Phrase Representations using RNN Encoder--Decoder for Statistical Machine Translation}, | |
| 940 | + booktitle = {Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP)}, | |
| 941 | + year = {2014}, | |
| 942 | + pages = {1724--1734}, | |
| 943 | + publisher = {Association for Computational Linguistics}, | |
| 944 | + doi = {10.3115/v1/d14-1179} | |
| 945 | +} | |
| 946 | + | |
| 947 | +@misc{bai2018tcn, | |
| 948 | + author = {Bai, Shaojie and Kolter, J. Zico and Koltun, Vladlen}, | |
| 949 | + title = {An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling}, | |
| 950 | + year = {2018}, | |
| 951 | + howpublished = {arXiv preprint arXiv:1803.01271}, | |
| 952 | + url = {https://arxiv.org/abs/1803.01271} | |
| 953 | +} | |
| 954 | + | |
| 955 | +@article{lim2021tft, | |
| 956 | + author = {Lim, Bryan and Ar{\i}k, Sercan {\"O}. and Loeff, Nicolas and Pfister, Tomas}, | |
| 957 | + title = {Temporal Fusion Transformers for interpretable multi-horizon time series forecasting}, | |
| 958 | + journal = {International Journal of Forecasting}, | |
| 959 | + year = {2021}, | |
| 960 | + volume = {37}, | |
| 961 | + number = {4}, | |
| 962 | + pages = {1748--1764}, | |
| 963 | + doi = {10.1016/j.ijforecast.2021.03.012} | |
| 964 | +} | |
| 965 | + | |
| 966 | +@inproceedings{oreshkin2020nbeats, | |
| 967 | + author = {Oreshkin, Boris N. and Carpov, Dmitri and Chapados, Nicolas and Bengio, Yoshua}, | |
| 968 | + title = {N-BEATS: Neural basis expansion analysis for interpretable time series forecasting}, | |
| 969 | + booktitle = {Proceedings of the 8th International Conference on Learning Representations (ICLR 2020)}, | |
| 970 | + year = {2020}, | |
| 971 | + note = {arXiv:1905.10437}, | |
| 972 | + url = {https://arxiv.org/abs/1905.10437} | |
| 973 | +} | |
| 974 | + | |
| 975 | +@article{salinas2020deepar, | |
| 976 | + author = {Salinas, David and Flunkert, Valentin and Gasthaus, Jan and Januschowski, Tim}, | |
| 977 | + title = {DeepAR: Probabilistic forecasting with autoregressive recurrent networks}, | |
| 978 | + journal = {International Journal of Forecasting}, | |
| 979 | + year = {2020}, | |
| 980 | + volume = {36}, | |
| 981 | + number = {3}, | |
| 982 | + pages = {1181--1191}, | |
| 983 | + doi = {10.1016/j.ijforecast.2019.07.001} | |
| 984 | +} | |
| 985 | + | |
| 986 | +@inproceedings{zeng2023transformers, | |
| 987 | + author = {Zeng, Ailing and Chen, Muxi and Zhang, Lei and Xu, Qiang}, | |
| 988 | + title = {Are Transformers Effective for Time Series Forecasting?}, | |
| 989 | + booktitle = {Proceedings of the AAAI Conference on Artificial Intelligence}, | |
| 990 | + year = {2023}, | |
| 991 | + note = {Vol. 37, No. 9}, | |
| 992 | + pages = {11121--11128}, | |
| 993 | + publisher = {Association for the Advancement of Artificial Intelligence (AAAI)}, | |
| 994 | + doi = {10.1609/aaai.v37i9.26317} | |
| 995 | +} | |
| 996 | + | |
| 997 | +@article{makridakis2020m4, | |
| 998 | + author = {Makridakis, Spyros and Spiliotis, Evangelos and Assimakopoulos, Vassilios}, | |
| 999 | + title = {The M4 Competition: 100,000 time series and 61 forecasting methods}, | |
| 1000 | + journal = {International Journal of Forecasting}, | |
| 1001 | + year = {2020}, | |
| 1002 | + volume = {36}, | |
| 1003 | + number = {1}, | |
| 1004 | + pages = {54--74}, | |
| 1005 | + doi = {10.1016/j.ijforecast.2019.04.014} | |
| 1006 | +} | |
| 1007 | + | |
| 1008 | +@article{makridakis2022m5accuracy, | |
| 1009 | + author = {Makridakis, Spyros and Spiliotis, Evangelos and Assimakopoulos, Vassilios}, | |
| 1010 | + title = {M5 accuracy competition: Results, findings, and conclusions}, | |
| 1011 | + journal = {International Journal of Forecasting}, | |
| 1012 | + year = {2022}, | |
| 1013 | + volume = {38}, | |
| 1014 | + number = {4}, | |
| 1015 | + pages = {1346--1364}, | |
| 1016 | + doi = {10.1016/j.ijforecast.2021.11.013} | |
| 1017 | +} | |
| 1018 | + | |
| 1019 | +@article{makridakis2022m5uncertainty, | |
| 1020 | + author = {Makridakis, Spyros and Spiliotis, Evangelos and Assimakopoulos, Vassilios and Chen, Zhi and Gaba, Anil and Tsetlin, Ilia and Winkler, Robert L.}, | |
| 1021 | + title = {The M5 uncertainty competition: Results, findings and conclusions}, | |
| 1022 | + journal = {International Journal of Forecasting}, | |
| 1023 | + year = {2022}, | |
| 1024 | + volume = {38}, | |
| 1025 | + number = {4}, | |
| 1026 | + pages = {1365--1385}, | |
| 1027 | + doi = {10.1016/j.ijforecast.2021.10.009} | |
| 1028 | +} | |
| 1029 | + | |
| 1030 | +@inproceedings{nie2023patchtst, | |
| 1031 | + author = {Nie, Yuqi and Nguyen, Nam H. and Sinthong, Phanwadee and Kalagnanam, Jayant}, | |
| 1032 | + title = {A Time Series is Worth 64 Words: Long-term Forecasting with Transformers}, | |
| 1033 | + booktitle = {Proceedings of the 11th International Conference on Learning Representations (ICLR 2023)}, | |
| 1034 | + year = {2023}, | |
| 1035 | + note = {arXiv:2211.14730}, | |
| 1036 | + url = {https://arxiv.org/abs/2211.14730} | |
| 1037 | +} | |
| 1038 | + | |
| 1039 | +@article{gneitingraftery2007scoring, | |
| 1040 | + author = {Gneiting, Tilmann and Raftery, Adrian E}, | |
| 1041 | + title = {Strictly Proper Scoring Rules, Prediction, and Estimation}, | |
| 1042 | + journal = {Journal of the American Statistical Association}, | |
| 1043 | + year = {2007}, | |
| 1044 | + volume = {102}, | |
| 1045 | + number = {477}, | |
| 1046 | + pages = {359--378}, | |
| 1047 | + doi = {10.1198/016214506000001437} | |
| 1048 | +} | |
| 1049 | + | |
| 1050 | +@article{gneiting2007calibration, | |
| 1051 | + author = {Gneiting, Tilmann and Balabdaoui, Fadoua and Raftery, Adrian E.}, | |
| 1052 | + title = {Probabilistic Forecasts, Calibration and Sharpness}, | |
| 1053 | + journal = {Journal of the Royal Statistical Society: Series B (Statistical Methodology)}, | |
| 1054 | + year = {2007}, | |
| 1055 | + volume = {69}, | |
| 1056 | + number = {2}, | |
| 1057 | + pages = {243--268}, | |
| 1058 | + doi = {10.1111/j.1467-9868.2007.00587.x} | |
| 1059 | +} | |
| 1060 | + | |
| 1061 | +@article{gneitingkatzfuss2014probabilistic, | |
| 1062 | + author = {Gneiting, Tilmann and Katzfuss, Matthias}, | |
| 1063 | + title = {Probabilistic Forecasting}, | |
| 1064 | + journal = {Annual Review of Statistics and Its Application}, | |
| 1065 | + year = {2014}, | |
| 1066 | + volume = {1}, | |
| 1067 | + number = {1}, | |
| 1068 | + pages = {125--151}, | |
| 1069 | + doi = {10.1146/annurev-statistics-062713-085831} | |
| 1070 | +} | |
| 1071 | + | |
| 1072 | +@article{koenkerbassett1978quantiles, | |
| 1073 | + author = {Koenker, Roger and Bassett, Gilbert}, | |
| 1074 | + title = {Regression Quantiles}, | |
| 1075 | + journal = {Econometrica}, | |
| 1076 | + year = {1978}, | |
| 1077 | + volume = {46}, | |
| 1078 | + number = {1}, | |
| 1079 | + pages = {33--50}, | |
| 1080 | + doi = {10.2307/1913643} | |
| 1081 | +} | |
| 1082 | + | |
| 1083 | +@article{bracher2021wis, | |
| 1084 | + author = {Bracher, Johannes and Ray, Evan L. and Gneiting, Tilmann and Reich, Nicholas G.}, | |
| 1085 | + title = {Evaluating epidemic forecasts in an interval format}, | |
| 1086 | + journal = {PLOS Computational Biology}, | |
| 1087 | + year = {2021}, | |
| 1088 | + volume = {17}, | |
| 1089 | + number = {2}, | |
| 1090 | + pages = {e1008618}, | |
| 1091 | + doi = {10.1371/journal.pcbi.1008618} | |
| 1092 | +} | |
| 1093 | + | |
| 1094 | +@inproceedings{romano2019cqr, | |
| 1095 | + author = {Romano, Yaniv and Patterson, Evan and Cand{\`e}s, Emmanuel J.}, | |
| 1096 | + title = {Conformalized Quantile Regression}, | |
| 1097 | + booktitle = {Advances in Neural Information Processing Systems 32 (NeurIPS 2019)}, | |
| 1098 | + year = {2019}, | |
| 1099 | + url = {https://proceedings.neurips.cc/paper/2019/hash/5103c3584b063c431bd1268e9b5e76fb-Abstract.html} | |
| 1100 | +} | |
| 1101 | + | |
| 1102 | +@book{vovk2005conformal, | |
| 1103 | + author = {Vovk, Vladimir and Gammerman, Alexander and Shafer, Glenn}, | |
| 1104 | + title = {Algorithmic Learning in a Random World}, | |
| 1105 | + year = {2005}, | |
| 1106 | + publisher = {Springer}, | |
| 1107 | + address = {New York}, | |
| 1108 | + doi = {10.1007/b106715} | |
| 1109 | +} | |
| 1110 | + | |
| 1111 | +@article{taylor2000quantilenn, | |
| 1112 | + author = {Taylor, James W.}, | |
| 1113 | + title = {A quantile regression neural network approach to estimating the conditional density of multiperiod returns}, | |
| 1114 | + journal = {Journal of Forecasting}, | |
| 1115 | + year = {2000}, | |
| 1116 | + volume = {19}, | |
| 1117 | + number = {4}, | |
| 1118 | + pages = {299--311}, | |
| 1119 | + doi = {10.1002/1099-131x(200007)19:4<299::aid-for775>3.0.co;2-v} | |
| 1120 | +} | |
| 1121 | + | |
| 1122 | +@book{gelman2013bda, | |
| 1123 | + author = {Gelman, Andrew and Carlin, John B. and Stern, Hal S. and Dunson, David B. and Vehtari, Aki and Rubin, Donald B.}, | |
| 1124 | + title = {Bayesian Data Analysis}, | |
| 1125 | + year = {2013}, | |
| 1126 | + edition = {3}, | |
| 1127 | + publisher = {Chapman and Hall/CRC}, | |
| 1128 | + address = {Boca Raton}, | |
| 1129 | + doi = {10.1201/b16018} | |
| 1130 | +} | |
| 1131 | + | |
| 1132 | +@article{blei2017vi, | |
| 1133 | + author = {Blei, David M. and Kucukelbir, Alp and McAuliffe, Jon D.}, | |
| 1134 | + title = {Variational Inference: A Review for Statisticians}, | |
| 1135 | + journal = {Journal of the American Statistical Association}, | |
| 1136 | + year = {2017}, | |
| 1137 | + volume = {112}, | |
| 1138 | + number = {518}, | |
| 1139 | + pages = {859--877}, | |
| 1140 | + doi = {10.1080/01621459.2017.1285773} | |
| 1141 | +} | |
| 1142 | + | |
| 1143 | +@article{hoffmangelman2014nuts, | |
| 1144 | + author = {Hoffman, Matthew D. and Gelman, Andrew}, | |
| 1145 | + title = {The No-U-Turn Sampler: Adaptively Setting Path Lengths in Hamiltonian Monte Carlo}, | |
| 1146 | + journal = {Journal of Machine Learning Research}, | |
| 1147 | + year = {2014}, | |
| 1148 | + volume = {15}, | |
| 1149 | + number = {47}, | |
| 1150 | + pages = {1593--1623}, | |
| 1151 | + url = {https://jmlr.org/papers/v15/hoffman14a.html} | |
| 1152 | +} | |
| 1153 | + | |
| 1154 | +@article{rue2009inla, | |
| 1155 | + author = {Rue, H{\aa}vard and Martino, Sara and Chopin, Nicolas}, | |
| 1156 | + title = {Approximate Bayesian Inference for Latent Gaussian models by using Integrated Nested Laplace Approximations}, | |
| 1157 | + journal = {Journal of the Royal Statistical Society: Series B (Statistical Methodology)}, | |
| 1158 | + year = {2009}, | |
| 1159 | + volume = {71}, | |
| 1160 | + number = {2}, | |
| 1161 | + pages = {319--392}, | |
| 1162 | + doi = {10.1111/j.1467-9868.2008.00700.x} | |
| 1163 | +} | |
| 1164 | + | |
| 1165 | +@article{hamilton1989regime, | |
| 1166 | + author = {Hamilton, James D.}, | |
| 1167 | + title = {A New Approach to the Economic Analysis of Nonstationary Time Series and the Business Cycle}, | |
| 1168 | + journal = {Econometrica}, | |
| 1169 | + year = {1989}, | |
| 1170 | + volume = {57}, | |
| 1171 | + number = {2}, | |
| 1172 | + pages = {357--384}, | |
| 1173 | + doi = {10.2307/1912559} | |
| 1174 | +} | |
| 1175 | + | |
| 1176 | +@book{kimnelson1999statespace, | |
| 1177 | + author = {Kim, Chang-Jin and Nelson, Charles R.}, | |
| 1178 | + title = {State-Space Models with Regime Switching: Classical and Gibbs-Sampling Approaches with Applications}, | |
| 1179 | + year = {1999}, | |
| 1180 | + publisher = {MIT Press}, | |
| 1181 | + address = {Cambridge, MA}, | |
| 1182 | + doi = {10.7551/mitpress/6444.001.0001} | |
| 1183 | +} | |
| 1184 | + | |
| 1185 | +@article{jacobs1991moe, | |
| 1186 | + author = {Jacobs, Robert A. and Jordan, Michael I. and Nowlan, Steven J. and Hinton, Geoffrey E.}, | |
| 1187 | + title = {Adaptive Mixtures of Local Experts}, | |
| 1188 | + journal = {Neural Computation}, | |
| 1189 | + year = {1991}, | |
| 1190 | + volume = {3}, | |
| 1191 | + number = {1}, | |
| 1192 | + pages = {79--87}, | |
| 1193 | + doi = {10.1162/neco.1991.3.1.79} | |
| 1194 | +} | |
| 1195 | + | |
| 1196 | +@article{jordanjacobs1994hme, | |
| 1197 | + author = {Jordan, Michael I. and Jacobs, Robert A.}, | |
| 1198 | + title = {Hierarchical Mixtures of Experts and the EM Algorithm}, | |
| 1199 | + journal = {Neural Computation}, | |
| 1200 | + year = {1994}, | |
| 1201 | + volume = {6}, | |
| 1202 | + number = {2}, | |
| 1203 | + pages = {181--214}, | |
| 1204 | + doi = {10.1162/neco.1994.6.2.181} | |
| 1205 | +} | |
| 1206 | + | |
| 1207 | +@misc{shazeer2017moe, | |
| 1208 | + author = {Shazeer, Noam and Mirhoseini, Azalia and Maziarz, Krzysztof and Davis, Andy and Le, Quoc and Hinton, Geoffrey and Dean, Jeff}, | |
| 1209 | + title = {Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer}, | |
| 1210 | + year = {2017}, | |
| 1211 | + howpublished = {arXiv preprint arXiv:1701.06538}, | |
| 1212 | + url = {https://arxiv.org/abs/1701.06538} | |
| 1213 | +} | |
| 1214 | + | |
| 1215 | +@inproceedings{rangapuram2018dssm, | |
| 1216 | + author = {Rangapuram, Syama Sundar and Seeger, Matthias W. and Gasthaus, Jan and Stella, Lorenzo and Wang, Yuyang and Januschowski, Tim}, | |
| 1217 | + title = {Deep State Space Models for Time Series Forecasting}, | |
| 1218 | + booktitle = {Advances in Neural Information Processing Systems 31 (NeurIPS 2018)}, | |
| 1219 | + year = {2018}, | |
| 1220 | + url = {https://proceedings.neurips.cc/paper/2018/hash/5cf68969fb67aa6082363a6d4e6468e2-Abstract.html} | |
| 1221 | +} | |
| 1222 | + | |
| 1223 | +@inproceedings{debezenac2020nkf, | |
| 1224 | + author = {de B{\'e}zenac, Emmanuel and Rangapuram, Syama Sundar and Benidis, Konstantinos and Bohlke-Schneider, Michael and Kurle, Richard and Stella, Lorenzo and Hasson, Hilaf and Gallinari, Patrick and Januschowski, Tim}, | |
| 1225 | + title = {Normalizing Kalman Filters for Multivariate Time Series Analysis}, | |
| 1226 | + booktitle = {Advances in Neural Information Processing Systems 33 (NeurIPS 2020)}, | |
| 1227 | + year = {2020}, | |
| 1228 | + url = {https://proceedings.neurips.cc/paper/2020/hash/1f47cef5e38c952f94c5d61726027439-Abstract.html} | |
| 1229 | +} | |
| 1230 | + | |
| 1231 | +@inproceedings{krishnan2017dkf, | |
| 1232 | + author = {Krishnan, Rahul and Shalit, Uri and Sontag, David}, | |
| 1233 | + title = {Structured Inference Networks for Nonlinear State Space Models}, | |
| 1234 | + booktitle = {Proceedings of the Thirty-First AAAI Conference on Artificial Intelligence (AAAI-17)}, | |
| 1235 | + year = {2017}, | |
| 1236 | + note = {Vol. 31, No. 1}, | |
| 1237 | + publisher = {Association for the Advancement of Artificial Intelligence (AAAI)}, | |
| 1238 | + doi = {10.1609/aaai.v31i1.10779} | |
| 1239 | +} | |
| 1240 | + | |
| 1241 | +@article{dieboldmariano1995, | |
| 1242 | + author = {Diebold, Francis X. and Mariano, Roberto S.}, | |
| 1243 | + title = {Comparing Predictive Accuracy}, | |
| 1244 | + journal = {Journal of Business \& Economic Statistics}, | |
| 1245 | + year = {1995}, | |
| 1246 | + volume = {13}, | |
| 1247 | + number = {3}, | |
| 1248 | + pages = {253--263}, | |
| 1249 | + doi = {10.1080/07350015.1995.10524599} | |
| 1250 | +} | |
| 1251 | + | |
| 1252 | +@article{harvey1997equality, | |
| 1253 | + author = {Harvey, David and Leybourne, Stephen and Newbold, Paul}, | |
| 1254 | + title = {Testing the equality of prediction mean squared errors}, | |
| 1255 | + journal = {International Journal of Forecasting}, | |
| 1256 | + year = {1997}, | |
| 1257 | + volume = {13}, | |
| 1258 | + number = {2}, | |
| 1259 | + pages = {281--291}, | |
| 1260 | + doi = {10.1016/s0169-2070(96)00719-4} | |
| 1261 | +} | |
| 1262 | + | |
| 1263 | +@article{giacominiwhite2006, | |
| 1264 | + author = {Giacomini, Raffaella and White, Halbert}, | |
| 1265 | + title = {Tests of Conditional Predictive Ability}, | |
| 1266 | + journal = {Econometrica}, | |
| 1267 | + year = {2006}, | |
| 1268 | + volume = {74}, | |
| 1269 | + number = {6}, | |
| 1270 | + pages = {1545--1578}, | |
| 1271 | + doi = {10.1111/j.1468-0262.2006.00718.x} | |
| 1272 | +} | |
| 1273 | + | |
| 1274 | +@article{hansen2011mcs, | |
| 1275 | + author = {Hansen, Peter R. and Lunde, Asger and Nason, James M.}, | |
| 1276 | + title = {The Model Confidence Set}, | |
| 1277 | + journal = {Econometrica}, | |
| 1278 | + year = {2011}, | |
| 1279 | + volume = {79}, | |
| 1280 | + number = {2}, | |
| 1281 | + pages = {453--497}, | |
| 1282 | + doi = {10.3982/ECTA5771} | |
| 1283 | +} | |
| 1284 | + | |
| 1285 | +@article{clarkmccracken2001nested, | |
| 1286 | + author = {Clark, Todd E and McCracken, Michael W}, | |
| 1287 | + title = {Tests of equal forecast accuracy and encompassing for nested models}, | |
| 1288 | + journal = {Journal of Econometrics}, | |
| 1289 | + year = {2001}, | |
| 1290 | + volume = {105}, | |
| 1291 | + number = {1}, | |
| 1292 | + pages = {85--110}, | |
| 1293 | + doi = {10.1016/s0304-4076(01)00071-9} | |
| 1294 | +} | |
| 1295 | + | |
| 1296 | +@incollection{clarkmccracken2013advances, | |
| 1297 | + author = {Clark, Todd and McCracken, Michael}, | |
| 1298 | + editor = {Elliott, Graham and Timmermann, Allan}, | |
| 1299 | + title = {Advances in Forecast Evaluation}, | |
| 1300 | + booktitle = {Handbook of Economic Forecasting, Volume 2B}, | |
| 1301 | + year = {2013}, | |
| 1302 | + volume = {2}, | |
| 1303 | + pages = {1107--1201}, | |
| 1304 | + publisher = {Elsevier}, | |
| 1305 | + doi = {10.1016/b978-0-444-62731-5.00020-8} | |
| 1306 | +} | |
| 1307 | + | |
| 1308 | +@article{west1996asymptotic, | |
| 1309 | + author = {West, Kenneth D.}, | |
| 1310 | + title = {Asymptotic Inference about Predictive Ability}, | |
| 1311 | + journal = {Econometrica}, | |
| 1312 | + year = {1996}, | |
| 1313 | + volume = {64}, | |
| 1314 | + number = {5}, | |
| 1315 | + pages = {1067--1084}, | |
| 1316 | + doi = {10.2307/2171956} | |
| 1317 | +} | |
| 1318 | + | |
| 1319 | +@article{hyndmankoehler2006mase, | |
| 1320 | + author = {Hyndman, Rob J. and Koehler, Anne B.}, | |
| 1321 | + title = {Another look at measures of forecast accuracy}, | |
| 1322 | + journal = {International Journal of Forecasting}, | |
| 1323 | + year = {2006}, | |
| 1324 | + volume = {22}, | |
| 1325 | + number = {4}, | |
| 1326 | + pages = {679--688}, | |
| 1327 | + doi = {10.1016/j.ijforecast.2006.03.001} | |
| 1328 | +} | |
| 1329 | + | |
| 1330 | +@article{politisromano1994stationary, | |
| 1331 | + author = {Politis, Dimitris N. and Romano, Joseph P.}, | |
| 1332 | + title = {The Stationary Bootstrap}, | |
| 1333 | + journal = {Journal of the American Statistical Association}, | |
| 1334 | + year = {1994}, | |
| 1335 | + volume = {89}, | |
| 1336 | + number = {428}, | |
| 1337 | + pages = {1303--1313}, | |
| 1338 | + doi = {10.1080/01621459.1994.10476870} | |
| 1339 | +} | |
| 1340 | + | |
| 1341 | +@article{kunsch1989jackknife, | |
| 1342 | + author = {K{\"u}nsch, Hans R.}, | |
| 1343 | + title = {The Jackknife and the Bootstrap for General Stationary Observations}, | |
| 1344 | + journal = {The Annals of Statistics}, | |
| 1345 | + year = {1989}, | |
| 1346 | + volume = {17}, | |
| 1347 | + number = {3}, | |
| 1348 | + pages = {1217--1241}, | |
| 1349 | + doi = {10.1214/aos/1176347265} | |
| 1350 | +} | |
| 1351 | + | |
| 1352 | +@article{diebold2015twenty, | |
| 1353 | + author = {Diebold, Francis X.}, | |
| 1354 | + title = {Comparing Predictive Accuracy, Twenty Years Later: A Personal Perspective on the Use and Abuse of Diebold--Mariano Tests}, | |
| 1355 | + journal = {Journal of Business \& Economic Statistics}, | |
| 1356 | + year = {2015}, | |
| 1357 | + volume = {33}, | |
| 1358 | + number = {1}, | |
| 1359 | + doi = {10.1080/07350015.2014.983236} | |
| 1360 | +} | |
| 1361 | + | |
| 1362 | +@incollection{timmermann2006combinations, | |
| 1363 | + author = {Timmermann, Allan}, | |
| 1364 | + editor = {Elliott, Graham and Granger, Clive W. J. and Timmermann, Allan}, | |
| 1365 | + title = {Forecast Combinations}, | |
| 1366 | + booktitle = {Handbook of Economic Forecasting, Volume 1}, | |
| 1367 | + year = {2006}, | |
| 1368 | + volume = {1}, | |
| 1369 | + pages = {135--196}, | |
| 1370 | + publisher = {Elsevier}, | |
| 1371 | + doi = {10.1016/s1574-0706(05)01004-9} | |
| 1372 | +} | |
| 1373 | + | |
| 1374 | +@article{batesgranger1969combination, | |
| 1375 | + author = {Bates, J. M. and Granger, C. W. J.}, | |
| 1376 | + title = {The Combination of Forecasts}, | |
| 1377 | + journal = {Journal of the Operational Research Society}, | |
| 1378 | + year = {1969}, | |
| 1379 | + volume = {20}, | |
| 1380 | + number = {4}, | |
| 1381 | + pages = {451--468}, | |
| 1382 | + doi = {10.1057/jors.1969.103} | |
| 1383 | +} | |
| 1384 | + | |
| 1385 | +@article{stockwatson2002principal, | |
| 1386 | + author = {Stock, James H and Watson, Mark W}, | |
| 1387 | + title = {Forecasting Using Principal Components From a Large Number of Predictors}, | |
| 1388 | + journal = {Journal of the American Statistical Association}, | |
| 1389 | + year = {2002}, | |
| 1390 | + volume = {97}, | |
| 1391 | + number = {460}, | |
| 1392 | + pages = {1167--1179}, | |
| 1393 | + doi = {10.1198/016214502388618960} | |
| 1394 | +} | |
| 1395 | + | |
| 1396 | +@article{stockwatson2002diffusion, | |
| 1397 | + author = {Stock, James H and Watson, Mark W}, | |
| 1398 | + title = {Macroeconomic Forecasting Using Diffusion Indexes}, | |
| 1399 | + journal = {Journal of Business \& Economic Statistics}, | |
| 1400 | + year = {2002}, | |
| 1401 | + volume = {20}, | |
| 1402 | + number = {2}, | |
| 1403 | + pages = {147--162}, | |
| 1404 | + doi = {10.1198/073500102317351921} | |
| 1405 | +} | |
| 1406 | + | |
| 1407 | +@article{banbura2010bvar, | |
| 1408 | + author = {Ba{\'n}bura, Marta and Giannone, Domenico and Reichlin, Lucrezia}, | |
| 1409 | + title = {Large Bayesian vector auto regressions}, | |
| 1410 | + journal = {Journal of Applied Econometrics}, | |
| 1411 | + year = {2010}, | |
| 1412 | + volume = {25}, | |
| 1413 | + number = {1}, | |
| 1414 | + pages = {71--92}, | |
| 1415 | + doi = {10.1002/jae.1137} | |
| 1416 | +} | |
| 1417 | + | |
| 1418 | +@article{litterman1986bvar, | |
| 1419 | + author = {Litterman, Robert B.}, | |
| 1420 | + title = {Forecasting With Bayesian Vector Autoregressions---Five Years of Experience}, | |
| 1421 | + journal = {Journal of Business \& Economic Statistics}, | |
| 1422 | + year = {1986}, | |
| 1423 | + volume = {4}, | |
| 1424 | + number = {1}, | |
| 1425 | + pages = {25--38}, | |
| 1426 | + doi = {10.1080/07350015.1986.10509491} | |
| 1427 | +} | |
| 1428 | + | |
| 1429 | +@inproceedings{lundberglee2017shap, | |
| 1430 | + author = {Lundberg, Scott M. and Lee, Su-In}, | |
| 1431 | + title = {A Unified Approach to Interpreting Model Predictions}, | |
| 1432 | + booktitle = {Advances in Neural Information Processing Systems 30 (NIPS 2017)}, | |
| 1433 | + year = {2017}, | |
| 1434 | + url = {https://proceedings.neurips.cc/paper/2017/hash/8a20a8621978632d76c43dfd28b67767-Abstract.html} | |
| 1435 | +} | |
| 1436 | + | |
| 1437 | +@article{lundberg2020treeexplainer, | |
| 1438 | + author = {Lundberg, Scott M. and Erion, Gabriel and Chen, Hugh and DeGrave, Alex and Prutkin, Jordan M. and Nair, Bala and Katz, Ronit and Himmelfarb, Jonathan and Bansal, Nisha and Lee, Su-In}, | |
| 1439 | + title = {From local explanations to global understanding with explainable AI for trees}, | |
| 1440 | + journal = {Nature Machine Intelligence}, | |
| 1441 | + year = {2020}, | |
| 1442 | + volume = {2}, | |
| 1443 | + number = {1}, | |
| 1444 | + pages = {56--67}, | |
| 1445 | + doi = {10.1038/s42256-019-0138-9} | |
| 1446 | +} | |
| 1447 | + | |
| 1448 | +@article{apleyzhu2020ale, | |
| 1449 | + author = {Apley, Daniel W. and Zhu, Jingyu}, | |
| 1450 | + title = {Visualizing the Effects of Predictor Variables in Black Box Supervised Learning Models}, | |
| 1451 | + journal = {Journal of the Royal Statistical Society: Series B (Statistical Methodology)}, | |
| 1452 | + year = {2020}, | |
| 1453 | + volume = {82}, | |
| 1454 | + number = {4}, | |
| 1455 | + pages = {1059--1086}, | |
| 1456 | + doi = {10.1111/rssb.12377} | |
| 1457 | +} | |
| 1458 | + | |
| 1459 | +@article{friedman2001gbm, | |
| 1460 | + author = {Friedman, Jerome H.}, | |
| 1461 | + title = {Greedy function approximation: A gradient boosting machine}, | |
| 1462 | + journal = {The Annals of Statistics}, | |
| 1463 | + year = {2001}, | |
| 1464 | + volume = {29}, | |
| 1465 | + number = {5}, | |
| 1466 | + pages = {1189--1232}, | |
| 1467 | + doi = {10.1214/aos/1013203451} | |
| 1468 | +} | |
| 1469 | + | |
| 1470 | +@article{breiman2001rf, | |
| 1471 | + author = {Breiman, Leo}, | |
| 1472 | + title = {Random Forests}, | |
| 1473 | + journal = {Machine Learning}, | |
| 1474 | + year = {2001}, | |
| 1475 | + volume = {45}, | |
| 1476 | + number = {1}, | |
| 1477 | + pages = {5--32}, | |
| 1478 | + doi = {10.1023/a:1010933404324} | |
| 1479 | +} | |
| 1480 | + | |
| 1481 | +@inproceedings{chenguestrin2016xgboost, | |
| 1482 | + author = {Chen, Tianqi and Guestrin, Carlos}, | |
| 1483 | + title = {XGBoost: A Scalable Tree Boosting System}, | |
| 1484 | + booktitle = {Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD '16)}, | |
| 1485 | + year = {2016}, | |
| 1486 | + pages = {785--794}, | |
| 1487 | + publisher = {ACM}, | |
| 1488 | + doi = {10.1145/2939672.2939785} | |
| 1489 | +} | |
| 1490 | + | |
| 1491 | +@inproceedings{prokhorenkova2018catboost, | |
| 1492 | + author = {Prokhorenkova, Liudmila and Gusev, Gleb and Vorobev, Aleksandr and Dorogush, Anna Veronika and Gulin, Andrey}, | |
| 1493 | + title = {CatBoost: unbiased boosting with categorical features}, | |
| 1494 | + booktitle = {Advances in Neural Information Processing Systems 31 (NeurIPS 2018)}, | |
| 1495 | + year = {2018}, | |
| 1496 | + url = {https://proceedings.neurips.cc/paper/2018/hash/14491b756b3a51daac41c24863285549-Abstract.html} | |
| 1497 | +} | |
| 1498 | + | |
| 1499 | +@book{molnar2025iml, | |
| 1500 | + author = {Molnar, Christoph}, | |
| 1501 | + title = {Interpretable Machine Learning: A Guide for Making Black Box Models Explainable}, | |
| 1502 | + year = {2025}, | |
| 1503 | + edition = {3}, | |
| 1504 | + publisher = {Self-published}, | |
| 1505 | + note = {ISBN 978-3-911578-03-5}, | |
| 1506 | + url = {https://christophm.github.io/interpretable-ml-book/} | |
| 1507 | +} | |
| 1508 | + | |
| 1509 | +@article{heckman1979selection, | |
| 1510 | + author = {Heckman, James J.}, | |
| 1511 | + title = {Sample Selection Bias as a Specification Error}, | |
| 1512 | + journal = {Econometrica}, | |
| 1513 | + year = {1979}, | |
| 1514 | + volume = {47}, | |
| 1515 | + number = {1}, | |
| 1516 | + pages = {153--161}, | |
| 1517 | + doi = {10.2307/1912352} | |
| 1518 | +} | |
| 1519 | + | |
| 1520 | +@article{judseaks1994selection, | |
| 1521 | + author = {Jud, Donald and Seaks, Terry}, | |
| 1522 | + title = {Sample Selection Bias in Estimating Housing Sales Prices}, | |
| 1523 | + journal = {Journal of Real Estate Research}, | |
| 1524 | + year = {1994}, | |
| 1525 | + volume = {9}, | |
| 1526 | + number = {3}, | |
| 1527 | + pages = {289--298}, | |
| 1528 | + doi = {10.1080/10835547.1994.12090753} | |
| 1529 | +} | |
| 1530 | + | |
| 1531 | +@article{munnekeslade2000selection, | |
| 1532 | + author = {Munneke, Henry J. and Slade, Barrett A.}, | |
| 1533 | + title = {An Empirical Study of Sample-Selection Bias in Indices of Commercial Real Estate}, | |
| 1534 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 1535 | + year = {2000}, | |
| 1536 | + volume = {21}, | |
| 1537 | + number = {1}, | |
| 1538 | + pages = {45--64}, | |
| 1539 | + doi = {10.1023/a:1007861303058} | |
| 1540 | +} | |
| 1541 | + | |
| 1542 | +@article{glaeser2014dynamics, | |
| 1543 | + author = {Glaeser, Edward L. and Gyourko, Joseph and Morales, Eduardo and Nathanson, Charles G.}, | |
| 1544 | + title = {Housing dynamics: An urban approach}, | |
| 1545 | + journal = {Journal of Urban Economics}, | |
| 1546 | + year = {2014}, | |
| 1547 | + volume = {81}, | |
| 1548 | + pages = {45--56}, | |
| 1549 | + doi = {10.1016/j.jue.2014.02.003} | |
| 1550 | +} | |
| 1551 | + | |
| 1552 | +@article{head2014search, | |
| 1553 | + author = {Head, Allen and Lloyd-Ellis, Huw and Sun, Hongfei}, | |
| 1554 | + title = {Search, Liquidity, and the Dynamics of House Prices and Construction}, | |
| 1555 | + journal = {American Economic Review}, | |
| 1556 | + year = {2014}, | |
| 1557 | + volume = {104}, | |
| 1558 | + number = {4}, | |
| 1559 | + pages = {1172--1210}, | |
| 1560 | + doi = {10.1257/aer.104.4.1172} | |
| 1561 | +} | |
| 1562 | + | |
| 1563 | +@article{guren2018momentum, | |
| 1564 | + author = {Guren, Adam M.}, | |
| 1565 | + title = {House Price Momentum and Strategic Complementarity}, | |
| 1566 | + journal = {Journal of Political Economy}, | |
| 1567 | + year = {2018}, | |
| 1568 | + volume = {126}, | |
| 1569 | + number = {3}, | |
| 1570 | + pages = {1172--1218}, | |
| 1571 | + doi = {10.1086/697207} | |
| 1572 | +} | |
| 1573 | + | |
| 1574 | +@article{berachaskiba2011momentum, | |
| 1575 | + author = {Beracha, Eli and Skiba, Hilla}, | |
| 1576 | + title = {Momentum in Residential Real Estate}, | |
| 1577 | + journal = {The Journal of Real Estate Finance and Economics}, | |
| 1578 | + year = {2011}, | |
| 1579 | + volume = {43}, | |
| 1580 | + number = {3}, | |
| 1581 | + pages = {299--320}, | |
| 1582 | + doi = {10.1007/s11146-009-9210-2} | |
| 1583 | +} | |
| 1584 | + | |
| 1585 | +@article{titman2014dynamics, | |
| 1586 | + author = {Titman, Sheridan and Wang, Ko and Yang, Jing}, | |
| 1587 | + title = {The Dynamics of Housing Prices}, | |
| 1588 | + journal = {Journal of Real Estate Research}, | |
| 1589 | + year = {2014}, | |
| 1590 | + volume = {36}, | |
| 1591 | + number = {3}, | |
| 1592 | + pages = {283--318}, | |
| 1593 | + doi = {10.1080/10835547.2014.12091394} | |
| 1594 | +} | |
| 1595 | + | |
| 1596 | +@article{capozza2004anatomy, | |
| 1597 | + author = {Capozza, Dennis R. and Hendershott, Patric H. and Mack, Charlotte}, | |
| 1598 | + title = {An Anatomy of Price Dynamics in Illiquid Markets: Analysis and Evidence from Local Housing Markets}, | |
| 1599 | + journal = {Real Estate Economics}, | |
| 1600 | + year = {2004}, | |
| 1601 | + volume = {32}, | |
| 1602 | + number = {1}, | |
| 1603 | + pages = {1--32}, | |
| 1604 | + doi = {10.1111/j.1080-8620.2004.00082.x} | |
| 1605 | +} | |
added
paper/sections/ablation.tex
+2 −0
@@ -0,0 +1,2 @@ | ||
| 1 | +\section{Ablations and robustness}\label{sec:ablation} | |
| 2 | +% to be written from results | |
added
paper/sections/abstract.tex
+3 −0
@@ -0,0 +1,3 @@ | ||
| 1 | +\newcommand{\WPabstract}{% | |
| 2 | +This paper asks whether new forecasting architectures improve residential price forecasts over strong conventional methods, and under which conditions. Using the audited Quebec land-registry sample of UQO Working Paper 22 (\NSales{} sales, 2021--2026) and its real-time quality-adjusted index vintages, we define three tasks in a strict pseudo-real-time design: the price of a property sold one to twelve months after a forecast origin (Task~A), the one- to twelve-month change of municipal, regional and provincial quality-adjusted indices (Task~B), and calibrated predictive distributions for both (Task~C). We implement five candidate architectures (a hierarchical spatiotemporal hedonic network, a dynamic spatial graph forecasting network, a regime-adaptive mixture of experts, a Bayesian hierarchical probabilistic forecaster and a quality-adjusted neural state-space model) and an integrated stacked architecture, against \NBenchB{} benchmarks ranging from no-change and momentum rules to gradient boosting, recurrent, convolutional and attention networks. Evaluation uses Diebold--Mariano and Giacomini--White tests, model confidence sets and block bootstraps, with Monte Carlo experiments on synthetic markets whose latent dynamics range from unforecastable random walks to regime switching and regional spillovers. \ResultsSummary{} Every component of the architectures exists in the literature; the contribution is the measured answer, on transaction-level data, to the question of when complexity pays.% | |
| 3 | +} | |
added
paper/sections/architectures.tex
+27 −0
@@ -0,0 +1,27 @@ | ||
| 1 | +\section{Proposed forecasting architectures}\label{sec:arch} | |
| 2 | + | |
| 3 | +All architectures are implemented in the accompanying repository (PyTorch for the neural ones) with fixed hyper-parameters (Appendix~\ref{app:hyper}). Each produces the five quantiles of Task~C; the point forecast is the median unless stated. | |
| 4 | + | |
| 5 | +\subsection{HSHN: hierarchical spatiotemporal hedonic network (Task A)} | |
| 6 | + | |
| 7 | +The network maps the standardised hedonic and market features $x_i$, three learned embeddings $g_i = e_{\mathrm{reg}(i)} + e_{\mathrm{mrc}(i)} + e_{\mathrm{mun}(i)}$ (dimension 8) and a horizon embedding $e_h$ (dimension 4) to five quantiles of $\log P_i$: an encoder of two GELU layers (256, 128) on $[x_i, g_i, e_h]$, an interaction block that combines the encoded representation with $[g_i, e_h]$, and a linear head. Partial pooling is implemented by weight decay on the municipality embedding only (coefficient $5\times10^{-3}$ against $10^{-4}$ elsewhere), so that a municipality's embedding is a penalised deviation from its MRC and region embeddings and thin municipalities fall back on their parents; \emph{full pooling} removes the municipality embedding, \emph{no pooling} removes the penalty. Training minimises the mean pinball loss over the five quantiles with AdamW and a one-cycle schedule (8 epochs, batch 4{,}096). The design is a neural counterpart of mixed-effects hedonics with a horizon input; the test is whether the learned pooling beats trees and an unpooled MLP out of time, especially in thin municipalities. | |
| 8 | + | |
| 9 | +\subsection{DSGFN: dynamic spatial graph forecasting network (Task B)} | |
| 10 | + | |
| 11 | +Nodes are the cells of one class at one origin; each node is encoded from its standardised features and its thirteen-month relative history by a two-layer network (dimension 32). A single graph-attention layer aggregates neighbours with logits $q_u^\top k_v/\sqrt{d} + \omega \log A_{uv}$, where $A$ is a prior adjacency that multiplies a Gaussian distance kernel between municipal centroids (bandwidth 60 km), a co-movement term $\tfrac12 + \tfrac12\,\mathrm{corr}$ of the two nodes' monthly real-time changes over the history window, and an indicator that the nodes share the level and class; self-attention is excluded so that the aggregated vector is a neighbourhood signal, and $\omega$ is learned. The head reads the node's own encoding and the neighbourhood vector. Edges are re-computed at every origin from information available then (dynamic graph). Ablations drop the distance kernel, the co-movement term or the whole neighbourhood vector. | |
| 12 | + | |
| 13 | +\subsection{RAREF: regime-adaptive mixture of experts (Task B)} | |
| 14 | + | |
| 15 | +At each origin a three-state Gaussian hidden Markov model is estimated by Baum--Welch on the sequence of provincial real-time monthly growth rates known at that origin (one value per past origin, each taken from its own vintage, so that no smoothed full-sample growth enters), and its filtered state probabilities at the origin gate three ridge experts estimated on the training rows weighted by their own origins' state probabilities. The forecast is the probability-weighted expert forecast; the predictive quantiles are the mixture's. Regimes are therefore inferred only from origin-dated information and can be mapped to calendar episodes. | |
| 16 | + | |
| 17 | +\subsection{BHPF: Bayesian hierarchical probabilistic forecaster (Task B)} | |
| 18 | + | |
| 19 | +The target is modelled as $y = \beta_0 + x^\top\beta + u_{\mathrm{region}} + u_{\mathrm{cell}} + \varepsilon$ with Gaussian priors $\beta \sim N(0, \tau_b^2 I)$, $u_{\mathrm{region}} \sim N(0, \tau_r^2)$, $u_{\mathrm{cell}} \sim N(0, \tau_c^2)$ and $\varepsilon \sim N(0, \sigma^2)$. The posterior is conjugate and exact; the variance components are updated by fifteen iterations of an EM-type scheme (posterior second moments of the random effects). The predictive distribution is Gaussian with the posterior-predictive variance, which separates parameter uncertainty from residual variance; cells unseen in training receive the region effect only. This is a small-area model in the Fay--Herriot tradition applied to index changes; it is the natural null for the neural hierarchical claims. | |
| 20 | + | |
| 21 | +\subsection{QANSS: quality-adjusted neural state-space forecaster (Task B)} | |
| 22 | + | |
| 23 | +WP22 already separates the quality component from the latent market component: its real-time index is the filtered latent state. QANSS forecasts the latent state by a learned transition: a two-layer network (32 tanh units) maps the cell's state at the origin (recent drift, volatility, volume ratio, provincial and regional drifts, last two monthly changes) to the mean monthly drift over the horizon and the log standard deviation of the $h$-month change, estimated by maximising the Gaussian likelihood of the training targets; the predictive variance adds the published filter variance of the origin level. The model is a deep state-space model in the sense of \citet{rangapuram2018dssm} whose observation equation is the WP22 hedonic state-space index; the question is whether the learned drift transition beats the local-linear-trend and autoregressive benchmarks on the same vintages. | |
| 24 | + | |
| 25 | +\subsection{QREFA: integrated architecture} | |
| 26 | + | |
| 27 | +The integrated architecture stacks the components by a non-negative least-squares combination of their in-sample forecasts, normalised to sum to one, estimated on the training origins; its quantiles are the weighted quantiles. Each component can be removed from the stack, which is the ablation design of the protocol. The null hypotheses are the best single component and the equal-weight combination. | |
added
paper/sections/benchmarks.tex
+3 −0
@@ -0,0 +1,3 @@ | ||
| 1 | +\section{Econometric and machine learning benchmarks}\label{sec:bench} | |
| 2 | + | |
| 3 | +Task A benchmarks are a hedonic OLS, ridge and elastic net on the same features, a random forest (150 trees, depth 18), XGBoost (600 trees, depth 8), LightGBM (800 trees, 63 leaves, with five quantile models), support vector regression on a 15{,}000-sale subsample, and a quantile MLP (two GELU layers, 256 and 128 units, pinball loss) without embeddings; the naive reference is the municipality's median log price over the three months before the origin. Task B benchmarks are the no-change forecast, the cell's historical mean $h$-month growth, momentum (the last three-month change scaled to the horizon with a fitted slope), random walk with the twelve-month drift, seasonal naive (the same-calendar change of the previous year), an AR(2) on the cell's monthly changes, a local linear trend (Kalman slope extrapolation), a pooled ridge regression on the panel features, LightGBM on the panel (with quantile models), a panel MLP, LSTM and GRU on the thirteen-month history with the features, a temporal convolutional network, and a TFT-lite with gated variable selection and self-attention over the history. Factor and VAR models are represented by the parent-momentum features (provincial and regional changes enter every pooled model) and by the AR benchmark; a full Bayesian VAR on 82 series with 45 origins is not estimable with any reliability and is not reported. All neural benchmarks output the five quantiles with the pinball loss; the others use residual quantiles. Hyper-parameters are listed in Appendix~\ref{app:hyper}; none was tuned on test origins. | |
added
paper/sections/conclusion.tex
+2 −0
@@ -0,0 +1,2 @@ | ||
| 1 | +\section{Limitations and conclusion}\label{sec:conclusion} | |
| 2 | +% to be completed from results | |
added
paper/sections/data.tex
+16 −0
@@ -0,0 +1,16 @@ | ||
| 1 | +\section{Data and institutional context}\label{sec:data} | |
| 2 | + | |
| 3 | +The data are those of WP22, used read-only: the Vrai Prix snapshot of 21 October 2026 of Quebec land-registry deeds republished by the Journal de Québec / Journal de Montréal feed, geocoded and matched to the provincial assessment roll (769{,}995 registered sales from 4 January 2021 to 7 October 2026), reduced by the WP22 exclusion ledger to a headline population of \NSales{} house, condominium and plex sales with roll characteristics. The institutional facts that matter for forecasting are three. Deeds are published with a lag of ten to thirteen days and never backfilled (WP22 measured this on four earlier extractions), so the information set at an origin is the set of sales dated at least ten days before the publication date; the last complete month is September 2026 and October is partial. The roll is a single current vintage, so characteristics are post-sale for most dwellings; this affects Task~A in the same way for every model. The provider collects no sale below \$50{,}000. | |
| 4 | + | |
| 5 | +Table~\ref{tab:variables} lists the variables actually available after inspection. The quality variables are floor area, lot area, year built, storeys, building genre, physical link (detached, semi-detached, row, integrated), number of dwellings for plexes, coordinates, municipality, MRC and region, and the assessment in force at the sale; bedrooms, bathrooms, parking, basement, condition, renovations, quality grade and listing attributes are not observed, and no image or text features are used. WP22 provides, in addition, the nested metric location cells and the feature engineering (imputation with time-stable missingness indicators, centred log areas, age bins) that we reuse unchanged, and two index products: the retrospective SHARP-HPI panel (province, 17 regions, 103 MRCs, 1{,}125 municipalities $\times$ three classes $\times$ 69 months), which serves only as the \emph{target} of Task~B, and the real-time vintage database (monthly publication dates from July 2022, filtered and smoothed modes, province, regions and the 64 municipalities with at least 1{,}500 sales), which is the only index information admitted as a \emph{predictor}. | |
| 6 | + | |
| 7 | +\input{tables/tab_variables} | |
| 8 | + | |
| 9 | +Table~\ref{tab:coverage} summarises coverage by region and class and the evaluation samples of each task. Figure~\ref{fig:map_density} maps municipal sales density. The sample is short for monthly forecasting: 69 months in total, of which the first 24 are history before the first origin; this constrains every model and is discussed throughout. | |
| 10 | + | |
| 11 | +\input{tables/tab_coverage} | |
| 12 | + | |
| 13 | +\begin{figure}[htbp]\centering | |
| 14 | +\includegraphics[width=0.9\textwidth]{figures/fig_map_density.pdf} | |
| 15 | +\caption{Municipal sales density (headline sample, 2021--2026) and the 64 municipalities with real-time index vintages (outlined).}\label{fig:map_density} | |
| 16 | +\end{figure} | |
added
paper/sections/framework.tex
+3 −0
@@ -0,0 +1,3 @@ | ||
| 1 | +\section{Empirical forecasting framework}\label{sec:framework} | |
| 2 | + | |
| 3 | +Forecasts are produced in forward-chaining fashion. For Task~A, twelve quarterly origins (December 2022 to September 2025) each yield a training set of all sales dated $\le o$ (with horizon-dated features) and a test set of the sales of the following twelve months; for Task~B, the models are re-estimated at every third origin on the rows whose targets were observed by the origin and used for the next three origins, which gives 34 to 45 evaluated origins per horizon. Point accuracy is reported as MAE, RMSE, median absolute error, bias and MASE relative to the naive reference; probabilistic accuracy as the mean pinball loss, the quantile-grid CRPS, 50\% and 90\% coverage and widths and the weighted interval score. Statistical comparisons use per-origin mean losses (which removes the cross-sectional dependence among forecasts issued at the same origin and leaves a short time series of $n$ origins): the Diebold--Mariano test with a Newey--West long-run variance with $h-1$ lags and the Harvey--Leybourne--Newbold small-sample correction, the Giacomini--White conditional test with a constant and the lagged loss difference as instruments, stationary-bootstrap confidence intervals for mean loss differences, and the model confidence set at the 10\% level with the $T_{\max}$ statistic and 500 bootstrap replications. With 34 to 45 origins these tests have limited power and are interpreted with the economic magnitudes alongside. Heterogeneity is reported by level, class, region, municipal size and price segment, and never for cells with fewer than 30 evaluated forecasts. | |
added
paper/sections/heterogeneity.tex
+2 −0
@@ -0,0 +1,2 @@ | ||
| 1 | +\section{Spatial and regional heterogeneity}\label{sec:het} | |
| 2 | +% to be written from results | |
added
paper/sections/interpretation.tex
+2 −0
@@ -0,0 +1,2 @@ | ||
| 1 | +\section{Interpretation and economic mechanisms}\label{sec:interp} | |
| 2 | +% to be written from results | |
added
paper/sections/introduction.tex
+11 −0
@@ -0,0 +1,11 @@ | ||
| 1 | +\section{Introduction}\label{sec:intro} | |
| 2 | + | |
| 3 | +Forecasting residential prices is a different problem from measuring them. A price index answers how much the price of a constant-quality dwelling has changed; a forecast answers how much it will change, or what a given dwelling will sell for, using only what is known at the forecast origin. The two problems share the data and the quality-adjustment apparatus, but they differ in what can go wrong: an index can be revised, a forecast cannot be, and an index is judged against a latent truth while a forecast is judged against an outcome that arrives later. This paper takes the transaction database, the geography and the real-time index vintages constructed in UQO Working Paper 22 \citep{boucher2026sharphpi} and asks whether forecasting architectures that combine property-level characteristics, spatial dependence, hierarchical pooling, regime adaptation and probabilistic output improve on conventional forecasts, and when. | |
| 4 | + | |
| 5 | +The recent literature offers many candidate mechanisms and few controlled comparisons. Gradient boosting dominates cross-sectional valuation contests \citep{mayer2019updating,hong2020randomforest}, but valuation is not forecasting; cross-regional spatial dependence of price dynamics is well documented \citep{pace2000spatiotemporal,hollypesaran2010,brady2011diffusion}, and graph neural networks designed for traffic forecasting \citep{li2018dcrnn,wu2019graphwavenet,bai2020agcrn} offer a flexible way to learn it, but the housing applications so far value properties cross-sectionally \citep{zhang2021mugrep,das2021gsne}; regime switching in house price dynamics is classical \citep{hamilton1989regime,capozza2004anatomy}; hierarchical Bayesian pooling of local indices is established \citep{francke2017hierarchical}; neural state-space models exist in the forecasting literature \citep{rangapuram2018dssm}; and simple linear models have been shown to beat elaborate transformers on many benchmarks \citep{zeng2023transformers}. What is missing is an evaluation of these mechanisms on the same transaction-level data, in a design that uses only information available at each origin, with tests that account for overlapping horizons and serial dependence, and with a simulation study that explains why a mechanism helps when it does. | |
| 6 | + | |
| 7 | +We make four contributions. First, we define three forecasting tasks on an audited registry sample and construct, for every monthly origin from December 2022 to September 2025, the information set actually available then: property characteristics, real-time municipal market features computed from past sales, and the real-time quality-adjusted index vintages of WP22, which were re-estimated at every publication date so that no full-sample index enters a predictor. Second, we implement five candidate architectures and an integrated architecture alongside \NBenchB{} benchmarks, from no-change and momentum rules through ARIMA-type, factor and state-space models to gradient boosting and recurrent, convolutional and attention networks, each with a quantile or distributional output. Third, we evaluate them with forward-chaining experiments and the inferential toolkit of the forecasting literature: Diebold--Mariano tests with horizon-adjusted long-run variances \citep{dieboldmariano1995,harvey1997equality}, Giacomini--White conditional tests \citep{giacominiwhite2006}, model confidence sets \citep{hansen2011mcs}, stationary block bootstraps \citep{politisromano1994stationary}, scale-free accuracy \citep{hyndmankoehler2006mase}, and proper scoring rules for the predictive distributions \citep{gneitingraftery2007scoring,bracher2021wis}. Fourth, we run the same forecasters on synthetic markets whose latent dynamics are known, from unforecastable random walks to persistent momentum, Markov-switching regimes and regional spillovers, so that the empirical ranking can be read against the mechanisms that generate it. | |
| 8 | + | |
| 9 | +We are explicit about novelty, following the verified literature review of Section~\ref{sec:lit}: each architecture is a combination of known components, and we classify each as an application, an adaptation or a new combination. \IntroFindings{} | |
| 10 | + | |
| 11 | +The paper proceeds as follows. Section~\ref{sec:lit} reviews the literature and states the gap. Section~\ref{sec:data} describes the data and the institutional context. Section~\ref{sec:targets} defines the forecasting targets and information sets. Section~\ref{sec:arch} presents the architectures and Section~\ref{sec:bench} the benchmarks. Section~\ref{sec:sim} reports the simulation study. Section~\ref{sec:framework} sets out the empirical forecasting framework. Sections~\ref{sec:results} to~\ref{sec:ablation} report the main results, spatial and regional heterogeneity, probabilistic forecasting and calibration, interpretation, and ablations and robustness. Section~\ref{sec:conclusion} concludes with limitations. | |
added
paper/sections/literature.tex
+27 −0
@@ -0,0 +1,27 @@ | ||
| 1 | +\section{Related literature}\label{sec:lit} | |
| 2 | + | |
| 3 | +\paragraph{Hedonic models, repeat sales and index construction.} Quality adjustment rests on hedonic regression \citep{rosen1974} and on repeat-sales methods \citep{bailey1963,caseshiller1989}; the index methods relevant here, including rolling time dummies \citep{hill2022rtd}, multilateral time-series smoothing \citep{ishaak2024hmts} and hierarchical structural time-series models for thin markets \citep{francke2010thin,francke2017hierarchical}, are reviewed in \citet{hill2013survey}, the Eurostat et al.\ handbook \citep{eurostat2013handbook} and WP22. \citet{sijpfrancke2026laplacian} model spatiotemporal random effects in hedonic and repeat-sales models through graph-Laplacian priors, the parametric counterpart of the spatial sharing that the neural architectures below attempt to learn. Selection into transaction is the subject of \citet{heckman1979selection}, \citet{gatzlaffhaurin1997,gatzlaffhaurin1998}, \citet{judseaks1994selection}, \citet{munnekeslade2000selection}, \citet{clapp1991alltransactions} and \citet{hwangquigley2004}. | |
| 4 | + | |
| 5 | +\paragraph{Forecasting housing markets.} Predictability of house price changes is documented by \citet{caseshiller1989,caseshiller1990forecasting}; momentum and mean reversion by \citet{capozza2004anatomy}, \citet{berachaskiba2011momentum}, \citet{titman2014dynamics} and, theoretically, \citet{glaeser2014dynamics}, \citet{head2014search} and \citet{guren2018momentum}. Regional index forecasting with cross-sectional information includes \citet{rapachstrauss2009}, \citet{gupta2011large,gupta2011forecasting} (factor-augmented and large Bayesian VARs), \citet{borkmoller2015} (dynamic model averaging), \citet{kouwenbergzwinkels2014}, \citet{plakandaras2015forecasting}, \citet{milunovich2020forecasting} (time series against machine learning for Australia) and \citet{yeo2025deepdfvar} (dynamic-factor VAR with deep learning); \citet{ghysels2013forecasting} survey the field. Spatial and spatiotemporal dependence of prices is modelled by \citet{pace1998spatiotemporal,pace2000spatiotemporal}, \citet{hollypesaran2010,holly2011uk} and \citet{brady2011diffusion}; the spatial-econometric toolkit is \citet{anselin1988}, \citet{lesagepace2009}, \citet{kelejianprucha2010} and \citet{elhorst2014spatial}. | |
| 6 | + | |
| 7 | +\paragraph{Machine learning and deep learning for property prices.} Tree ensembles \citep{breiman2001rf,friedman2001gbm,chen2016xgboost,ke2017lightgbm,prokhorenkova2018catboost} dominate valuation comparisons \citep{mayer2019updating,hong2020randomforest,baldominos2018opportunities,kok2017bigdata}; \citet{pacehayunga2020residuals} examine what trees extract from hedonic residuals; \citet{deppnercajias2024spatialcv} show that random cross-validation is biased by spatial dependence; interpretability is treated by \citet{lorenz2023interpretable} and \citet{lenaers2023xai}. Graph neural networks \citep{kipfwelling2017gcn,velickovic2018gat,wu2021gnnsurvey} have been applied to valuation with transaction, point-of-interest and road graphs \citep{viana2021attention,zhang2021mugrep,das2021gsne,guo2026heteroroadnet}; spatiotemporal graph forecasting models \citep{li2018dcrnn,yu2018stgcn,wu2019graphwavenet,bai2020agcrn} are surveyed by \citet{jin2024urbanstgnn,jin2024tsgnnsurvey}. Deep time-series forecasters include LSTM and GRU \citep{hochreiter1997lstm,cho2014gru}, temporal convolutions \citep{bai2018tcn}, N-BEATS \citep{oreshkin2020nbeats}, DeepAR \citep{salinas2020deepar}, the Temporal Fusion Transformer \citep{lim2021tft} and PatchTST \citep{nie2023patchtst}; \citet{zeng2023transformers} and the M4 and M5 competitions \citep{makridakis2020m4,makridakis2022m5accuracy,makridakis2022m5uncertainty} are the cautionary references. | |
| 8 | + | |
| 9 | +\paragraph{Regimes, state space, hierarchy and probability.} Markov-switching models \citep{hamilton1989regime,kimnelson1999statespace}, mixtures of experts \citep{jacobs1991moe,jordanjacobs1994hme,shazeer2017moe}, deep state-space models \citep{rangapuram2018dssm,krishnan2017dkf,debezenac2020nkf}, hierarchical Bayesian modelling \citep{gelman2006prior,hoffmangelman2014nuts,blei2017vi,rue2009inla}, forecast reconciliation \citep{hyndman2011hierarchical,wickramasuriya2019mint,athanasopoulos2024reconciliation}, forecast combination \citep{batesgranger1969combination,timmermann2006combinations}, quantile and conformal methods \citep{koenkerbassett1978quantiles,taylor2000quantilenn,romano2019cqr,vovk2005conformal} and proper scoring rules \citep{gneitingraftery2007scoring,gneiting2007calibration,gneitingkatzfuss2014probabilistic,bracher2021wis} supply the components. Forecast evaluation follows \citet{dieboldmariano1995}, \citet{harvey1997equality}, \citet{west1996asymptotic}, \citet{clarkmccracken2001nested,clarkmccracken2013advances}, \citet{giacominiwhite2006}, \citet{hansen2011mcs}, \citet{politisromano1994stationary}, \citet{kunsch1989jackknife}, \citet{hyndmankoehler2006mase} and \citet{diebold2015twenty}; dynamic factor and Bayesian VAR benchmarks follow \citet{stockwatson2002diffusion,stockwatson2002principal}, \citet{litterman1986bvar} and \citet{banbura2010bvar}; interpretation follows \citet{lundberglee2017shap,lundberg2020treeexplainer}, \citet{apleyzhu2020ale} and \citet{molnar2025iml}. | |
| 10 | + | |
| 11 | +\paragraph{The gap and the classification of contributions.} Table~\ref{tab:lit_class} classifies the six architectures against their closest predecessors (full detail in the repository's novelty scan). None is unprecedented. The hierarchical hedonic network is a neural parameterisation of mixed-effects and graph-Laplacian hedonics; the graph network is an adaptation of traffic-forecasting models to municipal nodes; the regime model is a gated mixture of experts with origin-only regime inference; the Bayesian forecaster is a conjugate hierarchical model in the small-area tradition; the neural state-space model is a deep state-space model whose observation equation is the WP22 quality-adjusted index; the integrated architecture is a constrained forecast combination. The gap this paper fills is evaluative: a controlled, leakage-audited comparison of these mechanisms on transaction-level data over a geographic hierarchy, with inference that respects overlapping horizons, and a simulation study that attributes performance to mechanisms. | |
| 12 | + | |
| 13 | +\begin{table}[htbp]\centering\footnotesize | |
| 14 | +\caption{Classification of the proposed architectures against the verified literature}\label{tab:lit_class} | |
| 15 | +\begin{tabular}{p{2.3cm}p{5.2cm}p{3.2cm}p{3.6cm}} | |
| 16 | +\toprule | |
| 17 | +Architecture & Closest predecessors & Classification & What is tested here \\ | |
| 18 | +\midrule | |
| 19 | +HSHN & Mixed-effects / hierarchical hedonics \citep{mayer2019updating,gelmanhill2007}; graph-Laplacian hedonics \citep{sijpfrancke2026laplacian}; MugRep \citep{zhang2021mugrep} & Adaptation (neural partial pooling with a horizon input) & Out-of-time gains over trees and MLP; partial vs full vs no pooling in thin municipalities \\ | |
| 20 | +DSGFN & DCRNN, Graph WaveNet, AGCRN \citep{li2018dcrnn,wu2019graphwavenet,bai2020agcrn}; STAR / FAVAR \citep{pace2000spatiotemporal,gupta2011large}; Deep-DFVAR \citep{yeo2025deepdfvar} & Application of adaptive-graph ST models to municipal indices & Gains over spatial-lag and parent-momentum benchmarks; edge-type ablation \\ | |
| 21 | +RAREF & Markov switching \citep{hamilton1989regime}; mixtures of experts \citep{jacobs1991moe}; DMA \citep{borkmoller2015} & Adaptation (origin-only HMM gating of ridge experts) & Gains around regime transitions; stability with 45 origins \\ | |
| 22 | +BHPF & Hierarchical repeat sales \citep{francke2017hierarchical}; Fay--Herriot \citep{fayherriot1979} & Application (conjugate hierarchical Gaussian model) & Calibration and sharpness vs quantile networks and conformal methods \\ | |
| 23 | +QANSS & Structural time-series indices \citep{francke2010thin}; deep state space \citep{rangapuram2018dssm} & New combination (WP22 quality-adjusted state + learned drift transition) & Gains over the local-linear-trend and AR benchmarks on the same vintages \\ | |
| 24 | +QREFA & Forecast combination \citep{batesgranger1969combination,timmermann2006combinations}; TFT \citep{lim2021tft} & Constrained combination of the five & Whether integration beats the best component and an equal-weight combination \\ | |
| 25 | +\bottomrule | |
| 26 | +\end{tabular} | |
| 27 | +\end{table} | |
added
paper/sections/probabilistic.tex
+2 −0
@@ -0,0 +1,2 @@ | ||
| 1 | +\section{Probabilistic forecasting and calibration}\label{sec:prob} | |
| 2 | +% to be written from results | |
added
paper/sections/results.tex
+2 −0
@@ -0,0 +1,2 @@ | ||
| 1 | +\section{Main forecasting results}\label{sec:results} | |
| 2 | +% to be written from results | |
added
paper/sections/simulation.tex
+2 −0
@@ -0,0 +1,2 @@ | ||
| 1 | +\section{Simulation design and results}\label{sec:sim} | |
| 2 | +% to be written from results | |
added
paper/sections/targets.tex
+17 −0
@@ -0,0 +1,17 @@ | ||
| 1 | +\section{Forecasting targets and information sets}\label{sec:targets} | |
| 2 | + | |
| 3 | +\subsection{Task A: the price of a future sale} | |
| 4 | + | |
| 5 | +For a forecast origin $o$ (a month) and a sale $i$ dated in month $o+h$, $h \in \{1,\ldots,12\}$, the target is $\log P_i$ and the information set is $\mathcal{I}_o = \{$characteristics of $i$ (known from the roll), its location, the market features of its municipality and region computed from sales dated $\le o$, the quality-stripped prices of its ten nearest sales dated in $(o-12, o]$, and $h\}$. The characteristics of the sold dwelling are treated as known at the origin, which corresponds to the use case of valuing a specific dwelling $h$ months ahead; the identity of the dwellings that will sell is not. Models are estimated on sales dated $\le o$; every training sale is assigned a horizon $h$ drawn from $\{1,3,6,12\}$ and receives the market features of the origin $h$ months before its sale, so that horizon dependence is learned from the same kind of pairs that are evaluated. Origins are quarterly from December 2022 to September 2025; test sales are grouped into horizon bands 1--3, 4--6 and 7--12 months. The transaction-selection problem is explicit: the evaluation population is the dwellings that transacted, which differ from the stock (Table~\ref{tab:selection} compares the characteristics of sold dwellings with the roll stock by class), so Task~A measures the accuracy of forecasts for dwellings that come to market, not for the stock. | |
| 6 | + | |
| 7 | +\subsection{Task B: the change of a quality-adjusted index} | |
| 8 | + | |
| 9 | +For cell $g$ (province, region or one of the 64 municipalities), class $k$, origin $o$ and horizon $h \in \{1,3,6,12\}$, the target is $y^{\mathrm{final}}_{g,k,o+h} - y^{\mathrm{final}}_{g,k,o}$, the change of the retrospective smoothed SHARP-HPI log index, the best available estimate of the true quality-adjusted market movement. The predictors are the thirteen-month history of the real-time index published for $o$ (the vintage estimated on sales $\le o - 10$ days, smoothed mode), summarised as 1-, 3-, 6- and 12-month changes, 6- and 12-month volatilities, acceleration, monthly sale counts and their ratio, the published standard error, calendar month, and the same summaries for the cell's region and the province (the parent momentum). Using the final series as the target and the real-time series as predictor means that the target embeds the revision between the two; we report the decomposition of forecast error into the revision and the genuine future change. Origins are monthly from December 2022; for horizon $h$ the last origin is September 2026 minus $h$, so that every evaluated forecast has an observed target. Models are re-estimated quarterly on the rows whose targets were observed by the origin and issue forecasts for the three following origins. | |
| 10 | + | |
| 11 | +\subsection{Task C: predictive distributions} | |
| 12 | + | |
| 13 | +Every model produces the 5\%, 25\%, 50\%, 75\% and 95\% quantiles of its target, either natively (quantile heads, Gaussian posterior predictive, mixture outputs) or from the empirical quantiles of its training residuals (homoskedastic fallback, labelled as such). We score them with the pinball loss, a quantile-grid approximation of the CRPS, the coverage and width of the 50\% and 90\% intervals and the weighted interval score \citep{bracher2021wis}, and we report calibration as the share of outcomes below each quantile. Probabilities of decline and of appreciation above thresholds are read off the quantile forecasts by interpolation. | |
| 14 | + | |
| 15 | +\subsection{Leakage audit} | |
| 16 | + | |
| 17 | +Every predictor is computed from data dated on or before the origin; the index vintages are those WP22 published for the origin, re-estimated at each publication date with their own location partition and empirical-Bayes priors; one-hot categories, standardisation constants and neighbour graphs are built on training data only; hyper-parameters are fixed in advance (Appendix~\ref{app:hyper}) rather than tuned on test origins; and random splits are never used. The audit list of the protocol (hedonic estimation, clustering, normalisation, feature selection, imputation, target encoding, graph estimation, tuning, index revisions) is checked item by item in Appendix~\ref{app:leakage}. | |
added
paper/sections/titlepage.tex
+77 −0
@@ -0,0 +1,77 @@ | ||
| 1 | +% ============================================================================ | |
| 2 | +% Title Page | |
| 3 | +% ============================================================================ | |
| 4 | +\thispagestyle{empty} | |
| 5 | + | |
| 6 | +\begin{center} | |
| 7 | + | |
| 8 | +% --- Logo --- | |
| 9 | +\includegraphics[width=3.5cm]{uq_logo.jpg} | |
| 10 | + | |
| 11 | +\vspace{0.6cm} | |
| 12 | + | |
| 13 | +{\footnotesize\textsc{Université du Québec en Outaouais}}\\[0.15cm] | |
| 14 | +{\footnotesize\textsc{Département des sciences administratives}} | |
| 15 | + | |
| 16 | +\vspace{0.8cm} | |
| 17 | + | |
| 18 | +{\footnotesize\textsc{Working Paper No.~\WPnumber}} | |
| 19 | + | |
| 20 | +\vspace{1.2cm} | |
| 21 | + | |
| 22 | +% --- Title --- | |
| 23 | +{\LARGE\bfseries \WPtitle\par} | |
| 24 | + | |
| 25 | +\ifx\WPsubtitle\empty\else | |
| 26 | + \vspace{0.3cm} | |
| 27 | + {\large\itshape \WPsubtitle\par} | |
| 28 | +\fi | |
| 29 | + | |
| 30 | +\vspace{1.2cm} | |
| 31 | + | |
| 32 | +% --- Author --- | |
| 33 | +{\large \WPauthor}\\[0.3cm] | |
| 34 | +{\normalsize \WPaffiliation}\\[0.15cm] | |
| 35 | +{\normalsize \href{mailto:\WPemail}{\WPemail}}\\[0.15cm] | |
| 36 | +{\small \WPaddress} | |
| 37 | + | |
| 38 | +\vspace{0.8cm} | |
| 39 | + | |
| 40 | +% --- Date & Version --- | |
| 41 | +{\normalsize \WPdate}\\[0.1cm] | |
| 42 | +{\small Version~\WPversion} | |
| 43 | + | |
| 44 | +\end{center} | |
| 45 | + | |
| 46 | +\vfill | |
| 47 | + | |
| 48 | +\newpage | |
| 49 | + | |
| 50 | +% ============================================================================ | |
| 51 | +% Abstract Page | |
| 52 | +% ============================================================================ | |
| 53 | +\thispagestyle{empty} | |
| 54 | + | |
| 55 | +\vspace*{1cm} | |
| 56 | + | |
| 57 | +\noindent\rule{\textwidth}{0.4pt} | |
| 58 | +\vspace{0.3cm} | |
| 59 | + | |
| 60 | +\noindent\textbf{Abstract} | |
| 61 | + | |
| 62 | +\vspace{0.15cm} | |
| 63 | + | |
| 64 | +\noindent\WPabstract | |
| 65 | + | |
| 66 | +\vspace{0.4cm} | |
| 67 | + | |
| 68 | +\noindent\textbf{Keywords:} \WPkeywords | |
| 69 | + | |
| 70 | +\vspace{0.15cm} | |
| 71 | + | |
| 72 | +\noindent\textbf{JEL Classification:} \WPjel | |
| 73 | + | |
| 74 | +\vspace{0.3cm} | |
| 75 | +\noindent\rule{\textwidth}{0.4pt} | |
| 76 | + | |
| 77 | +\newpage | |
added
paper/sections/titlepage_anon.tex
+53 −0
@@ -0,0 +1,53 @@ | ||
| 1 | +% ============================================================================ | |
| 2 | +% ANONYMOUS TITLE PAGE — for double-anonymized journal submission | |
| 3 | +% Used by paper/main_anon.tex (same macros as main.tex, no author block, | |
| 4 | +% no institution, no logo). Abstract/keywords/JEL page identical to titlepage.tex. | |
| 5 | +% ============================================================================ | |
| 6 | +\thispagestyle{empty} | |
| 7 | +\begin{center} | |
| 8 | + | |
| 9 | +\vspace*{3cm} | |
| 10 | + | |
| 11 | +{\LARGE\bfseries \WPtitle\par} | |
| 12 | + | |
| 13 | +\ifx\WPsubtitle\empty\else | |
| 14 | + \vspace{0.3cm} | |
| 15 | + {\large\itshape \WPsubtitle\par} | |
| 16 | +\fi | |
| 17 | + | |
| 18 | +\vspace{1.5cm} | |
| 19 | + | |
| 20 | +{\normalsize [Author identity withheld for review]} | |
| 21 | + | |
| 22 | +\vspace{0.8cm} | |
| 23 | + | |
| 24 | +{\normalsize \WPdate} | |
| 25 | + | |
| 26 | +\end{center} | |
| 27 | + | |
| 28 | +\vfill | |
| 29 | + | |
| 30 | +\newpage | |
| 31 | +\thispagestyle{empty} | |
| 32 | +\vspace*{1cm} | |
| 33 | + | |
| 34 | +\noindent\rule{\textwidth}{0.4pt} | |
| 35 | +\vspace{0.3cm} | |
| 36 | + | |
| 37 | +\noindent\textbf{Abstract} | |
| 38 | +\vspace{0.15cm} | |
| 39 | + | |
| 40 | +\noindent\WPabstract | |
| 41 | + | |
| 42 | +\vspace{0.4cm} | |
| 43 | + | |
| 44 | +\noindent\textbf{Keywords:} \WPkeywords | |
| 45 | + | |
| 46 | +\vspace{0.15cm} | |
| 47 | + | |
| 48 | +\noindent\textbf{JEL Classification:} \WPjel | |
| 49 | + | |
| 50 | +\vspace{0.3cm} | |
| 51 | +\noindent\rule{\textwidth}{0.4pt} | |
| 52 | + | |
| 53 | +\newpage | |
added
paper/tables/numbers.tex
+22 −0
@@ -0,0 +1,22 @@ | ||
| 1 | +% generated by scripts/50_tables.py | |
| 2 | +\newcommand{\NCellsB}{245} | |
| 3 | +\newcommand{\NMun}{1{,}111} | |
| 4 | +\newcommand{\NOriginsB}{45} | |
| 5 | +\newcommand{\NOriginsBhOne}{45} | |
| 6 | +\newcommand{\NOriginsBhOneTwo}{34} | |
| 7 | +\newcommand{\NOriginsBhSix}{40} | |
| 8 | +\newcommand{\NOriginsBhThree}{43} | |
| 9 | +\newcommand{\NRowsB}{39{,}690} | |
| 10 | +\newcommand{\NSales}{632{,}006} | |
| 11 | +\newcommand{\SelAgecondoSold}{17} | |
| 12 | +\newcommand{\SelAgecondoStock}{20} | |
| 13 | +\newcommand{\SelAgehouseSold}{41} | |
| 14 | +\newcommand{\SelAgehouseStock}{45} | |
| 15 | +\newcommand{\SelAgeplexSold}{65} | |
| 16 | +\newcommand{\SelAgeplexStock}{66} | |
| 17 | +\newcommand{\SelFacondoSold}{90} | |
| 18 | +\newcommand{\SelFacondoStock}{89} | |
| 19 | +\newcommand{\SelFahouseSold}{114} | |
| 20 | +\newcommand{\SelFahouseStock}{116} | |
| 21 | +\newcommand{\SelFaplexSold}{194} | |
| 22 | +\newcommand{\SelFaplexStock}{204} | |
added
paper/tables/tab_coverage.tex
+30 −0
@@ -0,0 +1,30 @@ | ||
| 1 | +\begin{table}[htbp] | |
| 2 | +\centering\footnotesize | |
| 3 | +\caption{Headline sales by administrative region and class (WP22 sample reused)}\label{tab:coverage} | |
| 4 | +\begin{threeparttable} | |
| 5 | +\begin{tabular}{lrrr} | |
| 6 | +\toprule | |
| 7 | +Region & Houses & Condominiums & Plexes \\ | |
| 8 | +\midrule | |
| 9 | +01 & 11{,}607 & 526 & 1{,}546 \\ | |
| 10 | +02 & 17{,}151 & 754 & 3{,}876 \\ | |
| 11 | +03 & 40{,}660 & 16{,}479 & 7{,}621 \\ | |
| 12 | +04 & 16{,}644 & 1{,}187 & 4{,}527 \\ | |
| 13 | +05 & 32{,}109 & 4{,}019 & 5{,}678 \\ | |
| 14 | +06 & 29{,}359 & 46{,}957 & 22{,}376 \\ | |
| 15 | +07 & 26{,}740 & 4{,}851 & 4{,}689 \\ | |
| 16 | +08 & 7{,}994 & 186 & 1{,}631 \\ | |
| 17 | +09 & 4{,}509 & 52 & 669 \\ | |
| 18 | +10 & 945 & 0 & 117 \\ | |
| 19 | +11 & 4{,}505 & 6 & 630 \\ | |
| 20 | +12 & 28{,}708 & 1{,}674 & 3{,}541 \\ | |
| 21 | +13 & 16{,}910 & 7{,}490 & 2{,}326 \\ | |
| 22 | +14 & 38{,}606 & 6{,}996 & 4{,}961 \\ | |
| 23 | +15 & 46{,}363 & 7{,}864 & 8{,}990 \\ | |
| 24 | +16 & 83{,}868 & 23{,}340 & 10{,}825 \\ | |
| 25 | +17 & 15{,}980 & 608 & 2{,}356 \\ | |
| 26 | +\bottomrule | |
| 27 | +\end{tabular} | |
| 28 | + | |
| 29 | +\end{threeparttable} | |
| 30 | +\end{table} | |
added
paper/tables/tab_hyper.tex
+27 −0
@@ -0,0 +1,27 @@ | ||
| 1 | +\begin{table}[htbp] | |
| 2 | +\centering\footnotesize | |
| 3 | +\caption{Hyper-parameters}\label{tab:hyper} | |
| 4 | +\begin{threeparttable} | |
| 5 | +\begin{tabular}{p{3.4cm}p{11.5cm}} | |
| 6 | +\toprule | |
| 7 | +Model & Hyper-parameters (fixed in advance, never tuned on test origins) \\ | |
| 8 | +\midrule | |
| 9 | +HSHN & embeddings 8 (geo) / 4 (h); encoder 256-128 GELU, dropout 0.1; AdamW, one-cycle lr $2\times10^{-3}$, 8 epochs, batch 4,096; municipality weight decay $5\times10^{-3}$ \\ | |
| 10 | +MLP (A) & 256-128 GELU, dropout 0.1; pinball loss on 5 quantiles; same optimiser \\ | |
| 11 | +LightGBM (A) & 800 trees, lr 0.04, 63 leaves, min child 30, subsample 0.8; quantile models 400 trees \\ | |
| 12 | +XGBoost (A) & 600 trees, lr 0.05, depth 8, subsample 0.8 \\ | |
| 13 | +Random forest (A) & 150 trees, depth 18, min leaf 5, max features 0.5 \\ | |
| 14 | +SVR (A) & RBF, C=3, $\epsilon$=0.05, 15,000-sale subsample \\ | |
| 15 | +Panel MLP / LSTM / GRU / TCN / TFT-lite (B) & hidden 64 (MLP) / 32 (RNN, attention) / 16 channels (TCN); 60 epochs, batch 512, AdamW lr $2\times10^{-3}$, weight decay $10^{-4}$; pinball loss \\ | |
| 16 | +DSGFN (B) & node encoder 32; one attention layer; prior adjacency: Gaussian distance kernel (60 km) $\times$ co-movement; 60 epochs \\ | |
| 17 | +RAREF (B) & 3-state Gaussian HMM (60 EM iterations) on provincial real-time growth; 3 ridge experts ($\alpha$=3) \\ | |
| 18 | +BHPF (B) & conjugate Gaussian hierarchy; 15 variance-component iterations; priors $\tau\_b^2$=1 (slopes) \\ | |
| 19 | +QANSS (B) & 32 tanh units; 200 Adam steps, lr $5\times10^{-3}$; Gaussian likelihood \\ | |
| 20 | +QREFA (B) & NNLS stacking of QANSS, BHPF, DSGFN (40 epochs), RAREF on training origins \\ | |
| 21 | +LightGBM (B) & 300 trees, lr 0.03, 15 leaves, min child 40; quantile models \\ | |
| 22 | +Ridge (B) & $\alpha$=3 on standardised features \\ | |
| 23 | +\bottomrule | |
| 24 | +\end{tabular} | |
| 25 | + | |
| 26 | +\end{threeparttable} | |
| 27 | +\end{table} | |
added
paper/tables/tab_leakage.tex
+23 −0
@@ -0,0 +1,23 @@ | ||
| 1 | +\begin{table}[htbp] | |
| 2 | +\centering\footnotesize | |
| 3 | +\caption{Leakage audit}\label{tab:leakage} | |
| 4 | +\begin{threeparttable} | |
| 5 | +\begin{tabular}{p{4cm}p{11cm}} | |
| 6 | +\toprule | |
| 7 | +Item & Treatment \\ | |
| 8 | +\midrule | |
| 9 | +Hedonic coefficients & WP22 stage 1 re-estimated at every vintage; Task A features never use coefficients \\ | |
| 10 | +Geographic clustering / location cells & WP22 nested grid rebuilt from data $\le$ origin at every vintage; Task A uses raw coordinates \\ | |
| 11 | +Normalisation & standardisation constants from training rows only; index levels enter as changes \\ | |
| 12 | +Feature selection & fixed feature lists, no selection on test data \\ | |
| 13 | +Imputation & WP22 conditional medians (no price information); indicators time-stable \\ | |
| 14 | +Target encoding & none; one-hot with training categories \\ | |
| 15 | +Spatial graph & DSGFN adjacency recomputed at each origin from centroids and the real-time history $\le$ origin \\ | |
| 16 | +Hyper-parameter tuning & fixed a priori (Table~\ref{tab:hyper}) \\ | |
| 17 | +Index revisions & predictors = vintage published for the origin; target = final series (revision component reported) \\ | |
| 18 | +Partial last month & October 2026 excluded; last target September 2026 \\ | |
| 19 | +\bottomrule | |
| 20 | +\end{tabular} | |
| 21 | + | |
| 22 | +\end{threeparttable} | |
| 23 | +\end{table} | |
added
paper/tables/tab_selection.tex
+16 −0
@@ -0,0 +1,16 @@ | ||
| 1 | +\begin{table}[htbp] | |
| 2 | +\centering\footnotesize | |
| 3 | +\caption{Transaction selection: medians of sold dwellings (2021--2026) versus the assessment-roll stock}\label{tab:selection} | |
| 4 | +\begin{threeparttable} | |
| 5 | +\begin{tabular}{lrrrrrrrr} | |
| 6 | +\toprule | |
| 7 | +Class & Floor area sold & Floor area stock & Age sold & Age stock & Lot sold & Lot stock & Sales & Stock units \\ | |
| 8 | +\midrule | |
| 9 | +house & 114 & 116 & 41 & 45 & 653 & 699 & 422{,}658 & 1{,}899{,}469 \\ | |
| 10 | +condo & 90 & 89 & 17 & 20 & 104 & 87 & 122{,}989 & 344{,}399 \\ | |
| 11 | +plex & 194 & 204 & 65 & 66 & 507 & 488 & 86{,}359 & 336{,}283 \\ | |
| 12 | +\bottomrule | |
| 13 | +\end{tabular} | |
| 14 | +\begin{tablenotes}\footnotesize\item Stock = residential use code 1000 in the 2026 roll, classified with the WP22 rules; age of the stock as of 2026.\end{tablenotes} | |
| 15 | +\end{threeparttable} | |
| 16 | +\end{table} | |
added
paper/tables/tab_variables.tex
+23 −0
@@ -0,0 +1,23 @@ | ||
| 1 | +\begin{table}[htbp] | |
| 2 | +\centering\footnotesize | |
| 3 | +\caption{Variables available and their use}\label{tab:variables} | |
| 4 | +\begin{threeparttable} | |
| 5 | +\begin{tabular}{p{4.2cm}p{3cm}p{5.2cm}p{1.6cm}} | |
| 6 | +\toprule | |
| 7 | +Variable & Source & Treatment & Used in \\ | |
| 8 | +\midrule | |
| 9 | +Floor area of storeys (m²) & roll & continuous; cubic in centred log & all tasks \\ | |
| 10 | +Lot area (m²) & roll & quadratic in centred log & all tasks \\ | |
| 11 | +Year built / age & roll & nine age bins; missingness indicator & all tasks \\ | |
| 12 | +Storeys, building genre, physical link, dwellings (plex) & roll & categorical & Task A \\ | |
| 13 | +Coordinates, municipality, MRC, region & feed / SDA V2026-07 & location; nested metric cells (WP22) & all tasks \\ | |
| 14 | +Assessment in force at sale & feed & not used as a predictor (post-dated for Task A test sales would be fine, but excluded for comparability) & — \\ | |
| 15 | +Municipal / regional market features at origin & computed from sales $\le$ origin & median log price and quality-stripped level (3/6/12/24 m), momentum, volumes, dispersion & Task A \\ | |
| 16 | +10 nearest past sales ($\le$ 12 m) & computed & mean quality-stripped log price, mean distance, dispersion & Task A \\ | |
| 17 | +Real-time SHARP-HPI vintage (13-month history) & WP22 index\_vintages (smoothed mode) & 1/3/6/12-m changes, volatilities, acceleration, counts, s.e.; parent (region, province) momentum & Task B \\ | |
| 18 | +Bedrooms, bathrooms, parking, basement, condition, renovations, quality, listing, images & — & not available & — \\ | |
| 19 | +\bottomrule | |
| 20 | +\end{tabular} | |
| 21 | + | |
| 22 | +\end{threeparttable} | |
| 23 | +\end{table} | |
added
paper/uq_logo.jpg
+0 −0
Binary file not shown.
added
scripts/10_task_a.py
+66 −0
@@ -0,0 +1,66 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 3 | +"""Task A — pseudo-real-time property-level forecasting. Quarterly origins from FIRST_ORIGIN; at each origin every model is | |
| 4 | +estimated on sales ≤ origin (features at their own month) and forecasts the log price of every sale in the next 12 months | |
| 5 | +(features at the origin). Predictions are stored per (origin, model, tx_id, h); scoring happens in 30_evaluate.py. | |
| 6 | +Usage: python3 scripts/10_task_a.py [--fast] [--origins 2022-12,2023-03,...]""" | |
| 7 | +from __future__ import annotations | |
| 8 | + | |
| 9 | +import argparse | |
| 10 | +import sys | |
| 11 | +import time | |
| 12 | +from pathlib import Path | |
| 13 | + | |
| 14 | +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) | |
| 15 | +import numpy as np | |
| 16 | +import polars as pl | |
| 17 | + | |
| 18 | +from wp23 import config as C | |
| 19 | +from wp23 import data as D | |
| 20 | +from wp23.models_a import TAUS, registry | |
| 21 | + | |
| 22 | +OUT = C.RESULTS / "task_a"; OUT.mkdir(parents=True, exist_ok=True) | |
| 23 | + | |
| 24 | + | |
| 25 | +def origins_quarterly(first: str, last_origin: str) -> list[str]: | |
| 26 | + o = first; out = [] | |
| 27 | + while o <= last_origin: | |
| 28 | + out.append(o); o = D.month_add(o, 3) | |
| 29 | + return out | |
| 30 | + | |
| 31 | + | |
| 32 | +def main() -> None: | |
| 33 | + ap = argparse.ArgumentParser(); ap.add_argument("--fast", action="store_true"); ap.add_argument("--family", type=str, default="trees"); ap.add_argument("--origins", type=str, default="") | |
| 34 | + a = ap.parse_args() | |
| 35 | + sales = D.load_sales() | |
| 36 | + origins = a.origins.split(",") if a.origins else origins_quarterly(C.FIRST_ORIGIN, D.month_add(C.LAST_MONTH, -12)) | |
| 37 | + rows, timing = [], [] | |
| 38 | + for o in origins: | |
| 39 | + tr, te = D.task_a_sets(sales, o) | |
| 40 | + Xtr, ytr, cols, cats = D.design(tr); Xte, yte, _, _ = D.design(te, cats) | |
| 41 | + meta_tr = {"mun_code": tr["mun_code"].to_list(), "mrc_code": tr["mrc_code"].to_list(), "region_code": tr["region_code"].to_list(), "h": tr["h"].to_numpy()} | |
| 42 | + meta_te = {"mun_code": te["mun_code"].to_list(), "mrc_code": te["mrc_code"].to_list(), "region_code": te["region_code"].to_list(), "h": te["h"].to_numpy()} | |
| 43 | + # naive benchmark: municipal median log price of the last 3 months at the origin, plus the class/subtype hedonic adjustment from OLS on the last 12 months | |
| 44 | + base = pl.DataFrame({"tx_id": te["tx_id"], "h": te["h"], "y": yte, "naive_mun_median": te["mun_medlp_3"].fill_null(te["reg_q_3"]).to_numpy()}) | |
| 45 | + for m in registry(a.family, a.fast): | |
| 46 | + t0 = time.time() | |
| 47 | + try: | |
| 48 | + m.fit(Xtr, ytr, meta_tr); p = m.predict(Xte, meta_te) | |
| 49 | + Q = m.predict_quantiles(Xte, meta_te) if hasattr(m, "predict_quantiles") else None | |
| 50 | + except Exception as ex: | |
| 51 | + print("FAILED", o, m.name, repr(ex), flush=True); continue | |
| 52 | + d = base.select(["tx_id", "h"]).with_columns(pl.lit(o).alias("origin"), pl.lit(m.name).alias("model"), pl.Series("pred", np.asarray(p, dtype=np.float64))) | |
| 53 | + if Q is not None: | |
| 54 | + for j, t in enumerate(TAUS): | |
| 55 | + d = d.with_columns(pl.Series(f"q{int(t*100):02d}", np.asarray(Q[:, j], dtype=np.float64))) | |
| 56 | + rows.append(d); timing.append({"origin": o, "model": m.name, "seconds": round(time.time() - t0, 1), "n_train": len(ytr), "n_test": len(yte)}) | |
| 57 | + print(o, m.name, f"{time.time() - t0:.0f}s", f"MAE={np.mean(np.abs(p - yte)):.4f}", flush=True) | |
| 58 | + if a.family == "trees": | |
| 59 | + rows.append(base.select(["tx_id", "h"]).with_columns(pl.lit(o).alias("origin"), pl.lit("naive_mun_median").alias("model"), pl.Series("pred", base["naive_mun_median"]))) | |
| 60 | + base.select(["tx_id", "h", "y"]).with_columns(pl.lit(o).alias("origin")).write_parquet(OUT / f"targets_{o}.parquet") | |
| 61 | + pl.concat(rows, how="diagonal").write_parquet(OUT / f"predictions_{a.family}.parquet"); pl.DataFrame(timing).write_csv(OUT / f"timing_{a.family}.csv") | |
| 62 | + print("done") | |
| 63 | + | |
| 64 | + | |
| 65 | +if __name__ == "__main__": | |
| 66 | + main() | |
added
scripts/20_task_b.py
+58 −0
@@ -0,0 +1,58 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 3 | +"""Task B — pseudo-real-time index forecasting on the cell × origin panel. | |
| 4 | +For each horizon h and each quarterly re-estimation origin o: training rows are panel rows whose target was observable at o | |
| 5 | +(origin' + h ≤ o); models are fitted once and used for the forecasts issued at origins o, o+1, o+2 (features at those origins). | |
| 6 | +Usage: python3 scripts/20_task_b.py [--fast] [--models a,b] [--refit-every 3]""" | |
| 7 | +from __future__ import annotations | |
| 8 | + | |
| 9 | +import argparse | |
| 10 | +import sys | |
| 11 | +import time | |
| 12 | +from pathlib import Path | |
| 13 | + | |
| 14 | +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) | |
| 15 | +import numpy as np | |
| 16 | +import polars as pl | |
| 17 | + | |
| 18 | +from wp23 import config as C | |
| 19 | +from wp23.data import month_add | |
| 20 | +from wp23.models_b import TAUS, registry | |
| 21 | + | |
| 22 | +OUT = C.RESULTS / "task_b"; OUT.mkdir(parents=True, exist_ok=True) | |
| 23 | + | |
| 24 | + | |
| 25 | +def main() -> None: | |
| 26 | + ap = argparse.ArgumentParser(); ap.add_argument("--fast", action="store_true"); ap.add_argument("--family", type=str, default="trees"); ap.add_argument("--models", type=str, default=""); ap.add_argument("--refit-every", type=int, default=3) | |
| 27 | + ap.add_argument("--min-train-origins", type=int, default=10) | |
| 28 | + a = ap.parse_args() | |
| 29 | + panel = pl.read_parquet(C.PROCESSED / "task_b_panel.parquet") | |
| 30 | + models = registry(a.family, a.fast) | |
| 31 | + if a.models: | |
| 32 | + keep = set(a.models.split(",")); models = [m for m in models if m.name in keep] | |
| 33 | + rows, timing = [], [] | |
| 34 | + for h in C.HORIZONS: | |
| 35 | + ph = panel.filter(pl.col("h") == h); origins = sorted(ph["origin"].unique().to_list()) | |
| 36 | + for k in range(0, len(origins), a.refit_every): | |
| 37 | + o = origins[k]; test_origins = origins[k:k + a.refit_every] | |
| 38 | + tr = ph.filter(pl.col("origin").map_elements(lambda x: month_add(x, h), return_dtype=pl.Utf8) <= o) | |
| 39 | + if tr["origin"].n_unique() < a.min_train_origins: | |
| 40 | + continue | |
| 41 | + te = ph.filter(pl.col("origin").is_in(test_origins)) | |
| 42 | + for m in models: | |
| 43 | + t0 = time.time() | |
| 44 | + try: | |
| 45 | + m.fit(tr); p = m.predict(te); Q = m.predict_quantiles(te) | |
| 46 | + except Exception as ex: | |
| 47 | + print("FAILED", h, o, m.name, repr(ex), flush=True); continue | |
| 48 | + d = te.select(["class", "level", "geo_id", "origin", "h", "target", "n_last", "grade_target", "region_code"]).with_columns(pl.lit(m.name).alias("model"), pl.lit(o).alias("fit_origin"), pl.Series("pred", np.asarray(p, dtype=np.float64))) | |
| 49 | + for j, t in enumerate(TAUS): | |
| 50 | + d = d.with_columns(pl.Series(f"q{int(t*100):02d}", np.asarray(Q[:, j], dtype=np.float64))) | |
| 51 | + rows.append(d); timing.append({"h": h, "fit_origin": o, "model": m.name, "seconds": round(time.time() - t0, 1), "n_train": tr.height, "n_test": te.height}) | |
| 52 | + print(h, o, m.name, f"{time.time() - t0:.1f}s", f"MAE={np.mean(np.abs(p - te['target'].to_numpy())):.4f}", flush=True) | |
| 53 | + pl.concat(rows).write_parquet(OUT / f"predictions_{a.family}.parquet"); pl.DataFrame(timing).write_csv(OUT / f"timing_{a.family}.csv") | |
| 54 | + print("done") | |
| 55 | + | |
| 56 | + | |
| 57 | +if __name__ == "__main__": | |
| 58 | + main() | |
added
scripts/30_evaluate.py
+99 −0
@@ -0,0 +1,99 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 3 | +"""Score Task A and Task B predictions: point and probabilistic metrics by model × horizon (× level/class/region/size), | |
| 4 | +Diebold–Mariano and Giacomini–White tests against the reference benchmark, Model Confidence Sets per horizon, bootstrap CIs. | |
| 5 | +Usage: python3 scripts/30_evaluate.py a|b""" | |
| 6 | +from __future__ import annotations | |
| 7 | + | |
| 8 | +import sys | |
| 9 | +from pathlib import Path | |
| 10 | + | |
| 11 | +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) | |
| 12 | +import numpy as np | |
| 13 | +import polars as pl | |
| 14 | + | |
| 15 | +from wp23 import config as C | |
| 16 | +from wp23 import evaluation as E | |
| 17 | + | |
| 18 | +TAUS = [0.05, 0.25, 0.5, 0.75, 0.95] | |
| 19 | + | |
| 20 | + | |
| 21 | +def prob_block(d: pl.DataFrame, ycol: str) -> dict: | |
| 22 | + if "q50" not in d.columns or d["q50"].null_count() == d.height: | |
| 23 | + return {"crps": np.nan, "pinball_mean": np.nan, "cov90": np.nan, "width90": np.nan, "wis90": np.nan, "cov50": np.nan} | |
| 24 | + y = d[ycol].to_numpy(); Q = np.column_stack([d[f"q{int(t*100):02d}"].to_numpy() for t in TAUS]); ok = np.all(np.isfinite(Q), axis=1) & np.isfinite(y) | |
| 25 | + y, Q = y[ok], Q[ok] | |
| 26 | + if len(y) == 0: | |
| 27 | + return {"crps": np.nan, "pinball_mean": np.nan, "cov90": np.nan, "width90": np.nan, "wis90": np.nan, "cov50": np.nan} | |
| 28 | + crps = float(np.mean(E.crps_from_quantiles(y, Q, np.array(TAUS)))); pb = float(np.mean([np.mean(E.pinball(y, Q[:, j], t)) for j, t in enumerate(TAUS)])) | |
| 29 | + i90 = E.interval_scores(y, Q[:, 0], Q[:, 4], 0.10); i50 = E.interval_scores(y, Q[:, 1], Q[:, 3], 0.50) | |
| 30 | + return {"crps": crps, "pinball_mean": pb, "cov90": i90["coverage"], "width90": i90["width"], "wis90": i90["interval_score"], "cov50": i50["coverage"]} | |
| 31 | + | |
| 32 | + | |
| 33 | +def evaluate(pred: pl.DataFrame, ycol: str, keys: list[str], ref_model: str, group_extra: list[str] | None = None, tag: str = "") -> None: | |
| 34 | + OUT = C.RESULTS / f"eval_{tag}"; OUT.mkdir(parents=True, exist_ok=True) | |
| 35 | + pred = pred.filter(pl.col("pred").is_not_null() & pl.col("pred").is_finite()) | |
| 36 | + # naive reference for MASE: the model named ref_model | |
| 37 | + ref = pred.filter(pl.col("model") == ref_model).select(keys + [pl.col("pred").alias("pred_ref")]) | |
| 38 | + j = pred.join(ref, on=keys, how="left") | |
| 39 | + rows = [] | |
| 40 | + for gkeys in ([["model", "h"]] + ([["model", "h"] + [g] for g in group_extra] if group_extra else [])): | |
| 41 | + for g, d in j.group_by(gkeys): | |
| 42 | + y = d[ycol].to_numpy(); f = d["pred"].to_numpy(); fr = d["pred_ref"].to_numpy() | |
| 43 | + sc = E.point_scores(y, f, fr if np.isfinite(fr).any() else None); sc.update(prob_block(d, ycol)) | |
| 44 | + rows.append({**dict(zip(gkeys, g)), "group": "|".join(gkeys[2:]) or "all", **sc}) | |
| 45 | + scores = pl.DataFrame(rows, infer_schema_length=None); scores.write_csv(OUT / "scores.csv") | |
| 46 | + # tests per horizon on per-origin mean losses (time-series of forecast-origin averages → serial dependence handled by HAC/bootstrap) | |
| 47 | + tests, mcs_rows = [], [] | |
| 48 | + for h, dh in j.group_by("h"): | |
| 49 | + h = h[0] | |
| 50 | + per = dh.with_columns(((pl.col("pred") - pl.col(ycol)) ** 2).alias("sq"), (pl.col("pred") - pl.col(ycol)).abs().alias("ab")).group_by(["model", "origin"]).agg(pl.col("sq").mean(), pl.col("ab").mean()).sort("origin") | |
| 51 | + wide_sq = per.pivot(on="model", index="origin", values="sq").sort("origin"); wide_ab = per.pivot(on="model", index="origin", values="ab").sort("origin") | |
| 52 | + models = [c for c in wide_sq.columns if c != "origin"] | |
| 53 | + if ref_model not in models: | |
| 54 | + continue | |
| 55 | + for m in models: | |
| 56 | + if m == ref_model: | |
| 57 | + continue | |
| 58 | + la = wide_sq[m].to_numpy(); lb = wide_sq[ref_model].to_numpy(); ok = np.isfinite(la) & np.isfinite(lb) | |
| 59 | + dm = E.diebold_mariano(la[ok], lb[ok], h=int(h)); gw = E.giacomini_white(la[ok], lb[ok], h=int(h)) | |
| 60 | + lo, hi = E.block_bootstrap_ci(la[ok] - lb[ok], B=500, mean_block=max(2, int(h))) | |
| 61 | + tests.append({"h": h, "model": m, "reference": ref_model, "n_origins": int(ok.sum()), "mean_sq_diff": dm["mean_diff"], "dm_stat": dm["dm"], "dm_p": dm["p"], "gw_stat": gw["stat"], "gw_p": gw["p"], "boot_ci_lo": lo, "boot_ci_hi": hi}) | |
| 62 | + L = np.column_stack([wide_sq[m].to_numpy() for m in models]); okr = np.all(np.isfinite(L), axis=1) | |
| 63 | + if okr.sum() >= 8: | |
| 64 | + mcs = E.model_confidence_set(L[okr], models, alpha=0.10, B=500, mean_block=max(2, int(h)), seed=0) | |
| 65 | + for m in models: | |
| 66 | + mcs_rows.append({"h": h, "model": m, "mcs_p": mcs["mcs_pvalues"].get(m, np.nan), "in_mcs_90": m in mcs["in_mcs"]}) | |
| 67 | + pl.DataFrame(tests, infer_schema_length=None).write_csv(OUT / "tests_vs_reference.csv"); pl.DataFrame(mcs_rows, infer_schema_length=None).write_csv(OUT / "mcs.csv") | |
| 68 | + # calibration (PIT-like): share of outcomes below each quantile | |
| 69 | + cal = [] | |
| 70 | + for (m, h), d in j.group_by(["model", "h"]): | |
| 71 | + if "q50" in d.columns and d["q50"].null_count() < d.height: | |
| 72 | + y = d[ycol].to_numpy() | |
| 73 | + for t in TAUS: | |
| 74 | + q = d[f"q{int(t*100):02d}"].to_numpy(); ok = np.isfinite(q) & np.isfinite(y) | |
| 75 | + cal.append({"model": m, "h": h, "tau": t, "share_below": float(np.mean(y[ok] < q[ok])) if ok.any() else np.nan}) | |
| 76 | + pl.DataFrame(cal, infer_schema_length=None).write_csv(OUT / "calibration.csv") | |
| 77 | + print(scores.filter(pl.col("group") == "all").sort(["h", "mae"]).select(["h", "model", "n", "mae", "rmse", "mase", "bias", "crps", "cov90"])) | |
| 78 | + | |
| 79 | + | |
| 80 | +def task_a() -> None: | |
| 81 | + pred = pl.concat([pl.read_parquet(f) for f in sorted((C.RESULTS / "task_a").glob("predictions_*.parquet"))], how="diagonal") | |
| 82 | + tg = pl.concat([pl.read_parquet(p) for p in sorted((C.RESULTS / "task_a").glob("targets_*.parquet"))]) | |
| 83 | + sales = pl.read_parquet(C.WP22_ANALYTIC, columns=["tx_id", "property_class", "region_code", "mun_code", "price"]) | |
| 84 | + size = sales.group_by("mun_code").agg(pl.len().alias("mun_sales")).with_columns(pl.when(pl.col("mun_sales") >= 5000).then(pl.lit("large")).when(pl.col("mun_sales") >= 500).then(pl.lit("medium")).otherwise(pl.lit("small")).alias("mun_size")) | |
| 85 | + j = pred.join(tg, on=["tx_id", "h", "origin"]).join(sales, on="tx_id").join(size, on="mun_code") | |
| 86 | + j = j.with_columns(pl.when(pl.col("h") <= 3).then(pl.lit("1-3")).when(pl.col("h") <= 6).then(pl.lit("4-6")).otherwise(pl.lit("7-12")).alias("hband"), | |
| 87 | + pl.when(pl.col("price") < 250000).then(pl.lit("<250k")).when(pl.col("price") < 500000).then(pl.lit("250-500k")).otherwise(pl.lit(">500k")).alias("segment")) | |
| 88 | + j = j.with_columns(pl.col("hband").alias("h")) # evaluate by horizon band | |
| 89 | + evaluate(j, "y", ["tx_id", "h", "origin"], "naive_mun_median", ["property_class", "region_code", "mun_size", "segment"], tag="a") | |
| 90 | + | |
| 91 | + | |
| 92 | +def task_b() -> None: | |
| 93 | + pred = pl.concat([pl.read_parquet(f) for f in sorted((C.RESULTS / "task_b").glob("predictions_*.parquet"))], how="diagonal") | |
| 94 | + pred = pred.with_columns(pl.when(pl.col("level") == "municipality").then(pl.when(pl.col("n_last") >= 50).then(pl.lit("mun_large")).otherwise(pl.lit("mun_small"))).otherwise(pl.col("level")).alias("size_level")) | |
| 95 | + evaluate(pred, "target", ["class", "level", "geo_id", "origin", "h"], "no_change", ["level", "class", "size_level", "region_code"], tag="b") | |
| 96 | + | |
| 97 | + | |
| 98 | +if __name__ == "__main__": | |
| 99 | + {"a": task_a, "b": task_b}[sys.argv[1]]() | |
added
scripts/40_simulation.py
+153 −0
@@ -0,0 +1,153 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 3 | +"""Forecasting Monte Carlo on synthetic markets (protocol §14). Markets are generated with the WP22 simulator (known latent | |
| 4 | +quality-constant paths per municipality, nested hierarchy, heterogeneous sizes) under scenarios that differ in *forecastability*: | |
| 5 | + rw pure random-walk latent paths (no predictable component: the no-change forecast is optimal) | |
| 6 | + momentum latent drift follows an AR(1) (persistent momentum) | |
| 7 | + regimes drift switches between two regimes by a Markov chain (regime adaptation should help) | |
| 8 | + spillover each municipality's drift partly follows its region's lagged drift (spatial information is predictive) | |
| 9 | + sparse momentum with 35 % of the sales (real-time estimates noisier) | |
| 10 | +The "real-time" index at an origin is the WP22 SHARP filtered estimate on the synthetic sales (so estimation noise and | |
| 11 | +pooling are realistic); the target is the true latent change. Each forecaster is evaluated across origins and horizons. | |
| 12 | +Usage: python3 scripts/40_simulation.py --reps 20 --family classic|torch|trees""" | |
| 13 | +from __future__ import annotations | |
| 14 | + | |
| 15 | +import argparse | |
| 16 | +import sys | |
| 17 | +import time | |
| 18 | +from pathlib import Path | |
| 19 | + | |
| 20 | +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) | |
| 21 | +import numpy as np | |
| 22 | +import polars as pl | |
| 23 | + | |
| 24 | +from wp23 import config as C | |
| 25 | +from wp23.data import month_add | |
| 26 | + | |
| 27 | +sys.path.insert(0, str(C.WP22_SRC)) | |
| 28 | +from sharp_hpi.hedonic import build_features # noqa: E402 | |
| 29 | +from sharp_hpi.sharp import cell_log_index, run_sharp # noqa: E402 | |
| 30 | +from sharp_hpi.simulate import Scenario, simulate # noqa: E402 | |
| 31 | + | |
| 32 | +OUT = C.RESULTS / "simulation"; OUT.mkdir(parents=True, exist_ok=True) | |
| 33 | +T = 72; LAGS = 12; HORIZONS = (1, 3, 6, 12) | |
| 34 | + | |
| 35 | + | |
| 36 | +def latent_paths(sc: Scenario, kind: str, rng: np.random.Generator, n_regions: int, n_mun: int, mun_region: np.ndarray): | |
| 37 | + """Override the WP22 random-walk latent paths with forecastable dynamics. Returns (mu, dR, dU) arrays.""" | |
| 38 | + T_ = sc.T | |
| 39 | + if kind == "rw": | |
| 40 | + drift_p = np.zeros(T_) + 0.003; drift_r = np.zeros((n_regions, T_)); drift_u = np.zeros((n_mun, T_)) | |
| 41 | + elif kind in ("momentum", "sparse"): | |
| 42 | + drift_p = np.zeros(T_); drift_r = np.zeros((n_regions, T_)); drift_u = np.zeros((n_mun, T_)) | |
| 43 | + for t in range(1, T_): | |
| 44 | + drift_p[t] = 0.85 * drift_p[t - 1] + rng.normal(0, 0.003) | |
| 45 | + drift_r[:, t] = 0.8 * drift_r[:, t - 1] + rng.normal(0, 0.002, n_regions) | |
| 46 | + drift_u[:, t] = 0.7 * drift_u[:, t - 1] + rng.normal(0, 0.003, n_mun) | |
| 47 | + elif kind == "regimes": | |
| 48 | + P = np.array([[0.93, 0.07], [0.10, 0.90]]); s = 0; drift_p = np.zeros(T_); states = np.zeros(T_, int) | |
| 49 | + for t in range(T_): | |
| 50 | + s = rng.choice(2, p=P[s]); states[t] = s; drift_p[t] = (0.012 if s == 0 else -0.006) + rng.normal(0, 0.002) | |
| 51 | + drift_r = np.zeros((n_regions, T_)); drift_u = np.zeros((n_mun, T_)) | |
| 52 | + for t in range(1, T_): | |
| 53 | + drift_r[:, t] = 0.6 * drift_r[:, t - 1] + rng.normal(0, 0.002, n_regions); drift_u[:, t] = 0.5 * drift_u[:, t - 1] + rng.normal(0, 0.003, n_mun) | |
| 54 | + elif kind == "spillover": | |
| 55 | + drift_p = np.full(T_, 0.004); drift_r = np.zeros((n_regions, T_)); drift_u = np.zeros((n_mun, T_)) | |
| 56 | + for t in range(1, T_): | |
| 57 | + drift_r[:, t] = 0.8 * drift_r[:, t - 1] + rng.normal(0, 0.003, n_regions) | |
| 58 | + drift_u[:, t] = 0.3 * drift_u[:, t - 1] + 0.6 * drift_r[mun_region, t - 1] + rng.normal(0, 0.002, n_mun) # municipalities follow their region with a lag | |
| 59 | + mu = np.cumsum(drift_p + rng.normal(0, 0.004, T_)); mu -= mu[0] | |
| 60 | + dR = np.cumsum(drift_r + rng.normal(0, 0.002, (n_regions, T_)), axis=1); dR -= dR[:, [0]] | |
| 61 | + dU = np.cumsum(drift_u + rng.normal(0, 0.003, (n_mun, T_)), axis=1); dU -= dU[:, [0]] | |
| 62 | + return mu, dR, dU | |
| 63 | + | |
| 64 | + | |
| 65 | +def one_market(kind: str, rep: int): | |
| 66 | + rng = np.random.default_rng(5000 + rep) | |
| 67 | + sc = Scenario(name=kind, T=T, seed=5000 + rep, scale_sales=0.35 if kind == "sparse" else 1.0, tau_prov=1e-4, tau_region=1e-4, tau_mrc=1e-4, tau_mun=1e-4, tau_mun_hetero=False) | |
| 68 | + sim = simulate(sc) | |
| 69 | + n_mun = len(sim.mun_codes); n_regions = sim.truth_region.shape[0] | |
| 70 | + mu, dR, dU = latent_paths(sc, kind, rng, n_regions, n_mun, sim.mun_region) | |
| 71 | + L_new = mu[None, :] + dR[sim.mun_region] + dU | |
| 72 | + # re-price the sales: replace the simulator's latent component by the new one (log_price += L_new − L_old) | |
| 73 | + old = sim.truth_mun; mi = {c: i for i, c in enumerate(sim.mun_codes)}; months = sim.months | |
| 74 | + df = sim.df.with_columns(pl.col("mun_code").replace_strict(mi, default=None).alias("_u"), pl.col("month").replace_strict({m: i for i, m in enumerate(months)}, default=None).alias("_t")) | |
| 75 | + u = df["_u"].to_numpy(); t = df["_t"].to_numpy() | |
| 76 | + df = df.with_columns((pl.col("log_price") + pl.Series(L_new[u, t] - old[u, t])).alias("log_price")).with_columns(pl.col("log_price").exp().alias("price")).drop(["_u", "_t"]) | |
| 77 | + w = sim.stock / sim.stock.sum(); truth_reg = np.vstack([(w[sim.mun_region == r][:, None] * L_new[sim.mun_region == r]).sum(0) / w[sim.mun_region == r].sum() for r in range(n_regions)]) | |
| 78 | + truth_prov = (w[:, None] * L_new).sum(0) | |
| 79 | + return df, L_new, truth_reg, truth_prov, sim | |
| 80 | + | |
| 81 | + | |
| 82 | +def build_sim_panel(kind: str, rep: int) -> pl.DataFrame: | |
| 83 | + df, L, truth_reg, truth_prov, sim = one_market(kind, rep) | |
| 84 | + f = build_features(df); months = sim.months | |
| 85 | + truth = {("municipality", c): L[i] for i, c in enumerate(sim.mun_codes)}; truth.update({("region", f"{r:02d}"): truth_reg[r] for r in range(truth_reg.shape[0])}); truth[("province", "QC")] = truth_prov | |
| 86 | + rows = [] | |
| 87 | + origins = [months[i] for i in range(24, T - 1)] | |
| 88 | + for o in origins: | |
| 89 | + oi = months.index(o); avail = f.filter(pl.col("month") <= o) | |
| 90 | + r = run_sharp(avail, months[: oi + 1], realtime_parent=True) | |
| 91 | + cells = [("province", "QC", r.stage1.mu)] + [(lvl, gid, cell_log_index(r, lvl, gid, "filtered")[0]) for (lvl, gid) in r.cells if lvl in ("region", "municipality")] | |
| 92 | + for lvl, gid, path in cells: | |
| 93 | + if len(path) < LAGS + 1 or (lvl, gid) not in truth: | |
| 94 | + continue | |
| 95 | + H = path[-(LAGS + 1):]; n = np.array([avail.filter((pl.col("month") == m) & ((pl.col("mun_code") == gid) if lvl == "municipality" else (pl.col("region_code") == gid) if lvl == "region" else True)).height for m in months[oi - LAGS: oi + 1]], float) | |
| 96 | + se = np.zeros(LAGS + 1) + 0.01 | |
| 97 | + feats = {"rt_level": H[-1], "d1": H[-1] - H[-2], "d3": H[-1] - H[-4], "d6": H[-1] - H[-7], "d12": H[-1] - H[0], "vol6": np.std(np.diff(H[-7:])), "vol12": np.std(np.diff(H)), | |
| 98 | + "n_last": n[-1], "n_mean12": n.mean(), "n_ratio": (n[-3:].mean() + 1) / (n.mean() + 1), "se_last": 0.01, "accel": (H[-1] - H[-4]) - (H[-4] - H[-7])} | |
| 99 | + tr = truth[(lvl, gid)] | |
| 100 | + for h in HORIZONS: | |
| 101 | + if oi + h >= T: | |
| 102 | + continue | |
| 103 | + rows.append({"class": "house", "level": lvl, "geo_id": gid, "origin": o, "h": h, "month_of_year": int(o[5:7]), "origin_t": oi, "hist": list(H), **feats, | |
| 104 | + "target": float(tr[oi + h] - tr[oi]), "y_final_o": float(tr[oi]), "region_code": gid if lvl == "region" else (f"{sim.mun_region[sim.mun_codes.index(gid)]:02d}" if lvl == "municipality" else None), | |
| 105 | + "cx": float(df.filter(pl.col("mun_code") == gid)["x_m"].mean()) if lvl == "municipality" else 0.0, "cy": float(df.filter(pl.col("mun_code") == gid)["y_m"].mean()) if lvl == "municipality" else 0.0, | |
| 106 | + "grade_target": "A", "n_target": 0, "scenario": kind, "rep": rep}) | |
| 107 | + p = pl.DataFrame(rows, infer_schema_length=None) | |
| 108 | + reg = p.filter(pl.col("level") == "region").select(["origin", "h", pl.col("geo_id").alias("region_code"), pl.col("d3").alias("reg_d3"), pl.col("d12").alias("reg_d12"), pl.col("vol12").alias("reg_vol12")]).unique() | |
| 109 | + prov = p.filter(pl.col("level") == "province").select(["origin", "h", pl.col("d3").alias("prov_d3"), pl.col("d12").alias("prov_d12"), pl.col("vol12").alias("prov_vol12")]).unique() | |
| 110 | + return p.join(reg, on=["origin", "h", "region_code"], how="left").join(prov, on=["origin", "h"], how="left") | |
| 111 | + | |
| 112 | + | |
| 113 | +def main() -> None: | |
| 114 | + ap = argparse.ArgumentParser(); ap.add_argument("--reps", type=int, default=20); ap.add_argument("--family", type=str, default="classic"); ap.add_argument("--build", action="store_true"); ap.add_argument("--scenarios", type=str, default="rw,momentum,regimes,spillover,sparse") | |
| 115 | + a = ap.parse_args() | |
| 116 | + if a.build: | |
| 117 | + for kind in a.scenarios.split(","): | |
| 118 | + for rep in range(a.reps): | |
| 119 | + t0 = time.time(); p = build_sim_panel(kind, rep); p.write_parquet(OUT / f"panel_{kind}_{rep}.parquet"); print("built", kind, rep, p.shape, f"{time.time() - t0:.0f}s", flush=True) | |
| 120 | + return | |
| 121 | + if a.family == "torch": | |
| 122 | + from wp23.models_b_torch import registry_torch_fast as registry | |
| 123 | + else: | |
| 124 | + from wp23.models_b import registry | |
| 125 | + rows = [] | |
| 126 | + for kind in a.scenarios.split(","): | |
| 127 | + for rep in range(a.reps): | |
| 128 | + f = OUT / f"panel_{kind}_{rep}.parquet" | |
| 129 | + if not f.exists(): | |
| 130 | + continue | |
| 131 | + p = pl.read_parquet(f) | |
| 132 | + for h in HORIZONS: | |
| 133 | + ph = p.filter(pl.col("h") == h); origins = sorted(ph["origin"].unique().to_list()) | |
| 134 | + for k in range(0, len(origins), 6): | |
| 135 | + o = origins[k]; test_o = origins[k:k + 6] | |
| 136 | + tr = ph.filter(pl.col("origin").map_elements(lambda x: month_add(x, h), return_dtype=pl.Utf8) <= o) | |
| 137 | + if tr["origin"].n_unique() < 8: | |
| 138 | + continue | |
| 139 | + te = ph.filter(pl.col("origin").is_in(test_o)) | |
| 140 | + for m in registry(a.family, fast=True): | |
| 141 | + try: | |
| 142 | + m.fit(tr); pr = m.predict(te); Q = m.predict_quantiles(te) | |
| 143 | + except Exception as ex: | |
| 144 | + print("FAILED", kind, rep, h, m.name, repr(ex), flush=True); continue | |
| 145 | + y = te["target"].to_numpy() | |
| 146 | + rows.append(te.select(["level", "geo_id", "origin", "h", "target"]).with_columns(pl.lit(kind).alias("scenario"), pl.lit(rep).alias("rep"), pl.lit(m.name).alias("model"), pl.Series("pred", np.asarray(pr, dtype=np.float64)), pl.Series("q05", np.asarray(Q[:, 0], dtype=np.float64)), pl.Series("q95", np.asarray(Q[:, 4], dtype=np.float64)))) | |
| 147 | + print(kind, rep, "done", flush=True) | |
| 148 | + pl.concat(rows).write_parquet(OUT / f"predictions_{a.family}.parquet") | |
| 149 | + print("done") | |
| 150 | + | |
| 151 | + | |
| 152 | +if __name__ == "__main__": | |
| 153 | + main() | |
added
scripts/41_sim_summary.py
+23 −0
@@ -0,0 +1,23 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 3 | +"""Summarise the forecasting Monte Carlo: MAE / RMSE / 90% coverage by scenario × level × horizon × model, with Monte Carlo s.e. over replications.""" | |
| 4 | +from __future__ import annotations | |
| 5 | + | |
| 6 | +import sys | |
| 7 | +from pathlib import Path | |
| 8 | + | |
| 9 | +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) | |
| 10 | +import numpy as np | |
| 11 | +import polars as pl | |
| 12 | + | |
| 13 | +from wp23 import config as C | |
| 14 | + | |
| 15 | +OUT = C.RESULTS / "simulation" | |
| 16 | +files = sorted(OUT.glob("predictions_*.parquet")) | |
| 17 | +p = pl.concat([pl.read_parquet(f) for f in files], how="diagonal") | |
| 18 | +p = p.with_columns((pl.col("pred") - pl.col("target")).abs().alias("ae"), ((pl.col("pred") - pl.col("target")) ** 2).alias("se"), ((pl.col("target") >= pl.col("q05")) & (pl.col("target") <= pl.col("q95"))).cast(pl.Float64).alias("cov90")) | |
| 19 | +rep = p.group_by(["scenario", "rep", "level", "h", "model"]).agg(pl.col("ae").mean().alias("mae"), pl.col("se").mean().sqrt().alias("rmse"), pl.col("cov90").mean().alias("cov90"), pl.len().alias("n")) | |
| 20 | +nc = rep.filter(pl.col("model") == "no_change").select(["scenario", "rep", "level", "h", pl.col("mae").alias("mae_nc")]) | |
| 21 | +rep = rep.join(nc, on=["scenario", "rep", "level", "h"], how="left").with_columns((pl.col("mae") / pl.col("mae_nc")).alias("rel_mae")) | |
| 22 | +summ = rep.group_by(["scenario", "level", "h", "model"]).agg(pl.col("rep").n_unique().alias("reps"), pl.col("mae").mean(), (pl.col("mae").std() / pl.col("mae").count().sqrt()).alias("mae_mcse"), pl.col("rmse").mean(), pl.col("cov90").mean(), pl.col("rel_mae").mean().alias("rel_mae"), (pl.col("rel_mae").std() / pl.col("rel_mae").count().sqrt()).alias("rel_mae_mcse")).sort(["scenario", "level", "h", "mae"]) | |
| 23 | +summ.write_csv(OUT / "summary.csv"); pl.Config.set_tbl_rows(100); print(summ.filter((pl.col("level") == "municipality") & (pl.col("h") == 3)).select(["scenario", "model", "reps", "mae", "mae_mcse", "rel_mae", "cov90"])) | |
added
scripts/50_tables.py
+190 −0
@@ -0,0 +1,190 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 3 | +"""LaTeX tables and number macros for WP23 from results/ (missing inputs skipped).""" | |
| 4 | +from __future__ import annotations | |
| 5 | + | |
| 6 | +import json | |
| 7 | +import re | |
| 8 | +import sys | |
| 9 | +from pathlib import Path | |
| 10 | + | |
| 11 | +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) | |
| 12 | +import numpy as np | |
| 13 | +import polars as pl | |
| 14 | + | |
| 15 | +from wp23 import config as C | |
| 16 | + | |
| 17 | +T = C.ROOT / "paper" / "tables"; T.mkdir(parents=True, exist_ok=True); R = C.RESULTS | |
| 18 | +MACROS: dict[str, str] = {} | |
| 19 | +WORDS = {str(i): w for i, w in enumerate(["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"])} | |
| 20 | +LABELS = {"naive_mun_median": "Naive: municipal median", "hedonic_ols": "Hedonic OLS", "ridge": "Ridge", "elastic_net": "Elastic net", "random_forest": "Random forest", "xgboost": "XGBoost", "lightgbm": "LightGBM", | |
| 21 | + "svr": "SVR (subsample)", "mlp": "Quantile MLP", "hshn_partial": "HSHN (partial pooling)", "hshn_full": "HSHN (full pooling)", "hshn_none": "HSHN (no pooling)", | |
| 22 | + "no_change": "No change", "mean_growth": "Mean growth", "momentum": "Momentum", "rw_drift": "Random walk with drift", "seasonal_naive": "Seasonal naive", "ar2_cell": "AR(2), cell", "local_linear_trend": "Local linear trend", | |
| 23 | + "ridge_panel": "Ridge (panel)", "lightgbm_panel": "LightGBM (panel)", "mlp_panel": "MLP (panel)", "lstm": "LSTM", "gru": "GRU", "tcn": "TCN", "tft_lite": "TFT-lite", "dsgfn": "DSGFN", "raref": "RAREF", "bhpf": "BHPF", "qanss": "QANSS", "qrefa": "QREFA"} | |
| 24 | +ORDER_A = ["naive_mun_median", "hedonic_ols", "ridge", "elastic_net", "svr", "random_forest", "xgboost", "lightgbm", "mlp", "hshn_none", "hshn_full", "hshn_partial"] | |
| 25 | +ORDER_B = ["no_change", "mean_growth", "momentum", "rw_drift", "seasonal_naive", "ar2_cell", "local_linear_trend", "ridge_panel", "lightgbm_panel", "mlp_panel", "lstm", "gru", "tcn", "tft_lite", "bhpf", "raref", "qanss", "dsgfn", "qrefa"] | |
| 26 | + | |
| 27 | + | |
| 28 | +def mname(n): return "".join(WORDS[c] if c.isdigit() else c for c in re.sub(r"[^A-Za-z0-9]", "", n)) | |
| 29 | +def macro(n, v, fmt="{:,.1f}"): | |
| 30 | + MACROS[mname(n)] = "n/a" if v is None or (isinstance(v, float) and np.isnan(v)) else fmt.format(v).replace(",", "{,}") | |
| 31 | +def esc(s): return str(s).replace("&", "\\&").replace("%", "\\%").replace("_", "\\_").replace("≤", "$\\le$").replace("≥", "$\\ge$").replace("×", "$\\times$") | |
| 32 | +def ok(*p): | |
| 33 | + miss = [str(x) for x in p if not Path(x).exists()] | |
| 34 | + if miss: print("skip:", miss) | |
| 35 | + return not miss | |
| 36 | + | |
| 37 | + | |
| 38 | +def table(name, header, rows, caption, label, align=None, notes="", size="\\small"): | |
| 39 | + align = align or "l" + "r" * (len(header) - 1); body = "\n".join(" & ".join(esc(c) for c in r) + " \\\\" for r in rows) | |
| 40 | + (T / f"{name}.tex").write_text(f"""\\begin{{table}}[htbp] | |
| 41 | +\\centering{size} | |
| 42 | +\\caption{{{caption}}}\\label{{{label}}} | |
| 43 | +\\begin{{threeparttable}} | |
| 44 | +\\begin{{tabular}}{{{align}}} | |
| 45 | +\\toprule | |
| 46 | +{' & '.join(esc(h) for h in header)} \\\\ | |
| 47 | +\\midrule | |
| 48 | +{body} | |
| 49 | +\\bottomrule | |
| 50 | +\\end{{tabular}} | |
| 51 | +{('\\begin{tablenotes}\\footnotesize\\item ' + notes + '\\end{tablenotes}') if notes else ''} | |
| 52 | +\\end{{threeparttable}} | |
| 53 | +\\end{{table}} | |
| 54 | +"""); print("table", name) | |
| 55 | + | |
| 56 | + | |
| 57 | +def t_data(): | |
| 58 | + s = pl.read_parquet(C.WP22_ANALYTIC, columns=["tx_id", "property_class", "region_code", "mun_code", "month", "price", "floor_area_m2", "land_area_m2", "age", "storeys"]) | |
| 59 | + macro("NSales", s.height, "{:,.0f}"); macro("NMun", s["mun_code"].n_unique(), "{:,.0f}") | |
| 60 | + rows = [["Floor area of storeys (m²)", "roll", "continuous; cubic in centred log", "all tasks"], ["Lot area (m²)", "roll", "quadratic in centred log", "all tasks"], ["Year built / age", "roll", "nine age bins; missingness indicator", "all tasks"], | |
| 61 | + ["Storeys, building genre, physical link, dwellings (plex)", "roll", "categorical", "Task A"], ["Coordinates, municipality, MRC, region", "feed / SDA V2026-07", "location; nested metric cells (WP22)", "all tasks"], | |
| 62 | + ["Assessment in force at sale", "feed", "not used as a predictor (post-dated for Task A test sales would be fine, but excluded for comparability)", "—"], | |
| 63 | + ["Municipal / regional market features at origin", "computed from sales ≤ origin", "median log price and quality-stripped level (3/6/12/24 m), momentum, volumes, dispersion", "Task A"], | |
| 64 | + ["10 nearest past sales (≤ 12 m)", "computed", "mean quality-stripped log price, mean distance, dispersion", "Task A"], | |
| 65 | + ["Real-time SHARP-HPI vintage (13-month history)", "WP22 index_vintages (smoothed mode)", "1/3/6/12-m changes, volatilities, acceleration, counts, s.e.; parent (region, province) momentum", "Task B"], | |
| 66 | + ["Bedrooms, bathrooms, parking, basement, condition, renovations, quality, listing, images", "—", "not available", "—"]] | |
| 67 | + table("tab_variables", ["Variable", "Source", "Treatment", "Used in"], rows, "Variables available and their use", "tab:variables", align="p{4.2cm}p{3cm}p{5.2cm}p{1.6cm}", size="\\footnotesize") | |
| 68 | + cov = s.group_by(["region_code", "property_class"]).agg(pl.len().alias("n")).pivot(on="property_class", index="region_code", values="n").fill_null(0).sort("region_code") | |
| 69 | + rows = [[r["region_code"], f"{r.get('house',0):,}".replace(",", "{,}"), f"{r.get('condo',0):,}".replace(",", "{,}"), f"{r.get('plex',0):,}".replace(",", "{,}")] for r in cov.iter_rows(named=True)] | |
| 70 | + if ok(R / "task_a" / "timing_trees.csv"): | |
| 71 | + ta = pl.concat([pl.read_csv(f) for f in (R / "task_a").glob("timing_*.csv")]); macro("NOriginsA", ta["origin"].n_unique(), "{:.0f}"); macro("NTestA", ta.group_by("origin").agg(pl.col("n_test").first())["n_test"].sum(), "{:,.0f}") | |
| 72 | + if ok(C.PROCESSED / "task_b_panel.parquet"): | |
| 73 | + pb = pl.read_parquet(C.PROCESSED / "task_b_panel.parquet"); macro("NCellsB", pb.select(["class", "level", "geo_id"]).unique().height, "{:.0f}"); macro("NRowsB", pb.height, "{:,.0f}"); macro("NOriginsB", pb["origin"].n_unique(), "{:.0f}") | |
| 74 | + for h in C.HORIZONS: macro(f"NOriginsBh{h}", pb.filter(pl.col("h") == h)["origin"].n_unique(), "{:.0f}") | |
| 75 | + table("tab_coverage", ["Region", "Houses", "Condominiums", "Plexes"], rows, "Headline sales by administrative region and class (WP22 sample reused)", "tab:coverage", size="\\footnotesize") | |
| 76 | + # selection: sold vs stock | |
| 77 | + if ok(C.WP22_STOCK): | |
| 78 | + st = pl.read_parquet(C.WP22_STOCK, columns=["cubf", "nb_logements", "lien_physique", "annee_construction", "aire_etages_m2", "superficie_terrain_m2"]).filter(pl.col("cubf") == 1000) | |
| 79 | + st = st.with_columns(pl.when(pl.col("nb_logements") >= 6).then(None).when(pl.col("nb_logements").is_between(2, 5)).then(pl.lit("plex")).when((pl.col("nb_logements") <= 1) & (pl.col("lien_physique") == "Intégré")).then(pl.lit("condo")).when(pl.col("nb_logements") <= 1).then(pl.lit("house")).otherwise(None).alias("cls")).filter(pl.col("cls").is_not_null()) | |
| 80 | + rows = [] | |
| 81 | + for cls in ["house", "condo", "plex"]: | |
| 82 | + a = s.filter(pl.col("property_class") == cls); b = st.filter(pl.col("cls") == cls) | |
| 83 | + rows.append([cls, f"{a['floor_area_m2'].median():.0f}", f"{b['aire_etages_m2'].median():.0f}", f"{a['age'].median():.0f}", f"{2026 - b['annee_construction'].median():.0f}", f"{a['land_area_m2'].median():.0f}", f"{b['superficie_terrain_m2'].median():.0f}", f"{a.height:,}".replace(",", "{,}"), f"{b.height:,}".replace(",", "{,}")]) | |
| 84 | + macro(f"SelFa{cls}Sold", a["floor_area_m2"].median(), "{:.0f}"); macro(f"SelFa{cls}Stock", b["aire_etages_m2"].median(), "{:.0f}"); macro(f"SelAge{cls}Sold", a["age"].median(), "{:.0f}"); macro(f"SelAge{cls}Stock", 2026 - b["annee_construction"].median(), "{:.0f}") | |
| 85 | + table("tab_selection", ["Class", "Floor area sold", "Floor area stock", "Age sold", "Age stock", "Lot sold", "Lot stock", "Sales", "Stock units"], rows, "Transaction selection: medians of sold dwellings (2021--2026) versus the assessment-roll stock", "tab:selection", size="\\footnotesize", | |
| 86 | + notes="Stock = residential use code 1000 in the 2026 roll, classified with the WP22 rules; age of the stock as of 2026.") | |
| 87 | + rows = [["HSHN", "embeddings 8 (geo) / 4 (h); encoder 256-128 GELU, dropout 0.1; AdamW, one-cycle lr $2\\times10^{-3}$, 8 epochs, batch 4,096; municipality weight decay $5\\times10^{-3}$"], | |
| 88 | + ["MLP (A)", "256-128 GELU, dropout 0.1; pinball loss on 5 quantiles; same optimiser"], ["LightGBM (A)", "800 trees, lr 0.04, 63 leaves, min child 30, subsample 0.8; quantile models 400 trees"], ["XGBoost (A)", "600 trees, lr 0.05, depth 8, subsample 0.8"], ["Random forest (A)", "150 trees, depth 18, min leaf 5, max features 0.5"], ["SVR (A)", "RBF, C=3, $\\epsilon$=0.05, 15,000-sale subsample"], | |
| 89 | + ["Panel MLP / LSTM / GRU / TCN / TFT-lite (B)", "hidden 64 (MLP) / 32 (RNN, attention) / 16 channels (TCN); 60 epochs, batch 512, AdamW lr $2\\times10^{-3}$, weight decay $10^{-4}$; pinball loss"], | |
| 90 | + ["DSGFN (B)", "node encoder 32; one attention layer; prior adjacency: Gaussian distance kernel (60 km) $\\times$ co-movement; 60 epochs"], ["RAREF (B)", "3-state Gaussian HMM (60 EM iterations) on provincial real-time growth; 3 ridge experts ($\\alpha$=3)"], | |
| 91 | + ["BHPF (B)", "conjugate Gaussian hierarchy; 15 variance-component iterations; priors $\\tau_b^2$=1 (slopes)"], ["QANSS (B)", "32 tanh units; 200 Adam steps, lr $5\\times10^{-3}$; Gaussian likelihood"], ["QREFA (B)", "NNLS stacking of QANSS, BHPF, DSGFN (40 epochs), RAREF on training origins"], | |
| 92 | + ["LightGBM (B)", "300 trees, lr 0.03, 15 leaves, min child 40; quantile models"], ["Ridge (B)", "$\\alpha$=3 on standardised features"]] | |
| 93 | + table("tab_hyper", ["Model", "Hyper-parameters (fixed in advance, never tuned on test origins)"], rows, "Hyper-parameters", "tab:hyper", align="p{3.4cm}p{11.5cm}", size="\\footnotesize") | |
| 94 | + rows = [["Hedonic coefficients", "WP22 stage 1 re-estimated at every vintage; Task A features never use coefficients"], ["Geographic clustering / location cells", "WP22 nested grid rebuilt from data ≤ origin at every vintage; Task A uses raw coordinates"], | |
| 95 | + ["Normalisation", "standardisation constants from training rows only; index levels enter as changes"], ["Feature selection", "fixed feature lists, no selection on test data"], ["Imputation", "WP22 conditional medians (no price information); indicators time-stable"], | |
| 96 | + ["Target encoding", "none; one-hot with training categories"], ["Spatial graph", "DSGFN adjacency recomputed at each origin from centroids and the real-time history ≤ origin"], ["Hyper-parameter tuning", "fixed a priori (Table~\\ref{tab:hyper})"], | |
| 97 | + ["Index revisions", "predictors = vintage published for the origin; target = final series (revision component reported)"], ["Partial last month", "October 2026 excluded; last target September 2026"]] | |
| 98 | + table("tab_leakage", ["Item", "Treatment"], rows, "Leakage audit", "tab:leakage", align="p{4cm}p{11cm}", size="\\footnotesize") | |
| 99 | + | |
| 100 | + | |
| 101 | +def scores_table(tag, order, caption, label, hs, ycol_desc): | |
| 102 | + f = R / f"eval_{tag}" / "scores.csv" | |
| 103 | + if not ok(f): return | |
| 104 | + d = pl.read_csv(f, infer_schema_length=None).filter(pl.col("group") == "all"); mcs = pl.read_csv(R / f"eval_{tag}" / "mcs.csv", infer_schema_length=None) if (R / f"eval_{tag}" / "mcs.csv").exists() else None | |
| 105 | + tests = pl.read_csv(R / f"eval_{tag}" / "tests_vs_reference.csv", infer_schema_length=None) if (R / f"eval_{tag}" / "tests_vs_reference.csv").exists() else None | |
| 106 | + rows = [] | |
| 107 | + for m in order: | |
| 108 | + if m not in d["model"].to_list(): continue | |
| 109 | + r = [LABELS.get(m, m)] | |
| 110 | + for h in hs: | |
| 111 | + x = d.filter((pl.col("model") == m) & (pl.col("h").cast(pl.Utf8) == str(h))) | |
| 112 | + if x.height == 0: r += ["—", "—"]; continue | |
| 113 | + mae = 100 * x["mae"][0]; star = "" | |
| 114 | + if tests is not None: | |
| 115 | + tt = tests.filter((pl.col("model") == m) & (pl.col("h").cast(pl.Utf8) == str(h))) | |
| 116 | + if tt.height and tt["dm_p"][0] == tt["dm_p"][0]: | |
| 117 | + star = "***" if tt["dm_p"][0] < 0.01 else "**" if tt["dm_p"][0] < 0.05 else "*" if tt["dm_p"][0] < 0.10 else "" | |
| 118 | + inm = "" | |
| 119 | + if mcs is not None: | |
| 120 | + mm = mcs.filter((pl.col("model") == m) & (pl.col("h").cast(pl.Utf8) == str(h))) | |
| 121 | + if mm.height and mm["in_mcs_90"][0]: inm = "$^{\\dagger}$" | |
| 122 | + r += [f"{mae:.2f}{star}{inm}", f"{x['mase'][0]:.2f}" if x["mase"][0] == x["mase"][0] else "—"] | |
| 123 | + macro(f"{tag}MAE{m}h{h}", mae, "{:.2f}"); macro(f"{tag}MASE{m}h{h}", x["mase"][0], "{:.2f}"); macro(f"{tag}CRPS{m}h{h}", 100 * x["crps"][0] if x["crps"][0] == x["crps"][0] else None, "{:.2f}"); macro(f"{tag}Cov{m}h{h}", 100 * x["cov90"][0] if x["cov90"][0] == x["cov90"][0] else None, "{:.0f}") | |
| 124 | + rows.append(r) | |
| 125 | + header = ["Model"] + [f"{h}: MAE" if i % 2 == 0 else f"{h}: MASE" for h in hs for i in range(2)] | |
| 126 | + table(f"tab_scores_{tag}", header, rows, caption, label, size="\\scriptsize", | |
| 127 | + notes=f"{ycol_desc} MAE in log points ×100; MASE relative to the naive reference. Stars: Diebold--Mariano test of equal squared-error loss against the reference on per-origin mean losses (* 10\\%, ** 5\\%, *** 1\\%); $\\dagger$ = in the 90\\% model confidence set of the horizon.") | |
| 128 | + rows = [] | |
| 129 | + for m in order: | |
| 130 | + if m not in d["model"].to_list(): continue | |
| 131 | + r = [LABELS.get(m, m)] | |
| 132 | + for h in hs: | |
| 133 | + x = d.filter((pl.col("model") == m) & (pl.col("h").cast(pl.Utf8) == str(h))) | |
| 134 | + r += [f"{100*x['crps'][0]:.2f}" if x.height and x["crps"][0] == x["crps"][0] else "—", f"{100*x['cov90'][0]:.0f}" if x.height and x["cov90"][0] == x["cov90"][0] else "—", f"{100*x['width90'][0]:.1f}" if x.height and x["width90"][0] == x["width90"][0] else "—"] | |
| 135 | + rows.append(r) | |
| 136 | + header = ["Model"] + [f"{h}: {k}" for h in hs for k in ("CRPS", "cov90", "width90")] | |
| 137 | + table(f"tab_prob_{tag}", header, rows, caption.replace("Point", "Probabilistic").replace("accuracy", "accuracy (CRPS ×100, 90\\% interval coverage \\% and width ×100)"), label.replace("scores", "prob"), size="\\scriptsize") | |
| 138 | + | |
| 139 | + | |
| 140 | +def t_results(): | |
| 141 | + scores_table("a", ORDER_A, "Task A — Point accuracy of future sale-price forecasts by horizon band (months after the origin)", "tab:scores_a", ["1-3", "4-6", "7-12"], "Target: log sale price.") | |
| 142 | + scores_table("b", ORDER_B, "Task B — Point accuracy of quality-adjusted index-change forecasts by horizon (months)", "tab:scores_b", [1, 3, 6, 12], "Target: final SHARP-HPI log change.") | |
| 143 | + for tag, grp, lab in [("b", "level", "level"), ("b", "class", "class"), ("b", "size_level", "cell size"), ("a", "mun_size", "municipality size"), ("a", "property_class", "class"), ("a", "segment", "price segment")]: | |
| 144 | + f = R / f"eval_{tag}" / "scores.csv" | |
| 145 | + if not ok(f): continue | |
| 146 | + d = pl.read_csv(f, infer_schema_length=None).filter(pl.col("group") == grp) | |
| 147 | + if d.height == 0: continue | |
| 148 | + groups = sorted(d[grp].unique().to_list()); order = ORDER_B if tag == "b" else ORDER_A; hs = [3] if tag == "b" else ["4-6"] | |
| 149 | + rows = [] | |
| 150 | + for m in order: | |
| 151 | + if m not in d["model"].to_list(): continue | |
| 152 | + r = [LABELS.get(m, m)] | |
| 153 | + for g in groups: | |
| 154 | + x = d.filter((pl.col("model") == m) & (pl.col(grp) == g) & (pl.col("h").cast(pl.Utf8) == str(hs[0]))) | |
| 155 | + r.append(f"{100*x['mae'][0]:.2f}" if x.height else "—") | |
| 156 | + rows.append(r) | |
| 157 | + table(f"tab_het_{tag}_{grp}", ["Model"] + [str(g) for g in groups], rows, f"Task {tag.upper()} — MAE (×100) by {lab}, horizon {hs[0]}", f"tab:het_{tag}_{grp}", size="\\scriptsize") | |
| 158 | + | |
| 159 | + | |
| 160 | +def t_simulation(): | |
| 161 | + f = R / "simulation" / "summary.csv" | |
| 162 | + if not ok(f): return | |
| 163 | + d = pl.read_csv(f, infer_schema_length=None); scen = ["rw", "momentum", "regimes", "spillover", "sparse"]; scen = [s for s in scen if s in d["scenario"].to_list()] | |
| 164 | + for lvl in ["municipality", "region"]: | |
| 165 | + rows = [] | |
| 166 | + for m in ORDER_B: | |
| 167 | + x = d.filter((pl.col("model") == m) & (pl.col("level") == lvl) & (pl.col("h") == 3)) | |
| 168 | + if x.height == 0: continue | |
| 169 | + r = [LABELS.get(m, m)] | |
| 170 | + for s in scen: | |
| 171 | + y = x.filter(pl.col("scenario") == s); r.append(f"{100*y['mae'][0]:.2f} ({100*y['mae_mcse'][0]:.2f})" if y.height else "—") | |
| 172 | + if y.height: macro(f"Sim{lvl}{m}{s}", 100 * y["mae"][0], "{:.2f}") | |
| 173 | + rows.append(r) | |
| 174 | + table(f"tab_sim_{lvl}", ["Model"] + scen, rows, f"Simulation — MAE (×100, Monte Carlo s.e.) of 3-month index-change forecasts at the {lvl} level, by scenario", f"tab:sim_{lvl}", size="\\scriptsize", | |
| 175 | + notes="rw: random-walk latent paths (unforecastable); momentum: AR(1) drifts; regimes: Markov-switching provincial drift; spillover: municipal drift follows the lagged regional drift; sparse: momentum with 35\\% of the sales.") | |
| 176 | + | |
| 177 | + | |
| 178 | +if __name__ == "__main__": | |
| 179 | + for fn in [t_data, t_results, t_simulation]: | |
| 180 | + try: fn() | |
| 181 | + except Exception as ex: | |
| 182 | + import traceback; traceback.print_exc(); print("FAILED", fn.__name__) | |
| 183 | + (T / "numbers.tex").write_text("% generated by scripts/50_tables.py\n" + "\n".join(f"\\newcommand{{\\{k}}}{{{v}}}" for k, v in sorted(MACROS.items())) + "\n") | |
| 184 | + used = set() | |
| 185 | + for f in list((C.ROOT / "paper" / "sections").glob("*.tex")) + list((C.ROOT / "paper" / "appendix").glob("*.tex")): | |
| 186 | + used |= set(re.findall(r"\\([A-Z][A-Za-z]+)(?=[^A-Za-z]|$)", f.read_text())) | |
| 187 | + skip = {"E", "Var", "DeclareMathOperator", "LARGE", "Large", "Delta", "WPabstract", "N"} | |
| 188 | + missing = sorted(u for u in used - set(MACROS) - skip if not u.startswith("WP")) | |
| 189 | + (T / "numbers_missing.tex").write_text("% must be empty in the final version\n" + "\n".join(f"\\providecommand{{\\{k}}}{{\\textbf{{??{k}??}}}}" for k in missing) + "\n") | |
| 190 | + print(len(MACROS), "macros;", len(missing), "missing:", missing) | |
added
scripts/60_figures.py
+141 −0
@@ -0,0 +1,141 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 3 | +"""WP23 figures from results/ (missing inputs skipped).""" | |
| 4 | +from __future__ import annotations | |
| 5 | + | |
| 6 | +import sys | |
| 7 | +from pathlib import Path | |
| 8 | + | |
| 9 | +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) | |
| 10 | +import matplotlib | |
| 11 | +matplotlib.use("Agg") | |
| 12 | +import matplotlib.pyplot as plt | |
| 13 | +import numpy as np | |
| 14 | +import polars as pl | |
| 15 | + | |
| 16 | +from wp23 import config as C | |
| 17 | + | |
| 18 | +sys.path.insert(0, str(C.WP22_SRC)) | |
| 19 | +from sharp_hpi.plotting import INK2, SERIES, style # noqa: E402 | |
| 20 | + | |
| 21 | +style(); FIG = C.FIGURES; FIG.mkdir(exist_ok=True); PFIG = C.ROOT / "paper" / "figures"; PFIG.mkdir(parents=True, exist_ok=True); R = C.RESULTS | |
| 22 | +LAB = {"naive_mun_median": "Naive municipal median", "hedonic_ols": "Hedonic OLS", "lightgbm": "LightGBM", "xgboost": "XGBoost", "random_forest": "Random forest", "mlp": "Quantile MLP", "hshn_partial": "HSHN partial", "hshn_full": "HSHN full", "hshn_none": "HSHN none", | |
| 23 | + "no_change": "No change", "momentum": "Momentum", "ar2_cell": "AR(2)", "ridge_panel": "Ridge panel", "lightgbm_panel": "LightGBM panel", "lstm": "LSTM", "tft_lite": "TFT-lite", "dsgfn": "DSGFN", "raref": "RAREF", "bhpf": "BHPF", "qanss": "QANSS", "qrefa": "QREFA", "mean_growth": "Mean growth", "local_linear_trend": "Local linear trend", "tcn": "TCN", "gru": "GRU", "mlp_panel": "MLP panel"} | |
| 24 | +COL = {m: SERIES[i % 8] for i, m in enumerate(["no_change", "momentum", "ar2_cell", "lightgbm_panel", "tft_lite", "bhpf", "qanss", "dsgfn"])}; COL.update({"raref": "#7a7a7a", "qrefa": "#0b0b0b", "ridge_panel": "#a0a0a0", "lstm": "#c98500"}) | |
| 25 | +COLA = {m: SERIES[i % 8] for i, m in enumerate(["naive_mun_median", "hedonic_ols", "lightgbm", "xgboost", "random_forest", "mlp", "hshn_partial", "hshn_full"])}; COLA["hshn_none"] = "#7a7a7a" | |
| 26 | + | |
| 27 | + | |
| 28 | +def save(fig, name): | |
| 29 | + fig.savefig(FIG / f"{name}.pdf", dpi=200); fig.savefig(PFIG / f"{name}.pdf", dpi=200); fig.savefig(FIG / f"{name}.png", dpi=150); plt.close(fig); print("fig", name) | |
| 30 | + | |
| 31 | + | |
| 32 | +def ok(*p): | |
| 33 | + miss = [str(x) for x in p if not Path(x).exists()] | |
| 34 | + if miss: print("skip:", miss) | |
| 35 | + return not miss | |
| 36 | + | |
| 37 | + | |
| 38 | +def fig_density(): | |
| 39 | + if not ok(C.WP22_SDA, C.WP22_ANALYTIC): return | |
| 40 | + import geopandas as gpd | |
| 41 | + s = pl.read_parquet(C.WP22_ANALYTIC, columns=["mun_code"]).group_by("mun_code").agg(pl.len().alias("n")).to_pandas() | |
| 42 | + mun = gpd.read_file(C.WP22_SDA, layer="munic_s")[["MUS_CO_GEO", "geometry"]].rename(columns={"MUS_CO_GEO": "mun_code"}).to_crs("EPSG:32198") | |
| 43 | + g = mun.merge(s, on="mun_code", how="left"); g["geometry"] = g.geometry.simplify(150); g["n"] = g["n"].fillna(0) | |
| 44 | + fig, ax = plt.subplots(figsize=(7.2, 5)); g.plot(ax=ax, column=np.log10(g["n"] + 1), cmap="Blues", edgecolor="white", linewidth=0.1, legend=True, legend_kwds={"shrink": 0.5, "label": "log10(1 + sales 2021–2026)"}) | |
| 45 | + g[g["n"] >= C.MIN_CELL_SALES].boundary.plot(ax=ax, color="#e34948", linewidth=0.5) | |
| 46 | + for coll in ax.collections: coll.set_rasterized(True) | |
| 47 | + ax.set_xlim(-650000, 500000); ax.set_ylim(130000, 700000); ax.axis("off"); save(fig, "fig_map_density") | |
| 48 | + | |
| 49 | + | |
| 50 | +def fig_perf(tag, order, col, xlab): | |
| 51 | + f = R / f"eval_{tag}" / "scores.csv" | |
| 52 | + if not ok(f): return | |
| 53 | + d = pl.read_csv(f, infer_schema_length=None).filter(pl.col("group") == "all") | |
| 54 | + hs = sorted(d["h"].unique().to_list(), key=lambda x: str(x)) | |
| 55 | + fig, axes = plt.subplots(1, 2, figsize=(9, 3.2)) | |
| 56 | + for m in order: | |
| 57 | + s = d.filter(pl.col("model") == m) | |
| 58 | + if s.height == 0: continue | |
| 59 | + v = {str(r["h"]): r for r in s.iter_rows(named=True)} | |
| 60 | + axes[0].plot(range(len(hs)), [100 * v[str(h)]["mae"] if str(h) in v else np.nan for h in hs], marker="o", ms=3, color=col.get(m, "#999"), label=LAB.get(m, m), lw=1.6 if m.startswith(("hshn", "dsgfn", "qanss", "bhpf", "raref", "qrefa")) else 1.0) | |
| 61 | + axes[1].plot(range(len(hs)), [100 * v[str(h)]["crps"] if str(h) in v and v[str(h)]["crps"] == v[str(h)]["crps"] else np.nan for h in hs], marker="o", ms=3, color=col.get(m, "#999"), lw=1.0) | |
| 62 | + for ax, yl in zip(axes, ["MAE (log points ×100)", "CRPS (×100)"]): | |
| 63 | + ax.set_xticks(range(len(hs))); ax.set_xticklabels([str(h) for h in hs]); ax.set_xlabel(xlab); ax.set_ylabel(yl) | |
| 64 | + axes[0].legend(fontsize=6, ncol=2); save(fig, f"fig_perf_{tag}") | |
| 65 | + | |
| 66 | + | |
| 67 | +def fig_calibration(tag, order, col): | |
| 68 | + f = R / f"eval_{tag}" / "calibration.csv" | |
| 69 | + if not ok(f): return | |
| 70 | + d = pl.read_csv(f, infer_schema_length=None); hs = sorted(d["h"].unique().to_list(), key=lambda x: str(x)); h = hs[min(1, len(hs) - 1)] | |
| 71 | + fig, ax = plt.subplots(figsize=(4.2, 3.6)); ax.plot([0, 1], [0, 1], color=INK2, lw=0.6, ls="--") | |
| 72 | + for m in order: | |
| 73 | + s = d.filter((pl.col("model") == m) & (pl.col("h").cast(pl.Utf8) == str(h))).sort("tau") | |
| 74 | + if s.height: ax.plot(s["tau"], s["share_below"], marker="o", ms=3, color=col.get(m, "#999"), label=LAB.get(m, m)) | |
| 75 | + ax.set_xlabel("Nominal quantile level"); ax.set_ylabel("Share of outcomes below the quantile"); ax.set_title(f"Calibration, horizon {h}", fontsize=9); ax.legend(fontsize=6); save(fig, f"fig_calibration_{tag}") | |
| 76 | + | |
| 77 | + | |
| 78 | +def fig_trajectories(): | |
| 79 | + f = R / "task_b" | |
| 80 | + files = sorted(f.glob("predictions_*.parquet")) | |
| 81 | + if not files: print("skip trajectories"); return | |
| 82 | + p = pl.concat([pl.read_parquet(x) for x in files], how="diagonal").filter((pl.col("h") == 3) & (pl.col("class") == "house")) | |
| 83 | + cells = [("province", "QC", "Province"), ("region", "06", "Montréal"), ("region", "03", "Capitale-Nationale"), ("municipality", "81017", "Gatineau")] | |
| 84 | + fig, axes = plt.subplots(2, 2, figsize=(9, 5.4)) | |
| 85 | + for ax, (lvl, gid, nm) in zip(axes.ravel(), cells): | |
| 86 | + s = p.filter((pl.col("level") == lvl) & (pl.col("geo_id") == gid)).sort("origin") | |
| 87 | + if s.height == 0: continue | |
| 88 | + tgt = s.filter(pl.col("model") == "no_change"); x = np.arange(tgt.height); ax.plot(x, 100 * tgt["target"], color="#0b0b0b", lw=1.6, label="Realised 3-month change") | |
| 89 | + for m in ["momentum", "qanss", "dsgfn", "lightgbm_panel", "bhpf"]: | |
| 90 | + t = s.filter(pl.col("model") == m) | |
| 91 | + if t.height: ax.plot(x[:t.height], 100 * t["pred"], color=COL.get(m), lw=0.9, label=LAB.get(m, m)) | |
| 92 | + ax.set_title(f"{nm}, houses", fontsize=9); idx = [i for i, o in enumerate(tgt["origin"].to_list()) if o.endswith("-01")]; ax.set_xticks(idx); ax.set_xticklabels([tgt["origin"][i][:4] for i in idx]); ax.axhline(0, color=INK2, lw=0.5) | |
| 93 | + axes[0, 0].set_ylabel("Log points ×100"); axes[1, 0].set_ylabel("Log points ×100"); axes[0, 0].legend(fontsize=6); save(fig, "fig_trajectories_b") | |
| 94 | + | |
| 95 | + | |
| 96 | +def fig_error_map(): | |
| 97 | + f = R / "eval_b" / "scores.csv" | |
| 98 | + if not ok(f, C.WP22_SDA): return | |
| 99 | + import geopandas as gpd | |
| 100 | + d = pl.read_csv(f, infer_schema_length=None).filter((pl.col("group") == "region_code") & (pl.col("h").cast(pl.Utf8) == "3")) | |
| 101 | + best = d.group_by("region_code").agg(pl.col("mae").min().alias("best"), pl.col("mae").filter(pl.col("model") == "no_change").first().alias("nc")).with_columns((pl.col("best") / pl.col("nc")).alias("rel")) | |
| 102 | + reg = gpd.read_file(C.WP22_SDA, layer="regio_s")[["RES_CO_REG", "geometry"]].rename(columns={"RES_CO_REG": "region_code"}).to_crs("EPSG:32198"); reg["geometry"] = reg.geometry.simplify(300) | |
| 103 | + g = reg.merge(best.with_columns(pl.col("region_code").cast(pl.Utf8)).to_pandas(), on="region_code", how="left") | |
| 104 | + fig, ax = plt.subplots(figsize=(6.4, 4.6)); g.plot(ax=ax, column="rel", cmap="Blues_r", vmin=0.5, vmax=1.0, edgecolor="white", linewidth=0.3, legend=True, legend_kwds={"shrink": 0.5, "label": "Best model MAE / no-change MAE, h = 3"}) | |
| 105 | + for coll in ax.collections: coll.set_rasterized(True) | |
| 106 | + ax.set_xlim(-650000, 500000); ax.set_ylim(130000, 700000); ax.axis("off"); save(fig, "fig_error_map") | |
| 107 | + | |
| 108 | + | |
| 109 | +def fig_simulation(): | |
| 110 | + f = R / "simulation" / "summary.csv" | |
| 111 | + if not ok(f): return | |
| 112 | + d = pl.read_csv(f, infer_schema_length=None).filter((pl.col("level") == "municipality") & (pl.col("h") == 3)); scen = [s for s in ["rw", "momentum", "regimes", "spillover", "sparse"] if s in d["scenario"].to_list()] | |
| 113 | + models = [m for m in ["no_change", "momentum", "ar2_cell", "lightgbm_panel", "tft_lite", "bhpf", "raref", "qanss", "dsgfn"] if m in d["model"].to_list()] | |
| 114 | + fig, ax = plt.subplots(figsize=(9, 3.2)); w = 0.8 / len(models) | |
| 115 | + for j, m in enumerate(models): | |
| 116 | + v = {r["scenario"]: r for r in d.filter(pl.col("model") == m).iter_rows(named=True)} | |
| 117 | + ax.bar(np.arange(len(scen)) + j * w - 0.4 + w / 2, [v[s]["rel_mae"] if s in v else np.nan for s in scen], width=w * 0.9, color=COL.get(m, "#999"), label=LAB.get(m, m), yerr=[v[s]["rel_mae_mcse"] if s in v else 0 for s in scen], error_kw=dict(lw=0.5), lw=0) | |
| 118 | + ax.axhline(1, color=INK2, lw=0.6, ls="--"); ax.set_xticks(range(len(scen))); ax.set_xticklabels(scen); ax.set_ylabel("MAE relative to no-change (municipalities, h = 3)"); ax.legend(fontsize=6, ncol=3); save(fig, "fig_simulation") | |
| 119 | + | |
| 120 | + | |
| 121 | +def fig_mcs(): | |
| 122 | + for tag in ["a", "b"]: | |
| 123 | + f = R / f"eval_{tag}" / "mcs.csv" | |
| 124 | + if not ok(f): continue | |
| 125 | + d = pl.read_csv(f, infer_schema_length=None); hs = sorted(d["h"].unique().to_list(), key=str); models = sorted(d["model"].unique().to_list(), key=lambda m: -d.filter(pl.col("model") == m)["mcs_p"].mean()) | |
| 126 | + M = np.array([[d.filter((pl.col("model") == m) & (pl.col("h").cast(pl.Utf8) == str(h)))["mcs_p"].to_list()[:1] or [np.nan] for h in hs] for m in models]).squeeze(-1) | |
| 127 | + fig, ax = plt.subplots(figsize=(4.5, 0.3 * len(models) + 1)); im = ax.imshow(M, cmap="Blues", vmin=0, vmax=1, aspect="auto") | |
| 128 | + ax.set_yticks(range(len(models))); ax.set_yticklabels([LAB.get(m, m) for m in models], fontsize=7); ax.set_xticks(range(len(hs))); ax.set_xticklabels([str(h) for h in hs]); ax.set_xlabel("Horizon") | |
| 129 | + for i in range(len(models)): | |
| 130 | + for j in range(len(hs)): | |
| 131 | + if M[i, j] == M[i, j]: ax.text(j, i, f"{M[i, j]:.2f}", ha="center", va="center", fontsize=6, color="white" if M[i, j] > 0.6 else "#0b0b0b") | |
| 132 | + ax.set_title(f"MCS p-values, Task {tag.upper()}", fontsize=9); ax.grid(False); save(fig, f"fig_mcs_{tag}") | |
| 133 | + | |
| 134 | + | |
| 135 | +if __name__ == "__main__": | |
| 136 | + for fn in [fig_density, lambda: fig_perf("a", ["naive_mun_median", "hedonic_ols", "random_forest", "xgboost", "lightgbm", "mlp", "hshn_partial", "hshn_full", "hshn_none"], COLA, "Horizon band (months)"), | |
| 137 | + lambda: fig_perf("b", ["no_change", "momentum", "ar2_cell", "ridge_panel", "lightgbm_panel", "lstm", "tft_lite", "bhpf", "raref", "qanss", "dsgfn", "qrefa"], COL, "Horizon (months)"), | |
| 138 | + lambda: fig_calibration("a", ["lightgbm", "mlp", "hshn_partial", "hedonic_ols"], COLA), lambda: fig_calibration("b", ["no_change", "lightgbm_panel", "tft_lite", "bhpf", "qanss", "dsgfn"], COL), fig_trajectories, fig_error_map, fig_simulation, fig_mcs]: | |
| 139 | + try: fn() | |
| 140 | + except Exception as ex: | |
| 141 | + import traceback; traceback.print_exc() | |
added
src/wp23/__init__.py
+6 −0
@@ -0,0 +1,6 @@ | ||
| 1 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 2 | +"""WP23 — forecasting architectures for Quebec residential prices (reuses WP22 read-only).""" | |
| 3 | +__version__ = "0.1.0" | |
| 4 | +import os as _os | |
| 5 | + | |
| 6 | +_os.environ.setdefault("KMP_DUPLICATE_LIB_OK", "TRUE") | |
added
src/wp23/config.py
+29 −0
@@ -0,0 +1,29 @@ | ||
| 1 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 2 | +"""Paths and conventions. WP22 artefacts are read-only inputs.""" | |
| 3 | +from __future__ import annotations | |
| 4 | + | |
| 5 | +from pathlib import Path | |
| 6 | + | |
| 7 | +ROOT = Path(__file__).resolve().parents[2] | |
| 8 | +WP22 = ROOT.parent / "sharp-hpi-quebec" | |
| 9 | +WP22_SRC = WP22 / "src" | |
| 10 | +WP22_ANALYTIC = WP22 / "data" / "processed" / "analytic_transactions.parquet" | |
| 11 | +WP22_PANEL = WP22 / "data" / "processed" / "index_panel.parquet" | |
| 12 | +WP22_VINTAGES = WP22 / "data" / "processed" / "index_vintages.parquet" | |
| 13 | +WP22_GEO = WP22 / "data" / "interim" / "geo_transactions.parquet" | |
| 14 | +WP22_STOCK = WP22 / "data" / "interim" / "raw_units_stock.parquet" | |
| 15 | +WP22_SDA = WP22 / "data" / "external" / "SDA.gpkg" | |
| 16 | +WP22_EXTERNAL = WP22 / "data" / "external" / "external_indices" | |
| 17 | + | |
| 18 | +DATA = ROOT / "data"; PROCESSED = DATA / "processed"; RESULTS = ROOT / "results"; FIGURES = ROOT / "figures"; DOCS = ROOT / "docs"; LOGS = ROOT / "logs" | |
| 19 | +SEED = 20261022 | |
| 20 | +HORIZONS = (1, 3, 6, 12) | |
| 21 | +FIRST_ORIGIN = "2022-12" # 24 months of history before the first forecast origin | |
| 22 | +LAST_MONTH = "2026-09" # last complete month (October 2026 is partial in WP22) | |
| 23 | +PROPERTY_TYPES = ("house", "condo", "plex") | |
| 24 | +MIN_CELL_SALES = 1500 # municipalities with real-time vintages in WP22 | |
| 25 | + | |
| 26 | + | |
| 27 | +def ensure_dirs() -> None: | |
| 28 | + for d in (PROCESSED, RESULTS, FIGURES, DOCS, LOGS): | |
| 29 | + d.mkdir(parents=True, exist_ok=True) | |
added
src/wp23/data.py
+133 −0
@@ -0,0 +1,133 @@ | ||
| 1 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 2 | +"""Forecasting datasets built strictly from information available at each origin. | |
| 3 | + | |
| 4 | +Task A (property level): for origin o, the training set is every headline sale dated ≤ o with features computed from | |
| 5 | +sales ≤ o; the test set is the sales of months o+1 … o+12, each labelled by its horizon h = months after o. Market | |
| 6 | +features for a test sale are those of its municipality *at the origin* (not at the sale date). | |
| 7 | +Task B (cell level): for origin o and cell g, predictors are the real-time SHARP-HPI vintage published for o (WP22 | |
| 8 | +index_vintages, smoothed mode), volumes and dispersion up to o; target = final smoothed log index change over h. | |
| 9 | +""" | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +import sys | |
| 13 | + | |
| 14 | +import numpy as np | |
| 15 | +import polars as pl | |
| 16 | +from scipy.spatial import cKDTree | |
| 17 | + | |
| 18 | +from wp23 import config as C | |
| 19 | + | |
| 20 | +sys.path.insert(0, str(C.WP22_SRC)) | |
| 21 | +from sharp_hpi.hedonic import build_features as wp22_build_features # noqa: E402 | |
| 22 | + | |
| 23 | + | |
| 24 | +def month_add(m: str, k: int) -> str: | |
| 25 | + y, mm = int(m[:4]), int(m[5:7]); mm += k | |
| 26 | + while mm > 12: | |
| 27 | + mm -= 12; y += 1 | |
| 28 | + while mm < 1: | |
| 29 | + mm += 12; y -= 1 | |
| 30 | + return f"{y:04d}-{mm:02d}" | |
| 31 | + | |
| 32 | + | |
| 33 | +def months_between(a: str, b: str) -> int: | |
| 34 | + return (int(b[:4]) - int(a[:4])) * 12 + int(b[5:7]) - int(a[5:7]) | |
| 35 | + | |
| 36 | + | |
| 37 | +def load_sales() -> pl.DataFrame: | |
| 38 | + """WP22 analytic layer + WP22 feature engineering (imputed logs, age bins, grid cells).""" | |
| 39 | + a = pl.read_parquet(C.WP22_ANALYTIC) | |
| 40 | + f = wp22_build_features(a) | |
| 41 | + keep = ["tx_id", "parcel_id", "date", "month", "year", "price", "log_price", "property_class", "subtype_c", "genre_c", "storeys_c", "units_c", | |
| 42 | + "lfa", "lfa2", "lla", "age_f", "fa_missing", "la_missing", "age_missing", "fa_f", "la_f", "x_m", "y_m", "mun_code", "mrc_code", "region_code", | |
| 43 | + "grid1k", "grid2k", "grid5k", "assessment_at_sale", "new_construction", "mamh_population"] | |
| 44 | + return f.select([c for c in keep if c in f.columns]).sort("date") | |
| 45 | + | |
| 46 | + | |
| 47 | +# ---- market features at an origin (real-time, from sales ≤ origin) --------------------------------- | |
| 48 | +def market_features_at(sales: pl.DataFrame, origin: str, key: str = "mun_code", prefix: str = "mun") -> pl.DataFrame: | |
| 49 | + """Per key: log median price per m² level and momentum (3/6/12 m), volumes, dispersion, computed from sales ≤ origin. | |
| 50 | + Price per m² is a crude real-time proxy of the local level; the quality-adjusted alternative (vintage index) is added in Task B.""" | |
| 51 | + s = sales.filter(pl.col("month") <= origin).with_columns((pl.col("log_price") - pl.col("lfa") * 0.5).alias("_q")) # crude quality strip | |
| 52 | + out = None | |
| 53 | + for lab, k in (("3", 3), ("6", 6), ("12", 12), ("24", 24)): | |
| 54 | + w = s.filter(pl.col("month") > month_add(origin, -k)) | |
| 55 | + g = w.group_by(key).agg(pl.col("log_price").median().alias(f"{prefix}_medlp_{lab}"), pl.col("_q").median().alias(f"{prefix}_q_{lab}"), | |
| 56 | + pl.len().alias(f"{prefix}_n_{lab}"), pl.col("log_price").std().alias(f"{prefix}_sd_{lab}")) | |
| 57 | + out = g if out is None else out.join(g, on=key, how="full", coalesce=True) | |
| 58 | + out = out.with_columns( | |
| 59 | + (pl.col(f"{prefix}_q_3") - pl.col(f"{prefix}_q_12")).alias(f"{prefix}_mom_3_12"), | |
| 60 | + (pl.col(f"{prefix}_q_6") - pl.col(f"{prefix}_q_24")).alias(f"{prefix}_mom_6_24"), | |
| 61 | + (pl.col(f"{prefix}_n_3") / (pl.col(f"{prefix}_n_12") / 4)).alias(f"{prefix}_vol_ratio"), | |
| 62 | + ) | |
| 63 | + return out | |
| 64 | + | |
| 65 | + | |
| 66 | +def knn_features_at(sales: pl.DataFrame, origin: str, targets: pl.DataFrame, k: int = 10, window_months: int = 12) -> pl.DataFrame: | |
| 67 | + """For each target sale: mean quality-stripped log price and distance of the k nearest sales of the same class dated in | |
| 68 | + (origin-12 m, origin]. Targets may be dated after the origin; only past sales are used.""" | |
| 69 | + past = sales.filter((pl.col("month") <= origin) & (pl.col("month") > month_add(origin, -window_months))) | |
| 70 | + rows = [] | |
| 71 | + for cls in C.PROPERTY_TYPES: | |
| 72 | + p = past.filter(pl.col("property_class") == cls); t = targets.filter(pl.col("property_class") == cls) | |
| 73 | + if p.height < k or t.height == 0: | |
| 74 | + continue | |
| 75 | + tree = cKDTree(p.select(["x_m", "y_m"]).to_numpy()) | |
| 76 | + q = (p["log_price"] - 0.5 * p["lfa"]).to_numpy() | |
| 77 | + d, idx = tree.query(t.select(["x_m", "y_m"]).to_numpy(), k=k) | |
| 78 | + rows.append(pl.DataFrame({"tx_id": t["tx_id"], "knn_q": q[idx].mean(axis=1), "knn_dist_km": d.mean(axis=1) / 1000, "knn_q_sd": q[idx].std(axis=1)})) | |
| 79 | + schema = {"tx_id": pl.Utf8, "knn_q": pl.Float64, "knn_dist_km": pl.Float64, "knn_q_sd": pl.Float64} | |
| 80 | + return pl.concat([r.cast(schema) for r in rows]) if rows else pl.DataFrame(schema=schema) | |
| 81 | + | |
| 82 | + | |
| 83 | +def task_a_sets(sales: pl.DataFrame, origin: str, horizons=C.HORIZONS, train_months: int | None = None): | |
| 84 | + """Returns (train, test) frames with features at the origin. train_months=None → expanding window.""" | |
| 85 | + tr = sales.filter(pl.col("month") <= origin) | |
| 86 | + if train_months: | |
| 87 | + tr = tr.filter(pl.col("month") > month_add(origin, -train_months)) | |
| 88 | + te = sales.filter((pl.col("month") > origin) & (pl.col("month") <= month_add(origin, max(horizons)))).with_columns( | |
| 89 | + pl.col("month").map_elements(lambda m: months_between(origin, m), return_dtype=pl.Int32).alias("h")) | |
| 90 | + mf = market_features_at(sales, origin, "mun_code", "mun"); rf = market_features_at(sales, origin, "region_code", "reg") | |
| 91 | + # training rows get market features at *their own* month-end? No: to mimic forecasting, training features are computed | |
| 92 | + # at each training sale's month (information ≤ that month), test features at the origin. | |
| 93 | + def attach(df, at_origin: bool): | |
| 94 | + if at_origin: | |
| 95 | + d = df.join(mf, on="mun_code", how="left").join(rf, on="region_code", how="left") | |
| 96 | + kn = knn_features_at(sales, origin, df) | |
| 97 | + return d.join(kn, on="tx_id", how="left").with_columns(pl.lit(months_between("2021-01", origin)).alias("origin_t")) | |
| 98 | + # training rows: each sale is assigned a horizon h ∈ HORIZONS (deterministic hash) and receives the market and | |
| 99 | + # neighbour features of the origin h months before its sale month, so that the models learn horizon-dependence | |
| 100 | + rng = np.random.default_rng(C.SEED); hs = np.array(horizons) | |
| 101 | + df = df.with_columns(pl.Series("h", hs[rng.integers(0, len(hs), df.height)]).cast(pl.Int32)) | |
| 102 | + parts = [] | |
| 103 | + for (m, h), sub in df.group_by(["month", "h"]): | |
| 104 | + mo = month_add(m, -int(h)) | |
| 105 | + if mo < "2021-01": | |
| 106 | + continue | |
| 107 | + d = sub.join(market_features_at(sales, mo, "mun_code", "mun"), on="mun_code", how="left").join(market_features_at(sales, mo, "region_code", "reg"), on="region_code", how="left") | |
| 108 | + d = d.join(knn_features_at(sales, mo, sub), on="tx_id", how="left").with_columns(pl.lit(months_between("2021-01", mo)).alias("origin_t")) | |
| 109 | + parts.append(d) | |
| 110 | + return pl.concat(parts) | |
| 111 | + return attach(tr, False), attach(te, True) | |
| 112 | + | |
| 113 | + | |
| 114 | +FEATURES_HEDONIC = ["lfa", "lfa2", "lla", "age_f", "fa_missing", "la_missing", "age_missing", "x_m", "y_m"] | |
| 115 | +FEATURES_CAT = ["property_class", "subtype_c", "genre_c", "storeys_c", "units_c", "region_code"] | |
| 116 | +FEATURES_MARKET = ["mun_medlp_3", "mun_q_3", "mun_q_12", "mun_n_3", "mun_n_12", "mun_sd_12", "mun_mom_3_12", "mun_mom_6_24", "mun_vol_ratio", | |
| 117 | + "reg_q_3", "reg_q_12", "reg_mom_3_12", "reg_mom_6_24", "knn_q", "knn_dist_km", "knn_q_sd", "origin_t"] | |
| 118 | + | |
| 119 | + | |
| 120 | +def design(df: pl.DataFrame, cats: dict | None = None): | |
| 121 | + """Numeric design matrix (one-hot categoricals with a fixed category list) + the target vector.""" | |
| 122 | + d = df.with_columns([pl.col(c).fill_null(0.0) for c in FEATURES_MARKET if c in df.columns]) | |
| 123 | + X = d.select([c for c in FEATURES_HEDONIC + FEATURES_MARKET if c in d.columns]).to_numpy().astype(np.float64) | |
| 124 | + cols = [c for c in FEATURES_HEDONIC + FEATURES_MARKET if c in d.columns] | |
| 125 | + cats = cats or {c: sorted(d[c].cast(pl.Utf8).fill_null("na").unique().to_list()) for c in FEATURES_CAT} | |
| 126 | + oh = [] | |
| 127 | + for c, levels in cats.items(): | |
| 128 | + v = d[c].cast(pl.Utf8).fill_null("na").to_numpy() | |
| 129 | + for lv in levels: | |
| 130 | + oh.append((v == lv).astype(np.float64)); cols.append(f"{c}={lv}") | |
| 131 | + X = np.column_stack([X] + oh) if oh else X | |
| 132 | + X = np.nan_to_num(X) | |
| 133 | + return X, d["log_price"].to_numpy(), cols, cats | |
added
src/wp23/data_b.py
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 2 | +"""Task B dataset: cell × origin panel of real-time predictors and final targets. | |
| 3 | + | |
| 4 | +For origin o (a month), the predictor history of cell g is the SHARP-HPI vintage published for o (WP22 `index_vintages`, | |
| 5 | +smoothed mode, estimated on sales ≤ o − 10 days): log index levels for months ≤ o. Volumes and dispersion come from sales ≤ o. | |
| 6 | +Target over horizon h: Δ_h y = y_{o+h} − y_o where y is the FINAL retrospective smoothed log index (WP22 index_panel), | |
| 7 | +i.e. the best available estimate of the true quality-adjusted movement; the real-time level at o is also recorded so that | |
| 8 | +the "revision" component of the target can be separated. The last complete month is LAST_MONTH; origins run to LAST_MONTH − h. | |
| 9 | +""" | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +import numpy as np | |
| 13 | +import polars as pl | |
| 14 | + | |
| 15 | +from wp23 import config as C | |
| 16 | +from wp23.data import month_add, months_between | |
| 17 | + | |
| 18 | +LAGS = 12 | |
| 19 | + | |
| 20 | + | |
| 21 | +def load_vintages() -> pl.DataFrame: | |
| 22 | + v = pl.read_parquet(C.WP22_VINTAGES) | |
| 23 | + if "mode" in v.columns: | |
| 24 | + v = v.filter(pl.col("mode") == "smoothed") | |
| 25 | + return v.select(["class", "vintage", "level", "geo_id", "month", "log_index", "se", "n"]) | |
| 26 | + | |
| 27 | + | |
| 28 | +def load_final() -> pl.DataFrame: | |
| 29 | + p = pl.read_parquet(C.WP22_PANEL) | |
| 30 | + return p.select(pl.col("property_type").alias("class"), pl.col("geography_level").alias("level"), pl.col("geography_id").alias("geo_id"), "month", | |
| 31 | + (pl.col("index_value") / 100).log().alias("y_final"), pl.col("actual_transaction_count").alias("n_final"), "reliability_grade", "partial_month_flag") | |
| 32 | + | |
| 33 | + | |
| 34 | +def cell_history_at(v: pl.DataFrame, origin: str) -> pl.DataFrame: | |
| 35 | + """Rows: class, level, geo_id with arrays of the last LAGS+1 real-time log-index levels (ending at the origin), counts and s.e.""" | |
| 36 | + h = v.filter((pl.col("vintage") == origin) & (pl.col("month") <= origin) & (pl.col("month") > month_add(origin, -(LAGS + 1)))).sort(["class", "level", "geo_id", "month"]) | |
| 37 | + g = h.group_by(["class", "level", "geo_id"], maintain_order=True).agg(pl.col("log_index").alias("hist"), pl.col("n").alias("n_hist"), pl.col("se").alias("se_hist"), pl.len().alias("len")) | |
| 38 | + return g.filter(pl.col("len") == LAGS + 1).drop("len") | |
| 39 | + | |
| 40 | + | |
| 41 | +def build_panel(horizons=C.HORIZONS, origins: list[str] | None = None) -> pl.DataFrame: | |
| 42 | + v = load_vintages(); fin = load_final() | |
| 43 | + all_origins = sorted(v["vintage"].unique().to_list()) | |
| 44 | + origins = origins or [o for o in all_origins if C.FIRST_ORIGIN <= o <= month_add(C.LAST_MONTH, -1)] | |
| 45 | + rows = [] | |
| 46 | + for o in origins: | |
| 47 | + hist = cell_history_at(v, o) | |
| 48 | + if hist.height == 0: | |
| 49 | + continue | |
| 50 | + H = np.array(hist["hist"].to_list(), float); N = np.array(hist["n_hist"].to_list(), float); SE = np.array(hist["se_hist"].to_list(), float) | |
| 51 | + lv = H[:, -1] | |
| 52 | + feats = { | |
| 53 | + "rt_level": lv, "d1": H[:, -1] - H[:, -2], "d3": H[:, -1] - H[:, -4], "d6": H[:, -1] - H[:, -7], "d12": H[:, -1] - H[:, 0], | |
| 54 | + "vol6": np.std(np.diff(H[:, -7:], axis=1), axis=1), "vol12": np.std(np.diff(H, axis=1), axis=1), | |
| 55 | + "n_last": N[:, -1], "n_mean12": N.mean(axis=1), "n_ratio": (N[:, -3:].mean(axis=1) + 1) / (N.mean(axis=1) + 1), "se_last": SE[:, -1], | |
| 56 | + "accel": (H[:, -1] - H[:, -4]) - (H[:, -4] - H[:, -7]), | |
| 57 | + } | |
| 58 | + base = hist.select(["class", "level", "geo_id"]).with_columns([pl.Series(k, val) for k, val in feats.items()]).with_columns( | |
| 59 | + pl.lit(o).alias("origin"), pl.lit(int(o[5:7])).alias("month_of_year"), pl.lit(months_between("2021-01", o)).alias("origin_t"), | |
| 60 | + pl.Series("hist", [list(r) for r in H])) | |
| 61 | + fo = fin.filter(pl.col("month") == o).select(["class", "level", "geo_id", pl.col("y_final").alias("y_final_o")]) | |
| 62 | + base = base.join(fo, on=["class", "level", "geo_id"], how="left") | |
| 63 | + for h in horizons: | |
| 64 | + tm = month_add(o, h) | |
| 65 | + if tm > C.LAST_MONTH: | |
| 66 | + continue | |
| 67 | + ft = fin.filter(pl.col("month") == tm).select(["class", "level", "geo_id", pl.col("y_final").alias("y_final_h"), pl.col("n_final").alias("n_target"), pl.col("reliability_grade").alias("grade_target")]) | |
| 68 | + d = base.join(ft, on=["class", "level", "geo_id"], how="inner").with_columns( | |
| 69 | + pl.lit(h).alias("h"), (pl.col("y_final_h") - pl.col("y_final_o")).alias("target"), (pl.col("y_final_h") - pl.col("rt_level")).alias("target_vs_rt")) | |
| 70 | + rows.append(d) | |
| 71 | + out = pl.concat(rows) | |
| 72 | + # province- and region-level context at the origin for every cell (parent momentum): join the region row of the same origin/class | |
| 73 | + reg = out.filter(pl.col("level") == "region").select(["class", "origin", "h", pl.col("geo_id").alias("region_code"), pl.col("d3").alias("reg_d3"), pl.col("d12").alias("reg_d12"), pl.col("vol12").alias("reg_vol12")]).unique() | |
| 74 | + prov = out.filter(pl.col("level") == "province").select(["class", "origin", "h", pl.col("d3").alias("prov_d3"), pl.col("d12").alias("prov_d12"), pl.col("vol12").alias("prov_vol12")]).unique() | |
| 75 | + geo = pl.read_parquet(C.WP22_GEO, columns=["mun_code", "region_code", "mrc_code", "x_m", "y_m"]).group_by("mun_code").agg(pl.col("region_code").first(), pl.col("mrc_code").first(), pl.col("x_m").mean().alias("cx"), pl.col("y_m").mean().alias("cy")) | |
| 76 | + out = out.join(geo, left_on="geo_id", right_on="mun_code", how="left").with_columns( | |
| 77 | + pl.when(pl.col("level") == "region").then(pl.col("geo_id")).otherwise(pl.col("region_code")).alias("region_code")) | |
| 78 | + out = out.join(reg, on=["class", "origin", "h", "region_code"], how="left").join(prov, on=["class", "origin", "h"], how="left") | |
| 79 | + return out | |
| 80 | + | |
| 81 | + | |
| 82 | +FEATURES_B = ["d1", "d3", "d6", "d12", "vol6", "vol12", "n_last", "n_mean12", "n_ratio", "se_last", "accel", "month_of_year", "origin_t", "reg_d3", "reg_d12", "reg_vol12", "prov_d3", "prov_d12", "prov_vol12"] | |
added
src/wp23/evaluation.py
+123 −0
@@ -0,0 +1,123 @@ | ||
| 1 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 2 | +"""Forecast evaluation: point and probabilistic scores, Diebold–Mariano (HAC), Giacomini–White, Model Confidence Set, block bootstrap.""" | |
| 3 | +from __future__ import annotations | |
| 4 | + | |
| 5 | +import numpy as np | |
| 6 | +from scipy import stats | |
| 7 | + | |
| 8 | + | |
| 9 | +# ---- point scores ----------------------------------------------------------------------------- | |
| 10 | +def point_scores(y: np.ndarray, f: np.ndarray, y_naive: np.ndarray | None = None) -> dict: | |
| 11 | + e = f - y; ok = np.isfinite(e); e = e[ok] | |
| 12 | + out = {"n": int(ok.sum()), "mae": float(np.mean(np.abs(e))), "rmse": float(np.sqrt(np.mean(e ** 2))), "medae": float(np.median(np.abs(e))), "bias": float(np.mean(e))} | |
| 13 | + if y_naive is not None: | |
| 14 | + en = (y_naive - y)[ok]; out["mase"] = float(np.mean(np.abs(e)) / max(np.mean(np.abs(en)), 1e-12)) | |
| 15 | + return out | |
| 16 | + | |
| 17 | + | |
| 18 | +# ---- probabilistic scores --------------------------------------------------------------------- | |
| 19 | +def pinball(y: np.ndarray, q: np.ndarray, tau: float) -> np.ndarray: | |
| 20 | + d = y - q | |
| 21 | + return np.maximum(tau * d, (tau - 1) * d) | |
| 22 | + | |
| 23 | + | |
| 24 | +def crps_from_quantiles(y: np.ndarray, Q: np.ndarray, taus: np.ndarray) -> np.ndarray: | |
| 25 | + """CRPS approximated by the average pinball loss over a quantile grid (×2), Laio & Tamea (2007) relation.""" | |
| 26 | + return 2 * np.mean(np.stack([pinball(y, Q[:, j], t) for j, t in enumerate(taus)], axis=1), axis=1) | |
| 27 | + | |
| 28 | + | |
| 29 | +def interval_scores(y: np.ndarray, lo: np.ndarray, hi: np.ndarray, alpha: float = 0.1) -> dict: | |
| 30 | + cov = np.mean((y >= lo) & (y <= hi)); width = np.mean(hi - lo) | |
| 31 | + wis = np.mean((hi - lo) + 2 / alpha * (lo - y) * (y < lo) + 2 / alpha * (y - hi) * (y > hi)) | |
| 32 | + return {"coverage": float(cov), "width": float(width), "interval_score": float(wis)} | |
| 33 | + | |
| 34 | + | |
| 35 | +def crps_gaussian(y: np.ndarray, mu: np.ndarray, sigma: np.ndarray) -> np.ndarray: | |
| 36 | + z = (y - mu) / sigma | |
| 37 | + return sigma * (z * (2 * stats.norm.cdf(z) - 1) + 2 * stats.norm.pdf(z) - 1 / np.sqrt(np.pi)) | |
| 38 | + | |
| 39 | + | |
| 40 | +# ---- tests ------------------------------------------------------------------------------------ | |
| 41 | +def hac_var(d: np.ndarray, lags: int) -> float: | |
| 42 | + d = d - d.mean(); n = len(d); v = np.sum(d * d) / n | |
| 43 | + for L in range(1, lags + 1): | |
| 44 | + w = 1 - L / (lags + 1); v += 2 * w * np.sum(d[L:] * d[:-L]) / n | |
| 45 | + return max(v, 1e-18) | |
| 46 | + | |
| 47 | + | |
| 48 | +def diebold_mariano(loss_a: np.ndarray, loss_b: np.ndarray, h: int = 1, small_sample: bool = True) -> dict: | |
| 49 | + """DM test of H0: E[loss_a − loss_b] = 0 with Newey–West variance (h−1 lags) and the Harvey–Leybourne–Newbold correction.""" | |
| 50 | + d = loss_a - loss_b; d = d[np.isfinite(d)]; n = len(d) | |
| 51 | + if n < 10: | |
| 52 | + return {"dm": np.nan, "p": np.nan, "n": n, "mean_diff": float(np.mean(d)) if n else np.nan} | |
| 53 | + v = hac_var(d, max(h - 1, 0)); dm = d.mean() / np.sqrt(v / n) | |
| 54 | + if small_sample: | |
| 55 | + dm *= np.sqrt((n + 1 - 2 * h + h * (h - 1) / n) / n) | |
| 56 | + p = 2 * (1 - stats.t.cdf(abs(dm), df=n - 1)) | |
| 57 | + else: | |
| 58 | + p = 2 * (1 - stats.norm.cdf(abs(dm))) | |
| 59 | + return {"dm": float(dm), "p": float(p), "n": n, "mean_diff": float(d.mean())} | |
| 60 | + | |
| 61 | + | |
| 62 | +def giacomini_white(loss_a: np.ndarray, loss_b: np.ndarray, Z: np.ndarray | None = None, h: int = 1) -> dict: | |
| 63 | + """Conditional predictive ability test: regress d_t on instruments Z_{t-1} (constant + lagged d by default); Wald test with HAC.""" | |
| 64 | + d = loss_a - loss_b; ok = np.isfinite(d); d = d[ok] | |
| 65 | + if Z is None: | |
| 66 | + Z = np.column_stack([np.ones(len(d) - 1), d[:-1]]); dd = d[1:] | |
| 67 | + else: | |
| 68 | + Z = Z[ok][1:]; dd = d[1:] | |
| 69 | + n, q = Z.shape | |
| 70 | + if n < 10 + q: | |
| 71 | + return {"stat": np.nan, "p": np.nan, "n": n} | |
| 72 | + Zd = Z * dd[:, None]; m = Zd.mean(axis=0) | |
| 73 | + S = np.zeros((q, q)); lags = max(h - 1, 0) | |
| 74 | + Zc = Zd - m | |
| 75 | + S = Zc.T @ Zc / n | |
| 76 | + for L in range(1, lags + 1): | |
| 77 | + w = 1 - L / (lags + 1); G = Zc[L:].T @ Zc[:-L] / n; S += w * (G + G.T) | |
| 78 | + try: | |
| 79 | + stat = float(n * m @ np.linalg.solve(S, m)) | |
| 80 | + except np.linalg.LinAlgError: | |
| 81 | + return {"stat": np.nan, "p": np.nan, "n": n} | |
| 82 | + return {"stat": stat, "p": float(1 - stats.chi2.cdf(stat, q)), "n": n} | |
| 83 | + | |
| 84 | + | |
| 85 | +def stationary_bootstrap_indices(n: int, mean_block: float, rng: np.random.Generator) -> np.ndarray: | |
| 86 | + p = 1 / mean_block; idx = np.empty(n, int); i = rng.integers(n) | |
| 87 | + for t in range(n): | |
| 88 | + if t > 0 and rng.random() > p: | |
| 89 | + i = (i + 1) % n | |
| 90 | + else: | |
| 91 | + i = rng.integers(n) | |
| 92 | + idx[t] = i | |
| 93 | + return idx | |
| 94 | + | |
| 95 | + | |
| 96 | +def model_confidence_set(losses: np.ndarray, names: list[str], alpha: float = 0.10, B: int = 1000, mean_block: float = 3.0, seed: int = 0) -> dict: | |
| 97 | + """Hansen–Lunde–Nason MCS with the T_max statistic and the stationary bootstrap. losses: (T, M).""" | |
| 98 | + rng = np.random.default_rng(seed) | |
| 99 | + L = losses[np.all(np.isfinite(losses), axis=1)]; T, M = L.shape | |
| 100 | + alive = list(range(M)); pvals = {}; order = [] | |
| 101 | + boots = [stationary_bootstrap_indices(T, mean_block, rng) for _ in range(B)] | |
| 102 | + while len(alive) > 1: | |
| 103 | + Lk = L[:, alive]; dbar = Lk.mean(axis=0) - Lk.mean() | |
| 104 | + # bootstrap distribution of the deviations | |
| 105 | + bd = np.array([(Lk[b].mean(axis=0) - Lk[b].mean()) - dbar for b in boots]) | |
| 106 | + var = np.maximum(bd.var(axis=0), 1e-18) | |
| 107 | + t_stat = dbar / np.sqrt(var); tmax = t_stat.max() | |
| 108 | + tmax_b = (bd / np.sqrt(var)).max(axis=1) | |
| 109 | + p = float(np.mean(tmax_b >= tmax)) | |
| 110 | + worst = int(np.argmax(t_stat)); name = names[alive[worst]] | |
| 111 | + pvals[name] = max(p, max(pvals.values()) if pvals else 0.0); order.append(name) | |
| 112 | + if p >= alpha: | |
| 113 | + break | |
| 114 | + alive.pop(worst) | |
| 115 | + for i in alive: | |
| 116 | + pvals.setdefault(names[i], 1.0) | |
| 117 | + return {"mcs_pvalues": pvals, "in_mcs": [n for n, p in pvals.items() if p >= alpha], "eliminated_in_order": order} | |
| 118 | + | |
| 119 | + | |
| 120 | +def block_bootstrap_ci(values: np.ndarray, stat=np.mean, B: int = 1000, mean_block: float = 3.0, seed: int = 0, level: float = 0.95) -> tuple[float, float]: | |
| 121 | + rng = np.random.default_rng(seed); v = values[np.isfinite(values)]; n = len(v) | |
| 122 | + s = np.array([stat(v[stationary_bootstrap_indices(n, mean_block, rng)]) for _ in range(B)]) | |
| 123 | + return float(np.quantile(s, (1 - level) / 2)), float(np.quantile(s, 1 - (1 - level) / 2)) | |
added
src/wp23/models_a.py
+99 −0
@@ -0,0 +1,99 @@ | ||
| 1 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 2 | +"""Task A models (property-level price at a future sale date). All expose fit(X, y, meta) / predict(X, meta) → point (log price) | |
| 3 | +and, where available, predict_quantiles(X, meta, taus) → (n, len(taus)). `meta` carries the categorical keys for the | |
| 4 | +hierarchical model (municipality / MRC / region codes, horizon).""" | |
| 5 | +from __future__ import annotations | |
| 6 | + | |
| 7 | +import os | |
| 8 | + | |
| 9 | +import numpy as np | |
| 10 | + | |
| 11 | +# NOTE (macOS): LightGBM / XGBoost (libomp) and PyTorch cannot train in the same process without a segmentation fault or a | |
| 12 | +# deadlock in the OpenMP runtime. Tree models live here (lazy imports); neural models live in models_a_torch.py; the runner | |
| 13 | +# executes the two families in separate processes (`--family trees|torch`). | |
| 14 | +from sklearn.ensemble import RandomForestRegressor | |
| 15 | +from sklearn.linear_model import ElasticNet, Ridge | |
| 16 | +from sklearn.svm import SVR | |
| 17 | + | |
| 18 | +TAUS = np.array([0.05, 0.25, 0.5, 0.75, 0.95]) | |
| 19 | + | |
| 20 | + | |
| 21 | +class OLS: | |
| 22 | + name = "hedonic_ols" | |
| 23 | + def fit(self, X, y, meta=None): | |
| 24 | + Xa = np.column_stack([np.ones(len(X)), X]); self.b = np.linalg.lstsq(Xa, y, rcond=None)[0] | |
| 25 | + r = y - Xa @ self.b; self.sigma = r.std(); return self | |
| 26 | + def predict(self, X, meta=None): | |
| 27 | + return np.column_stack([np.ones(len(X)), X]) @ self.b | |
| 28 | + def predict_quantiles(self, X, meta=None, taus=TAUS): | |
| 29 | + from scipy.stats import norm | |
| 30 | + m = self.predict(X); return m[:, None] + self.sigma * norm.ppf(taus)[None, :] | |
| 31 | + | |
| 32 | + | |
| 33 | +class RidgeM(OLS): | |
| 34 | + name = "ridge" | |
| 35 | + def fit(self, X, y, meta=None): | |
| 36 | + self.mu = X.mean(0); self.sd = X.std(0) + 1e-9; self.m = Ridge(alpha=1.0).fit((X - self.mu) / self.sd, y) | |
| 37 | + self.sigma = (y - self.m.predict((X - self.mu) / self.sd)).std(); return self | |
| 38 | + def predict(self, X, meta=None): | |
| 39 | + return self.m.predict((X - self.mu) / self.sd) | |
| 40 | + | |
| 41 | + | |
| 42 | +class ElasticNetM(RidgeM): | |
| 43 | + name = "elastic_net" | |
| 44 | + def fit(self, X, y, meta=None): | |
| 45 | + self.mu = X.mean(0); self.sd = X.std(0) + 1e-9; self.m = ElasticNet(alpha=0.001, l1_ratio=0.5, max_iter=3000).fit((X - self.mu) / self.sd, y) | |
| 46 | + self.sigma = (y - self.m.predict((X - self.mu) / self.sd)).std(); return self | |
| 47 | + | |
| 48 | + | |
| 49 | +class RF: | |
| 50 | + name = "random_forest" | |
| 51 | + def fit(self, X, y, meta=None): | |
| 52 | + self.m = RandomForestRegressor(n_estimators=150, max_depth=18, min_samples_leaf=5, max_features=0.5, n_jobs=int(os.environ.get("WP23_JOBS", "8")), random_state=0).fit(X, y); return self | |
| 53 | + def predict(self, X, meta=None): | |
| 54 | + return self.m.predict(X) | |
| 55 | + | |
| 56 | + | |
| 57 | +class XGB: | |
| 58 | + name = "xgboost" | |
| 59 | + def fit(self, X, y, meta=None): | |
| 60 | + import xgboost as xgb | |
| 61 | + self.m = xgb.XGBRegressor(n_estimators=600, learning_rate=0.05, max_depth=8, subsample=0.8, colsample_bytree=0.8, tree_method="hist", n_jobs=int(os.environ.get("WP23_JOBS", "8")), random_state=0).fit(X, y); return self | |
| 62 | + def predict(self, X, meta=None): | |
| 63 | + return self.m.predict(X) | |
| 64 | + | |
| 65 | + | |
| 66 | +class LGBM: | |
| 67 | + name = "lightgbm" | |
| 68 | + def __init__(self, quantiles: bool = True): | |
| 69 | + self.quantiles = quantiles | |
| 70 | + def fit(self, X, y, meta=None): | |
| 71 | + import lightgbm as lgb | |
| 72 | + kw = dict(n_estimators=800, learning_rate=0.04, num_leaves=63, min_child_samples=30, subsample=0.8, subsample_freq=1, colsample_bytree=0.8, n_jobs=int(os.environ.get("WP23_JOBS", "8")), random_state=0, verbose=-1) | |
| 73 | + self.m = lgb.LGBMRegressor(objective="l2", **kw).fit(X, y) | |
| 74 | + if self.quantiles: | |
| 75 | + self.q = {t: lgb.LGBMRegressor(objective="quantile", alpha=float(t), **{**kw, "n_estimators": 400}).fit(X, y) for t in TAUS} | |
| 76 | + return self | |
| 77 | + def predict(self, X, meta=None): | |
| 78 | + return self.m.predict(X) | |
| 79 | + def predict_quantiles(self, X, meta=None, taus=TAUS): | |
| 80 | + Q = np.column_stack([self.q[t].predict(X) for t in taus]); return np.sort(Q, axis=1) | |
| 81 | + | |
| 82 | + | |
| 83 | +class SVRM: | |
| 84 | + name = "svr" | |
| 85 | + def fit(self, X, y, meta=None, n_max=15000): | |
| 86 | + rng = np.random.default_rng(0); idx = rng.choice(len(X), min(n_max, len(X)), replace=False) | |
| 87 | + self.mu = X.mean(0); self.sd = X.std(0) + 1e-9; self.m = SVR(C=3.0, epsilon=0.05, gamma="scale").fit((X[idx] - self.mu) / self.sd, y[idx]); return self | |
| 88 | + def predict(self, X, meta=None): | |
| 89 | + return self.m.predict((X - self.mu) / self.sd) | |
| 90 | + | |
| 91 | + | |
| 92 | +def registry(family: str = "trees", fast: bool = False) -> list: | |
| 93 | + if family == "torch": | |
| 94 | + from wp23.models_a_torch import HSHN, MLP | |
| 95 | + return [MLP(), HSHN("partial"), HSHN("full"), HSHN("none")] | |
| 96 | + base = [OLS(), RidgeM(), ElasticNetM(), LGBM(), XGB()] | |
| 97 | + if not fast: | |
| 98 | + base += [RF(), SVRM()] | |
| 99 | + return base | |
added
src/wp23/models_a_torch.py
+102 −0
@@ -0,0 +1,102 @@ | ||
| 1 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 2 | +"""Task A neural models (PyTorch). Never import lightgbm / xgboost in the same process (OpenMP conflict on macOS).""" | |
| 3 | +from __future__ import annotations | |
| 4 | + | |
| 5 | +import os | |
| 6 | + | |
| 7 | +import numpy as np | |
| 8 | +import torch | |
| 9 | +import torch.nn as nn | |
| 10 | + | |
| 11 | +from wp23.models_a import TAUS | |
| 12 | + | |
| 13 | +torch.set_num_threads(int(os.environ.get("WP23_TORCH_THREADS", "6"))) | |
| 14 | + | |
| 15 | + | |
| 16 | +def _pinball(pred, y, taus): | |
| 17 | + d = y[:, None] - pred; return torch.mean(torch.maximum(taus * d, (taus - 1) * d)) | |
| 18 | + | |
| 19 | + | |
| 20 | +class MLP: | |
| 21 | + """Multilayer perceptron with a quantile head (pinball loss on 5 quantiles; the median is the point forecast).""" | |
| 22 | + name = "mlp" | |
| 23 | + def __init__(self, hidden=(256, 128), epochs=8, lr=2e-3, batch=4096, seed=0): | |
| 24 | + self.hidden, self.epochs, self.lr, self.batch, self.seed = hidden, epochs, lr, batch, seed | |
| 25 | + def _net(self, d): | |
| 26 | + layers = []; last = d | |
| 27 | + for h in self.hidden: | |
| 28 | + layers += [nn.Linear(last, h), nn.GELU(), nn.Dropout(0.1)]; last = h | |
| 29 | + layers += [nn.Linear(last, len(TAUS))]; return nn.Sequential(*layers) | |
| 30 | + def fit(self, X, y, meta=None): | |
| 31 | + torch.manual_seed(self.seed); self.mu = X.mean(0); self.sd = X.std(0) + 1e-9 | |
| 32 | + Xt = torch.tensor((X - self.mu) / self.sd, dtype=torch.float32); yt = torch.tensor(y, dtype=torch.float32); taus = torch.tensor(TAUS, dtype=torch.float32) | |
| 33 | + self.net = self._net(X.shape[1]); opt = torch.optim.AdamW(self.net.parameters(), lr=self.lr, weight_decay=1e-4) | |
| 34 | + sched = torch.optim.lr_scheduler.OneCycleLR(opt, max_lr=self.lr, total_steps=self.epochs * ((len(Xt) + self.batch - 1) // self.batch)) | |
| 35 | + self.net.train() | |
| 36 | + for ep in range(self.epochs): | |
| 37 | + perm = torch.randperm(len(Xt)) | |
| 38 | + for i in range(0, len(Xt), self.batch): | |
| 39 | + b = perm[i:i + self.batch]; opt.zero_grad(); loss = _pinball(self.net(Xt[b]), yt[b], taus); loss.backward(); opt.step(); sched.step() | |
| 40 | + self.net.eval(); return self | |
| 41 | + def predict_quantiles(self, X, meta=None, taus=TAUS): | |
| 42 | + with torch.no_grad(): | |
| 43 | + Q = self.net(torch.tensor((X - self.mu) / self.sd, dtype=torch.float32)).numpy() | |
| 44 | + return np.sort(Q, axis=1) | |
| 45 | + def predict(self, X, meta=None): | |
| 46 | + return self.predict_quantiles(X, meta)[:, 2] | |
| 47 | + | |
| 48 | + | |
| 49 | +class HSHN(MLP): | |
| 50 | + """Hierarchical spatiotemporal hedonic network: the MLP of the hedonic + market features plus learned embeddings of the | |
| 51 | + municipality, MRC and region (nested: the municipality embedding is a *deviation* penalised toward zero, so thin | |
| 52 | + municipalities fall back on their MRC and region — partial pooling by weight decay), a horizon embedding, and an | |
| 53 | + interaction block between the horizon/market state and the hedonic representation. pooling ∈ {partial, full, none}.""" | |
| 54 | + name = "hshn" | |
| 55 | + def __init__(self, pooling="partial", emb=8, hidden=(256, 128), epochs=8, lr=2e-3, batch=4096, seed=0, mun_decay=5e-3): | |
| 56 | + super().__init__(hidden, epochs, lr, batch, seed); self.pooling, self.emb, self.mun_decay = pooling, emb, mun_decay | |
| 57 | + self.name = f"hshn_{pooling}" | |
| 58 | + def _codes(self, meta, fit=False): | |
| 59 | + out = [] | |
| 60 | + for k in ("mun_code", "mrc_code", "region_code"): | |
| 61 | + v = np.asarray(meta[k]).astype(str) | |
| 62 | + if fit: | |
| 63 | + self.maps = getattr(self, "maps", {}); self.maps[k] = {c: i + 1 for i, c in enumerate(sorted(set(v)))} | |
| 64 | + out.append(torch.tensor([self.maps[k].get(c, 0) for c in v])) | |
| 65 | + h = torch.tensor(np.clip(np.asarray(meta["h"]).astype(int), 0, 12)); return out + [h] | |
| 66 | + def fit(self, X, y, meta=None): | |
| 67 | + torch.manual_seed(self.seed); self.mu = X.mean(0); self.sd = X.std(0) + 1e-9 | |
| 68 | + Xt = torch.tensor((X - self.mu) / self.sd, dtype=torch.float32); yt = torch.tensor(y, dtype=torch.float32); taus = torch.tensor(TAUS, dtype=torch.float32) | |
| 69 | + codes = self._codes(meta, fit=True) | |
| 70 | + n_mun, n_mrc, n_reg = (len(self.maps["mun_code"]) + 1, len(self.maps["mrc_code"]) + 1, len(self.maps["region_code"]) + 1) | |
| 71 | + e = self.emb | |
| 72 | + self.emb_mun = nn.Embedding(n_mun, e); self.emb_mrc = nn.Embedding(n_mrc, e); self.emb_reg = nn.Embedding(n_reg, e); self.emb_h = nn.Embedding(13, 4) | |
| 73 | + for em in (self.emb_mun, self.emb_mrc, self.emb_reg, self.emb_h): | |
| 74 | + nn.init.normal_(em.weight, std=0.02) | |
| 75 | + d_in = X.shape[1] + e + 4 | |
| 76 | + self.enc = nn.Sequential(nn.Linear(d_in, self.hidden[0]), nn.GELU(), nn.Dropout(0.1), nn.Linear(self.hidden[0], self.hidden[1]), nn.GELU()) | |
| 77 | + self.inter = nn.Sequential(nn.Linear(self.hidden[1] + e + 4, 64), nn.GELU()) | |
| 78 | + self.head = nn.Linear(self.hidden[1] + 64, len(TAUS)) | |
| 79 | + params = [p for m in (self.emb_mrc, self.emb_reg, self.emb_h, self.enc, self.inter, self.head) for p in m.parameters()] | |
| 80 | + groups = [{"params": params, "weight_decay": 1e-4}] | |
| 81 | + if self.pooling != "full": | |
| 82 | + groups.append({"params": self.emb_mun.parameters(), "weight_decay": self.mun_decay if self.pooling == "partial" else 0.0}) | |
| 83 | + opt = torch.optim.AdamW(groups, lr=self.lr) | |
| 84 | + steps = self.epochs * ((len(Xt) + self.batch - 1) // self.batch); sched = torch.optim.lr_scheduler.OneCycleLR(opt, max_lr=self.lr, total_steps=steps) | |
| 85 | + for ep in range(self.epochs): | |
| 86 | + perm = torch.randperm(len(Xt)) | |
| 87 | + for i in range(0, len(Xt), self.batch): | |
| 88 | + b = perm[i:i + self.batch]; opt.zero_grad(); loss = _pinball(self._forward(Xt[b], [c[b] for c in codes]), yt[b], taus); loss.backward(); opt.step(); sched.step() | |
| 89 | + return self | |
| 90 | + def _forward(self, x, codes): | |
| 91 | + mun, mrc, reg, h = codes | |
| 92 | + g = self.emb_reg(reg) + self.emb_mrc(mrc) + (self.emb_mun(mun) if self.pooling != "full" else 0.0) | |
| 93 | + hv = self.emb_h(h); z = self.enc(torch.cat([x, g, hv], 1)); it = self.inter(torch.cat([z, g, hv], 1)) | |
| 94 | + return self.head(torch.cat([z, it], 1)) | |
| 95 | + def predict_quantiles(self, X, meta=None, taus=TAUS): | |
| 96 | + with torch.no_grad(): | |
| 97 | + for m in (self.enc, self.inter, self.head): | |
| 98 | + m.eval() | |
| 99 | + Q = self._forward(torch.tensor((X - self.mu) / self.sd, dtype=torch.float32), self._codes(meta)).numpy() | |
| 100 | + return np.sort(Q, axis=1) | |
| 101 | + | |
| 102 | + | |
added
src/wp23/models_b.py
+242 −0
@@ -0,0 +1,242 @@ | ||
| 1 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 2 | +"""Task B models: forecast the h-month change of a cell's quality-adjusted log index from information at the origin. | |
| 3 | + | |
| 4 | +Interface: fit(panel_train) ; predict(panel_test) → point forecast of `target`; predict_quantiles(panel_test, taus) optional. | |
| 5 | +`panel_*` are polars frames from data_b.build_panel restricted to one horizon h (train rows: origins whose target is observed | |
| 6 | +before the test origin — enforced by the caller). | |
| 7 | +Simple benchmarks: no-change (0), mean growth (historical mean h-change of the cell), momentum (last 3-m change scaled), | |
| 8 | +seasonal naive (same-calendar change last year), random walk with drift (12-m drift × h/12). | |
| 9 | +Time-series benchmarks on each cell's own history: AR(2) on monthly changes, local linear trend (Kalman). | |
| 10 | +Pooled panel benchmarks: ridge, LightGBM, MLP, LSTM / GRU / TCN on the 13-month history, TFT-lite (variable-selection + attention). | |
| 11 | +Proposed: DSGFN (graph attention over cells), RAREF (HMM regimes + gated experts), BHPF (hierarchical Bayesian ridge, posterior predictive), | |
| 12 | +QANSS (Kalman latent state per cell with learned nonlinear drift), QREFA (integration).""" | |
| 13 | +from __future__ import annotations | |
| 14 | + | |
| 15 | +import os | |
| 16 | + | |
| 17 | +import numpy as np | |
| 18 | +import polars as pl | |
| 19 | +from sklearn.linear_model import Ridge | |
| 20 | + | |
| 21 | +from wp23.data_b import FEATURES_B | |
| 22 | + | |
| 23 | +TAUS = np.array([0.05, 0.25, 0.5, 0.75, 0.95]) | |
| 24 | + | |
| 25 | + | |
| 26 | +def _X(df: pl.DataFrame) -> np.ndarray: | |
| 27 | + return np.nan_to_num(df.select(FEATURES_B).to_numpy().astype(float)) | |
| 28 | + | |
| 29 | + | |
| 30 | +def _keys(df: pl.DataFrame, cols: list[str]) -> np.ndarray: | |
| 31 | + return df.select(pl.concat_str([pl.col(c).cast(pl.Utf8).fill_null("na") for c in cols], separator="|").alias("k"))["k"].to_numpy().astype(str) | |
| 32 | + | |
| 33 | + | |
| 34 | +def _H(df: pl.DataFrame) -> np.ndarray: | |
| 35 | + H = np.array(df["hist"].to_list(), float); return H - H[:, [-1]] # history relative to the origin level | |
| 36 | + | |
| 37 | + | |
| 38 | +class Base: | |
| 39 | + name = "base"; prob = False | |
| 40 | + def fit(self, tr): return self | |
| 41 | + def predict(self, te): raise NotImplementedError | |
| 42 | + def predict_quantiles(self, te, taus=TAUS): | |
| 43 | + """Default: empirical residual quantiles from training (homoskedastic).""" | |
| 44 | + p = self.predict(te); return p[:, None] + np.quantile(self._res, taus)[None, :] | |
| 45 | + def _store_res(self, tr): | |
| 46 | + self._res = tr["target"].to_numpy() - self.predict(tr); return self | |
| 47 | + | |
| 48 | + | |
| 49 | +class NoChange(Base): | |
| 50 | + name = "no_change" | |
| 51 | + def fit(self, tr): return self._store_res(tr) | |
| 52 | + def predict(self, te): return np.zeros(te.height) | |
| 53 | + | |
| 54 | + | |
| 55 | +class MeanGrowth(Base): | |
| 56 | + name = "mean_growth" | |
| 57 | + def fit(self, tr): | |
| 58 | + self.h = int(tr["h"][0]); m = tr.group_by(["class", "level", "geo_id"]).agg(pl.col("target").mean().alias("mg")); self.map = {tuple(k): v for *k, v in m.iter_rows()} | |
| 59 | + self.glob = float(tr["target"].mean()); return self._store_res(tr) | |
| 60 | + def predict(self, te): return np.array([self.map.get((c, l, g), self.glob) for c, l, g in te.select(["class", "level", "geo_id"]).iter_rows()]) | |
| 61 | + | |
| 62 | + | |
| 63 | +class Momentum(Base): | |
| 64 | + name = "momentum" | |
| 65 | + def fit(self, tr): | |
| 66 | + self.h = int(tr["h"][0]); x = tr["d3"].to_numpy() / 3 * self.h; y = tr["target"].to_numpy(); self.b = float(np.sum(x * y) / max(np.sum(x * x), 1e-12)); return self._store_res(tr) | |
| 67 | + def predict(self, te): return self.b * te["d3"].to_numpy() / 3 * self.h | |
| 68 | + | |
| 69 | + | |
| 70 | +class RWDrift(Base): | |
| 71 | + name = "rw_drift" | |
| 72 | + def fit(self, tr): self.h = int(tr["h"][0]); return self._store_res(tr) | |
| 73 | + def predict(self, te): return te["d12"].to_numpy() / 12 * self.h | |
| 74 | + | |
| 75 | + | |
| 76 | +class SeasonalNaive(Base): | |
| 77 | + name = "seasonal_naive" | |
| 78 | + def fit(self, tr): self.h = int(tr["h"][0]); return self._store_res(tr) | |
| 79 | + def predict(self, te): | |
| 80 | + H = np.array(te["hist"].to_list(), float); h = self.h | |
| 81 | + # change over the same months one year earlier, when the 13-month history covers it (h ≤ 12 → months -12..-12+h) | |
| 82 | + if h <= 12 and H.shape[1] >= 13: | |
| 83 | + return H[:, h] - H[:, 0] | |
| 84 | + return np.zeros(te.height) | |
| 85 | + | |
| 86 | + | |
| 87 | +class AR2(Base): | |
| 88 | + name = "ar2_cell" | |
| 89 | + def fit(self, tr): | |
| 90 | + self.h = int(tr["h"][0]); D = np.diff(_H(tr), axis=1); y = tr["target"].to_numpy() | |
| 91 | + X = np.column_stack([np.ones(len(D)), D[:, -1], D[:, -2]]); self.b = np.linalg.lstsq(X, y, rcond=None)[0]; return self._store_res(tr) | |
| 92 | + def predict(self, te): D = np.diff(_H(te), axis=1); return np.column_stack([np.ones(len(D)), D[:, -1], D[:, -2]]) @ self.b | |
| 93 | + | |
| 94 | + | |
| 95 | +class LocalLinearTrend(Base): | |
| 96 | + name = "local_linear_trend" | |
| 97 | + def fit(self, tr): self.h = int(tr["h"][0]); return self._store_res(tr) | |
| 98 | + def predict(self, te): | |
| 99 | + import sys | |
| 100 | + from wp23 import config as C | |
| 101 | + sys.path.insert(0, str(C.WP22_SRC)); from sharp_hpi.statespace import _filter_llt | |
| 102 | + out = np.empty(te.height); H = np.array(te["hist"].to_list(), float) | |
| 103 | + for i, y in enumerate(H): | |
| 104 | + r = np.full(len(y), 1e-4); a, p, s, sv, g, ll, vs = _filter_llt(y, r, 1e-5, 2e-6, 1.0) | |
| 105 | + # slope at the end from the filtered state (re-run with 2-state output): approximate slope = last filtered level change | |
| 106 | + out[i] = (a[-1] - a[-2]) * self.h | |
| 107 | + return out | |
| 108 | + | |
| 109 | + | |
| 110 | +class RidgePanel(Base): | |
| 111 | + name = "ridge_panel" | |
| 112 | + def fit(self, tr): | |
| 113 | + X = _X(tr); self.mu = X.mean(0); self.sd = X.std(0) + 1e-9; self.m = Ridge(alpha=3.0).fit((X - self.mu) / self.sd, tr["target"].to_numpy()); return self._store_res(tr) | |
| 114 | + def predict(self, te): return self.m.predict((_X(te) - self.mu) / self.sd) | |
| 115 | + | |
| 116 | + | |
| 117 | +class LGBMPanel(Base): | |
| 118 | + name = "lightgbm_panel"; prob = True | |
| 119 | + def fit(self, tr): | |
| 120 | + import lightgbm as lgb | |
| 121 | + X = _X(tr); y = tr["target"].to_numpy(); kw = dict(n_estimators=300, learning_rate=0.03, num_leaves=15, min_child_samples=40, subsample=0.8, subsample_freq=1, colsample_bytree=0.8, verbose=-1, n_jobs=4, random_state=0) | |
| 122 | + self.m = lgb.LGBMRegressor(objective="l2", **kw).fit(X, y); self.q = {t: lgb.LGBMRegressor(objective="quantile", alpha=float(t), **kw).fit(X, y) for t in TAUS}; return self._store_res(tr) | |
| 123 | + def predict(self, te): return self.m.predict(_X(te)) | |
| 124 | + def predict_quantiles(self, te, taus=TAUS): return np.sort(np.column_stack([self.q[t].predict(_X(te)) for t in taus]), axis=1) | |
| 125 | + | |
| 126 | + | |
| 127 | +class GaussianHMM: | |
| 128 | + """Two-state Gaussian HMM on a univariate series, EM (Baum–Welch); used on the provincial/regional real-time growth at the origin.""" | |
| 129 | + def __init__(self, K=3, iters=60, seed=0): self.K, self.iters, self.rng = K, iters, np.random.default_rng(seed) | |
| 130 | + def fit(self, x): | |
| 131 | + x = np.asarray(x, float); K = self.K; q = np.quantile(x, np.linspace(0.2, 0.8, K)); mu = q.copy(); sd = np.full(K, x.std() + 1e-6); A = np.full((K, K), 0.1) + np.eye(K) * (0.9 - 0.1 * (K - 1)); pi = np.full(K, 1 / K) | |
| 132 | + for _ in range(self.iters): | |
| 133 | + B = np.exp(-0.5 * ((x[:, None] - mu) / sd) ** 2) / sd; T = len(x); al = np.zeros((T, K)); be = np.zeros((T, K)); c = np.zeros(T) | |
| 134 | + al[0] = pi * B[0]; c[0] = al[0].sum() + 1e-300; al[0] /= c[0] | |
| 135 | + for t in range(1, T): | |
| 136 | + al[t] = (al[t - 1] @ A) * B[t]; c[t] = al[t].sum() + 1e-300; al[t] /= c[t] | |
| 137 | + be[-1] = 1 | |
| 138 | + for t in range(T - 2, -1, -1): | |
| 139 | + be[t] = (A @ (B[t + 1] * be[t + 1])) / c[t + 1] | |
| 140 | + g = al * be; g /= g.sum(1, keepdims=True) + 1e-300 | |
| 141 | + xi = np.zeros((K, K)) | |
| 142 | + for t in range(T - 1): | |
| 143 | + m = al[t][:, None] * A * (B[t + 1] * be[t + 1])[None, :]; xi += m / (m.sum() + 1e-300) | |
| 144 | + pi = g[0]; A = xi / (xi.sum(1, keepdims=True) + 1e-300); mu = (g * x[:, None]).sum(0) / (g.sum(0) + 1e-300); sd = np.sqrt((g * (x[:, None] - mu) ** 2).sum(0) / (g.sum(0) + 1e-300)) + 1e-4 | |
| 145 | + self.mu, self.sd, self.A, self.pi = mu, sd, A, pi; self.filtered = al; return self | |
| 146 | + def filter_last(self, x): | |
| 147 | + x = np.asarray(x, float); B = np.exp(-0.5 * ((x[:, None] - self.mu) / self.sd) ** 2) / self.sd; al = self.pi * B[0]; al /= al.sum() + 1e-300 | |
| 148 | + for t in range(1, len(x)): | |
| 149 | + al = (al @ self.A) * B[t]; al /= al.sum() + 1e-300 | |
| 150 | + return al | |
| 151 | + | |
| 152 | + | |
| 153 | +class RAREF(Base): | |
| 154 | + """Regime-adaptive forecasting: a 3-state Gaussian HMM is estimated at each origin on the provincial real-time monthly growth | |
| 155 | + (information ≤ origin only); the filtered regime probabilities gate a mixture of ridge experts (one per regime) estimated on | |
| 156 | + training rows weighted by their own origin's regime probabilities. Forecast = probability-weighted expert forecast.""" | |
| 157 | + name = "raref"; prob = True | |
| 158 | + def __init__(self, K=3): self.K = K | |
| 159 | + def _probs(self, df): | |
| 160 | + # per origin: filtered regime probabilities of the provincial growth series up to that origin | |
| 161 | + out = np.zeros((df.height, self.K)); cache = {} | |
| 162 | + for i, (o, c) in enumerate(df.select(["origin", "class"]).iter_rows()): | |
| 163 | + if (o, c) not in cache: | |
| 164 | + hist = df.filter((pl.col("origin") == o) & (pl.col("class") == c) & (pl.col("level") == "province")) | |
| 165 | + if hist.height == 0: | |
| 166 | + cache[(o, c)] = np.full(self.K, 1 / self.K) | |
| 167 | + else: | |
| 168 | + g = np.diff(np.array(hist["hist"][0], float)); key = (o, c) | |
| 169 | + series = self._growth_series(df, o, c) | |
| 170 | + cache[key] = self.hmm_for(series).filter_last(series) if len(series) > 10 else np.full(self.K, 1 / self.K) | |
| 171 | + out[i] = cache[(o, c)] | |
| 172 | + return out | |
| 173 | + def _growth_series(self, df, o, c): | |
| 174 | + # concatenate provincial growth across origins ≤ o from the stored histories (real-time at each origin): use the origin's own 13-month history | |
| 175 | + # extended backward with the earliest available origins (all ≤ o → no leakage) | |
| 176 | + hs = df.filter((pl.col("class") == c) & (pl.col("level") == "province") & (pl.col("origin") <= o)).sort("origin") | |
| 177 | + if hs.height == 0: | |
| 178 | + return np.array([]) | |
| 179 | + seq = [] | |
| 180 | + for o2, hh in zip(hs["origin"].to_list(), hs["hist"].to_list()): | |
| 181 | + seq.append(np.diff(np.array(hh, float))[-1]) # last monthly growth known at each past origin | |
| 182 | + return np.array(seq) | |
| 183 | + def hmm_for(self, series): | |
| 184 | + return GaussianHMM(self.K).fit(series) | |
| 185 | + def fit(self, tr): | |
| 186 | + self.P = self._probs(tr); X = _X(tr); self.mu = X.mean(0); self.sd = X.std(0) + 1e-9; Xs = (X - self.mu) / self.sd; y = tr["target"].to_numpy() | |
| 187 | + self.experts = [] | |
| 188 | + for k in range(self.K): | |
| 189 | + w = self.P[:, k] + 1e-3; self.experts.append(Ridge(alpha=3.0).fit(Xs, y, sample_weight=w)) | |
| 190 | + self._train_df = tr; return self._store_res(tr) | |
| 191 | + def predict(self, te): | |
| 192 | + both = pl.concat([self._train_df.select(te.columns), te], how="diagonal") if te.height else te | |
| 193 | + P = self._probs(both)[-te.height:]; Xs = (_X(te) - self.mu) / self.sd | |
| 194 | + return sum(P[:, k] * self.experts[k].predict(Xs) for k in range(self.K)) | |
| 195 | + | |
| 196 | + | |
| 197 | +class BHPF(Base): | |
| 198 | + """Bayesian hierarchical probabilistic forecasting: hierarchical linear model with cell-level random intercepts (shrunk toward | |
| 199 | + their region, then the class mean) and common slopes on the standardized features; conjugate Gaussian posterior (ridge-type) | |
| 200 | + with variance components estimated by REML-like iteration; predictive distribution = posterior predictive Gaussian with | |
| 201 | + cell-specific variance. Laplace/conjugate rather than MCMC: exact for this Gaussian model.""" | |
| 202 | + name = "bhpf"; prob = True | |
| 203 | + def fit(self, tr): | |
| 204 | + X = _X(tr); self.mu = X.mean(0); self.sd = X.std(0) + 1e-9; Xs = (X - self.mu) / self.sd; y = tr["target"].to_numpy() | |
| 205 | + cells = _keys(tr, ["class", "level", "geo_id"]); regs = _keys(tr, ["class", "region_code"]) | |
| 206 | + self.cells = sorted(set(cells)); self.regs = sorted(set(regs)); ci = {c: i for i, c in enumerate(self.cells)}; ri = {r: i for i, r in enumerate(self.regs)} | |
| 207 | + Zc = np.zeros((len(y), len(self.cells))); Zc[np.arange(len(y)), [ci[c] for c in cells]] = 1 | |
| 208 | + Zr = np.zeros((len(y), len(self.regs))); Zr[np.arange(len(y)), [ri[r] for r in regs]] = 1 | |
| 209 | + self.ci, self.ri = ci, ri | |
| 210 | + D = np.column_stack([np.ones(len(y)), Xs, Zr, Zc]); p = Xs.shape[1] | |
| 211 | + tau_b, tau_r, tau_c, s2 = 1.0, 0.01, 0.01, float(y.var()) | |
| 212 | + for _ in range(15): | |
| 213 | + prec = np.concatenate([[1e-6], np.full(p, 1 / tau_b), np.full(len(self.regs), 1 / tau_r), np.full(len(self.cells), 1 / tau_c)]) | |
| 214 | + Ainv = np.linalg.inv(D.T @ D / s2 + np.diag(prec)); beta = Ainv @ (D.T @ y / s2); r = y - D @ beta | |
| 215 | + s2 = float(np.mean(r ** 2)) + 1e-9 | |
| 216 | + br = beta[1 + p: 1 + p + len(self.regs)]; bc = beta[1 + p + len(self.regs):] | |
| 217 | + tau_r = max(float(np.mean(br ** 2) + np.mean(np.diag(Ainv)[1 + p: 1 + p + len(self.regs)])), 1e-6); tau_c = max(float(np.mean(bc ** 2) + np.mean(np.diag(Ainv)[1 + p + len(self.regs):])), 1e-6) | |
| 218 | + self.beta, self.Ainv, self.s2, self.p = beta, Ainv, s2, p; self.vc = {"s2": s2, "tau_region": tau_r, "tau_cell": tau_c}; return self._store_res(tr) | |
| 219 | + def _design(self, te): | |
| 220 | + Xs = (_X(te) - self.mu) / self.sd; cells = _keys(te, ["class", "level", "geo_id"]); regs = _keys(te, ["class", "region_code"]) | |
| 221 | + Zc = np.zeros((te.height, len(self.cells))); Zr = np.zeros((te.height, len(self.regs))) | |
| 222 | + for i, (c, r) in enumerate(zip(cells, regs)): | |
| 223 | + if c in self.ci: Zc[i, self.ci[c]] = 1 | |
| 224 | + if r in self.ri: Zr[i, self.ri[r]] = 1 | |
| 225 | + return np.column_stack([np.ones(te.height), Xs, Zr, Zc]) | |
| 226 | + def predict(self, te): return self._design(te) @ self.beta | |
| 227 | + def predict_quantiles(self, te, taus=TAUS): | |
| 228 | + from scipy.stats import norm | |
| 229 | + D = self._design(te); m = D @ self.beta; v = np.einsum("ij,jk,ik->i", D, self.Ainv, D) + self.s2 | |
| 230 | + return m[:, None] + np.sqrt(v)[:, None] * norm.ppf(taus)[None, :] | |
| 231 | + | |
| 232 | + | |
| 233 | +def registry(family: str = "classic", fast: bool = False) -> list: | |
| 234 | + if family == "torch": | |
| 235 | + from wp23.models_b_torch import DSGFN, GRUPanel, LSTMPanel, MLPPanel, QANSS, QREFA, TCNPanel, TFTLite | |
| 236 | + base = [MLPPanel(), LSTMPanel(), GRUPanel(), TCNPanel(), TFTLite(), DSGFN(), QANSS()] | |
| 237 | + if not fast: | |
| 238 | + base.append(QREFA()) | |
| 239 | + return base | |
| 240 | + if family == "trees": | |
| 241 | + return [LGBMPanel()] | |
| 242 | + return [NoChange(), MeanGrowth(), Momentum(), RWDrift(), SeasonalNaive(), AR2(), LocalLinearTrend(), RidgePanel(), RAREF(), BHPF()] | |
added
src/wp23/models_b_torch.py
+216 −0
@@ -0,0 +1,216 @@ | ||
| 1 | +# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca | |
| 2 | +"""Task B neural models (PyTorch): panel MLP / LSTM / GRU / TCN / TFT-lite benchmarks and the proposed DSGFN, QANSS and QREFA. | |
| 3 | +Never import lightgbm / xgboost in this process (OpenMP conflict on macOS).""" | |
| 4 | +from __future__ import annotations | |
| 5 | + | |
| 6 | +import os | |
| 7 | + | |
| 8 | +import numpy as np | |
| 9 | +import polars as pl | |
| 10 | +import torch | |
| 11 | +import torch.nn as nn | |
| 12 | + | |
| 13 | +from wp23.data_b import FEATURES_B | |
| 14 | +from wp23.models_b import TAUS, Base, BHPF, RAREF, _H, _X | |
| 15 | + | |
| 16 | +torch.set_num_threads(int(os.environ.get("WP23_TORCH_THREADS", "6"))) | |
| 17 | + | |
| 18 | + | |
| 19 | +def _pinball(pred, y, taus): | |
| 20 | + d = y[:, None] - pred; return torch.mean(torch.maximum(taus * d, (taus - 1) * d)) | |
| 21 | + | |
| 22 | + | |
| 23 | +class TorchPanel(Base): | |
| 24 | + """Shared training loop for neural panel models: inputs = standardized features + relative history; output = 5 quantiles.""" | |
| 25 | + prob = True | |
| 26 | + def __init__(self, epochs=60, lr=2e-3, batch=512, seed=0, wd=1e-4): | |
| 27 | + self.epochs, self.lr, self.batch, self.seed, self.wd = epochs, lr, batch, seed, wd | |
| 28 | + def _inputs(self, df, fit=False): | |
| 29 | + X = _X(df); H = _H(df) | |
| 30 | + if fit: | |
| 31 | + self.mu, self.sd = X.mean(0), X.std(0) + 1e-9; self.hs = H.std() + 1e-9 | |
| 32 | + return torch.tensor((X - self.mu) / self.sd, dtype=torch.float32), torch.tensor(H / self.hs, dtype=torch.float32) | |
| 33 | + def build(self, d_x, T): raise NotImplementedError | |
| 34 | + def forward(self, x, hist): return self.net(x, hist) | |
| 35 | + def fit(self, tr): | |
| 36 | + torch.manual_seed(self.seed); x, hist = self._inputs(tr, fit=True); y = torch.tensor(tr["target"].to_numpy(), dtype=torch.float32) | |
| 37 | + self.ys = float(y.std()) + 1e-9; y = y / self.ys; taus = torch.tensor(TAUS, dtype=torch.float32) | |
| 38 | + self.build(x.shape[1], hist.shape[1]); self._extra_fit(tr) | |
| 39 | + opt = torch.optim.AdamW(self.parameters(), lr=self.lr, weight_decay=self.wd); n = len(y) | |
| 40 | + for ep in range(self.epochs): | |
| 41 | + perm = torch.randperm(n) | |
| 42 | + for i in range(0, n, self.batch): | |
| 43 | + b = perm[i:i + self.batch]; opt.zero_grad(); loss = _pinball(self.forward(x[b], hist[b]), y[b], taus); loss.backward(); opt.step() | |
| 44 | + self.eval_mode(); return self._store_res(tr) | |
| 45 | + def parameters(self): return self.net.parameters() | |
| 46 | + def eval_mode(self): self.net.eval() | |
| 47 | + def _extra_fit(self, tr): pass | |
| 48 | + def predict_quantiles(self, te, taus=TAUS): | |
| 49 | + with torch.no_grad(): | |
| 50 | + x, hist = self._inputs(te); Q = self.forward(x, hist).numpy() * self.ys | |
| 51 | + return np.sort(Q, axis=1) | |
| 52 | + def predict(self, te): return self.predict_quantiles(te)[:, 2] | |
| 53 | + | |
| 54 | + | |
| 55 | +class MLPNet(nn.Module): | |
| 56 | + def __init__(self, d_x, T, hidden=64): | |
| 57 | + super().__init__(); self.f = nn.Sequential(nn.Linear(d_x + T, hidden), nn.GELU(), nn.Dropout(0.1), nn.Linear(hidden, hidden), nn.GELU(), nn.Linear(hidden, 5)) | |
| 58 | + def forward(self, x, h): return self.f(torch.cat([x, h], 1)) | |
| 59 | + | |
| 60 | + | |
| 61 | +class MLPPanel(TorchPanel): | |
| 62 | + name = "mlp_panel" | |
| 63 | + def build(self, d_x, T): self.net = MLPNet(d_x, T) | |
| 64 | + | |
| 65 | + | |
| 66 | +class RNNNet(nn.Module): | |
| 67 | + def __init__(self, d_x, T, kind="lstm", hidden=32): | |
| 68 | + super().__init__(); cell = nn.LSTM if kind == "lstm" else nn.GRU; self.rnn = cell(1, hidden, batch_first=True); self.f = nn.Sequential(nn.Linear(hidden + d_x, 64), nn.GELU(), nn.Linear(64, 5)) | |
| 69 | + def forward(self, x, h): | |
| 70 | + out, _ = self.rnn(h.unsqueeze(-1)); return self.f(torch.cat([out[:, -1], x], 1)) | |
| 71 | + | |
| 72 | + | |
| 73 | +class LSTMPanel(TorchPanel): | |
| 74 | + name = "lstm" | |
| 75 | + def build(self, d_x, T): self.net = RNNNet(d_x, T, "lstm") | |
| 76 | + | |
| 77 | + | |
| 78 | +class GRUPanel(TorchPanel): | |
| 79 | + name = "gru" | |
| 80 | + def build(self, d_x, T): self.net = RNNNet(d_x, T, "gru") | |
| 81 | + | |
| 82 | + | |
| 83 | +class TCNNet(nn.Module): | |
| 84 | + def __init__(self, d_x, T, ch=16): | |
| 85 | + super().__init__() | |
| 86 | + self.c1 = nn.Conv1d(1, ch, 3, padding=2, dilation=1); self.c2 = nn.Conv1d(ch, ch, 3, padding=4, dilation=2); self.c3 = nn.Conv1d(ch, ch, 3, padding=8, dilation=4) | |
| 87 | + self.f = nn.Sequential(nn.Linear(ch + d_x, 64), nn.GELU(), nn.Linear(64, 5)) | |
| 88 | + def forward(self, x, h): | |
| 89 | + z = h.unsqueeze(1); T = z.shape[-1] | |
| 90 | + z = torch.relu(self.c1(z))[..., :T]; z = torch.relu(self.c2(z))[..., :T]; z = torch.relu(self.c3(z))[..., :T] # causal crops | |
| 91 | + return self.f(torch.cat([z[:, :, -1], x], 1)) | |
| 92 | + | |
| 93 | + | |
| 94 | +class TCNPanel(TorchPanel): | |
| 95 | + name = "tcn" | |
| 96 | + def build(self, d_x, T): self.net = TCNNet(d_x, T) | |
| 97 | + | |
| 98 | + | |
| 99 | +class TFTLiteNet(nn.Module): | |
| 100 | + """Temporal-fusion-style: gated variable selection over static/known features, self-attention over the history embedding.""" | |
| 101 | + def __init__(self, d_x, T, d=32): | |
| 102 | + super().__init__(); self.vs = nn.Sequential(nn.Linear(d_x, d_x), nn.Softmax(dim=-1)); self.xe = nn.Linear(d_x, d) | |
| 103 | + self.he = nn.Linear(1, d); self.pos = nn.Parameter(torch.randn(T, d) * 0.02); self.att = nn.MultiheadAttention(d, 4, batch_first=True) | |
| 104 | + self.gate = nn.Sequential(nn.Linear(2 * d, d), nn.Sigmoid()); self.f = nn.Sequential(nn.Linear(2 * d, 64), nn.GELU(), nn.Linear(64, 5)) | |
| 105 | + def forward(self, x, h): | |
| 106 | + xs = self.xe(x * self.vs(x)); hs = self.he(h.unsqueeze(-1)) + self.pos | |
| 107 | + a, _ = self.att(hs, hs, hs, need_weights=False); ctx = a[:, -1] | |
| 108 | + g = self.gate(torch.cat([xs, ctx], 1)); return self.f(torch.cat([g * xs, (1 - g) * ctx], 1)) | |
| 109 | + | |
| 110 | + | |
| 111 | +class TFTLite(TorchPanel): | |
| 112 | + name = "tft_lite" | |
| 113 | + def build(self, d_x, T): self.net = TFTLiteNet(d_x, T) | |
| 114 | + | |
| 115 | + | |
| 116 | +# ---- proposed architectures ----------------------------------------------------------------------- | |
| 117 | +class DSGFNNet(nn.Module): | |
| 118 | + """Dynamic spatial graph forecasting network: per-node encoding of history + features, then graph attention over the cells | |
| 119 | + present at the same origin with an adjacency prior (distance kernel + co-movement + composition similarity) and learned | |
| 120 | + attention; the head reads the node's own encoding and its attention-aggregated neighbourhood.""" | |
| 121 | + def __init__(self, d_x, T, d=32): | |
| 122 | + super().__init__(); self.enc = nn.Sequential(nn.Linear(d_x + T, d), nn.GELU(), nn.Linear(d, d)); self.q = nn.Linear(d, d); self.k = nn.Linear(d, d); self.v = nn.Linear(d, d) | |
| 123 | + self.prior_w = nn.Parameter(torch.tensor(1.0)); self.f = nn.Sequential(nn.Linear(2 * d, 64), nn.GELU(), nn.Linear(64, 5)) | |
| 124 | + def forward(self, x, h, A): | |
| 125 | + z = self.enc(torch.cat([x, h], 1)); q, k, v = self.q(z), self.k(z), self.v(z) | |
| 126 | + logits = q @ k.T / np.sqrt(q.shape[1]) + self.prior_w * torch.log(A + 1e-6) | |
| 127 | + logits = logits - torch.eye(len(z)) * 1e9 # no self-attention: neighbours only | |
| 128 | + att = torch.softmax(logits, dim=1); nb = att @ v | |
| 129 | + return self.f(torch.cat([z, nb], 1)), att | |
| 130 | + | |
| 131 | + | |
| 132 | +class DSGFN(TorchPanel): | |
| 133 | + name = "dsgfn" | |
| 134 | + def __init__(self, bandwidth_km=60.0, **kw): | |
| 135 | + super().__init__(**kw); self.bw = bandwidth_km | |
| 136 | + def build(self, d_x, T): self.net = DSGFNNet(d_x, T) | |
| 137 | + def _adjacency(self, df: pl.DataFrame) -> torch.Tensor: | |
| 138 | + cx = df["cx"].fill_null(0.0).to_numpy(); cy = df["cy"].fill_null(0.0).to_numpy(); H = _H(df); lvl = df["level"].to_numpy(); cls = df["class"].to_numpy(); org = df["origin"].to_numpy() | |
| 139 | + d = np.sqrt((cx[:, None] - cx[None, :]) ** 2 + (cy[:, None] - cy[None, :]) ** 2) / 1000; A = np.exp(-(d / self.bw) ** 2) | |
| 140 | + D = np.diff(H, axis=1); D = (D - D.mean(1, keepdims=True)) / (D.std(1, keepdims=True) + 1e-9); A = A * (0.5 + 0.5 * np.clip(D @ D.T / D.shape[1], -1, 1)) | |
| 141 | + same = (lvl[:, None] == lvl[None, :]) & (cls[:, None] == cls[None, :]) & (org[:, None] == org[None, :]); A = A * same | |
| 142 | + return torch.tensor(A, dtype=torch.float32) | |
| 143 | + def fit(self, tr): | |
| 144 | + torch.manual_seed(self.seed); self.build(len(FEATURES_B), 13); taus = torch.tensor(TAUS, dtype=torch.float32) | |
| 145 | + x_all, h_all = self._inputs(tr, fit=True); y_all = torch.tensor(tr["target"].to_numpy(), dtype=torch.float32); self.ys = float(y_all.std()) + 1e-9 | |
| 146 | + groups = tr.with_row_index("_i").group_by(["origin", "class"]).agg(pl.col("_i")) | |
| 147 | + idxs = [torch.tensor(g) for g in groups["_i"].to_list()]; As = [self._adjacency(tr[g]) for g in groups["_i"].to_list()] | |
| 148 | + opt = torch.optim.AdamW(self.net.parameters(), lr=self.lr, weight_decay=self.wd) | |
| 149 | + for ep in range(self.epochs): | |
| 150 | + for j in torch.randperm(len(idxs)).tolist(): | |
| 151 | + b = idxs[j]; opt.zero_grad(); out, _ = self.net(x_all[b], h_all[b], As[j]); loss = _pinball(out, y_all[b] / self.ys, taus); loss.backward(); opt.step() | |
| 152 | + self.net.eval(); return self._store_res(tr) | |
| 153 | + def predict_quantiles(self, te, taus=TAUS): | |
| 154 | + Q = np.zeros((te.height, 5)); self.last_att = {} | |
| 155 | + with torch.no_grad(): | |
| 156 | + x, h = self._inputs(te) | |
| 157 | + for o, c, g in te.with_row_index("_i").group_by(["origin", "class"]).agg(pl.col("_i")).iter_rows(): | |
| 158 | + b = torch.tensor(g); out, att = self.net(x[b], h[b], self._adjacency(te[g])); Q[g] = out.numpy() * self.ys; self.last_att[(o, c)] = att.numpy() | |
| 159 | + return np.sort(Q, axis=1) | |
| 160 | + | |
| 161 | + | |
| 162 | +class QANSS(Base): | |
| 163 | + """Quality-adjusted neural state-space forecaster: the cell's quality-adjusted log level (already separated from composition by | |
| 164 | + the WP22 stage-1 hedonic) follows a latent level + latent drift; the drift's transition is a small network of the cell's recent | |
| 165 | + state (drift, volatility, volume ratio, parent drift) estimated on training origins; the Kalman filter at the origin gives the | |
| 166 | + state and its variance; the forecast is level + Σ_{j≤h} drift_j with drift propagated by the learned transition and the | |
| 167 | + predictive variance from the filter plus the learned drift noise.""" | |
| 168 | + name = "qanss"; prob = True | |
| 169 | + def __init__(self, epochs=200, lr=5e-3, seed=0): self.epochs, self.lr, self.seed = epochs, lr, seed | |
| 170 | + def _state(self, df): | |
| 171 | + H = np.array(df["hist"].to_list(), float); D = np.diff(H, axis=1) | |
| 172 | + lvl = H[:, -1]; drift = D[:, -3:].mean(1); vol = D.std(1); nr = df["n_ratio"].fill_null(1.0).to_numpy(); pd_ = df["prov_d3"].fill_null(0.0).to_numpy() / 3; rd = df["reg_d3"].fill_null(0.0).to_numpy() / 3 | |
| 173 | + return np.column_stack([drift, vol, nr - 1, pd_, rd, D[:, -1], D[:, -2]]) | |
| 174 | + def fit(self, tr): | |
| 175 | + torch.manual_seed(self.seed); self.h = int(tr["h"][0]); S = self._state(tr); self.mu = S.mean(0); self.sd = S.std(0) + 1e-9 | |
| 176 | + x = torch.tensor((S - self.mu) / self.sd, dtype=torch.float32); y = torch.tensor(tr["target"].to_numpy(), dtype=torch.float32) | |
| 177 | + self.net = nn.Sequential(nn.Linear(S.shape[1], 32), nn.Tanh(), nn.Linear(32, 2)) # mean drift per month and log-sd of the h-step change | |
| 178 | + opt = torch.optim.Adam(self.net.parameters(), lr=self.lr) | |
| 179 | + for _ in range(self.epochs): | |
| 180 | + opt.zero_grad(); out = self.net(x); m = out[:, 0] * self.h; ls = out[:, 1] | |
| 181 | + loss = torch.mean(0.5 * ((y - m) / torch.exp(ls)) ** 2 + ls); loss.backward(); opt.step() | |
| 182 | + self.net.eval(); return self._store_res(tr) | |
| 183 | + def _mv(self, te): | |
| 184 | + with torch.no_grad(): | |
| 185 | + out = self.net(torch.tensor((self._state(te) - self.mu) / self.sd, dtype=torch.float32)).numpy() | |
| 186 | + se = te["se_last"].fill_null(0.0).to_numpy() | |
| 187 | + return out[:, 0] * self.h, np.sqrt(np.exp(2 * out[:, 1]) + se ** 2) | |
| 188 | + def predict(self, te): return self._mv(te)[0] | |
| 189 | + def predict_quantiles(self, te, taus=TAUS): | |
| 190 | + from scipy.stats import norm | |
| 191 | + m, s = self._mv(te); return m[:, None] + s[:, None] * norm.ppf(taus)[None, :] | |
| 192 | + | |
| 193 | + | |
| 194 | +class QREFA(Base): | |
| 195 | + """Integrated architecture: stacking of the components with the strongest out-of-sample evidence (QANSS drift state, | |
| 196 | + DSGFN neighbourhood signal, BHPF hierarchical intercepts, RAREF regime probabilities) through a constrained linear | |
| 197 | + combination estimated on the training origins (non-negative weights summing to one, no intercept), so that every component | |
| 198 | + is ablatable by removing it from the stack.""" | |
| 199 | + name = "qrefa"; prob = True | |
| 200 | + def __init__(self, components=None): self.components = components or [QANSS(), BHPF(), DSGFN(epochs=40), RAREF()] | |
| 201 | + def fit(self, tr): | |
| 202 | + from scipy.optimize import nnls | |
| 203 | + F = [] | |
| 204 | + for c in self.components: | |
| 205 | + c.fit(tr); F.append(c.predict(tr)) | |
| 206 | + F = np.column_stack(F); y = tr["target"].to_numpy(); w, _ = nnls(F, y); self.w = w / (w.sum() + 1e-12) if w.sum() > 0 else np.full(len(w), 1 / len(w)) | |
| 207 | + return self._store_res(tr) | |
| 208 | + def predict(self, te): return np.column_stack([c.predict(te) for c in self.components]) @ self.w | |
| 209 | + def predict_quantiles(self, te, taus=TAUS): | |
| 210 | + Q = sum(w * c.predict_quantiles(te, taus) for w, c in zip(self.w, self.components)); return np.sort(Q, axis=1) | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | +def registry_torch_fast(family: str = "torch", fast: bool = True) -> list: | |
| 216 | + return [MLPPanel(epochs=30), LSTMPanel(epochs=30), TCNPanel(epochs=30), TFTLite(epochs=30), DSGFN(epochs=30), QANSS(epochs=150)] | |
| 217 | ||