Skip to contents

Here, we show a simple example of a salmon operating model where all fish mature at age 3 and follows the structure of an analysis done in AHA. The historical spool-up is not informed by an estimation model. The model is used to project the proposed management levers to determine the equilibrium properties of the system.

We create several S4 objects, the Bio object contains the natural biological dynamics, including the maturity ogive p_mature, fecundity, as well as the density-dependent survival of smolts through the capacity and productivity parameters (capacity_smolt and kappa, respectively).

The first example will be deterministic. With salmonMSE, we must run at minimum 2 simulation replicates, but we will run 3 simulations where the biological parameters, as well as the results, are identical among simulations.

To accommodate the life stage within the age structured model, we model ocean survival as an equivalent instantaneous rate Mjuv_NOS where all mortality occurs in the age class prior to maturation, i.e., age 2.

library(salmonMSE)

class?SOM # Definition of inputs

SAR <- 0.01 # Marine survival
nsim <- 3 # Number of simulations
Bio <- new(
  "Bio",
  maxage = 3,
  p_mature = c(0, 0, 1),
  SRrel = "BH",
  capacity_smolt = 17250,           # Beverton-Holt asymptote. Not unfished capacity!
  kappa = 3,                        # Productivity in recruits per spawner
  Mjuv_NOS = c(0, -log(SAR), 0),    # Convert marine survival to an instantaneous mortality rate
  fec = c(0, 0, 5040),              # Spawning fecundity of NOS and HOS
  p_female = 0.49,
  s_enroute = 1
)

The next three objects control the management of the conservation unit through habitat, hatchery, and harvest options.

Let’s leave the habitat unchanged from the Bio object:

Habitat <- new(
  "Habitat",
  capacity_smolt_improve = 1,    # Keep carrying capacity unchanged
  kappa_improve = 1              # Keep productivity unchanged
)

Next, we work on the hatchery dynamics.

Below, we have a management target to release 10,000 yearlings annually. In comparison, the carrying capacity of the natural environment is 17,250 smolts. Users also specify the survival of broodtake (s_prespawn), eggs in the hatchery (s_egg_smolt and s_egg_subyearling), the target proportion of natural spawners in the broodtake (ptarget_NOB), and the maximum proportion of natural spawners to be used as broodtake (pmax_NOB). The target proportion can be obtained when the mark rate m = 1 and broodstock origin can be identified.

We place some additional constraints are placed which may prevent us from realizing the target releases. In each time step of the projection, the model calculates the required number of eggs annually for the target releases. The natural broodtake (NOB) and hatchery broodtake (HOB) are removed from the escapement to reach the target egg production and maintain NOB/(NOB + HOB) = ptarget_NOB. The proportion of NOB to the natural origin escapement cannot exceed pmax_NOB. If the target egg production cannot be reached, then the NOB is taken in accordance with pmax_NOB and HOB is taken (up to the total hatchery origin escapement returned to the hatchery) to meet the target egg production.

We also need to specify the relative spawning success of HOS, and various parameters that control fitness of hatchery fish in the natural environment.

Hatchery <- new(
  "Hatchery",
  n_yearling = 10000,             # Management lever. No hatchery if both this line and next line are zero
  n_subyearling = 0,              # Management lever. No hatchery if both this line and previous line are zero
  s_prespawn = 1,                 # Survival prior to spawning
  s_egg_smolt = 0.92,             # Survival of eggs in hatchery
  s_egg_subyearling = 1,
  Mjuv_HOS = Bio@Mjuv_NOS,
  gamma = 0.8,
  m = 1,                          # Mark rate of hatchery releases
  pmax_esc = 1,                   # Maximum proportion of escapement (after en route mortality) that could be used as broodtake
  pmax_NOB = 0.7,                 
  ptarget_NOB = 0.51,
  phatchery = 0.8,
  premove_HOS = 0,
  theta = c(100, 80),
  rel_loss = c(0.5, 0.4, 0.1),
  fec_brood = c(0, 0, 5040),
  fitness_type = c("Ford", "none"),
  zbar_start = c(93.1, 92),
  fitness_variance = 10,
  selection_strength = 3,
  heritability = 0.5,
  fitness_floor = 0.5
)

We specify a harvest rate of 0.203 for the terminal fishery (mature component). No hatchery fish are marked.

