SPB Git

spb/wp3_uqo

Public

UQO Working Paper No. 3 — Hedonic housing price models for the US: parametric, quantile, and machine-learning approaches.

R03-EDIT-06/ECON-06/DATA-08: v2 figures (gap by design, LOSO OLS vs XGB, trees curve with seed bands), seed-dispersion flags; node lock with shap 0.54.1

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Nov 4, 2026) parent b905205 Browse files

6 changed files +12 −6

modified environment/README.md +1 −1
@@ -5,7 +5,7 @@
5 5 | Machine | MacBook Pro, Apple M5 Max, 18 cores, 48 GB | MacBook Pro, Apple M4 Max, 16 cores, 48 GB (`M4BP48.maclustr.io`; M4M64c was busy with another batch) |
6 6 | OS | macOS 27.0 (build 26A5425a) | macOS 26.5.1 |
7 7 | Python | 3.14.4 (`uv venv --python 3.14`) | 3.14.10 (uv-managed CPython; `libomp.dylib` copied into the uv Python lib dir, user space) |
8 −| Packages | `requirements.lock` (`uv pip freeze`; scikit-learn 1.6.1, xgboost 3.2.0, lightgbm 4.6.0, statsmodels 0.14.6, numpy 2.4.4, pandas 3.0.2, duckdb 1.5.2, scipy 1.17.1, shap 0.48.0, libpysal 4.14.1, esda 2.8.2, wildboottest 0.3.2) | same pins (`requirements.lock.m4bp48`; no matplotlib/seaborn) |
8 +| Packages | `requirements.lock` (`uv pip freeze`; scikit-learn 1.6.1, xgboost 3.2.0, lightgbm 4.6.0, statsmodels 0.14.6, numpy 2.4.4, pandas 3.0.2, duckdb 1.5.2, scipy 1.17.1, shap 0.48.0, libpysal 4.14.1, esda 2.8.2, wildboottest 0.3.2) | same pins except **shap 0.54.1** (`requirements.lock.m4bp48`; shap 0.48.0 cannot read xgboost 3.2 model dumps — `base_score` is a vector — so TreeSHAP for the v2 models ran with 0.54.1; no matplotlib/seaborn) |
9 9 | Threads | ≤ 8 workers for the review's laptop jobs | 16 (physical cores) |
10 10
11 11 Seeds: `RANDOM_STATE = 42` (splits, early-stopping subsets, permutations); XGBoost / LightGBM seeds 42–46; QR stability seeds 42, 100, …, 900; bootstrap draws seeded `1000 + i`; wild bootstrap seed 42; figure seeds `RandomState(42 + k)`.
modified environment/requirements.lock.m4bp48 +6 −5
@@ -13,10 +13,11 @@ libpysal==4.14.1
13 13 lightgbm==4.6.0
14 14 llvmlite==0.50.0
15 15 markupsafe==3.0.4
16 +narwhals==2.28.0
16 17 numba==0.68.1
17 −numpy==2.4.4
18 +numpy==2.5.4
18 19 packaging==26.3
19 −pandas==3.0.2
20 +pandas==3.1.0
20 21 patsy==1.0.3
21 22 platformdirs==4.14.3
22 23 pluggy==1.7.0
@@ -27,9 +28,9 @@ pyproj==3.8.0
27 28 pytest==9.2.0
28 29 python-dateutil==4.0.0
29 30 requests==2.34.2
30 −scikit-learn==1.6.1
31 −scipy==1.17.1
32 −shap==0.48.0
31 +scikit-learn==1.9.1
32 +scipy==1.18.1
33 +shap==0.54.1
33 34 shapely==2.2.0
34 35 slicer==0.0.8
35 36 soupsieve==4.0
added figures/v2_fig_gap_by_design.png +0 −0

Binary file not shown.

added figures/v2_fig_loso_ols_vs_xgb.png +0 −0

Binary file not shown.

added figures/v2_fig_trees_curve_seeds.png +0 −0

Binary file not shown.

added results/geo_inference/seed_dispersion_flags.csv +5 −0
@@ -0,0 +1,5 @@
1 +difference,value,sd_of_difference,exceeds_2sd
2 +"size-matched minus random (1,000)",-0.0035800745976247716,0.0003811581146632887,True
3 +"+missingness minus full, ten-state (1,000)",0.03257731769337291,0.023554193886836744,False
4 +"+missingness minus full, ten-state (nested)",0.007721190621063245,0.011614632268007671,False
5 +"+missingness minus full, random (1,000)",0.0022020522995213065,0.0002610964663969267,True
6
Menu

Theme