Previsione e backtest CFS della crescita del mais

Questa è una previsione termica sperimentale del mais per il 2024, verificata fuori campione, non un consiglio agronomico. La dashboard chiede quando gli stadi statali supererebbero il 50% se lo sviluppo seguisse il calore accumulato in una cella CFS.

Come viene costruita la previsione

La dashboard usa CFS FLXF di NOAA, con uscite ogni sei ore fino a circa 215 giorni, insieme a un modello modificato di Growing Degree Days (GDD) calibrato e verificato sui rapporti USDA sull'avanzamento delle colture. In questo modo produce una previsione termica per l'intera stagione mantenendo verificabili ipotesi e soglie.

Il caso è congelato al 1 luglio 2024, 00 UTC. Prima usa storia CFS con lead time esatto di sei ore, poi un unico run archiviato. La storia resta guidance di modello, non osservazione, e non vengono aggiunti cicli successivi.

Dato che CFS è grossolano, ogni serie usa una coordinata nativa della griglia gaussiana, non una città o una media statale:

StatoLatitudineLongitudine
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

Calcolo termico su sei ore

Per ogni intervallo, TMAX e TMIN vengono convertite in Fahrenheit, limitate a 50–86 °F, mediate, ridotte della base di 50 °F e moltiplicate per un quarto di giorno:

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

Base e limite seguono il metodo GDD modificato di Iowa State University Extension. Applicarlo a ogni intervallo non equivale esattamente agli estremi giornalieri; le soglie sono quindi calibrate nella stessa metrica di sei ore.

Come sono state generate le costanti

I target vengono da USDA NASS Crop Progress and Condition. Interpoliamo linearmente il momento in cui la percentuale settimanale statale supera il 50%. Il 50% seminato avvia l'accumulo; emergenza, emissione delle sete, maturazione cerosa, dentatura e maturità sono i target.

Per ogni stato, anno e stadio, la soglia implicita è il GDD accumulato tra le due date. Per non calibrare il 2024 su sé stesso, le costanti della dashboard sono le mediane del 2020–2023. È una piccola calibrazione storica, non addestramento di machine learning:

StatoEmergenzaEmissione seteMaturazione cerosaDentaturaMaturità
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

Le differenze fra stati sono volute: un'unica soglia nazionale funzionava male. Le costanti assorbono varietà, maturità relativa, date di semina e la differenza fra una cella e uno stato.

La previsione archiviata è plausibile?

Abbiamo ripetuto il fit con validazione leave-one-year-out sul 2020–2024. Per la stessa divisione storia-previsione del 1 luglio, i risultati fuori campione sono:

StadioPrevisti / ammissibiliCoperturaBiasErrore assoluto medioErrore assoluto mediano
Emissione sete35 / 35100%-0.9 giorni2.5 giorni1.7 giorni
Maturazione cerosa35 / 35100%-0.9 giorni3.3 giorni1.9 giorni
Dentatura34 / 3597%+0.8 giorni4.7 giorni3.6 giorni
Maturità32 / 3591%+2.9 giorni6.5 giorni4.2 giorni

La copertura è la quota di stagioni ammissibili che raggiunge lo stadio prima della fine della previsione. Il bias è data prevista meno data USDA. I risultati rendono plausibile, come demo, una stima della maturità con circa una settimana di errore a luglio; non garantiscono un campo o la prossima previsione.

Limiti importanti

Riprodurre il calcolo meteorologico

La dashboard raggruppa sette coordinate; queste due richieste minime per Iowa mostrano l'intero calcolo. Grafana concatena i contributi, sottrae il GDD precedente alla semina e calcola la somma cumulativa.

Richiesta di storia con lead time esatto di sei ore

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

Richiesta della previsione archiviata del 1 luglio

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

Righe di esempio al raccordo storia-previsione:

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

Fonti primarie: documentazione NOAA CFSv2 · modello e inventario CFS FLXF · metodologia USDA NASS · archivio ufficiale Crop Progress · metodo GDD di Iowa State.