Prévision et backtest de croissance du maïs avec CFS

Il s'agit d'une prévision thermique expérimentale du maïs pour 2024, évaluée hors échantillon, et non d'un conseil agronomique. Le tableau de bord demande quand les stades d'un État franchiraient 50 % si le développement suivait la chaleur accumulée sur une maille CFS.

Construction de la prévision

Le tableau de bord utilise CFS FLXF de NOAA, dont les sorties toutes les six heures s'étendent jusqu'à environ 215 jours, avec un modèle modifié de Growing Degree Days (GDD) calibré et évalué à partir des rapports USDA sur l'avancement des cultures. Cette approche produit une prévision thermique à l'échelle de la saison dont les hypothèses et les seuils restent vérifiables.

Le cas est figé au 1er juillet 2024 à 00 UTC. Il raccorde avant cette date l'historique CFS à échéance exacte de six heures à un seul cycle archivé après celle-ci. L'historique reste une prévision de modèle, pas une observation, et aucun cycle ultérieur n'est ajouté.

CFS étant grossier, chaque série emploie une coordonnée native de la grille gaussienne, et non une ville ou une moyenne d'État :

ÉtatLatitudeLongitude
Iowa42.047066-93.750371
Nebraska41.102190-99.375363
Kansas38.267561-100.312862
Indiana40.157314-86.250381
Missouri39.212437-92.812872
Ohio40.157314-82.500386
North Dakota46.771444-98.437864

Calcul du temps thermique sur six heures

À chaque intervalle, TMAX et TMIN sont converties en Fahrenheit, bornées à 50–86 °F, moyennées, puis la base de 50 °F est soustraite et le résultat multiplié par un quart de jour :

Tmax_F = (TMAX_K - 273.15) × 9 / 5 + 32
Tmin_F = (TMIN_K - 273.15) × 9 / 5 + 32

GDD50_6h = (
  (clamp(Tmax_F, 50, 86) + clamp(Tmin_F, 50, 86)) / 2 - 50
) × 6 / 24

La base de 50 °F et le plafond de 86 °F suivent la méthode modifiée d'Iowa State University Extension. L'appliquer à chaque intervalle n'est pas identique à calculer d'abord des extrêmes journaliers ; les seuils sont donc calibrés dans la même métrique sur six heures.

Comment les constantes ont été obtenues

Les cibles viennent de USDA NASS Crop Progress and Condition. Nous interpolons linéairement l'instant où le pourcentage hebdomadaire de l'État franchit 50 %. Le semis à 50 % démarre l'accumulation ; levée, sortie des soies, grain pâteux, denté et maturité sont les cibles.

Pour chaque État, année et stade, le seuil implicite est le GDD accumulé entre les deux dates. Afin que 2024 ne serve pas à son propre calibrage, les constantes du tableau de bord sont les médianes de 2020–2023. C'est un petit calibrage historique, pas un apprentissage automatique :

ÉtatLevéeSortie des soiesGrain pâteuxDentéMaturité
Iowa113.4751332.4091739.1392163.2472563.627
Nebraska142.0861388.0371898.4942357.7202892.070
Kansas166.0021557.5222111.4452664.3863290.921
Indiana115.4661275.0901766.8122228.1592632.039
Missouri72.7291389.5161874.2762365.3142910.735
Ohio127.7561277.1391677.8362173.6492538.914
North Dakota177.1231116.5681623.3711963.7592248.754

Les écarts entre États sont intentionnels : un seuil national unique fonctionnait mal. Ces constantes absorbent les variétés, maturités relatives, calendriers de semis et l'écart entre une maille et un État.

La prévision archivée est-elle plausible ?

Nous avons répété l'ajustement en validation leave-one-year-out sur 2020–2024. Pour le même raccord historique-prévision du 1er juillet, les résultats hors échantillon sont :

StadePrévus / éligiblesCouvertureBiaisErreur absolue moyenneErreur absolue médiane
Sortie des soies35 / 35100%-0.9 jours2.5 jours1.7 jours
Grain pâteux35 / 35100%-0.9 jours3.3 jours1.9 jours
Denté34 / 3597%+0.8 jours4.7 jours3.6 jours
Maturité32 / 3591%+2.9 jours6.5 jours4.2 jours

