-
Notifications
You must be signed in to change notification settings - Fork 0
Conditioning a simple mixed fishery Operating Model
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")
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
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")))
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
## 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)]
## 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)
}))
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)
res <- runMixME(om = input$om,
oem = input$oem,
ctrl_obj = input$ctrl_obj,
args = input$args)
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.
Tutorials
- Conditioning a simple single-stock Operating Model
- Conditioning a simple mixed fishery Operating Model
- Exploring simulation outputs
- Management - Constant fishing mortality
- [Management - Empirical harvest control rule]
- [Management - Model-based harvest control rule]
User Manual
- Introduction to MixME
- MixME simulation loop
- [Operating model]
- Observation error model
- [Stock estimation module]
- [Harvest control rule module]
- [Advice implementation module]
- Forward projection module
Technical Manual
MixME Development