{
  "n": 244,
  "n_train": 195,
  "n_test": 49,
  "features": [
    "zhvi_5y_cagr",
    "bachelor_plus_pct",
    "irs_net_migration_2022",
    "unemployment_pct_acs",
    "median_income",
    "log_population",
    "abs_lat",
    "lon",
    "median_age"
  ],
  "target": "zori_5y_cagr",
  "ols": {
    "r2_train": 0.4819213976402612,
    "r2_test": 0.27624567336976835,
    "mape_train": 0.18487136719922717,
    "mape_test": 0.1675769289079529,
    "rmse_test": 0.014514792687575233,
    "adj_r2_train": 0.45671757374167943,
    "f_pvalue": 2.1975481288723367e-22,
    "coefficients": [
      {
        "name": "const",
        "beta": 0.050809393910032294,
        "se": 0.0007561446979103982,
        "ci_low": 0.04931761876054072,
        "ci_high": 0.052301169059523867,
        "tstat": 67.19533185968741,
        "pvalue": 6.590336103366159e-132
      },
      {
        "name": "zhvi_5y_cagr",
        "beta": 0.007106806761569218,
        "se": 0.0008292218210503517,
        "ci_low": 0.005470859952079526,
        "ci_high": 0.00874275357105891,
        "tstat": 8.570453141919526,
        "pvalue": 4.012622319452694e-15
      },
      {
        "name": "bachelor_plus_pct",
        "beta": 0.00024519992408559535,
        "se": 0.0008458949315825606,
        "ci_low": -0.0014236407640828867,
        "ci_high": 0.0019140406122540774,
        "tstat": 0.28987042590130885,
        "pvalue": 0.7722399990743783
      },
      {
        "name": "irs_net_migration_2022",
        "beta": -0.0030343349745639717,
        "se": 0.0007995975745076312,
        "ci_low": -0.004611836998370488,
        "ci_high": -0.0014568329507574549,
        "tstat": -3.794827637430524,
        "pvalue": 0.00020005993442715473
      },
      {
        "name": "unemployment_pct_acs",
        "beta": 0.0002924847508904687,
        "se": 0.0008050883877593743,
        "ci_low": -0.00129584993336065,
        "ci_high": 0.0018808194351415874,
        "tstat": 0.3632952050202553,
        "pvalue": 0.7167991570845056
      },
      {
        "name": "median_income",
        "beta": -0.0017280559323951765,
        "se": 0.0010371252217845806,
        "ci_low": -0.003774169112907762,
        "ci_high": 0.0003180572481174093,
        "tstat": -1.666197963464539,
        "pvalue": 0.09736624861353545
      },
      {
        "name": "log_population",
        "beta": -0.0010132414095210657,
        "se": 0.0008145785798791829,
        "ci_low": -0.00262029900858909,
        "ci_high": 0.0005938161895469587,
        "tstat": -1.2438841807887315,
        "pvalue": 0.2151159902450784
      },
      {
        "name": "abs_lat",
        "beta": 0.0030597878103033045,
        "se": 0.0007954599959517043,
        "ci_low": 0.0014904486908798485,
        "ci_high": 0.004629126929726761,
        "tstat": 3.846564033232762,
        "pvalue": 0.00016472311656917508
      },
      {
        "name": "lon",
        "beta": 0.00415102846923193,
        "se": 0.000932996780778967,
        "ci_low": 0.00231034716052476,
        "ci_high": 0.005991709777939101,
        "tstat": 4.449134825273674,
        "pvalue": 1.4860050237723839e-05
      },
      {
        "name": "median_age",
        "beta": 0.00034187049491380675,
        "se": 0.0008212893390055979,
        "ci_low": -0.0012784265591509595,
        "ci_high": 0.001962167548978573,
        "tstat": 0.4162607240558331,
        "pvalue": 0.6777017397247027
      }
    ],
    "n_train": 195,
    "n_test": 49
  },
  "gbm": {
    "available": false,
    "reason": "sklearn not installed in working environment; OLS is the load-bearing model"
  },
  "partial_correlations": {
    "zhvi_5y_cagr": {
      "zhvi_5y_cagr": 1.0,
      "bachelor_plus_pct": -0.08437428407459506,
      "irs_net_migration_2022": 0.045271395595584525,
      "unemployment_pct_acs": 0.04814471370547196,
      "median_income": -0.13510294284935428,
      "log_population": -0.26916482150416776,
      "abs_lat": -0.06673528308791693,
      "lon": 0.2798845657939696,
      "median_age": -0.014127247569276169,
      "zori_5y_cagr": 0.5693401369427568
    },
    "bachelor_plus_pct": {
      "zhvi_5y_cagr": -0.08437428407459506,
      "bachelor_plus_pct": 0.9999999999999998,
      "irs_net_migration_2022": 0.0033921919315442446,
      "unemployment_pct_acs": -0.19649181308786254,
      "median_income": 0.3508413867414959,
      "log_population": 0.07372714029156015,
      "abs_lat": 0.11894063253172185,
      "lon": 0.005116253959580234,
      "median_age": 0.017379088650268198,
      "zori_5y_cagr": -0.0849401900592428
    },
    "irs_net_migration_2022": {
      "zhvi_5y_cagr": 0.045271395595584525,
      "bachelor_plus_pct": 0.003392191931544244,
      "irs_net_migration_2022": 0.9999999999999998,
      "unemployment_pct_acs": 0.006294643968837834,
      "median_income": -0.14102386847043868,
      "log_population": -0.15466355195835957,
      "abs_lat": 0.08424855980392212,
      "lon": 0.221450507258135,
      "median_age": -0.11861932954691985,
      "zori_5y_cagr": -0.06001890001156414
    },
    "unemployment_pct_acs": {
      "zhvi_5y_cagr": 0.04814471370547196,
      "bachelor_plus_pct": -0.19649181308786254,
      "irs_net_migration_2022": 0.006294643968837834,
      "unemployment_pct_acs": 0.9999999999999999,
      "median_income": -0.2831713277679334,
      "log_population": 0.0036660310578549194,
      "abs_lat": 0.12447612260092436,
      "lon": 0.06357489651182983,
      "median_age": -0.07402516887646689,
      "zori_5y_cagr": 0.09892846429959395
    },
    "median_income": {
      "zhvi_5y_cagr": -0.13510294284935428,
      "bachelor_plus_pct": 0.3508413867414959,
      "irs_net_migration_2022": -0.14102386847043868,
      "unemployment_pct_acs": -0.28317132776793347,
      "median_income": 1.0,
      "log_population": -0.0631160194402731,
      "abs_lat": 0.07260892328114599,
      "lon": -0.4910821641332048,
      "median_age": 0.34671310790203097,
      "zori_5y_cagr": -0.29043136532329833
    },
    "log_population": {
      "zhvi_5y_cagr": -0.2691648215041677,
      "bachelor_plus_pct": 0.07372714029156013,
      "irs_net_migration_2022": -0.15466355195835957,
      "unemployment_pct_acs": 0.00366603105785492,
      "median_income": -0.0631160194402731,
      "log_population": 1.0,
      "abs_lat": 0.00555613556726959,
      "lon": 0.008874723314449929,
      "median_age": -0.00824747043365116,
      "zori_5y_cagr": -0.17109380169979124
    },
    "abs_lat": {
      "zhvi_5y_cagr": -0.06673528308791692,
      "bachelor_plus_pct": 0.11894063253172184,
      "irs_net_migration_2022": 0.08424855980392214,
      "unemployment_pct_acs": 0.12447612260092436,
      "median_income": 0.07260892328114599,
      "log_population": 0.00555613556726959,
      "abs_lat": 1.0,
      "lon": -0.09129118132506249,
      "median_age": -0.12345087118874333,
      "zori_5y_cagr": 0.06358832592278574
    },
    "lon": {
      "zhvi_5y_cagr": 0.2798845657939696,
      "bachelor_plus_pct": 0.005116253959580233,
      "irs_net_migration_2022": 0.221450507258135,
      "unemployment_pct_acs": 0.06357489651182983,
      "median_income": -0.4910821641332048,
      "log_population": 0.008874723314449929,
      "abs_lat": -0.09129118132506249,
      "lon": 0.9999999999999998,
      "median_age": -0.1386472590904412,
      "zori_5y_cagr": 0.3865056651802832
    },
    "median_age": {
      "zhvi_5y_cagr": -0.014127247569276169,
      "bachelor_plus_pct": 0.017379088650268198,
      "irs_net_migration_2022": -0.11861932954691984,
      "unemployment_pct_acs": -0.07402516887646687,
      "median_income": 0.34671310790203097,
      "log_population": -0.00824747043365116,
      "abs_lat": -0.12345087118874332,
      "lon": -0.13864725909044118,
      "median_age": 0.9999999999999999,
      "zori_5y_cagr": -0.09628676118695845
    },
    "zori_5y_cagr": {
      "zhvi_5y_cagr": 0.5693401369427568,
      "bachelor_plus_pct": -0.0849401900592428,
      "irs_net_migration_2022": -0.060018900011564125,
      "unemployment_pct_acs": 0.09892846429959397,
      "median_income": -0.29043136532329833,
      "log_population": -0.17109380169979124,
      "abs_lat": 0.06358832592278574,
      "lon": 0.3865056651802832,
      "median_age": -0.09628676118695845,
      "zori_5y_cagr": 1.0
    }
  },
  "feature_means_train": {
    "zhvi_5y_cagr": 0.04527739877071497,
    "bachelor_plus_pct": 38.74320105645423,
    "irs_net_migration_2022": -8061.2021978021985,
    "unemployment_pct_acs": 6.2278875739645,
    "median_income": 79132.68717948718,
    "log_population": 12.452400122639284,
    "abs_lat": 36.36473206153846,
    "lon": -97.86863057948717,
    "median_age": 35.49025641025639
  },
  "feature_stds_train": {
    "zhvi_5y_cagr": 0.021533797084464137,
    "bachelor_plus_pct": 20.375103627602318,
    "irs_net_migration_2022": 19499.927822231817,
    "unemployment_pct_acs": 4.080465316182485,
    "median_income": 25199.948889439213,
    "log_population": 0.7189932037503938,
    "abs_lat": 5.225878483898592,
    "lon": 16.635353202667158,
    "median_age": 3.358381392170851
  },
  "target_summary": {
    "mean": 0.05144520931272272,
    "std": 0.01494095735210573,
    "min": 0.014876858182092612,
    "p25": 0.04065675848895883,
    "p50": 0.05186360371311427,
    "p75": 0.0618103366471095,
    "max": 0.1283577042966091
  },
  "hypothesis_results": {
    "H1_zori_lags_zhvi": {
      "expected_sign": "+",
      "beta_standardized": 0.007106806761569218,
      "pvalue": 4.012622319452694e-15,
      "bivariate_r": 0.5693401369427568,
      "verdict": "supported (p<0.05, sign matches)"
    },
    "H2_education_premium": {
      "expected_sign": "+",
      "beta_standardized": 0.00024519992408559535,
      "pvalue": 0.7722399990743783,
      "bivariate_r": -0.0849401900592428,
      "verdict": "inconclusive (p=0.77, beta=+0.000245)"
    },
    "H3_net_migration": {
      "expected_sign": "+",
      "beta_standardized": -0.0030343349745639717,
      "pvalue": 0.00020005993442715473,
      "bivariate_r": -0.06001890001156414,
      "verdict": "rejected (p<0.05 but sign opposite \u2014 beta=-0.00303)"
    },
    "H4_unemployment_inverse": {
      "expected_sign": "-",
      "beta_standardized": 0.0002924847508904687,
      "pvalue": 0.7167991570845056,
      "bivariate_r": 0.09892846429959395,
      "verdict": "inconclusive (p=0.72, beta=+0.000292)"
    },
    "H5_income_level": {
      "expected_sign": "+",
      "beta_standardized": -0.0017280559323951765,
      "pvalue": 0.09736624861353545,
      "bivariate_r": -0.29043136532329833,
      "verdict": "inconclusive (p=0.10, beta=-0.00173)"
    },
    "H6_population_size": {
      "expected_sign": "+",
      "beta_standardized": -0.0010132414095210657,
      "pvalue": 0.2151159902450784,
      "bivariate_r": -0.17109380169979124,
      "verdict": "inconclusive (p=0.22, beta=-0.00101)"
    }
  },
  "missingness": {
    "bachelor_plus_pct_imputed_count": 11,
    "unemployment_pct_acs_imputed_count": 10,
    "irs_net_migration_2022_imputed_count": 13,
    "median_age_imputed_count": 0,
    "median_income_imputed_count": 0,
    "zhvi_5y_cagr_imputed_count": 2
  },
  "attrition": {
    "n_cities_input": 250,
    "n_after_zori_target_filter": 244
  },
  "_meta": {
    "fitted": "2026-05-21",
    "no_fabrication": true,
    "split": {
      "train_pct": 0.8,
      "test_pct": 0.2,
      "random_state": 42
    },
    "standardization": "z-score on training set, applied to test set",
    "window": "2021-04-30 \u2192 2026-04-30 (5-yr CAGR)",
    "sources": [
      "Zillow Research \u2014 City ZORI (sfrcondomfr smoothed, CC-BY) \u2014 target + asset-price control",
      "Zillow Research \u2014 City ZHVI all-homes (sfrcondo blend, CC-BY) \u2014 H1 asset-price control",
      "U.S. Census Population Estimates Program SUB-EST2024 \u2014 population (public domain)",
      "U.S. Census ACS 5-yr 2023 B19013 \u2014 median household income (public domain)",
      "U.S. Census ACS 5-yr 2023 B01002 \u2014 median age (public domain)",
      "U.S. Census 2023 Gazetteer Places \u2014 city lat/lon (public domain)",
      "U.S. Census 2023 Gazetteer ZCTA \u2014 ZCTA centroid for nearest-join (public domain)",
      "U.S. Census ACS 5-yr 2023 B15003 \u2014 bachelor_plus_pct (joined via nearest ZCTA)",
      "U.S. Census ACS 5-yr 2023 B23025 \u2014 unemployment_pct_acs (joined via nearest ZCTA)",
      "IRS SOI 2022 county-to-county migration \u2014 irs_inflow_2022 / irs_outflow_2022 (joined via nearest ZCTA)"
    ],
    "limitations": [
      "n=244 max \u2014 small-sample cross-section",
      "No spatial-cluster correction on standard errors",
      "Nearest-ZCTA centroid join is an approximation for large multi-ZCTA cities",
      "IRS migration is 2022-only (single-year), not a 5y cumulative net flow",
      "H5 risks reverse causation: high-rent cities select for higher-income earners",
      "OLS p-values reported are suggestive, not confirmatory",
      "sklearn missing: gradient boosting result is null in this environment"
    ]
  }
}