assessmentyear <- as.numeric(format(Sys.Date(), "%Y")) - 1 area_long <- paste0(tolower(params$area), "ern ") n_stocks <- xfun::numbers_to_words( length(get_groups(info_groups))) spr_peak_yr <- model[["sprseries"]][["Yr"]][model[["sprseries"]][["SPR_report"]] == max(model[["sprseries"]][["SPR_report"]][model[["sprseries"]][["Yr"]] < model[["endyr"]]])] spr_peak <- round(max(model[["sprseries"]][["SPR_report"]][model[["sprseries"]][["Yr"]] < model[["endyr"]]]), 2) SSB_2021 <- round(model[["derived_quants"]]["SSB_2021", "Value"], 0) SSB_Virgin <- round(model[["derived_quants"]]["SSB_Virgin", "Value"], 0) TotBio_2021 <- round(model[["timeseries"]][model[["timeseries"]][["Yr"]]==2021, "Bio_all"], 0) Bratio_2021 <- round(model[["derived_quants"]]["Bratio_2021", "Value"], 4) Bratio_series <- model[["derived_quants"]][paste0("Bratio_", model$startyr:model$endyr), "Value"] Bratio_min <- min(Bratio_series, na.rm = TRUE) Bratio_min_yr <- (model$startyr:model$endyr)[which(Bratio_series == Bratio_min)] Bratio_min <- round(Bratio_min, 4)
``{asis executive-summary-stock, echo = TRUE}
This assessment reports the status of
r spp(_
r spp.sci_)
r tolower(params$area)of \CapeM along the
r coastcoast
using data through
r assessmentyear.
r Sppwere modeled as
r n_stocksr ifelse(n_stocks > 1, "stocks", "stock")
split at \CapeM. This choice is informed by a consideration of genetic differences
[@longo2020strong] as well as differences in growth and management.
Models for
r spp` do not include catches or dynamics from the Alaskan, Canadian, or Mexican populations.
## Catches{-} The first known records of `r spp` landings date back to the late 1800s (Figure \@ref(fig:es-catch)). Catch reconstructions for these early landings were informed by state resources. Recent landings were available from PacFIN and RecFIN (Table \@ref(tab:removalsES)). Commercial discards were modeled using discard rates and length compositions, which facilitated the estimation of retention curves. Discard mortality was assumed to be 50\% for commercial trawl and 7\% for commercial fixed-gear and recreational fleets. Recreational catches included estimates of dead discards (Table \@ref(tab:removalsES)). ```r sa4ss::read_child("catch-comm-fleetstructure.Rmd")
table_labels <- utils::read.csv( file.path("..", mod_loc, "tables", "table_labels.csv") ) eslandingsinfo <- utils::read.csv( file.path("..", mod_loc, "tables", "a_Catches_ES.csv") ) %>% dplyr::select(where(~ any(. != 0))) eslandingsinfo <- round(eslandingsinfo, 2) # round all catch values to 0 digits colnames(eslandingsinfo) <- gsub("^X", "", colnames(eslandingsinfo)) colnames(eslandingsinfo) <- gsub("\\.Landings", "", colnames(eslandingsinfo)) colnames(eslandingsinfo) <- gsub("Dead$", "dead", colnames(eslandingsinfo)) matches <- match(colnames(eslandingsinfo), get_fleet(col = "fleet")) colnames(eslandingsinfo) <- ifelse(is.na(matches), gsub("([a-zA-Z])\\.([a-zA-Z])", "\\1 \\L\\2", perl = TRUE, colnames(eslandingsinfo)), gsub("^([a-z])", "\\U\\1", perl = TRUE, get_fleet(col = "label_short")[matches]) ) sa4ss::table_format( eslandingsinfo, align = "r", caption = "Recent commercial landings and recreational catches by fleet (mt), total across fleets, and the total dead including internal estimates of commercial discards.", label = table_labels[table_labels[["label"]] == "removalsES", "label"], )
{width=100% height=100% alt="Histogram of catch time series, where Table \label{tab:} contains values."}
r Spp
has been modeled using various age-structured forward-projection models since the mid 1990s and
was most recently assessed in 2017 [@haltuch2019lingcod].
This assessment fit all data using a single stock assessment framework,
Stock Synthesis r strsplit(model$SS_version,";")[[1]][1]
(SS3).
Data included in the base model provided information on
landings for each commercial and recreational fleet;
commercial discards, available from the West Coast Groundfish Observer Program;
relative abundance as informed by the
Triennial Survey,
West Coast Groundfish Bottom Trawl Survey,
commercial trawl fishery, and
each recreational fishery; and
length and age compositions,
available from the previous sources as well as research by L. Lam.
For this r area_long
stock, information on
r ifelse(params$area == "North", "relative abundance", "relative abundance, length, and age")
was also available from the
r ifelse(params$area == "North", "Oregon FG fleet", "\\gls{s-hkl}")
.
r ifelse(params$area == "South",
"The final model included ages from only the \\gls{s-wcgbt} because of conflicts between age- and length-composition data.",
""
)
Age data were explored using conditional-age-at-length rather than marginal ages. Length data were modeled as sex-specific compositions for fish that were sexed and combined-sex compositions for fish that were measured but not sexed. Unsexed fish that were aged and measured for length were not included in the conditional age-at-length data.
Key parameters related to productivity were estimated and
parameters related to growth and mortality were sex specific and time invariant.
Compensatory stock-recruitment dynamics were assumed, and thus,
the Beverton-Holt stock-recruit function was used to model recruitment.
Steepness, $h$, was estimated to account for
uncertainty in the shape of the stock-recruit relationship.
Main annual recruitment deviations were set to start in
r model$recruitpars%>%dplyr::filter(type == "Main_RecrDev")%>%dplyr::pull(Yr) %>% min
,
just prior to the availability of reliable length- and age-composition data.
Selectivity for each fleet was modeled using a double-normal function of length that allowed for dome or asymptotic shapes that were supported by the data.
Time blocks were used for selectivity and retention to account for management changes.
A wide range of sensitivity runs were conducted to explore various model structures related to biology and recruitment, changes to the data that were included in the model, ways in which selectivity was parameterized, etc. Results were particularly sensitive to the addition and subtraction of age data, which typically changed the scale of the population and estimates of key productivity parameters.
```{asis, opts.label = "north"} The stock biomass is currently trending downwards, though the rate of the decline is highly uncertain (Table \@ref(tab:ssbES); Figure \@ref(fig:es-ssb)). Although the biomass is currently estimated to be declining, no estimate is below the minimum stock size threshold and all estimates since the late 1990s are above the management target (Figure \@ref(fig:es-depl)).
```{asis, opts.label = "south"} Over the last decade, the spawning biomass has been trending upward due to a period of above-average recruitment which ended in 2013, though the rate of the increase is highly uncertain (Table \@ref(tab:ssbES); Figure \@ref(fig:es-ssb)). Uncertainty in the initial stock size is vast and this uncertainty is carried forward until approximately the early 1980s when more informative data are available. The current estimated biomass is below, but close to, the management target with the uncertainty in this estimate spanning well above and below the management target and the minimum stock size threshold (Figure \@ref(fig:es-depl)).
tabb <- utils::read.csv( file.path("..", mod_loc, "tables", "b_SSB_ES.csv") ) tabb[, grep("Interval", colnames(tabb))] <- round(tabb[, grep("Interval", colnames(tabb))], 3) colnames(tabb) <- gsub( "\\.[1-9]$", "", gsub( "\\.\\.mt\\.", " (mt)", gsub("([a-z])\\.([A-Za-z])", "\\1 \\L\\2", perl = TRUE, colnames(tabb)) )) kableExtra::kbl( tabb, align = "r", position = "H", digits = c(rep(0, 4), rep(3, 3)), booktabs = TRUE, longtable = FALSE, caption = table_labels[table_labels[["label"]] == "ssbES", "caption"], label = table_labels[table_labels[["label"]] == "ssbES", "label"], ) %>% kableExtra::column_spec(column = 2:ncol(tabb), width = "1.7cm") %>% kableExtra::row_spec(0, align = "c")
sa4ss::add_figure( filein = file.path("..", mod_loc, "plots", "ts7_Spawning_biomass_(mt)_with_95_asymptotic_intervals_intervals.png"), caption = "Estimated time series of spawning output (circles and line are maximum likelihood estimates; light broken lines are 95\\% intervals) for the base model", label = 'es-ssb')
sa4ss::add_figure( filein = dir(file.path("..", mod_loc, "plots"), pattern = "ts9_.+_intervals", full.names = TRUE), caption = "Estimated time series of fraction of unfished spawning output (circles and line are maximum likelihood estimates; light broken lines are 95\\% intervals) for the base model", label = 'es-depl')
\clearpage
Steepness was estimated
($\hat{h}$ = r sprintf("%.2f", model$parameters[model$parameters$Label=="SR_BH_steep", "Value"])
)
rather than fixed at a point value to
capture uncertainty in the resilience of r spp
to harvesting.
r Spp
appear to have moderate variability in estimates of recruitment with
recruitment variability ($\sigma_R$) fixed at
r model$parameters[model$parameters$Label=="SR_sigmaR", "Value"]
(Figures \@ref(fig:es-recruits) and \@ref(fig:es-rec-devs)).
```{asis, opts.label = "north"}
Large recruitments of age-0 fish were estimated as having occurred in 2013 and 2018.
The south area also had a large recruitment event in 2013, but not 2018.
```{asis, opts.label = "south"} Postive recruitment deviations were estimated for the years 2008--2013. Estimates of recruitment deviations in the subsequent years have been close to zero or negative, leading to lower recruitment.
The 2019 and 2020 estimates of recruitment deviations
were not included in the main recruitment deviations
and are instead termed late recruitment deviations that are not constrained to sum to zero
(Table \@ref(tab:recrES)).
Given the pandemic and the lack of recent survey information,
there was little information in the data to estimate recruitment in 2019 and
the uncertainty about this estimate is relatively large.
r Spp
are not collected as age-0 fish in appreciable quantities,
limiting the ability to estimate the terminal year of recruitment.
tabc <- utils::read.csv( file.path("..", mod_loc, "tables", "c_Recr_ES.csv") ) tabc[, "Lower.Interval"] <- round(tabc[, "Lower.Interval"], 2) tabc[, 5:NCOL(tabc)] <- round(tabc[, 5:NCOL(tabc)], 4) colnames(tabc) <- gsub( "\\.[1-9]$", "", gsub( "^Recruitment$", "Recruitment (1000s)", gsub("([a-z])\\.([A-Za-z])", "\\1 \\L\\2", perl = TRUE, colnames(tabc)) )) kableExtra::kbl( tabc, align = "r", position = "H", digits = c(rep(0, 4), rep(3, 3)), booktabs = TRUE, longtable = FALSE, caption = table_labels[table_labels[["label"]] == "recrES", "caption"], label = table_labels[table_labels[["label"]] == "recrES", "label"], ) %>% kableExtra::column_spec(column = 2:ncol(tabc), width = "1.7cm") %>% kableExtra::row_spec(0, align = "c")
sa4ss::add_figure( filein = file.path("..", mod_loc, "plots", "ts11_Age-0_recruits_(1000s)_with_95_asymptotic_intervals.png"), caption = "Estimated time series of age-0 recruits (1000s) for the base model with 95\\% intervals", label = 'es-recruits')
sa4ss::add_figure( filein = file.path("..", mod_loc, "plots", "recdevs2_withbars.png"), caption = "Estimated time series of recruitment deviations. Black points are for years that were constrained to sum to zero and are part of the 'main' period, and blue points are for early deviations (left) and late or forecast deviations (right). Bars represent 95\\% intervals.", label = 'es-rec-devs')
\clearpage
``{asis, opts.label = "north"}
The exploitation rate,
annual total dead catch divided by age 3+ biomass,
was estimated to have never been above the target proxy exploitation rate
(Table \@ref(tab:exploitES); Figure \@ref(fig:es-1-spr)).
Recent estimates of fishing intensity, $1-SPR$, indicate stability within the fishery and
are close to pre-1950 estimates.
Relative fishing intensity, $(1 - SPR)/(1-SPR_{45\%})$, is estimated to have
peaked in
r spr_peak_yrat
r spr_peak`.
```{asis, opts.label = "south"} The stock was estimated to have been exploited above the target proxy exploitation rate from the 1970s to approximately the late 1990s and again in the early 2000s (Figure \@ref(fig:es-1-spr)). Exploitation rate is defined as the annual total dead catch divided by age 3+ biomass. The relative fishing intensity, $(1 - SPR)/(1-SPR_{45\%})$, is estimated to have peaked in `r spr_peak_yr` at `r spr_peak`. Recent estimates of exploitation have all been below the target proxy exploitation rate and the estimate of fishing intensity for the terminal year was the lowest estimated since 2011 (Table \@ref(tab:exploitES)).
tabd <- utils::read.csv( file.path("..", mod_loc, "tables", "d_SPR_ES.csv") ) tabd[, -1] <- round(tabd[, -1], 4) colnames(tabd)[2] <- "Relative fishing intensity" colnames(tabd) <- gsub( "\\.[1-9]$", "", gsub( "\\.\\.mt\\.", " (mt)", gsub("([a-z])\\.([A-Za-z])", "\\1 \\L\\2", perl = TRUE, colnames(tabd)) )) sa4ss::table_format( tabd, digits = c(0, rep(3, NCOL(tabd) - 1)), caption = "Estimated recent trend in relative fishing intensity, $(1-SPR)/(1-SPR45\\%)$, and exploitation rate with associated 95\\% intervals. Fishing intensity is $1-SPR$, where the spawning potential ratio (SPR) has a target of 45\\%, $SPR_{45\\%}$. Exploitation rate is annual total dead catch divided by age 3+ biomass.", label = table_labels[table_labels[["label"]] == "exploitES", "label"], )
sa4ss::add_figure( filein = file.path("..", mod_loc, "plots", "SPR3_ratiointerval.png"), caption = "Estimated relative fishing intensity, $(1-SPR)/(1-SPR45\\%)$, with 95% intervals. Fishing intensity is $1-SPR$, where the spawning potential ratio (SPR) has a target of 45\\%, $SPR_{45\\%}$. The red horizontal line at 1.0 indicates fishing intensity equal to the target and values above this reflect harvest in excess of the proxy harvest rate.", label = 'es-1-spr')
\clearpage
ecolines <- knitr::knit_child("13ecosystemconsiderations.Rmd", quiet = TRUE) cat(gsub("## Ecosystem considerations\n\n", "", ecolines))
``{asis, opts.label = "north"}
The estimate of 2021 spawning biomass relative to unfished equilibrium biomass
(fraction unfished =
r Bratio_2021`)
was well above the management target of 40\%
(Table \@ref(tab:referenceES) and Figure \@ref(fig:es-phase)).
Even the lower 95\% interval was estimated to be above the target
(Table \@ref(tab:referenceES)).
Only a few years during the modeled period were estimated to be
below the target (blue points to the left of the vertical line at 0.4 in Figure \@ref(fig:es-phase)).
Equilibrium yield given the estimate of steepness shows disparity between maximum sustainable yield (blue) and the target biomass (red; Figure \@ref(fig:es-yield)). Whereas, the target biomass is in line with the SPR target (green; Figure \@ref(fig:es-yield)).
```{asis, opts.label = "south"} The estimate of 2021 spawning biomass relative to unfished equilibrium biomass (fraction unfished = `r Bratio_2021`) was estimated to be close to the management target of 40\% (Table \@ref(tab:referenceES); Figure \@ref(fig:es-phase)). The uncertainty in this estimate spans above and well below the target, suggesting the current status of the stock is uncertain (Figure \@ref(fig:es-phase)). Equilibrium yield given the estimate of steepness shows disparity between maximum sustainable yield (blue) and the SPR target (green Figure \@ref(fig:es-yield)). Whereas, the target biomass (red) is in line with the maximum sustainable yield and the current biomass (Figure \@ref(fig:es-yield)).
tabe <- utils::read.csv( file.path("..", mod_loc, "tables", "e_ReferencePoints_ES.csv") ) tabe[, -1] <- round(tabe[, -1], 4) colnames(tabe)[1] <- "Reference point" colnames(tabe) <- gsub( "\\.[1-9]$", "", gsub( "\\.\\.mt\\.", " (mt)", gsub("([a-z])\\.([A-Za-z])", "\\1 \\L\\2", perl = TRUE, colnames(tabe)) )) tabe[which(is.na(tabe[, 2])), -1] <- "-" sa4ss::table_format( tabe, escape = FALSE, longtable = FALSE, align = c("l", rep("r", 3)), caption = table_labels[table_labels[["filename"]] == "e_ReferencePoints_ES.csv", "caption"], label = table_labels[table_labels[["filename"]] == "e_ReferencePoints_ES.csv", "label"], )
sa4ss::add_figure( filein = file.path("..", mod_loc, "plots", "SPR4_phase.png"), caption = "Phase plot of biomass ratio vs. \\glsfirst{spr} ratio. Each point represents the biomass ratio at the start of the year and the relative fishing intensity in that same year. Lines through the final point show 95\\% intervals based on the asymptotic uncertainty for each dimension. The shaded ellipse is a 95\\% region which accounts for the estimated correlation between the two quantities.", label = 'es-phase')
sa4ss::add_figure( filein = file.path("..", mod_loc, "plots", "yield2_yield_curve_with_refpoints.png"), caption = "Equilibrium yield curve. Values are based on the 2020 fishery selectivities", label = 'es-yield')
\clearpage
In the last ten years, the annual catch limit has been set equal to or below the annual catch limit (Table \@ref(tab:manageES)). Landings and total dead catches (including estimated dead discards) have been well below the annual catch limit.
management_oflabcacl <- utils::read.csv(file.path("..", "tables", "management-oflabcacl.csv")) tabf <- utils::read.csv( file.path("..", mod_loc, "tables", "f_Manage_ES.csv") ) %>% dplyr::mutate_all(~gsub(",", "", .)) tabf[, 2:4] <- management_oflabcacl %>% dplyr::filter(area == params$area) %>% dplyr::filter(Year %in% tabf[, 1]) %>% dplyr::select(-area, -Year) colnames(tabf) <- gsub( "\\.[1-9]$", "", gsub( "mortality", "dead", gsub("([a-z])\\.([A-Za-z])", "\\1 \\L\\2", perl = TRUE, colnames(tabf)) )) sa4ss::table_format( tabf, digits = 0, align = "r", longtable = FALSE, caption = table_labels[table_labels[["filename"]] == "f_Manage_ES.csv", "caption"], label = table_labels[table_labels[["filename"]] == "f_Manage_ES.csv", "label"], )
sa4ss::read_child("unresolved-problems.Rmd")
The forecast of stock abundance and yield was developed using the base model (Table \@ref(tab:es-forecastprojections)). The total catches for the first two years of the forecast period were based on values provided by the \glsentrylong{gmt}. These assumed removals are likely higher than what the true removals will be for this year and next year but their influence on the assessment of stock status and future removals are limited. ```{asis, opts.label = "south"} The projections, including the first two years, assume a 40:60 split between the trawl and fixed-gear commercial fleets based on guidance from the \glsentrylong{gmt}.
```{asis, opts.label = "north"} The states of nature in the decision table (Table \@ref(tab:es-decision)) do not fall on a single axis of uncertainty. Instead, two alternative model structures were chosen from the set of sensitivity analyses to represent alternative states of nature. This represents the consensus among the participants in the STAR panel as a better representation of uncertainty than any axis could. The low state of nature included sex-specific selectivity while the high state excluded the fishery-dependent age data.
```{asis, opts.label = "south"} The axes of uncertainty in the decision table (Table \@ref(tab:es-decision)) are based on uncertainty in female natural mortality.
Three alternative catch streams were created for the decision table (Table \@ref(tab:es-decision)). The first option uses recent average catch as provided by the \glsentrylong{gmt}, the second option uses a $P^*$ of 0.40, and the third option uses a $P^*$ of 0.45. These $P^*$ values are combined with the category 2 default $\sigma$ = 1.0 in calculating the buffer between \gls{ofl} and \gls{abc}. ```r ignore <- table_projections(model, label = "es-forecastprojections") cat(ignore)
caption <- "Decision table with 10-year projections based on two years of recent average catch, alternative states of nature (columns), and management assumptions (rows) annual catch limits (ACLs) defined using an estimate of uncertainty (i.e., $P^*$) of 0.40 and 0.45. Colors of catch and fraction unfished are relative with lighter colors representing lower values. Italics indicate years were the full catch could not be removed from the low state of nature because of insufficient biomass." decisiontable <- append( x = readLines(file.path("..", mod_loc, "decision_table.tex")), values = paste0("\\caption{\\label{tab:es-decision}", caption, "}"), after = 1 ) cat(decisiontable)
\clearpage
sa4ss::read_child("scientific-uncertainty.Rmd")
sa4ss::read_child("regional-management-considerations.Rmd")
sa4ss::read_child("research-and-data-needs.Rmd")
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.