Skip to contents

🎯 Goal

This vignette demonstrates how to use FraNchEstYN to simulate yield losses under different fungicide treatment for Septoria tritici in Ethiopia, using data from fungicide trials on three varieties and two locations in 2012.

The workflow has three main steps:

  1. Crop and disease calibration: adjust crop and disease parameters using the most susceptible variety.
  2. Adapt varietal resistance and fungicide scheduling: simulate alternative fungicide schedules and varietal resistance levels.

Data are released with the package and were digitized from trial reports including weather (NASA POWER), reference disease observations, and management metadata.

📦 Packages

We load FraNchEstYN plus helper libraries for wrangling and visualization.

📥 Data loading

Hourly weather data were queried from NASA POWER for Agecha and Hossana sites.

data(weather_ethiopia)
glimpse(weather_ethiopia)
#> Rows: 17,568
#> Columns: 9
#> $ Site        <chr> "Agecha", "Agecha", "Agecha", "Agecha", "Agecha", "Agecha"…
#> $ lat         <dbl> 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7…
#> $ YEAR        <int> 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012…
#> $ MO          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
#> $ DY          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
#> $ HR          <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
#> $ T2M         <dbl> 9.24, 8.75, 8.26, 7.74, 7.25, 6.70, 6.30, 10.10, 14.68, 19…
#> $ RH2M        <dbl> 63.62, 60.29, 58.47, 58.81, 59.50, 60.31, 60.23, 44.76, 31…
#> $ PRECTOTCORR <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…

📑 Disease and yield data

Reference observations come from fungicide trials. We filter here for the Gambo variety in one site (Hossana ) without fungicide (susceptible baseline). We will then apply the calibrated parameters on the other site (Agecha).

data(reference_ethiopia)
reference_data <- reference_ethiopia %>%
  filter(variety == "Gambo", fungicide == "no", site == 'Hossana')
head(reference_data)
#>      site variety fungicide year DOY Disease YieldActual YieldAttainable
#> 1 Hossana   Gambo        no 2012 201    0.00          NA              NA
#> 2 Hossana   Gambo        no 2012 246    1.13          NA              NA
#> 3 Hossana   Gambo        no 2012 253    3.66          NA              NA
#> 4 Hossana   Gambo        no 2012 260    7.37          NA              NA
#> 5 Hossana   Gambo        no 2012 267   21.23          NA              NA
#> 6 Hossana   Gambo        no 2012 274   48.11          NA              NA

🧰 Management data

Basic management metadata (crop, sowing DOY, fungicide schedules) are included as management_ethiopia.

data(management_ethiopia)
management_data<-management_ethiopia |> 
  filter(site=='Hossana',fungicide=='no')

head(management_ethiopia)
#>      site fungicide  crop variety year sowingDOY             treatment
#> 1 Hossana        no wheat     All 2012       201                     0
#> 2  Agecha        no wheat     All 2012       204                     0
#> 3 Hossana         2 wheat     All 2012       201        Sep 23, Oct 23
#> 4  Agecha         2 wheat     All 2012       204          Oct 8, Nov 8
#> 5 Hossana         3 wheat     All 2012       201 Sep 16, Oct 6, Oct 26
#> 6  Agecha         3 wheat     All 2012       204 Oct 7, Oct 27, Nov 16

🌾🦠 Step 1 — Crop and disease calibration

We first calibrate crop parameters (cycle length, base/optimum temperature, RUE) together with key disease parameters for Septoria (senescence acceleration, light stealer damage). Calibration is performed on Gambo without fungicide.

thisCropParameters <- FraNchEstYN::disable_all_calibration(cropParameters$wheat)
thisCropParameters$TbaseCrop$value <- 2
thisCropParameters$ToptCrop$value  <- 21
thisCropParameters$CycleLength$calibration <- TRUE
thisCropParameters$CycleLength$min <- 2100
thisCropParameters$CycleLength$max <- 2300
thisCropParameters$RadiationUseEfficiency$calibration <- TRUE
thisCropParameters$HalfIntSenescence$value<-90

thisDiseaseParam <- diseaseParameters$septoria
thisDiseaseParam$SenescenceAcceleratorDamage$calibration <- TRUE
thisDiseaseParam$SenescenceAcceleratorDamage$max <- 0.1
thisDiseaseParam$LightStealerDamage$min <- 0.1
thisDiseaseParam$AssimilateSappersDamage$calibration<-F
thisDiseaseParam$AssimilateSappersDamage$value<-0
thisDiseaseParam$OuterInoculumShapeRelease$value<-1
thisDiseaseParam$LightStealerDamage$min<-0
thisDiseaseParam$LightStealerDamage$max<-.3
thisDiseaseParam$HydroThermalTimeOnset$max<-5
thisDiseaseParam$CyclePercentageOnset$max<-10
thisDiseaseParam$CyclePercentageOnset$min<-0