La couverture est la part des saisons éligibles qui atteignent le stade avant la fin de la prévision. Le biais vaut date prévue moins date USDA. Ces résultats rendent plausible, pour la démo, une estimation de maturité à environ une semaine en juillet ; ils ne garantissent ni une parcelle particulière ni la prochaine prévision.

Limites importantes

Reproduire le calcul météorologique

Le tableau de bord regroupe sept coordonnées ; ces deux requêtes minimales pour l'Iowa montrent le calcul complet. Grafana concatène les contributions, retire le GDD antérieur au semis et calcule la somme cumulée.

Requête d'historique à échéance exacte de six heures

curl -X POST 'https://gribstream.com/api/v2/cfsflxf/timeseries' \
  -H "Content-Type: application/json" \
  -H "Accept: text/csv" \
  -H "Authorization: Bearer [API_TOKEN]" \
  -d '{
    "fromTime": "2024-04-15T06:00:00Z",
    "untilTime": "2024-07-01T06:00:00Z",
    "asOf": "2024-11-02T00:00:00Z",
    "minLeadTime": "6h",
    "maxLeadTime": "6h",
    "coordinates": [
      {"name": "Iowa", "lat": 42.047066, "lon": -93.750371}
    ],
    "variables": [
      {"name": "TMAX", "level": "2 m above ground", "info": "", "alias": "temperature_max_k", "hidden": true},
      {"name": "TMIN", "level": "2 m above ground", "info": "", "alias": "temperature_min_k", "hidden": true}
    ],
    "expressions": [
      {"expression": "(temperature_max_k - 273.15) * 9 / 5 + 32", "alias": "temperature_max_f"},
      {"expression": "(temperature_min_k - 273.15) * 9 / 5 + 32", "alias": "temperature_min_f"},
      {"expression": "((func.Min(86.0, func.Max(50.0, temperature_max_f)) + func.Min(86.0, func.Max(50.0, temperature_min_f))) / 2 - 50.0) * 0.25", "alias": "gdd50_f_degree_days_6h"}
    ]
  }'

Requête de la prévision archivée du 1er juillet

curl -X POST 'https://gribstream.com/api/v2/cfsflxf/runs' \
  -H "Content-Type: application/json" \
  -H "Accept: text/csv" \
  -H "Authorization: Bearer [API_TOKEN]" \
  -d '{
    "forecastedFrom": "2024-07-01T00:00:00Z",
    "forecastedUntil": "2024-07-01T00:00:00Z",
    "minLeadTime": "6h",
    "maxLeadTime": "2952h",
    "coordinates": [
      {"name": "Iowa", "lat": 42.047066, "lon": -93.750371}
    ],
    "variables": [
      {"name": "TMAX", "level": "2 m above ground", "info": "", "alias": "temperature_max_k", "hidden": true},
      {"name": "TMIN", "level": "2 m above ground", "info": "", "alias": "temperature_min_k", "hidden": true}
    ],
    "expressions": [
      {"expression": "(temperature_max_k - 273.15) * 9 / 5 + 32", "alias": "temperature_max_f"},
      {"expression": "(temperature_min_k - 273.15) * 9 / 5 + 32", "alias": "temperature_min_f"},
      {"expression": "((func.Min(86.0, func.Max(50.0, temperature_max_f)) + func.Min(86.0, func.Max(50.0, temperature_min_f))) / 2 - 50.0) * 0.25", "alias": "gdd50_f_degree_days_6h"}
    ]
  }'

Exemples de lignes au raccord historique-prévision :

forecasted_at,forecasted_time,lat,lon,name,member,gdd50_f_degree_days_6h,temperature_max_f,temperature_min_f
2024-06-30T18:00:00Z,2024-07-01T00:00:00Z,42.0471,-93.7504,Iowa,0,4.7475,70.2500,67.7300
2024-07-01T00:00:00Z,2024-07-01T06:00:00Z,42.0471,-93.7504,Iowa,0,3.3300,69.5300,57.1100

Sources primaires : documentation NOAA CFSv2 · modèle et inventaire CFS FLXF · méthodologie USDA NASS · archives officielles Crop Progress · méthode GDD d'Iowa State.