Skip to contents

Introduction

Reference points for salmon typically use the Ricker stock function that predict the return as a density-dependent relationship with the number of spawners, typically of the previous generation for salmon with single brood year returns.

The Ricker function is

\[ R = a\times S\exp(-bS) \]

where \(R\) is the return and \(S\) is the spawners. Parameters \(a\) is in units of returns/spawner and \(b\) is in units of reciprocal spawners.

Let \(S_\textrm{MSY}\) be the spawner abundance that maximizes catch \(R-S\), which can be obtained by maximizing the function:

\[ R - S = a\times S\exp(-b S) - S \]

The implicit solution, where \(\alpha = \log(a)\), satisfies

\[ (1 - bS_\textrm{MSY})\exp(\alpha - bS_\textrm{MSY}) = 1 \]

and can be solved numerically (Scheuerell 2016).

\(S_\textrm{MSY}\) is also the spawner abundance that maximizes excess returns above the one-to-one line.

The harvest rate corresponding to \(S_\textrm{MSY}\) is

\[ U_\textrm{MSY} = bS_\textrm{MSY} \]

The quantity \(S_\textrm{gen}\) is the spawner abundance that would reach the spawner abundance at MSY after one generation without fishing (Holt et al. 2009), and satisfies the equation:

\[ S_\textrm{MSY}=a\times S_\textrm{gen}\exp(-b\times S_\textrm{gen}) \]

There are several implicit assumptions frequently associated with these reference points:

  1. The stock-recruit relationship predicts the number of returns, not juveniles, from the number of spawners. The density-dependent and density-independent components of survival are modeled together.
  2. All exploitation occurs on mature individuals
  3. All returns are equally vulnerable to the terminal fishery
  4. All spawners are equally fecund

Reference points in salmonMSE

salmonMSE is an age-structured model that can relax the assumptions from the typical spawner-return model:

  1. The stock-recruit relationship predicts the number of outmigrating juveniles, not the return, from the egg production (not the number of spawners). The density-dependent and density-independent components of survival are modeled separately.
  2. Exploitation can occur on both immature and mature individuals
  3. Fish vulnerability can vary by age
  4. Older, larger spawners have larger contributions to the egg production because they are more fecund than younger fish

Accordingly, reference points are calculated with more structural complexity compared to the simple approach. Comparisons below indicate the many situations where the salmonMSE reference points do and don’t overlap with the simpler reference points.

Calculations for MSY

Given exploitation in both the immature and mature component of the population, the juvenile survival of an outmigrating individual (“smolt”) to age \(a\) is

\[ \ell_a = \prod_{j=1}^{a-1}\exp(-[M_j+v^\textrm{PT}_jF^\textrm{PT}])(1 - p_j) \] where \(M\) is natural mortality, \(v^\textrm{PT}\) is vulnerability at age in the preterminal fishery, \(F^\textrm{PT}\) is fishing mortality in the preterminal fishery, and \(p\) is maturity.

The corresponding return per juvenile \(r_a = \ell_a \exp(-v^\textrm{PT}_aF^\textrm{PT}])(1 - p_a)\).

The corresponding escapement per juvenile is \(s_a = r_a \exp(-v^\textrm{T}_aF^\textrm{T}])\), with \(v^\textrm{T}\) is vulnerability at age in the fishery and \(F^\textrm{T}\) is fishing mortality in the terminal fishery.

The corresponding egg production per juvenile \(\phi = \sum_a s_a f_a p^\textrm{female}\).

The equilibrium juvenile production \(J\) is calculated from \(\phi\) as:

\(J = \log(a'\phi)/(b'\phi)\)

where \(a'\) is in units of juvenile per egg and \(b'\) is in units of per egg.

The total return is \(R = \sum_a J \times r_a\) and total spawners is \(S = \sum_a J \times s_a\).

The equilibrium preterminal catch is:

\[ C^\textrm{PT} = \sum_a J\times\ell_a\times(1 - \exp(v^\textrm{PT}_aF^\textrm{PT})) \]