weather_ethiopia_singlesite <- weather_ethiopia |> 
  filter(Site =='Hossana')

df_calib <- franchestyn(
  weather_data      = weather_ethiopia_singlesite,
  management_data   = management_data,
  reference_data    = reference_data,
  cropParameters    = thisCropParameters,
  diseaseParameters = thisDiseaseParam,
  calibration       = "all",
  start_end         = c(2012,2012),
  iterations        = 999
)

sim <- df_calib$outputs$simulation

📊 Plot after calibration (single site = Hossana)

💊 Step 2 — Varietal resistance and fungicide schedules We now extend simulations to the other site (Agecha), all varieties (Gambo, Galama, Alidoro) and fungicide schedules (no, 2, 3, 7). Only Varietal Resistance is adjusted per cultivar, while fungicide efficacy is applied through parameterized protectant functions.

#calibrated parameters
# Disable calibration (fix crop + disease params after step 1 calibration)
calibCrop    <- FraNchEstYN::disable_all_calibration(df_calib$parameters$crop)
calibDisease <- FraNchEstYN::disable_all_calibration(df_calib$parameters$disease)

# Initialize empty list to store all simulation outputs
outputsSim <- list()

fungicideParam <- FraNchEstYN::disable_all_calibration(FraNchEstYN::fungicideParameters$protectant)
fungicideParam$TenacityFactor$value<-0.05
fungicideParam$DegradationRate$value<-0.02
fungicideParam$InitialEfficacy$value<-1
fungicideParam$AShapeParameter$value<-3
fungicideParam$BShapeParameter$value<-8

# 🔁 Loop over sites (e.g., Hossana, Agecha)
for (s in unique(reference_ethiopia$site)) {
  
  # 🔁 Loop over varieties (Gambo, Galama, Alidoro)
  for (var in unique(reference_ethiopia$variety)) {
    
    # 🔁 Loop over fungicide treatments (no, 2, 3, 7)
    for (f in unique(management_ethiopia$fungicide)) {
      
      # Filter datasets for this site–variety–fungicide combination
      ref_sub <- reference_ethiopia %>%
        filter(site == s, variety == var, fungicide == f)   # observed disease + yield
      man_sub <- management_ethiopia %>%
        filter(site == s, fungicide == f)                   # management schedule
      weather_sub <- weather_ethiopia %>%
        filter(Site == s)                                   # weather for this site
      
      # Skip this combination if any dataset is missing
      if (nrow(ref_sub) == 0 | nrow(man_sub) == 0 | nrow(weather_sub) == 0) next
      
      # Run simulation with FraNchEstYN
      res <- franchestyn(
        weather_data        = weather_sub,
        management_data     = man_sub,
        reference_data      = ref_sub,
        cropParameters      = calibCrop,
        diseaseParameters   = calibDisease,
        fungicideParameters = fungicideParam,
        calibration         = "none",   # no further calibration, just simulate
        start_end           = c(2012,2012),
      )
      
      # If simulation produced outputs, store them in the list
      if (!is.null(res$outputs$simulation)) {
        outputsSim[[paste(s, var, f, sep = "_")]] <- res$outputs$simulation %>%
          mutate(site = s, variety = var, fungicide = f)  # tag outputs with metadata
      }
    }
  }
}

# Combine all site–variety–fungicide simulations into one data frame
sim_all <- bind_rows(outputsSim)

📊 Plot after looping across sites, varieties, fungicides

📝 Key take-home messages

FraNchEstYN successfully reproduced Septoria epidemics and yield losses observed in Ethiopia fungicide trials.

Calibration on the susceptible variety Gambo at Hossana provided a baseline that transferred well to Agecha and to other varieties.

Varietal resistance and fungicide scheduling strongly influenced epidemic progress and yield protection, with more resistant varieties and intensive spray schedules delaying disease development and sustaining yields.

The modeling framework captured multiple canopy processes simultaneously (light interception, disease severity, fungicide efficacy, attainable and actual yields), allowing a holistic assessment of crop loss.

Outputs are fully structured, enabling further diagnostics, parameter analysis, and scenario testing.

🚀 Next steps

  • Apply the same workflow to other seasons or Ethiopian regions, by plugging in local weather and reference trial data.
  • Test alternative fungicide parameterizations (protectant vs systemic, degradation rates, efficacy curves) to assess spray strategies.
  • Explore genotype × environment × management interactions, by running varietal resistance levels under diverse climates.
  • Assess uncertainty by increasing calibration iterations and comparing parameter stability across replicates.
  • Extend this approach to economic or policy scenarios, estimating yield losses avoided through integrated disease management.