Using the devRate package to simulate the phenology of Helicoverpa armigera

François Rebaudo ; IRD UMR EGCE

2025-08-25

This vignette exemplifies the use of the devRate package to simulate Helicoverpa armigera phenology using thermal performance curves available in the literature.

require("devRate")

1. Models published in the literature

Numerous models have been developed to simulate the phenology of Helicoverpar armigera. Most are based on the characterization of development as a function of temperature. Insects are reared at various constant temperatures under laboratory conditions, then a model is fitted to the data to obtain a thermal performance curve. The various publications for which models were retrievable are listed in Table 1.

Table 1. Models for Helicoverpa armigera

Ref DOI Function name in devRate
Bartekova and Praslicka, 2006 10.17221/2768-PPS ha_bartekova2006
Jallow and Matsumura, 2001 10.1303/aez.2001.427 ha_jallow2001
Mironidis and Savopoulou-Soultani, 2008 10.1093/ee/37.1.16 ha_mironidis2008_ls
Mironidis and Savopoulou-Soultani, 2008 10.1093/ee/37.1.16 ha_mironidis2008_nls
Foley, 1981 10.1111/j.1440-6055.1981.tb00993.x ha_foley1981
Kay, 1981 10.1111/j.1440-6055.1981.tb01020.x ha_kay1981_ls
Kay, 1981 10.1111/j.1440-6055.1981.tb01020.x ha_kay1981_nls
Noor-ul-Ane et al., 2018 10.1017/S0007485317000724 ha_noorulane2018_ls
Noor-ul-Ane et al., 2018 10.1017/S0007485317000724 ha_noorulane2018_nls
Qureshi et al., 1999 10.1303/aez.34.327 ha_qureshi1999_ls
Ahmad 2024 10.21203/rs.3.rs-4845823/v1 ha_ahmad2024_ls

Each model is implemented in this package as a function that returns a list object. Each list is composed of two elements: the first contains the mathematical equation used and the second a list of the parameters of the mathematical equation for each life stage of the insect. The life stages available, the models, and the number of temperatures used for fitting are shown in Table 2.

Table 2. Model specifications for Helicoverpa armigera

Name Type Temperature (Celsius) Life stages
ha_bartekova2006 Campbell 20, 25, 30 (3) eggs, larvae, pupae (3)
ha_jallow2001 Campbell 10, 13.3, 16.4, 20, 22.5, 25, 27.9, 30.5, 32.5 (9) eggs, larvae, pupae (3)
ha_mironidis2008_ls Campbell 10, 12.5, 15, 17.5, 20, 25, 27.5, 30, 32.5, 35, 37.5, 40 (12) eggs, larvae, pupae (3)
ha_mironidis2008_nls Lactin-2 10, 12.5, 15, 17.5, 20, 25, 27.5, 30, 32.5, 35, 37.5, 40 (12) eggs, larvae, pupae (3)
ha_foley1981 Campbell 20, 24, 28, 32 (4) post-diapausing and non-diapausing pupae (2)
ha_kay1981_ls Campbell 8, 10, 13.3, 17.8, 20.8, 24.4, 27.2, 31.4, 35, 39.4 (10) eggs (1)
ha_kay1981_nls Davidson 8, 10, 13.3, 17.8, 20.8, 24.4, 27.2, 31.4, 35, 39.4 (10) eggs (1)
ha_noorulane2018_ls Campbell 10, 15, 17.5, 20, 25, 27.5, 30, 35, 37.5, 40 (10) eggs, larvae, pupae (3)
ha_noorulane2018_nls Briere-2 10, 15, 17.5, 20, 25, 27.5, 30, 35, 37.5, 40 (10) overall (1)
ha_qureshi1999_ls Campbell 15, 20, 25, 30 (4) eggs, larvae, pupae (3)
ha_ahmad2024_ls Campbell 14, 16, 18, 20, 22, 25, 27, 30, 32, 35, 36 (11) eggs, l1:6, prepupae, pupae (9)

2. Simulating phenology

Based on the relationship between development and temperature, and on a temperature time series, it is then possible to run simulations of the pest’s phenology.

2.1. Temperature time series

Any temperature time series can be used to simulate pest phenology. In the following simulations, the time step is expressed in days. If the temperature time series has a time step of 1h, a time step of 1/24 should be specified. In this example, we’ll simulate a theoretical temperature time series using a random generation for the normal distribution with mean equal to 25 and standard deviation equal to 2 (90 days with one temperature data every 6 hours ; 90x4 temperature values).

temp <- stats::rnorm(n = 90*4, mean = 25, sd = 2)
par(mar = c(4, 4, 0, 0))
plot(
  x = temp, type = "o", 
  xlab = "Time (6 hours time step)", ylab = "Temperature",
  ylim = c(15, 35)
)

2.2. Model selection and computation

Now we can run simulations, selecting our temperature time series and the models of our choice.

2.2.1. Simulation using a single model

set.seed(1234)

# Using Bartekova and Praslicka, 2006 model
my_model <- ha_bartekova2006()