Frequently, the preterminal catch is adjusted in terms of adult equivalent units (the number of adults that the catch would have produced if it hadn’t been caught):

\[ C^\textrm{PT,AEQ} = \sum_a \textrm{AEQ}_a \times J\times\ell_a\times(1 - \exp(v^\textrm{PT}_aF^\textrm{PT})) \]

where

\[ \textrm{AEQ}_a = \begin{cases} \begin{array}{l l} 1 & a = A\\ \textrm{AEQ}_{a+1} \times \exp(-M_a) (1 - p_a) + p_a \quad & a = 1, \dots, A-1 \end{array} \end{cases} \]

The equilibrium terminal catch (of adults) is:

\[ C^\textrm{T} = \sum_a J\times r_a\times(1 - \exp(v^\textrm{T}_aF^\textrm{T})) \]

The maximum sustainable yield state variables can be obtained from maximizing the objective function \(f\).

If the objective function maximizes total catch:

\[ f = C^\textrm{PT,AEQ} + C^\textrm{T} \] The optimization calculates the corresponding fishery effort \(E_\textrm{MSY}\). The user needs to specify the relative effort to the preterminal and terminal fisheries (\(e_1\) and \(e_2\)), with \(F^\textrm{PT,MSY} = e_1 \times E_\textrm{MSY}\) and \(F^\textrm{T,MSY} = e_2 \times E_\textrm{MSY}\).

For example, if there is only a preterminal fishery, then \(e_1 = 1\) and \(e_2 = 0\), therefore \(C^\textrm{T} = 0\).

Alternatively, the objective function maximizes excess recruitment:

\[ f = (C^\textrm{PT,AEQ} + R) - S \]

but the two methods are functionally equivalent.

The preterminal exploitation rate using adult equivalents is \(U^{PT} = C^\textrm{PT,AEQ}/(C^\textrm{PT,AEQ} + R)\).

The terminal exploitation rate is \(U^T = C^T/R\).

Calculations for Sgen

Sgen is calculated by a subsequent optimization algorithm to search for the fishery effort \(E_\textrm{gen}\) that generates an equilibrium distribution at age, then projects that equilibrium population for \(n_\textrm{gen}\) years with no fishing, such that the spawning abundance reaches \(S_\textrm{MSY}\) after \(n_\textrm{gen}\) years.

If there is partial maturity at several age classes, the number of years for the projection is unclear. The population can recover to \(S_\textrm{MSY}\) with either increased survival, increased juvenile production, or both. Currently, salmonMSE will use the first age of maturity, e.g., typically two years for Chinook salmon, for the projection duration. Comparisons in the next section indicate that Sgen between the two methods sometimes, but not always, agree.

Comparison between methods

