-
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, full = FALSE, catch = catch)
## remove excess data
stock.n(xx)[] <- NA
stock(xx)[] <- NA
## return result
return(xx)
}))
input <- makeMixME(om = mixedfishery_MixME_om,
catch_obs = stk_oem,
management_lag = 0,
management_type = "fixedC",
effort_type = "min",
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
## Update fbar ranges
input$args$frange$cod <- c("minfbar" = 2, "maxfbar" = 4)
input$args$frange$had <- c("minfbar" = 3, "maxfbar" = 5)
In this tutorial we've specified an additional argument that we should discuss in the context of fleet dynamics in mixed fisheries systems. The 'effort_type' argument specifies how stock quotas constrain fleet effort dynamics. The default value for this argument ("min"), means that the fleets will stop fishing when the first quota is consumed. This means that the most-limiting stock constrains fleet activity. An alternative assumption is that fleets keep fishing until the last quota is consumed ("max"). This means that the least-limiting stock constrains fleet activity.
This argument is passed to the forward projection module in the assembled MixME inputs ('effortType'). For now, we will be sticking with the assumption that effort is constrained by the most-limiting stock ("min"), but you might want to check whether management is robust to effort dynamics driven by the least-limiting stock ("max") in your own simulations.
input$ctrl_obj$fwd@args$effortType
There are several other arguments in this module that are useful to know about:
- 'adviceType' defines where management considers quota to be consumed by the total catch or only the landed fraction. The argument takes 'catch' or 'landings' as inputs.
- 'exceptions' allows you to remove stocks . The argument takes the form of a matrix with stocks on rows and fleets on columns. Matrix elements take the values '1' or '0'. By default, all elements are '1' and changing the value to '0' means that the stock is no longer effort-limiting for that fleet. This is a powerful argument that allows you to build simulations where specific fleets target a single stock or are constrained by a select group of target species.
- 'multiplier' is a way of adding implementation error to the simulation. Specifically, it allows fleets to systematically deviate from quota restrictions by a specified fraction whilst tracking the original quota target. This is useful if we want to test the robustness of management to, say, a 10 % annual over-quota catch by one or more fleets. In this case, advice is not being altered to increase available quota, and performance statistics will report these additional catches as overfishing, but fleet effort dynamics will use the inflated over-quota catch target.
input$ctrl_obj$fwd@args$adviceType
input$ctrl_obj$fwd@args$exceptions
input$ctrl_obj$fwd@args$multiplier
res <- runMixME(om = input$om,
oem = input$oem,
ctrl_obj = input$ctrl_obj,
args = input$args)
That's where we will stop in this tutorial. In the next tutorial, we will look at the outputs of this simulation; we will check whether effort optimisation was carried out to sufficient precision, we will check the uptake of quota by the two fleets, and we will generate summaries and figures for the system properties of interest.
1: Although a quick overview of the main methods to partition stock data and link fleet exploitation might make a useful tutorial series!
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