Harvest <- new(
  "Harvest",
  u_preterminal = 0,             # No pre-terminal fishery
  u_terminal = 0.203,            # Specify fixed harvest rate of mature fish
  MSF = FALSE,                   # No mark-selective fishing
  release_mort = c(0.1, 0.1),
  vulPT = c(0, 0, 0),
  vulT = c(1, 1, 1)
)

To start the projection, we specify the conditions for the spool-up with the Historical object. We will have a two-year spool-up with an escapement of 1000 natural origin fish and 1000 hatchery origin fish each in the first generation (for all simulations). This is accomplished by setting a spool-up period of 2 years (nyears) and specify the immature abundance of age 1 fish at the beginning of year 1 and age 2 fish at the start of year 2. Since we model ocean survival during age 2, abundance of the cohort doesn’t change.

# Return of 1000 natural and hatchery fish each for the first generation
nyears <- 2
HistN <- array(0, c(nsim, Bio@maxage, nyears+1, 2))
HistN[, 1, 1, ] <- HistN[, 2, 2, ] <- 1000/SAR

Historical <- new(
  "Historical",
  HistN = HistN
)

Now let’s stitch together the operating model and run the simulation for 50 projection years (proyears).

SOM <- new(
  "SOM",
  Bio, Habitat, Hatchery, Harvest, Historical,
  nsim = nsim, nyears = 2, proyears = 50
)
SMSE <- salmonMSE(SOM)

With a simple salmon model, we can run AHA and compare the trajectory of the population. As we can see, the number of NOS in both models is slowly equilibriating to approximately 70.

SAHA <- AHA(SOM, ngen = 20)

# Compare NOS
SAHA$NOS
SMSE@NOS[, 1, ]

Comparison of the abundance of NOS between AHA (by generation) and salmonMSE (by year) given identical biological parameters, hatchery releases, and terminal fishery harvest rate in the simple example.

Stochastic simulations

Let’s repeat the simple example with stochasticity on the productivity parameter (“kappa”, units of recruits/spawner). To do this, we sample productivity from a distribution and we run 100 simulations. This incorporates our uncertainty in understanding of natural productivity in the evaluation of the management strategy.

Histogram of the productivity (kappa) values sampled for our stochastic operating model.

SAR <- 0.01

nsim_stochastic <- 100

# Sample productivity
set.seed(100)
kappa_mean <- 3
kappa_sd <- 0.3
kappa <- rlnorm(nsim_stochastic, log(kappa_mean) - 0.5 * kappa_sd^2, kappa_sd)

Bio_stochastic <- new(
  "Bio",
  maxage = 3,
  p_mature = c(0, 0, 1),
  SRrel = "BH",
  capacity_smolt = 17250,
  kappa = kappa,
  Mjuv_NOS = c(0, -log(SAR), 0),
  fec = c(0, 0, 5040),
  p_female = 0.49,
  s_enroute = 1
)

nyears <- 2
HistN <- array(0, c(nsim_stochastic, Bio_stochastic@maxage, nyears+1, 2))
HistN[, 1, 1, ] <- HistN[, 2, 2, ] <- 1000/SAR

Historical <- new(
  "Historical",
  HistN = HistN
)

SOM_stochastic <- new(
  "SOM",
  Bio_stochastic, Habitat, Hatchery, Harvest, Historical,
  nsim = nsim_stochastic, nyears = 2, proyears = 50
)

SMSE_stochastic <- salmonMSE(SOM_stochastic)

We expect a distribution in the state variables during the projection. Let’s take a look at PNI, where we can plot the median and 95 percent range in values annually from the projection:

plot_statevar_ts(SMSE_stochastic, "PNI", quant = TRUE)

Here is the distribution of PNI in the last projection year:

plot_statevar_hist(SMSE_stochastic, "PNI", y = 49)

From such models, we can develop performance metrics that make probabilistic statements about the system dynamics for each set of management actions. For example, we calculate the long-term probability that PNI is at least 0.80:

PNI_LT <- SMSE_stochastic@PNI[, 1, 49]
mean(PNI_LT >= 0.5)
#> [1] 0.13

The quantiles can also be calculated for our performance metric from the stochastic replicates:

quantile(PNI_LT, c(0.025, 0.5, 0.975))
#>      2.5%       50%     97.5% 
#> 0.6266439 0.7634803 0.8133749

Here is the relationship between the performance metrics and productivity:

A summary Markdown report can be generated with the report() function:

report(SMSE_stochastic)