Currently, salmonMSE parameterizes the operating model with \(a\) (returns/spawner), \(\phi\) (juveniles/egg) and \(Smax = 1/b'\) (eggs).

The following function facilitates comparison of the salmonMSE and Ricker SRR reference points in the various examples. Some conversion is also needed to convert between \(b'\) (1/eggs) to \(b\) (1/spawner).

In summary, if the age-structured reference point calculation only includes terminal exploitation, then the reference points are equivalent with values from the Ricker model unless both fecundity and vulnerability vary with age.

compare_ref <- function(a = 3, # Units of adults/spawner
                        Smax = 1000, # Units of spawners
                        maxage = 5,
                        rel_F = c(0, 1), # e_1 and e_2
                        p_female = 1,
                        vulPT = rep(0, maxage),
                        vulT = c(0, 0, 0.2, 0.5, 1),
                        M = c(1, 0.8, 0.6, 0.4),
                        fec = c(0, 1500, 3000, 3200, 3500),
                        p_mature = c(0, 0.1, 0.2, 0.3, 1),
                        maximize = c("MSY", "MER")) {
  
  require(salmonMSE)
  
  maximize <- match.arg(maximize)

  # Calculate eggs per smolt
  phi <- salmonMSE:::calc_phi(
    Mjuv = M,
    p_mature = p_mature,
    p_female = p_female,
    fec = fec,
    s_enroute = 1
  )

  # To convert Smax from units of spawners to eggs:
  # 1. Calculate Srep from Ricker SRR, set R = S --> S0 = log(a)/b
  # 2. Calculate spawners per juvenile (tau)
  # 3. Calculate smolt per egg (phi)
  # 4. Egg production at replacement (Erep) = unfished spawners * juvenile per spawner * egg per smolt
  # 5. Emax = log(a) / unfished eggs
  tau <- salmonMSE:::calc_phi(
    Mjuv = M,
    p_mature = p_mature,
    p_female = p_female,
    fec = fec,
    s_enroute = 1,
    output = "spawner"
  )
  
  Srep <- Smax * log(a)
  Erep <- Srep / tau * phi
  beta <- log(a)/Erep
  Emax <- 1/beta

  SRRpars <- data.frame(
    kappa = a,
    Smax = Smax,
    Emax = Emax,
    tau = tau,
    phi = phi,
    SRrel = "Ricker"
  )

  # salmonMSE ref
  ref <- calc_MSY(
    M, fec, p_female, rel_F, vulPT, vulT, p_mature,
    s_enroute = 1, SRRpars = SRRpars, maximize = maximize
  )

  ref["Sgen"] <- calc_Sgen(
    M, fec, p_female, rel_F, vulPT, vulT, p_mature,
    s_enroute = 1, SRRpars = SRRpars, SMSY = ref["Spawners_MSY"]
  )
  ref["Catch/Return"] <- sum(ref["KPT_AEQ_MSY"], ref["KT_MSY"])/(sum(ref["KPT_AEQ_MSY"], ref["Return_MSY"]))

  ref_salmonMSE <- structure(
    ref[c("UPT_EQ_MSY", "UT_MSY", "Catch/Return", "Spawners_MSY", "Sgen")], 
    names = c("UMSY (preterminal)", "UMSY (terminal)", "Catch/Return", "SMSY", "Sgen")
  ) |>
    round(4)
  
  # Ricker SRR calcs
  ref_Ricker <- local({
    umsy <- calc_Umsy_Ricker(log(a))
    smsy <- calc_Smsy_Ricker(log(a), 1/Smax)
    sgen <- calc_Sgen_Ricker(log(a), 1/Smax)
    structure(c(umsy, smsy, sgen), names = c("UMSY", "SMSY", "Sgen"))
  }) |>
    round(4)
  
  output <- list(
    salmonMSE = ref_salmonMSE,
    Ricker = ref_Ricker
  )
  return(output)
}

Situation 1 - single age of maturity

Situation 1 specifies the salmonMSE (age-structured) model with the simple assumptions identified in the introduction. The salmonMSE and Ricker (stock-recruit only) reference points are identical.

compare_ref(
  a = 3,
  Smax = 1000,
  maxage = 5,
  rel_F = c(0, 1),
  p_female = 1,
  vulPT = rep(0, 5),
  vulT = c(0, 0, 0, 0, 1),
  M = c(-log(0.01), 0, 0, 0), # SAR = 0.01
  fec = c(0, 0, 0, 0, 1),
  p_mature = c(0, 0, 0, 0, 1)
)
#> Loading required package: salmonMSE
#> $salmonMSE
#> UMSY (preterminal)    UMSY (terminal)       Catch/Return               SMSY 
#>             0.0000             0.4678             0.4678           467.8335 
#>               Sgen 
#>           188.2447 
#> 
#> $Ricker
#>     UMSY     SMSY     Sgen 
#>   0.4678 467.8265 188.2417

Situation 2 - partial age maturity, equal vulnerability

Situation 2 specifies the salmonMSE (age-structured) model with age-specific juvenile mortality and maturity. All spawners are identical with fecundity = 1 and fully vulnerable to the fishery.

The salmonMSE and Ricker-only reference points are identical.

compare_ref(
  a = 3,
  Smax = 1000,
  maxage = 5,
  rel_F = c(0, 1),
  p_female = 1,
  vulPT = rep(0, 5),
  vulT = rep(1, 5),
  M = c(1, 0.3, 0.2, 0.1),
  fec = rep(1, 5),
  p_mature = c(0, 0.1, 0.2, 0.3, 1),
)
#> $salmonMSE
#> UMSY (preterminal)    UMSY (terminal)       Catch/Return               SMSY 
#>             0.0000             0.4678             0.4678           467.8335 
#>               Sgen 
#>           188.2447 
#> 
#> $Ricker
#>     UMSY     SMSY     Sgen 
#>   0.4678 467.8265 188.2417

Situation 3 - partial age maturity, varying vulnerability by age

Situation 3 is the same as 2 except with age-varying fishery vulnerability.

The salmonMSE and Ricker-only reference points are identical.

compare_ref(
  a = 3,
  Smax = 1000,
  maxage = 5,
  rel_F = c(0, 1),
  p_female = 1,
  vulPT = rep(0, 5),
  vulT = c(0, 0.1, 0.2, 0.4, 1),
  M = c(1, 0.3, 0.2, 0.1),
  fec = rep(1, 5),
  p_mature = c(0, 0.1, 0.2, 0.3, 1),
  maximize = "MER"
)
#> $salmonMSE
#> UMSY (preterminal)    UMSY (terminal)       Catch/Return               SMSY 
#>             0.0000             0.4678             0.4678           467.8251 
#>               Sgen 
#>           188.2410 
#> 
#> $Ricker
#>     UMSY     SMSY     Sgen 
#>   0.4678 467.8265 188.2417

Situation 4 - partial age maturity, varying fecundity and vulnerability by age

Situation 4 is the same as 3 except with age-varying fecundity.

The salmonMSE and Ricker-only reference points are not identical.

Preferential vulnerability by the fishery for return which are not identical in fecundity are additional complexities not implemented in Ricker-only reference points.

compare_ref(
  a = 3,
  Smax = 1000,
  maxage = 5,
  rel_F = c(0, 1),
  p_female = 1,
  vulPT = rep(0, 5),
  vulT = c(0, 0.1, 0.2, 0.4, 1),
  M = c(1, 0.3, 0.2, 0.1),
  fec = c(0, 1000, 2000, 3000, 3500),
  p_mature = c(0, 0.1, 0.2, 0.3, 1)
)
#> $salmonMSE
#> UMSY (preterminal)    UMSY (terminal)       Catch/Return               SMSY 
#>             0.0000             0.4001             0.4001           523.7658 
#>               Sgen 
#>           260.2642 
#> 
#> $Ricker
#>     UMSY     SMSY     Sgen 
#>   0.4678 467.8265 188.2417

Situation 5 - partial age maturity, with immature exploitation

Reference points can also be calculated by considering preterminal exploitation and converting juvenile catch to their adult equivalents.

Nonetheless, salmonMSE and Ricker reference points are not identical.

compare_ref(
  a = 3,
  Smax = 1000,
  maxage = 5,
  rel_F = c(1, 0),
  p_female = 1,
  vulPT = c(0, 0.1, 0.2, 0.4, 1),
  vulT = c(0, 0, 0, 0, 0),
  M = c(1, 0.3, 0.2, 0.1),
  fec = c(0, 1000, 2000, 3000, 3500),
  p_mature = c(0, 0.1, 0.2, 0.3, 1)
)
#> $salmonMSE
#> UMSY (preterminal)    UMSY (terminal)       Catch/Return               SMSY 
#>             0.3806             0.0000             0.3806           706.9302 
#>               Sgen 
#>           532.8182 
#> 
#> $Ricker
#>     UMSY     SMSY     Sgen 
#>   0.4678 467.8265 188.2417