{
  "n": 177,
  "n_train": 142,
  "n_test": 35,
  "features": [
    "zillow_zori_5y_cagr",
    "zhvi_5y_cagr",
    "log_troops",
    "years_active",
    "abs_lat",
    "lon",
    "dist_to_coast_km",
    "log_income",
    "log_population",
    "log_hud_fmr",
    "z_bachelor_plus_pct",
    "z_median_age",
    "z_unemployment_pct_acs",
    "z_bls_unemployment_pct",
    "irs_net_migration_per_capita"
  ],
  "target": "bah_5y_cagr",
  "ols": {
    "r2_train": 0.28848391565966336,
    "r2_test": -0.510158448305507,
    "mape_train": 0.4945618603286164,
    "mape_test": 0.4691214112986309,
    "rmse_test": 0.02568795475959726,
    "adj_r2_train": 0.20377961990486126,
    "f_pvalue": 7.626723748547322e-05,
    "coefficients": [
      {
        "name": "const",
        "beta": 0.0640711267605636,
        "se": 0.0017615612948139094,
        "ci_low": 0.06058504874456326,
        "ci_high": 0.06755720477656395,
        "tstat": 36.371783910779016,
        "pvalue": 1.1171838218696856e-68
      },
      {
        "name": "zillow_zori_5y_cagr",
        "beta": 0.0048628004779902026,
        "se": 0.0019454534682732411,
        "ci_low": 0.0010128052567819532,
        "ci_high": 0.008712795699198451,
        "tstat": 2.4995717231450207,
        "pvalue": 0.013719833732418876
      },
      {
        "name": "zhvi_5y_cagr",
        "beta": 0.007636714157693798,
        "se": 0.001996980777649628,
        "ci_low": 0.003684747906031201,
        "ci_high": 0.011588680409356397,
        "tstat": 3.8241300282729442,
        "pvalue": 0.00020535293677229248
      },
      {
        "name": "log_troops",
        "beta": -0.0024088852196991325,
        "se": 0.0024152660063628774,
        "ci_low": -0.007188625642222458,
        "ci_high": 0.002370855202824193,
        "tstat": -0.9973581433072237,
        "pvalue": 0.3205022245049943
      },
      {
        "name": "years_active",
        "beta": -0.00014022523540487626,
        "se": 0.001922663670280303,
        "ci_low": -0.003945120116360326,
        "ci_high": 0.003664669645550573,
        "tstat": -0.07293279504492482,
        "pvalue": 0.9419752464371495
      },
      {
        "name": "abs_lat",
        "beta": 0.002598408606313489,
        "se": 0.0020156545253882984,
        "ci_low": -0.0013905124431524921,
        "ci_high": 0.00658732965577947,
        "tstat": 1.2891140686983193,
        "pvalue": 0.19972004111060945
      },
      {
        "name": "lon",
        "beta": -0.001172108122742215,
        "se": 0.0020717038326330426,
        "ci_low": -0.005271949103506184,
        "ci_high": 0.0029277328580217536,
        "tstat": -0.5657701184307403,
        "pvalue": 0.5725562420907193
      },
      {
        "name": "dist_to_coast_km",
        "beta": 0.00028378775131160903,
        "se": 0.002381606946123627,
        "ci_low": -0.004429342380508391,
        "ci_high": 0.004996917883131609,
        "tstat": 0.11915809692002716,
        "pvalue": 0.9053398764269558
      },
      {
        "name": "log_income",
        "beta": -0.009571331270854558,
        "se": 0.004376252282771983,
        "ci_low": -0.018231805885253007,
        "ci_high": -0.000910856656456108,
        "tstat": -2.187106833062178,
        "pvalue": 0.030580895582631853
      },
      {
        "name": "log_population",
        "beta": -0.0011080787865391478,
        "se": 0.0024828620124723363,
        "ci_low": -0.0060215897179635,
        "ci_high": 0.003805432144885205,
        "tstat": -0.4462909259446789,
        "pvalue": 0.6561531422370103
      },
      {
        "name": "log_hud_fmr",
        "beta": 0.003120707548294095,
        "se": 0.004339449079345592,
        "ci_low": -0.005466934608465304,
        "ci_high": 0.011708349705053493,
        "tstat": 0.7191483276408699,
        "pvalue": 0.4733811849982006
      },
      {
        "name": "z_bachelor_plus_pct",
        "beta": 0.0037952549719160247,
        "se": 0.0034708337013273,
        "ci_low": -0.0030734228873283784,
        "ci_high": 0.010663932831160428,
        "tstat": 1.093470704305038,
        "pvalue": 0.276273303366678
      },
      {
        "name": "z_median_age",
        "beta": 0.0026565055436832364,
        "se": 0.002098682478701356,
        "ci_low": -0.0014967253845308073,
        "ci_high": 0.00680973647189728,
        "tstat": 1.2657967894824451,
        "pvalue": 0.20792133701439666
      },
      {
        "name": "z_unemployment_pct_acs",
        "beta": -0.0036538656486788702,
        "se": 0.0026632260006707355,
        "ci_low": -0.008924311610401449,
        "ci_high": 0.0016165803130437084,
        "tstat": -1.371969801946452,
        "pvalue": 0.17251063151679397
      },
      {
        "name": "z_bls_unemployment_pct",
        "beta": 0.004357844783649039,
        "se": 0.0025125937983406935,
        "ci_low": -0.0006145044779527825,
        "ci_high": 0.009330194045250862,
        "tstat": 1.7344008357128566,
        "pvalue": 0.08529258357875318
      },
      {
        "name": "irs_net_migration_per_capita",
        "beta": -0.0015380714659316772,
        "se": 0.0020959590967909885,
        "ci_low": -0.005685912901407174,
        "ci_high": 0.00260976996954382,
        "tstat": -0.7338270428495177,
        "pvalue": 0.46441744236463567
      }
    ],
    "n_train": 142,
    "n_test": 35
  },
  "sensitivity_joined_only": {
    "r2_train": 0.3176126367545242,
    "r2_test": -0.2650204754996486,
    "mape_train": 0.5234714237788463,
    "mape_test": 0.3267519552690485,
    "rmse_test": 0.021473222281448195,
    "adj_r2_train": 0.19719133735826377,
    "f_pvalue": 0.0025828951847216993,
    "coefficients": [
      {
        "name": "const",
        "beta": 0.06262475247524746,
        "se": 0.0020978911238731125,
        "ci_low": 0.05845358288026923,
        "ci_high": 0.0667959220702257,
        "tstat": 29.851288163911033,
        "pvalue": 7.981226519930352e-47
      },
      {
        "name": "zillow_zori_5y_cagr",
        "beta": 0.004059099281753584,
        "se": 0.0023327958634256274,
        "ci_low": -0.0005791238681912064,
        "ci_high": 0.008697322431698375,
        "tstat": 1.7400147802872652,
        "pvalue": 0.08547578602734561
      },
      {
        "name": "zhvi_5y_cagr",
        "beta": 0.00837298545124775,
        "se": 0.002518806914047356,
        "ci_low": 0.0033649224989156564,
        "ci_high": 0.013381048403579844,
        "tstat": 3.3241871000717484,
        "pvalue": 0.0013099968122545409
      },
      {
        "name": "log_troops",
        "beta": -0.0006411916160080989,
        "se": 0.0023078792661384586,
        "ci_low": -0.005229873895203277,
        "ci_high": 0.00394749066318708,
        "tstat": -0.277827192009459,
        "pvalue": 0.7818196682926711
      },
      {
        "name": "years_active",
        "beta": -0.002883642634562725,
        "se": 0.002393040263831546,
        "ci_low": -0.0076416477924398105,
        "ci_high": 0.0018743625233143607,
        "tstat": -1.205012167219312,
        "pvalue": 0.23154282228633508
      },
      {
        "name": "abs_lat",
        "beta": 0.0008510207727497037,
        "se": 0.0028653508252461713,
        "ci_low": -0.004846064316750631,
        "ci_high": 0.006548105862250038,
        "tstat": 0.2970040405703514,
        "pvalue": 0.7671880091008632
      },
      {
        "name": "lon",
        "beta": 0.002327154213229452,
        "se": 0.0028465172761025577,
        "ci_low": -0.00333248473492474,
        "ci_high": 0.007986793161383645,
        "tstat": 0.8175443840677419,
        "pvalue": 0.4159031556787688
      },
      {
        "name": "dist_to_coast_km",
        "beta": 0.003147991883759905,
        "se": 0.0032388720944129,
        "ci_low": -0.003291753557984798,
        "ci_high": 0.009587737325504608,
        "tstat": 0.9719407843212565,
        "pvalue": 0.3338377736474235
      },
      {
        "name": "log_income",
        "beta": -0.008650201517752023,
        "se": 0.005952154045699849,
        "ci_low": -0.02048467838717774,
        "ci_high": 0.003184275351673692,
        "tstat": -1.4532892548373118,
        "pvalue": 0.14982554983944935
      },
      {
        "name": "log_population",
        "beta": -0.0028252018435052017,
        "se": 0.0036176106172216855,
        "ci_low": -0.010017980935475942,
        "ci_high": 0.004367577248465538,
        "tstat": -0.7809579698975311,
        "pvalue": 0.43699686071674226
      },
      {
        "name": "log_hud_fmr",
        "beta": 0.008438919621568699,
        "se": 0.006344789227466269,
        "ci_low": -0.004176221179109676,
        "ci_high": 0.021054060422247074,
        "tstat": 1.3300551553449635,
        "pvalue": 0.18705800350183877
      },
      {
        "name": "z_bachelor_plus_pct",
        "beta": 0.0020903731774123517,
        "se": 0.004630732296822392,
        "ci_low": -0.007116763236477893,
        "ci_high": 0.011297509591302596,
        "tstat": 0.4514130905055267,
        "pvalue": 0.6528414986849709
      },
      {
        "name": "z_median_age",
        "beta": -0.0004207677011788015,
        "se": 0.002768513349188523,
        "ci_low": -0.00592531394479262,
        "ci_high": 0.005083778542435017,
        "tstat": -0.15198326614611862,
        "pvalue": 0.8795602976979079
      },
      {
        "name": "z_unemployment_pct_acs",
        "beta": -0.0011320781768247466,
        "se": 0.003219460973538958,
        "ci_low": -0.007533229109887629,
        "ci_high": 0.005269072756238136,
        "tstat": -0.3516359372358913,
        "pvalue": 0.7259815142550174
      },
      {
        "name": "z_bls_unemployment_pct",
        "beta": 0.003098691955574778,
        "se": 0.0029113795436465683,
        "ci_low": -0.002689910557543372,
        "ci_high": 0.008887294468692929,
        "tstat": 1.0643380257091444,
        "pvalue": 0.29018982608742144
      },
      {
        "name": "irs_net_migration_per_capita",
        "beta": 0.0008646568194751257,
        "se": 0.0025402795395858325,
        "ci_low": -0.004186099465104396,
        "ci_high": 0.005915413104054648,
        "tstat": 0.34037861030684025,
        "pvalue": 0.734411203576717
      }
    ],
    "n_train": 101,
    "n_test": 25,
    "n_joined": 126,
    "note": "MHAs where zip_master county join succeeded (zero-imputation for spine features). Same 80/20 random_state=42 split."
  },
  "sensitivity_parsimonious": {
    "r2_train": 0.22219525592408818,
    "r2_test": -0.133126455136223,
    "mape_train": 0.49942911198931944,
    "mape_test": 0.4130637363574297,
    "rmse_test": 0.02225140605284963,
    "adj_r2_train": 0.20528645713982918,
    "f_pvalue": 1.3432222157392357e-07,
    "coefficients": [
      {
        "name": "const",
        "beta": 0.06407112676056338,
        "se": 0.0017598936389392969,
        "ci_low": 0.06059128283472271,
        "ci_high": 0.06755097068640406,
        "tstat": 36.40624941356093,
        "pvalue": 1.2407907710559202e-72
      },
      {
        "name": "zillow_zori_5y_cagr",
        "beta": 0.004841500955086692,
        "se": 0.0018278377232719115,
        "ci_low": 0.0012273109506363172,
        "ci_high": 0.008455690959537068,
        "tstat": 2.6487586361989446,
        "pvalue": 0.009020551603205435
      },
      {
        "name": "zhvi_5y_cagr",
        "beta": 0.008703667513507467,
        "se": 0.0018126545702718134,
        "ci_low": 0.005119499211263111,
        "ci_high": 0.012287835815751824,
        "tstat": 4.80161397336853,
        "pvalue": 4.043232887745608e-06
      },
      {
        "name": "log_income",
        "beta": -0.0009509738479795962,
        "se": 0.0017757774044085432,
        "ci_low": -0.004462224799543111,
        "ci_high": 0.002560277103583919,
        "tstat": -0.5355253679986632,
        "pvalue": 0.5931486188707847
      }
    ],
    "n_train": 142,
    "n_test": 35,
    "features": [
      "zillow_zori_5y_cagr",
      "zhvi_5y_cagr",
      "log_income"
    ],
    "note": "Re-fit OLS using only features with |t|>=2 in the main 15-feature spec. Reported as overfit diagnostic; sample is the same n=177."
  },
  "gbm": {
    "available": false,
    "reason": "sklearn not installed in working environment; OLS is the load-bearing model"
  },
  "partial_correlations": {
    "zillow_zori_5y_cagr": {
      "zillow_zori_5y_cagr": 1.0,
      "zhvi_5y_cagr": 0.2575329023502003,
      "log_troops": -0.0788738674409241,
      "years_active": 0.022019553582407182,
      "abs_lat": 0.027115526974942048,
      "lon": 0.28036197741515245,
      "dist_to_coast_km": -0.07091612237417164,
      "log_income": -0.1586837808758104,
      "log_population": -0.23607311357657082,
      "log_hud_fmr": -0.07731483389738057,
      "z_bachelor_plus_pct": -0.06474710748132775,
      "z_median_age": 0.040979156980996106,
      "z_unemployment_pct_acs": 0.06176353251863795,
      "z_bls_unemployment_pct": 0.02481567798791383,
      "irs_net_migration_per_capita": 0.015744362052408464,
      "bah_5y_cagr": 0.2628075392776818
    },
    "zhvi_5y_cagr": {
      "zillow_zori_5y_cagr": 0.2575329023502003,
      "zhvi_5y_cagr": 0.9999999999999998,
      "log_troops": -0.08647634686137341,
      "years_active": 0.01387384274045394,
      "abs_lat": 0.03221359320102986,
      "lon": 0.34061183999585304,
      "dist_to_coast_km": -0.0794574530595702,
      "log_income": -0.056268143454267186,
      "log_population": -0.1718703292427427,
      "log_hud_fmr": 0.028129576465145245,
      "z_bachelor_plus_pct": 0.03504886954789451,
      "z_median_age": 0.18404525904192834,
      "z_unemployment_pct_acs": 0.06680717856548282,
      "z_bls_unemployment_pct": 0.056109517180630585,
      "irs_net_migration_per_capita": 0.0019939732425360676,
      "bah_5y_cagr": 0.3732347130970228
    },
    "log_troops": {
      "zillow_zori_5y_cagr": -0.0788738674409241,
      "zhvi_5y_cagr": -0.08647634686137341,
      "log_troops": 0.9999999999999998,
      "years_active": -0.01955370610471377,
      "abs_lat": -0.03684667943072887,
      "lon": -0.12987406988991781,
      "dist_to_coast_km": 0.10327444149322651,
      "log_income": -0.10193029349556416,
      "log_population": 0.6014157117642404,
      "log_hud_fmr": -0.05393884608399119,
      "z_bachelor_plus_pct": -0.18103773331039066,
      "z_median_age": -0.1639199473224077,
      "z_unemployment_pct_acs": 0.01135371386598754,
      "z_bls_unemployment_pct": 0.08658162668624453,
      "irs_net_migration_per_capita": 0.05908916472447979,
      "bah_5y_cagr": -0.09467683643803212
    },
    "years_active": {
      "zillow_zori_5y_cagr": 0.022019553582407182,
      "zhvi_5y_cagr": 0.01387384274045394,
      "log_troops": -0.01955370610471377,
      "years_active": 0.9999999999999999,
      "abs_lat": 0.09978672053026509,
      "lon": 0.07376236322831528,
      "dist_to_coast_km": 0.2228527317068879,
      "log_income": 0.0643833081037756,
      "log_population": -0.026506874079782167,
      "log_hud_fmr": -0.035534533923045376,
      "z_bachelor_plus_pct": 0.10700290224559748,
      "z_median_age": 0.018753140418096823,
      "z_unemployment_pct_acs": -0.05414115443003312,
      "z_bls_unemployment_pct": -0.046327127737638016,
      "irs_net_migration_per_capita": -0.05825455087109681,
      "bah_5y_cagr": -0.025592382734916982
    },
    "abs_lat": {
      "zillow_zori_5y_cagr": 0.02711552697494205,
      "zhvi_5y_cagr": 0.03221359320102986,
      "log_troops": -0.03684667943072887,
      "years_active": 0.09978672053026508,
      "abs_lat": 1.0,
      "lon": -0.01926141637911392,
      "dist_to_coast_km": 0.18666953361141994,
      "log_income": 0.3099830821785477,
      "log_population": 0.013358756410440861,
      "log_hud_fmr": 0.10770314256745823,
      "z_bachelor_plus_pct": 0.24285746924862212,
      "z_median_age": 0.09848962343563568,
      "z_unemployment_pct_acs": -0.23604911510273763,
      "z_bls_unemployment_pct": -0.04795238331512452,
      "irs_net_migration_per_capita": -0.012387651916800208,
      "bah_5y_cagr": 0.023452294998865305
    },
    "lon": {
      "zillow_zori_5y_cagr": 0.28036197741515245,
      "zhvi_5y_cagr": 0.340611839995853,
      "log_troops": -0.12987406988991781,
      "years_active": 0.07376236322831528,
      "abs_lat": -0.01926141637911392,
      "lon": 1.0,
      "dist_to_coast_km": -0.05713110887051961,
      "log_income": -0.07278297838237735,
      "log_population": -0.04992998032704353,
      "log_hud_fmr": -0.08174824629339741,
      "z_bachelor_plus_pct": 0.12099239364431638,
      "z_median_age": 0.14593790596595715,
      "z_unemployment_pct_acs": -0.004553643702658125,
      "z_bls_unemployment_pct": -0.14851929590993726,
      "irs_net_migration_per_capita": -0.01188983581343933,
      "bah_5y_cagr": 0.14380807426577577
    },
    "dist_to_coast_km": {
      "zillow_zori_5y_cagr": -0.07091612237417165,
      "zhvi_5y_cagr": -0.07945745305957018,
      "log_troops": 0.10327444149322651,
      "years_active": 0.22285273170688794,
      "abs_lat": 0.18666953361141997,
      "lon": -0.057131108870519615,
      "dist_to_coast_km": 1.0,
      "log_income": -0.15888600002583642,
      "log_population": 0.12469404277919446,
      "log_hud_fmr": -0.4085660738118993,
      "z_bachelor_plus_pct": -0.0008189228335324661,
      "z_median_age": -0.2521674027877475,
      "z_unemployment_pct_acs": -0.2664031990569329,
      "z_bls_unemployment_pct": -0.2247525213455875,
      "irs_net_migration_per_capita": 0.09120592148061547,
      "bah_5y_cagr": -0.07185137189000691
    },
    "log_income": {
      "zillow_zori_5y_cagr": -0.1586837808758104,
      "zhvi_5y_cagr": -0.056268143454267186,
      "log_troops": -0.10193029349556416,
      "years_active": 0.06438330810377559,
      "abs_lat": 0.3099830821785477,
      "lon": -0.07278297838237734,
      "dist_to_coast_km": -0.15888600002583642,
      "log_income": 1.0,
      "log_population": 0.10151099982832053,
      "log_hud_fmr": 0.8155623759239001,
      "z_bachelor_plus_pct": 0.764536602832006,
      "z_median_age": 0.33011656301116815,
      "z_unemployment_pct_acs": -0.3416289183294517,
      "z_bls_unemployment_pct": -0.15535298979144407,
      "irs_net_migration_per_capita": -0.23458231270912042,
      "bah_5y_cagr": -0.10312993577287044
    },
    "log_population": {
      "zillow_zori_5y_cagr": -0.2360731135765708,
      "zhvi_5y_cagr": -0.17187032924274273,
      "log_troops": 0.6014157117642404,
      "years_active": -0.026506874079782167,
      "abs_lat": 0.013358756410440861,
      "lon": -0.04992998032704353,
      "dist_to_coast_km": 0.12469404277919446,
      "log_income": 0.10151099982832054,
      "log_population": 1.0,
      "log_hud_fmr": 0.1327364625922308,
      "z_bachelor_plus_pct": 0.09491912736726847,
      "z_median_age": 0.01868553253798947,
      "z_unemployment_pct_acs": 0.028021676092729084,
      "z_bls_unemployment_pct": 0.0076534763745294,
      "irs_net_migration_per_capita": -0.07273557259732333,
      "bah_5y_cagr": -0.08496277732645045
    },
    "log_hud_fmr": {
      "zillow_zori_5y_cagr": -0.07731483389738059,
      "zhvi_5y_cagr": 0.02812957646514525,
      "log_troops": -0.05393884608399118,
      "years_active": -0.035534533923045376,
      "abs_lat": 0.10770314256745823,
      "lon": -0.08174824629339743,
      "dist_to_coast_km": -0.4085660738118993,
      "log_income": 0.8155623759239001,
      "log_population": 0.1327364625922308,
      "log_hud_fmr": 0.9999999999999998,
      "z_bachelor_plus_pct": 0.6402154796856574,
      "z_median_age": 0.3565485034106713,
      "z_unemployment_pct_acs": -0.03140295292775319,
      "z_bls_unemployment_pct": 0.04147002384922345,
      "irs_net_migration_per_capita": -0.3790674568464151,
      "bah_5y_cagr": -0.010340241122651975
    },
    "z_bachelor_plus_pct": {
      "zillow_zori_5y_cagr": -0.06474710748132775,
      "zhvi_5y_cagr": 0.03504886954789452,
      "log_troops": -0.18103773331039064,
      "years_active": 0.10700290224559748,
      "abs_lat": 0.24285746924862212,
      "lon": 0.12099239364431637,
      "dist_to_coast_km": -0.0008189228335324661,
      "log_income": 0.7645366028320059,
      "log_population": 0.09491912736726846,
      "log_hud_fmr": 0.6402154796856574,
      "z_bachelor_plus_pct": 0.9999999999999998,
      "z_median_age": 0.31514370022461535,
      "z_unemployment_pct_acs": -0.37635043929977785,
      "z_bls_unemployment_pct": -0.35514234351029694,
      "irs_net_migration_per_capita": -0.26469631457204246,
      "bah_5y_cagr": -0.012530243422888011
    },
    "z_median_age": {
      "zillow_zori_5y_cagr": 0.040979156980996106,
      "zhvi_5y_cagr": 0.18404525904192834,
      "log_troops": -0.16391994732240767,
      "years_active": 0.018753140418096823,
      "abs_lat": 0.09848962343563566,
      "lon": 0.14593790596595715,
      "dist_to_coast_km": -0.2521674027877475,
      "log_income": 0.3301165630111681,
      "log_population": 0.01868553253798947,
      "log_hud_fmr": 0.3565485034106713,
      "z_bachelor_plus_pct": 0.31514370022461535,
      "z_median_age": 1.0,
      "z_unemployment_pct_acs": -0.027190227911165547,
      "z_bls_unemployment_pct": -0.010377177387472339,
      "irs_net_migration_per_capita": 0.10985652941816652,
      "bah_5y_cagr": 0.09701446387689545
    },
    "z_unemployment_pct_acs": {
      "zillow_zori_5y_cagr": 0.06176353251863794,
      "zhvi_5y_cagr": 0.06680717856548282,
      "log_troops": 0.01135371386598754,
      "years_active": -0.054141154430033124,
      "abs_lat": -0.23604911510273766,
      "lon": -0.004553643702658125,
      "dist_to_coast_km": -0.2664031990569329,
      "log_income": -0.3416289183294517,
      "log_population": 0.028021676092729084,
      "log_hud_fmr": -0.0314029529277532,
      "z_bachelor_plus_pct": -0.37635043929977785,
      "z_median_age": -0.027190227911165547,
      "z_unemployment_pct_acs": 1.0,
      "z_bls_unemployment_pct": 0.6123074372188353,
      "irs_net_migration_per_capita": -0.06212629213529356,
      "bah_5y_cagr": 0.07143019487632345
    },
    "z_bls_unemployment_pct": {
      "zillow_zori_5y_cagr": 0.02481567798791383,
      "zhvi_5y_cagr": 0.05610951718063059,
      "log_troops": 0.08658162668624451,
      "years_active": -0.046327127737638016,
      "abs_lat": -0.04795238331512452,
      "lon": -0.14851929590993726,
      "dist_to_coast_km": -0.2247525213455875,
      "log_income": -0.15535298979144407,
      "log_population": 0.0076534763745294,
      "log_hud_fmr": 0.04147002384922344,
      "z_bachelor_plus_pct": -0.355142343510297,
      "z_median_age": -0.010377177387472339,
      "z_unemployment_pct_acs": 0.6123074372188353,
      "z_bls_unemployment_pct": 1.0,
      "irs_net_migration_per_capita": 0.051678110631577144,
      "bah_5y_cagr": 0.09948405196717837
    },
    "irs_net_migration_per_capita": {
      "zillow_zori_5y_cagr": 0.015744362052408464,
      "zhvi_5y_cagr": 0.0019939732425360676,
      "log_troops": 0.05908916472447978,
      "years_active": -0.058254550871096815,
      "abs_lat": -0.012387651916800206,
      "lon": -0.01188983581343933,
      "dist_to_coast_km": 0.09120592148061549,
      "log_income": -0.23458231270912042,
      "log_population": -0.07273557259732333,
      "log_hud_fmr": -0.379067456846415,
      "z_bachelor_plus_pct": -0.26469631457204246,
      "z_median_age": 0.10985652941816652,
      "z_unemployment_pct_acs": -0.06212629213529356,
      "z_bls_unemployment_pct": 0.051678110631577144,
      "irs_net_migration_per_capita": 1.0,
      "bah_5y_cagr": -0.01313919352993292
    },
    "bah_5y_cagr": {
      "zillow_zori_5y_cagr": 0.2628075392776818,
      "zhvi_5y_cagr": 0.3732347130970228,
      "log_troops": -0.09467683643803214,
      "years_active": -0.02559238273491698,
      "abs_lat": 0.023452294998865305,
      "lon": 0.14380807426577577,
      "dist_to_coast_km": -0.07185137189000691,
      "log_income": -0.10312993577287043,
      "log_population": -0.08496277732645045,
      "log_hud_fmr": -0.010340241122651975,
      "z_bachelor_plus_pct": -0.012530243422888011,
      "z_median_age": 0.09701446387689545,
      "z_unemployment_pct_acs": 0.07143019487632343,
      "z_bls_unemployment_pct": 0.09948405196717838,
      "irs_net_migration_per_capita": -0.01313919352993292,
      "bah_5y_cagr": 0.9999999999999999
    }
  },
  "feature_means_train": {
    "zillow_zori_5y_cagr": 0.06039353329898399,
    "zhvi_5y_cagr": 0.05143168710071389,
    "log_troops": 5.26399432519225,
    "years_active": 98.34626738522475,
    "abs_lat": 37.11507294013908,
    "lon": -93.47763391520438,
    "dist_to_coast_km": 412.71535964103316,
    "log_income": 11.260576553120524,
    "log_population": 8.982580398974266,
    "log_hud_fmr": 7.363529748826111,
    "z_bachelor_plus_pct": 32.495989004896856,
    "z_median_age": 37.8386079278128,
    "z_unemployment_pct_acs": 5.12997403325631,
    "z_bls_unemployment_pct": 4.069560717878672,
    "irs_net_migration_per_capita": -0.06836927440283752
  },
  "feature_stds_train": {
    "zillow_zori_5y_cagr": 0.017001564851931605,
    "zhvi_5y_cagr": 0.019700830483404916,
    "log_troops": 4.294549596876304,
    "years_active": 24.668870494102137,
    "abs_lat": 6.098984746890723,
    "lon": 18.83684499240842,
    "dist_to_coast_km": 384.224666900267,
    "log_income": 0.204453196670432,
    "log_population": 5.7272242851406725,
    "log_hud_fmr": 0.26243406336690533,
    "z_bachelor_plus_pct": 8.488569282603262,
    "z_median_age": 3.326403178393289,
    "z_unemployment_pct_acs": 1.1744527864685392,
    "z_bls_unemployment_pct": 1.214824150853922,
    "irs_net_migration_per_capita": 0.17380489478922398
  },
  "target_summary": {
    "mean": 0.06326497175141244,
    "std": 0.023019466439704758,
    "min": -0.0042,
    "p25": 0.0471,
    "p50": 0.0651,
    "p75": 0.0802,
    "max": 0.1212
  },
  "hypothesis_results": {
    "H1_bah_lags_zori_growth": {
      "feature": "zillow_zori_5y_cagr",
      "expected_sign": "+",
      "beta_standardized": 0.0048628004779902026,
      "pvalue": 0.013719833732418876,
      "bivariate_r": 0.2628075392776818,
      "verdict": "supported (p<0.05, sign matches)"
    },
    "H2_v2_income_level": {
      "feature": "log_income",
      "expected_sign": "+",
      "beta_standardized": -0.009571331270854558,
      "pvalue": 0.030580895582631853,
      "bivariate_r": -0.10312993577287044,
      "verdict": "rejected (p<0.05 but sign opposite \u2014 beta=-0.00957)",
      "note": "v1-untestable now tested as LEVEL \u2014 zip_master is cross-sectional"
    },
    "H3_coast_gradient": {
      "feature": "dist_to_coast_km",
      "expected_sign": "-",
      "beta_standardized": 0.00028378775131160903,
      "pvalue": 0.9053398764269558,
      "bivariate_r": -0.07185137189000691,
      "verdict": "inconclusive (p=0.91, beta=+0.000284)"
    },
    "H4_v2_population_level": {
      "feature": "log_population",
      "expected_sign": "+",
      "beta_standardized": -0.0011080787865391478,
      "pvalue": 0.6561531422370103,
      "bivariate_r": -0.08496277732645045,
      "verdict": "inconclusive (p=0.66, beta=-0.00111)",
      "note": "v1-untestable now tested as LEVEL \u2014 see H2 note"
    },
    "H5_troop_count": {
      "feature": "log_troops",
      "expected_sign": "+",
      "beta_standardized": -0.0024088852196991325,
      "pvalue": 0.3205022245049943,
      "bivariate_r": -0.09467683643803212,
      "verdict": "inconclusive (p=0.32, beta=-0.00241)",
      "caveat": "cross-sectional level, not change"
    },
    "H6_education": {
      "feature": "z_bachelor_plus_pct",
      "expected_sign": "+",
      "beta_standardized": 0.0037952549719160247,
      "pvalue": 0.276273303366678,
      "bivariate_r": -0.012530243422888011,
      "verdict": "inconclusive (p=0.28, beta=+0.0038)"
    },
    "H7_net_migration": {
      "feature": "irs_net_migration_per_capita",
      "expected_sign": "+",
      "beta_standardized": -0.0015380714659316772,
      "pvalue": 0.46441744236463567,
      "bivariate_r": -0.01313919352993292,
      "verdict": "inconclusive (p=0.46, beta=-0.00154)",
      "note": "IRS 2022 single-year migration; this is a 1y proxy not a 5y signal"
    },
    "H8_hud_fmr_level": {
      "feature": "log_hud_fmr",
      "expected_sign": "+",
      "beta_standardized": 0.003120707548294095,
      "pvalue": 0.4733811849982006,
      "bivariate_r": -0.010340241122651975,
      "verdict": "inconclusive (p=0.47, beta=+0.00312)",
      "note": "zip_master holds latest FMR level only; growth-on-growth was pre-registered but not testable from this spine \u2014 flagged."
    },
    "H9_unemployment_low": {
      "feature": "z_bls_unemployment_pct",
      "expected_sign": "-",
      "beta_standardized": 0.004357844783649039,
      "pvalue": 0.08529258357875318,
      "bivariate_r": 0.09948405196717837,
      "verdict": "inconclusive (p=0.09, beta=+0.00436)"
    }
  },
  "join_diagnostics": {
    "installations_joined_to_county": 170,
    "installations_missed": 124,
    "unique_counties_in_zipmaster": 3207
  },
  "missingness": {
    "zillow_zori_5y_cagr_imputed_count": 77,
    "zhvi_5y_cagr_imputed_count": 3,
    "log_income_imputed_count": 51,
    "log_hud_fmr_imputed_count": 51,
    "log_population_imputed_count": 0,
    "z_bachelor_plus_pct_imputed_count": 51,
    "z_unemployment_pct_acs_imputed_count": 51,
    "z_bls_unemployment_pct_imputed_count": 51,
    "irs_net_migration_per_capita_imputed_count": 51,
    "years_active_imputed_count": 25,
    "dist_to_coast_km_imputed_count": 0,
    "z_median_age_imputed_count": 51
  },
  "v1_compare": {
    "r2_train_v1": 0.24018169917064836,
    "r2_test_v1": -0.2715947853933458,
    "n_v1": 177,
    "features_v1": [
      "zillow_zori_5y_cagr",
      "zhvi_5y_cagr",
      "log_troops",
      "years_active",
      "abs_lat",
      "lon",
      "dist_to_coast_km"
    ]
  },
  "_meta": {
    "fitted": "2026-05-21",
    "version": "v2",
    "pre_registered_in": "projects/bah-research/RESEARCH.md, \"v2 with zip_master\" section",
    "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",
    "tier": "BAH E5 with-dependents (2021->2026 CAGR)",
    "sources": [
      "DoD Defense Travel Management Office \u2014 historical BAH 2013-2026",
      "Zillow Research \u2014 ZORI (Observed Rent Index), ZHVI (Home Value Index)",
      "DoD / open-source installation rosters \u2014 troop_count, lat/lon, years_active",
      "projects/zipdata/data/zip_master.json (31,646 ZCTAs, 2026-05-21)",
      "  - ACS B19013 median household income",
      "  - ACS B01003 total population",
      "  - ACS B01002 median age",
      "  - ACS B15003 bachelor-plus pct",
      "  - ACS B23025 unemployment pct (decennial)",
      "  - HUD FMR 2BR FY26 SAFMR / FY25 county fallback",
      "  - BLS LAUS 2024 county annual unemployment",
      "  - IRS SOI county migration 2022-2023"
    ],
    "limitations": [
      "n=177 MHAs \u2014 same binding constraint as v1",
      "zip_master ACS/HUD/BLS/IRS features are LEVELS not 5y growth \u2014 H2/H4/H8 tested as level proxies, not growth-on-growth",
      "County-level aggregation: per-installation feeder_county is mapped to a zip_master county_fips; un-mapped installations get NaN and fall back to cohort-mean imputation with a missingness dummy",
      "No spatial-cluster correction on standard errors",
      "sklearn missing: GBM result is null",
      "Causation NOT inferred \u2014 observational cross-section"
    ]
  }
}