Skip to content

Conditioning a simple single‐stock Operating Model

pacematt edited this page Jan 26, 2024 · 17 revisions

In this first tutorial, we set up a simple single-stock and single-fleet operating model using some sample data provided with the MixME package. You should be familiar with FLR data objects and methods before starting this tutorial, particularly the

We will cover the basic structure required for inputs to a MixME simulation and introduce some of the conditioning functions to help build the operating model. We will then assemble the remaining objects required to run a MixME simulation. For simplicity, we will implement fixed catch advice over the duration of the simulation, so that stock estimation is not required (in reality we will generate perfect observations of the stock that are ignored by the harvest control rule module... but more on that later).

Let's load the necessary libraries and load a sample dataset to condition our first operating model.

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

## load example data
data("singlestock_MixME_om")

Basic Operating Model structure

In case anyone is interested, this is haddock (Melanogrammus aeglefinus) and we have stock and catch data for the years 1993 - 2019. These stock and catch data are age-structured and stored in separate FLR objects. The key stock information is stored within slots (numbers n, natural mortality m, stock mean individual weight wt and proportion mature mat) in a named FLBiol object (had), which is in turn nested in a named FLBiols object (stks). The 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 a named FLCatch (had) in a named FLFishery (fleet) that is in turn nested in a named FLFisheries object (flts).

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

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

This hierarchical structure is extremely convenient because we can nest multiple stocks and fleets. A few important points:

  1. The name of the FLBiols object must be stks and the names of the FLFisheries object must be flts.
  2. Stocks and their corresponding fleet catches must share same name. In this case both our stock and catch object are called had.
  3. By default, the catchability slot in an FLCatch does not have a year dimension. This is easily modified, and MixME expects that catchability can be indexed by year.
  4. A parameterised stock-recruit model must be available from the rec slot of the stock FLBiol.
## Check that stock and catch names match
names(singlestock_MixME_om$flts$fleet) %in% names(singlestock_MixME_om$stks)

## Check catchability dimensions
dim(catch.q(singlestock_MixME_om$flts$fleet$had))

## Check stock-recruit relationship
singlestock_MixME_om$stks$had@rec

The good news is that we have most of the basic structure for our operating model. This basic structure remains the same irrespective of whether we are modelling 1 or 100 stock and fleets.

There are a few steps left before we have an operating model that we can pass to MixME:

  1. Estimate historic quota-share for our single fleet
  2. Project stock n years into the future
  3. Calculate stock numbers in initial year
  4. Generate an observation error model

Estimate historic quota-share

In a multi-fleet system, we need some way of partitioning the overall target catch for each stock across the fleets that catch this stock. This proportional share of stock quota (quota-share) is not currently represented in any FLR objects, so we must generate an FLQuant containing the estimated quota-share for each catch and attach it as an attribute of the corresponding FLCatch.

In our single-stock example, quota-share will be 1 in each year (because all available quota is taken by our single fleet). In more complex mixed fishery systems, quota-share can be a tricky parameter to estimate. One convenient (but also highly imprecise) method is to assume that the proportional share of landings for each stock across fleets corresponds to the quota-share. MixME has a function that allows you to calculate the quota-share in this way for each fleet catch.

## Calculate quota-share
out <- calculateQuotashare(stks = singlestock_MixME_om$stks, 
                           flts = singlestock_MixME_om$flts, verbose = TRUE)
singlestock_MixME_om$stks <- out$stks
singlestock_MixME_om$flts <- out$flts

## Check 
attr(singlestock_MixME_om$flts$fleet$had, "quotashare")

Project stock properties into future years

MixME requires that Operating Model year dimensions run the full length of the simulation. So if we want to carry out a 20-year simulation, we need to extend the stock and fishery structures from 2019 (the current final data year) to 2039. In each of these projection years (2020 - 2039), we need to

This dataset is now conditioned and ready to run, but we're going to first look at some of the inputs.