Skip to content

Conditioning a simple mixed fishery Operating Model

pacematt edited this page Jan 29, 2024 · 11 revisions

This is the third tutorial in a series. In the first tutorial, we looked at how to condition a simple single-stock MixME operating model and ran a simulation using a fixed catch management procedure. In this tutorial, we condition a simple mixed fishery operating model comprising two stocks that are each exploited by the same two fleets. As we will see, the steps we take are the same as for the single-stock operating model - the only difference is that they are applied to two stock and fleet structures.

One important note at the outset - we will not be dealing with how to partition fishing mortality and catches into separate fleets or how to link exploitation across stocks for a given fleet. There are a few ways these two processing steps can be done, depending on the available data, but this not specific to MixME.1

As before, let's begin by loading the necessary libraries and sample dataset

## load libraries
library(FLCore)
library(FLFishery)
library(mse)
library(stockassessment)
library(MixME)

## load example data
data("mixedfishery_MixME_om")

Operating model structure

We have data for cod (Gadus morhua) for the years 1963 - 2019, and haddock (Melanogrammus aeglefinus) for the years 1993 - 2019. Currently, both stocks have relatively similar biomass, but haddock has higher recruitment potential. The data for these two stocks are age-structured and stored within slots (numbers n, natural mortality m, stock mean individual weight wt and proportion mature mat) in named FLBiol objects (cod and had), which are nested in a named FLBiols object (stks).

## A list of stks (FLBiols) and flts (FLFisheries)
summary(mixedfishery_MixME_om)

## Dimensions for each stock and fleet
summary(mixedfishery_MixME_om$stks)
summary(mixedfishery_MixME_om$flts)

## Plot recruitment and total stock biomass for both stocks
plot(mixedfishery_MixME_om$stks)

Both stocks are exploited by two demersal otter trawl fleets (given the informative names "A" and "B"). Recall that catch information (landings numbers landings.n, landings mean individual weight landings.wt, discards numbers discards.n, discards mean individual weight discards.wt, selectivity catch.sel and catchability catch.q) are stored as named FLCatch objects (cod and had) in named FLFishery objects (OTB_A and OTB_B) that are in turn nested in a named FLFisheries object (flts).

In the long-term, fleet B effort has declined whereas fleet A effort has increased and now dominates overall activity.

## Plot effort for both fleets
plot(FLQuants(OTB_A = mixedfishery_MixME_om$flts$OTB_A@effort,
              OTB_B = mixedfishery_MixME_om$flts$OTB_B@effort))

The picture for catchability is somewhat more complex. Catchability for cod has historically been higher in fleet B compared to fleet A, but fleet B cod catchability dropped below fleet A for the first time in 2019. Haddock catchability patterns are more consistent - fleet A haddock catchability is considerably higher than fleet B. As you could imagine, the way we leverage these historical patterns to estimate future catchability will have major impacts on the simulation outcomes, and this is something that we will explore in the next tutorial.

## Plot catchability for cod by both fleets
plot(FLQuants(OTB_A = FLQuant(mixedfishery_MixME_om$flts$OTB_A$cod@catch.q["alpha",]),
              OTB_B = FLQuant(mixedfishery_MixME_om$flts$OTB_B$cod@catch.q["alpha",])))

## Plot catchability for haddock by both fleets
plot(FLQuants(OTB_A = FLQuant(mixedfishery_MixME_om$flts$OTB_A$had@catch.q["alpha",]),
              OTB_B = FLQuant(mixedfishery_MixME_om$flts$OTB_B$had@catch.q["alpha",])))

The steps to assembling a mixed fishery operating model that we can pass to MixME are:

  • Estimate historic quota-share for the two fleets
  • Project stock n years into the future
  • Calculate numbers of both stocks in initial year
  • Generate an observation error model

Estimate historic quota-share

Just like the first tutorial, we use a built-in function to estimate the historical fleet share of stocks landings as a proxy for quota-share. For both stocks, it is clear that fleet A has eclipsed fleet B in proportion of overall landings.