# This model was designed for eggs, larvae and pupae, using simple linear
# regression models (following Campbell 1974).
forecastX <- devRateIBMparam(
  tempTS = temp, # the temperature time series described above
  timeStepTS = 1/4, # we  have 4 temperature values per day (every 6 hours)
  eq = list("campbell_74", "campbell_74", "campbell_74"), # the model eq for
    # the three life stages
  myParam = list(
    my_model[["model"]]$pupa, # starting with pupae
    my_model[["model"]]$egg,  # then adults and eggs
    my_model[["model"]]$larva # then larvae and the cycle goes on
  ),
  adultLifeStage = 1, # adult life stage after the first model step (pupae 
    # to adults)
  timeLayEggs = 10, # adults longevity fixed to 10 days
  numInd = 10, # 10 individuals for the simulation
  stocha = 0.05 # a bit of intra-population variability
)

The result of the simulation is a list object, with the first element being the predictions of the various stages for all individuals (phenology). The data correspond to the number of time steps expressed in the time series value (6h time step here). The second element corresponds to the model parameters used, and the third element to the temperature series used. We can plot the simualtion result using the first element.

sim01 <- forecastX[[1]]
hist(
  -999, # empty histogram
  xlim = c(0, max(sim01)), ylim = c(0, nrow(sim01)), 
  xlab = "Time", ylab = "Number of individuals", axes = FALSE, main = ""
)
axis(1)
axis(2, las = 1)
cycleLabels <- rep(c("adults", "larvae", "pupae"), 10)
trash <- lapply(1:ncol(sim01), function(i){
  hist(sim01[,i], add = TRUE)
  text(
    x = mean(sim01[,i]), 
    y = max(table(sim01[,i])), 
    labels = colnames(sim01)[i],
    pos = 2
  )
  text(
    x = mean(sim01[,i]), 
    y = max(table(sim01[,i]))+1, 
    labels = cycleLabels[i],
    pos = 2
  )
  
})

2.2.2. Simulation using different models

set.seed(1234)

my_model01 <- ha_bartekova2006(plotfig = FALSE)
my_model02 <- ha_mironidis2008_nls(plotfig = FALSE)
my_model03 <- ha_foley1981(plotfig = FALSE)

forecastX <- devRateIBMparam(
  tempTS = temp, # the temperature time series described above
  timeStepTS = 1/4, # we  have 4 temperature values per day (every 6 hours)
  eq = rep(list(
    "campbell_74", "campbell_74", "lactin2_95"
  ), 3), # the model eq for
    # the three life stages
  myParam = list(
    my_model03[["model"]]$diapausingpupae, # starting with diapausing pupae (Foley 1981)
    my_model01[["model"]]$egg,  # then adults and eggs (Bartekova 2006)
    my_model02[["model"]]$larva, # then larvae (Mironidis 2008)
    my_model03[["model"]]$nondiapausingpupae, # pupae G2 (Foley 1981)
    my_model01[["model"]]$egg,
    my_model02[["model"]]$larva,
    my_model03[["model"]]$nondiapausingpupae,
    my_model01[["model"]]$egg,
    my_model02[["model"]]$larva
  ),
  adultLifeStage = 1, # adult life stage after the first model step (pupae 
    # to adults)
  timeLayEggs = 10, # adults longevity fixed to 10 days
  numInd = 10, # 10 individuals for the simulation
  stocha = 0.05 # a bit of intra-population variability
)
sim02 <- forecastX[[1]]
hist(
  -999, # empty histogram
  xlim = c(0, max(sim02)), ylim = c(0, nrow(sim02)), 
  xlab = "Time", ylab = "Number of individuals", axes = FALSE, main = ""
)
axis(1)
axis(2, las = 1)
cycleLabels <- rep(c("adults", "larvae", "pupae"), 10)
trash <- lapply(1:ncol(sim02), function(i){
  hist(sim02[,i], add = TRUE)
  text(
    x = mean(sim02[,i]), 
    y = max(table(sim02[,i])), 
    labels = colnames(sim02)[i],
    pos = 2
  )
  text(
    x = mean(sim02[,i]), 
    y = max(table(sim02[,i]))+1, 
    labels = cycleLabels[i],
    pos = 2
  )
  
})

2.3. Simulation results and comparison

# results of simulations using model 1
apply(sim01, MARGIN = 2, FUN = summary)
##          g1s1  g1s2  g1s3  g2s1  g2s2
## Min.    52.00 87.00 187.0 241.0 276.0
## 1st Qu. 52.25 87.25 188.0 242.0 277.0
## Median  53.00 88.00 188.0 242.0 277.5
## Mean    52.80 87.90 188.3 242.1 277.5
## 3rd Qu. 53.00 88.00 189.0 242.0 278.0
## Max.    54.00 89.00 189.0 243.0 279.0
# results of simulations using model 2
apply(sim02, MARGIN = 2, FUN = summary)
##          g1s1  g1s2 g1s3  g1s4  g1s5  g1s6
## Min.    53.00 88.00  152 213.0 239.0 303.0
## 1st Qu. 53.00 88.25  153 214.0 240.0 304.0
## Median  53.00 89.00  153 214.5 240.5 304.5
## Mean    53.40 88.90  153 214.3 240.4 304.6
## 3rd Qu. 53.75 89.00  153 215.0 241.0 305.0
## Max.    55.00 90.00  154 215.0 241.0 306.0

A more detailed comparison would not be meaningful here because the time series is theoretical and the choice of models used is arbitrary. Nevertheless, these simulations highlight notable differences in phenology for H. armigera. A comparison could be made based on meteorological data from sites where insect trapping is carried out, in order to compare simulated data with observed data and choose the most appropriate model from among the many possible combinations.