CFS-Prognose und Backtest für Maiswachstum

Dies ist eine experimentelle, außerhalb der Stichprobe geprüfte Mais-Wärmezeitprognose für 2024 und keine agronomische Beratung. Das Dashboard fragt, wann landesweite Stadien 50 % überschreiten würden, wenn die Entwicklung der Wärmesumme einer CFS-Zelle folgt.

Wie die Prognose aufgebaut ist

Das Dashboard nutzt CFS FLXF von NOAA mit sechsstündlichen Ausgaben für bis zu etwa 215 Tage sowie ein Modell modifizierter Growing Degree Days (GDD), das anhand der USDA-Berichte zum Pflanzenfortschritt kalibriert und geprüft wurde. So entsteht eine saisonlange Wärmezeitprognose mit nachvollziehbaren Annahmen und Schwellenwerten.

Der Fall ist auf den 1. Juli 2024, 00 UTC, eingefroren. Vor diesem Zeitpunkt wird CFS-Historie mit exakt sechs Stunden Vorlauf verwendet, danach genau ein archivierter Lauf. Die Historie bleibt Modellführung, keine Beobachtung; spätere Läufe werden nicht beigemischt.

Wegen der groben CFS-Auflösung verwendet jede Reihe eine native Koordinate des Gauß-Gitters, keine Stadt und keinen Landesmittelwert:

BundesstaatBreitengradLängengrad
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

Sechsstündige Wärmezeitberechnung

Für jedes Intervall werden TMAX und TMIN in Fahrenheit umgerechnet, auf 50–86 °F begrenzt, gemittelt, um die Basis 50 °F vermindert und mit einem Vierteltag multipliziert:

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

Basis und Obergrenze folgen der modifizierten Mais-GDD-Methode der Iowa State University Extension. Die Anwendung je Intervall entspricht nicht exakt täglichen Extremwerten; deshalb wurden die Schwellen direkt in derselben Sechs-Stunden-Metrik kalibriert.

Wie die Konstanten erzeugt wurden

Die Ziele stammen aus USDA NASS Crop Progress and Condition. Wir interpolieren linear den Zeitpunkt, an dem der wöchentliche Landesanteil 50 % überschreitet. 50 % Aussaat startet die Summe; Auflaufen, Narbenschieben, Teigreife, Zahnreife und Reife sind die Ziele.

Für Land, Jahr und Stadium ist der implizite Schwellenwert die zwischen beiden Daten angesammelte GDD-Summe. Damit 2024 nicht auf sich selbst kalibriert wird, sind die Dashboard-Konstanten die Mediane aus 2020–2023. Das ist eine kleine historische Kalibrierung, kein Machine-Learning-Training:

BundesstaatAuflaufenNarbenschiebenTeigreifeZahnreifeReife
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

Die Unterschiede zwischen den Ländern sind beabsichtigt: Ein nationaler Reifeschwellenwert funktionierte schlecht. Die Konstanten nehmen Sortenmix, relative Reife, Aussaatmuster und den Unterschied zwischen Zelle und Land auf.

Ist die archivierte Prognose plausibel?

Wir wiederholten die Anpassung mit Leave-one-year-out-Validierung für 2020–2024. Für denselben Historie-Prognose-Schnitt am 1. Juli ergaben sich:

StadiumPrognostiziert / geeignetAbdeckungBiasMittlerer absoluter FehlerMedian absoluter Fehler
Narbenschieben35 / 35100%-0.9 Tage2.5 Tage1.7 Tage
Teigreife35 / 35100%-0.9 Tage3.3 Tage1.9 Tage
Zahnreife34 / 3597%+0.8 Tage4.7 Tage3.6 Tage
Reife32 / 3591%+2.9 Tage6.5 Tage4.2 Tage

Abdeckung ist der Anteil berechtigter Saisons, die das Stadium vor Prognoseende erreichten. Bias ist Prognosedatum minus USDA-Datum. Die Werte machen eine Reifeschätzung mit etwa einer Woche Unsicherheit im Juli als Demo plausibel; sie garantieren weder ein Feld noch die nächste Prognose.

Wichtige Einschränkungen

Wetterberechnung reproduzieren

Das Dashboard bündelt sieben Koordinaten; diese zwei minimalen Iowa-Anfragen zeigen die vollständige Berechnung. Grafana verbindet die Beiträge, zieht GDD vor der Aussaat ab und berechnet die kumulative Summe.

Historienanfrage mit exakt sechs Stunden Vorlauf

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"}
    ]
  }'

Anfrage des archivierten Laufs vom 1. Juli

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"}
    ]
  }'

Beispielzeilen am Übergang von Historie zu Prognose:

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

Primärquellen: NOAA-CFSv2-Dokumentation · CFS-FLXF-Modell und Inventar · USDA-NASS-Methodik · offizielles Crop-Progress-Archiv · Iowa-State-GDD-Methode.