pray-calc-ml/analysis_raw_results.json
Aric Camarata 9e537d0df9 analysis: ML formula discovery for Fajr/Isha depression angles
Comprehensive analysis of 83k records across 11 model types.

Key finding: physical variables (lat, day_of_year) explain the correct
seasonal-latitude interaction pattern, but the heterogeneous dataset has
a 3.3 degree noise floor from incompatible measurement methodologies.

Recommended DPC formula (Medium-9):
  f(abs_lat, day_of_year) -> angle
  9 terms: intercept + abs_lat + 4 seasonal harmonics + 4 lat*season interactions

Mandatory args: abs(latitude), day_of_year
Optional: elevation_m (+0.0007 deg/m)
Not needed: longitude (data artifact, not physics)

See analysis_results.md for full formulas with coefficients.
2026-03-23 05:00:47 -04:00

334 lines
No EOL
8.1 KiB
JSON

{
"fajr": {
"model_comparison": {
"Simple-5": {
"r2": 0.0037294032319437507,
"mae": 3.381430344476216,
"rmse": 3.984818643437369,
"terms": 5
},
"Medium-9": {
"r2": 0.007737993749145522,
"mae": 3.3627760770456847,
"rmse": 3.976777933646338,
"terms": 9
},
"Full-14": {
"r2": 0.01639481886729226,
"mae": 3.345013458456923,
"rmse": 3.9594219633550756,
"terms": 14
},
"Full+3rdHarm-18": {
"r2": 0.020661384021336215,
"mae": 3.336802072840702,
"rmse": 3.950824158726502,
"terms": 18
},
"GBR (no lng)": {
"r2": 0.236195535734822,
"mae": 2.7373858090357377,
"rmse": 3.4890663798056827,
"terms": "tree"
},
"GBR (with lng)": {
"r2": 0.24822079798663896,
"mae": 2.7051306330358273,
"rmse": 3.4614550243166375,
"terms": "tree"
},
"RF (with lng)": {
"r2": 0.24768394351428089,
"mae": 2.6843915746185916,
"rmse": 3.4627216933088065,
"terms": "tree"
}
},
"recommended_formula": {
"intercept": 15.54082967950781,
"coefficients": {
"abs_lat": -0.1759002088821986,
"sin_doy": -0.38529047072698375,
"cos_doy": 1.2126189745706981,
"sin_2doy": -0.5968800982699566,
"cos_2doy": 0.7911049208541243,
"abs_lat*sin_doy": 0.004109107638723691,
"abs_lat*cos_doy": -0.08685150481427173,
"abs_lat*sin_2doy": 0.01127401125451497,
"abs_lat*cos_2doy": -0.02487844468431522,
"abs_lat^2": 0.004944715408442619,
"abs_lat^2*sin_doy": 0.00011795308249738109,
"abs_lat^2*cos_doy": 0.0011284481834558614,
"abs_lat^3": -4.1015518814461417e-05,
"elev": 0.0006606981432948898
},
"feature_names": [
"abs_lat",
"sin_doy",
"cos_doy",
"sin_2doy",
"cos_2doy",
"abs_lat*sin_doy",
"abs_lat*cos_doy",
"abs_lat*sin_2doy",
"abs_lat*cos_2doy",
"abs_lat^2",
"abs_lat^2*sin_doy",
"abs_lat^2*cos_doy",
"abs_lat^3",
"elev"
]
},
"per_band_linear": {
"0-15": {
"n": 1899,
"mean": 14.73,
"mae": 2.4314,
"rmse": 3.0092,
"r2": -0.101055
},
"15-30": {
"n": 4860,
"mean": 13.78,
"mae": 3.3601,
"rmse": 3.9979,
"r2": -0.019705
},
"30-45": {
"n": 28038,
"mean": 13.82,
"mae": 3.6495,
"rmse": 4.1639,
"r2": 0.008841
},
"45-60": {
"n": 13126,
"mean": 14.41,
"mae": 2.8208,
"rmse": 3.6011,
"r2": 0.040659
},
"60-70": {
"n": 724,
"mean": 14.43,
"mae": 3.2761,
"rmse": 3.8828,
"r2": 0.031951
}
},
"per_band_gbr": {
"0-15": {
"n": 1899,
"mae": 1.6345,
"r2": 0.460556
},
"15-30": {
"n": 4860,
"mae": 3.1422,
"r2": 0.094083
},
"30-45": {
"n": 28038,
"mae": 2.8216,
"r2": 0.302304
},
"45-60": {
"n": 13126,
"mae": 2.1238,
"r2": 0.352742
},
"60-70": {
"n": 724,
"mae": 2.6796,
"r2": 0.324101
}
},
"data_stats": {
"n": 48647,
"mean": 14.018684446834104,
"std": 3.992536352703117,
"min": 7.001979953582796,
"max": 21.999743910929467
},
"medium_formula": {
"intercept": 14.180410692819587,
"coefficients": {
"abs_lat": -0.004033430644220256,
"sin_doy": -0.620355629033609,
"cos_doy": -0.1073962588977038,
"sin_2doy": -0.6685569552606863,
"cos_2doy": 0.5680496109805692,
"abs_lat*sin_doy": 0.014678703458006518,
"abs_lat*cos_doy": -0.004863536644432507,
"abs_lat*sin_2doy": 0.012667090495126133,
"abs_lat*cos_2doy": -0.01963766317111711
}
}
},
"isha": {
"model_comparison": {
"Simple-5": {
"r2": 0.0025881413978093406,
"mae": 3.2866329036408857,
"rmse": 3.682317046063136,
"terms": 5
},
"Medium-9": {
"r2": 0.00488234209111138,
"mae": 3.2794198739501845,
"rmse": 3.678073921209377,
"terms": 9
},
"Full-14": {
"r2": 0.00777731358187661,
"mae": 3.2679623718024673,
"rmse": 3.6727157734194877,
"terms": 14
},
"Full+3rdHarm-18": {
"r2": 0.008089966130246772,
"mae": 3.266715275509219,
"rmse": 3.6721358229647736,
"terms": 18
},
"GBR (no lng)": {
"r2": 0.25612487085877333,
"mae": 2.5999770638896114,
"rmse": 3.1800291730680272,
"terms": "tree"
},
"GBR (with lng)": {
"r2": 0.26410775806459996,
"mae": 2.581165704259283,
"rmse": 3.162926613553637,
"terms": "tree"
},
"RF (with lng)": {
"r2": 0.2664862210707678,
"mae": 2.5726380263489164,
"rmse": 3.157804129726421,
"terms": "tree"
}
},
"recommended_formula": {
"intercept": 15.864854036971996,
"coefficients": {
"abs_lat": -0.034480932269895494,
"sin_doy": -1.06285562552457,
"cos_doy": 0.7699403067194821,
"sin_2doy": -0.233626928673645,
"cos_2doy": -0.042571839262928186,
"abs_lat*sin_doy": 0.05506929227342321,
"abs_lat*cos_doy": -0.04888022777463985,
"abs_lat*sin_2doy": 0.0027786682672281734,
"abs_lat*cos_2doy": -0.004584563291871479,
"abs_lat^2": 0.00010685222255441428,
"abs_lat^2*sin_doy": -0.0005702653779849103,
"abs_lat^2*cos_doy": 0.0005765223497612091,
"abs_lat^3": 4.9599806824073855e-06,
"elev": 0.00033966145771243696
},
"feature_names": [
"abs_lat",
"sin_doy",
"cos_doy",
"sin_2doy",
"cos_2doy",
"abs_lat*sin_doy",
"abs_lat*cos_doy",
"abs_lat*sin_2doy",
"abs_lat*cos_2doy",
"abs_lat^2",
"abs_lat^2*sin_doy",
"abs_lat^2*cos_doy",
"abs_lat^3",
"elev"
]
},
"per_band_linear": {
"0-15": {
"n": 178,
"mean": 15.76,
"mae": 3.0588,
"rmse": 3.4955,
"r2": 0.027476
},
"15-30": {
"n": 4360,
"mean": 15.18,
"mae": 3.1446,
"rmse": 3.5942,
"r2": -0.012017
},
"30-45": {
"n": 23616,
"mean": 14.94,
"mae": 3.312,
"rmse": 3.6883,
"r2": 0.007525
},
"45-60": {
"n": 5915,
"mean": 16.09,
"mae": 3.1879,
"rmse": 3.6658,
"r2": -0.048477
},
"60-70": {
"n": 442,
"mean": 15.05,
"mae": 3.1522,
"rmse": 3.608,
"r2": -0.036892
}
},
"per_band_gbr": {
"0-15": {
"n": 178,
"mae": 2.6117,
"r2": 0.258285
},
"15-30": {
"n": 4360,
"mae": 2.7468,
"r2": 0.191277
},
"30-45": {
"n": 23616,
"mae": 2.3886,
"r2": 0.355418
},
"45-60": {
"n": 5915,
"mae": 2.4819,
"r2": 0.306523
},
"60-70": {
"n": 442,
"mae": 2.5377,
"r2": 0.289367
}
},
"data_stats": {
"n": 34511,
"mean": 15.174020672108975,
"std": 3.687488123478661,
"min": 10.000116676082458,
"max": 21.99926238259298
},
"medium_formula": {
"intercept": 15.326614884802717,
"coefficients": {
"abs_lat": -0.0050118005501870915,
"sin_doy": -0.22772992150552812,
"cos_doy": -0.11138064221643007,
"sin_2doy": -0.2157568787073702,
"cos_2doy": -0.03724246711156049,
"abs_lat*sin_doy": 0.009975172113063641,
"abs_lat*cos_doy": -0.0027871993819204477,
"abs_lat*sin_2doy": 0.0023014113789451254,
"abs_lat*cos_2doy": -0.004852170656249994
}
}
}
}