out <- calculateQuotashare(stks = mixedfishery_MixME_om$stks, flts = mixedfishery_MixME_om$flts, verbose = TRUE)
mixedfishery_MixME_om$stks <- out$stks
mixedfishery_MixME_om$flts <- out$flts

## Check historic quota-share (landings-share) patterns
plot(FLQuants(OTB_A = attr(mixedfishery_MixME_om$flts$OTB_A$cod, "quotashare"),
              OTB_B = attr(mixedfishery_MixME_om$flts$OTB_B$cod, "quotashare")))
plot(FLQuants(OTB_A = attr(mixedfishery_MixME_om$flts$OTB_A$had, "quotashare"),
              OTB_B = attr(mixedfishery_MixME_om$flts$OTB_B$had, "quotashare")))

Project stock properties into future years

out <- stfMixME(mixedfishery_MixME_om,
                method = "yearMeans", 
                nyears = 20, 
                wts.nyears = 3, 
                sel.nyears = 3, 
                qs.nyears = 3, 
                verbose = TRUE)


## Check projection
plot(out$stks$had)
plot(out$flts$OTB_A)
plot(out$flts$OTB_B)

## Overwrite outputs
mixedfishery_MixME_om$stks <- out$stks
mixedfishery_MixME_om$flts <- out$flts

Calculate stock numbers in initial year

## initial projection year
iy = 2020

## arbitrary effort-based target for each fleet
ctrlArgs <- lapply(1:length(mixedfishery_MixME_om$flts), function(x) {
  list(year = iy,
       quant = "effort",
       fishery = names(mixedfishery_MixME_om$flts)[x],
       value = 1)
})
ctrlArgs$FCB <- makeFCB(biols = mixedfishery_MixME_om$stks, 
                        flts = mixedfishery_MixME_om$flts)

## Generate effort-based FLasher::fwd forecast control
flasher_ctrl <- do.call(FLasher::fwdControl, ctrlArgs)

omfwd <- FLasher::fwd(object    = mixedfishery_MixME_om$stks, 
                      fishery   = mixedfishery_MixME_om$flts, 
                      control   = flasher_ctrl)

mixedfishery_MixME_om$stks$had@n[,ac(iy)] <- omfwd$biols$had@n[,ac(iy)]
mixedfishery_MixME_om$stks$cod@n[,ac(iy)] <- omfwd$biols$cod@n[,ac(iy)]

Generate an Observation Error Model

## convert FLBiol to FLStocks
stk_oem <- FLStocks(lapply(mixedfishery_MixME_om$stks, function(x) {
  
  ## identify where corresponding catch occurs in fleet structure
  catch <- sapply(mixedfishery_MixME_om$flts, function(y) which(names(y) %in% name(x)))
  
  ## coerce to FLStock
  xx <- as.FLStock(x, mixedfishery_MixME_om$flts, catch = catch)
  
  ## remove excess data
  stock.n(xx)[] <- NA
  stock(xx)[]   <- NA
  harvest(xx)[] <- NA
  
  ## return result
  return(xx)
}))

Assemble simulation inputs

input <- makeMixME(om = mixedfishery_MixME_om, 
                   catch_obs = stk_oem, 
                   management_lag = 0, 
                   management_type = "fixedC", 
                   parallel = FALSE)

## Update observation arguments
input$oem@args$catch_timing$cod <- 0
input$oem@args$catch_timing$had <- 0

## Update management arguments
input$ctrl_obj$hcr@args$ctrg$cod <- 1000
input$ctrl_obj$hcr@args$ctrg$had <- 1000

## Update simulation arguments
input$args$iy
# input$args$adviceInit$cod[] <- 1000 # not needed if management lag = 0
# input$args$adviceInit$had[] <- 1000

## Update fbar ranges
input$args$frange$cod <- c("minfbar" = 2, "maxfbar" = 4)
input$args$frange$had <- c("minfbar" = 3, "maxfbar" = 5)

Run the simulation

res <- runMixME(om  = input$om, 
                oem = input$oem,
                ctrl_obj = input$ctrl_obj,
                args     = input$args)

Notes

1: Although a quick overview of the main methods to partition stock data and link fleet exploitation might make a useful tutorial series!

In the second tutorial, we ran this operating model with a constant catch management procedure.