4 Example Krill MSE
Showcasing the application of a Management Strategy Evaluation to the Krill fishery using the openMSE tool
4.1 Introduction
4.2 Set-up MSE
4.2.1 Build the base-case Operating Model
Compute time-series of yearly total fishing effort targeted at Krill in terms of trawling duration in hours (summed over each net in each vessel) in the whole Statistical Area 48 (source: CCAMLR Secretariat 2023).
# filter effort for krill in all subareas of 48
<- effort_ccamlr |>
effort_krill_48 filter(
== "KRI",
target_species_code %in% as.character(c(48, 481:486))
asd_code
)
<- effort_krill_48 |>
yearly_trawl_hrs_krill_48 group_by(year) |>
summarise(trawl_hrs = sum(trawl_duration_hours, na.rm = TRUE))
ggplot(yearly_trawl_hrs_krill_48) +
geom_line(aes(x = year, y = trawl_hrs), col = "blue", linewidth = 1) +
labs(
x = "Year",
y = "Total trawling duration (hours)",
title = "Historical fishing effort targetted at Krill (Area 48)",
subtitle = "Trawling duration summed over every net used by each vessel"
)
The base-case OM is specified next, taking the PR estimates and maturity ogive defined under scenario scn-2 of the openMSE-Grym approximation analysis presented in Part 1 of this project (Table 2.3). This scenario comprises random draws of natural mortality rate \(M\) that are closest to the range of estimates presented in Pakhomov (1995), and maturity ogive estimates recommended in Maschette et al. (2021).
[Add main differences to OMs specified in openMSE-Gryn approximation]
# Selecting scenario "scn-2"
<- grym_setups |>
krill_pars filter(scenario_id == "scn-2")
<- build_krill_OM(
krill_base_OM om_name = "krill_base_case",
maxage = last(unlist(krill_pars$Ages)),
nyears = nrow(yearly_trawl_hrs_krill_48),
LenCV = c(0.05, 0.08), # low variation in length-at-age
effort = yearly_trawl_hrs_krill_48$trawl_hrs,
qinc = c(0.0), # no increase in fishing efficiency
M_draws = krill_pars$prRecruitPars$`PR-emm21`$M,
RCV_draws = krill_pars$prRecruitPars$`PR-emm21`$CV,
n_iter = krill_pars$n_iter,
proj_yrs = krill_pars$n.years,
maxF = krill_pars$Fmax,
seed = 101
)
write_rds(krill_base_OM, "inputs/krill_base_OM.rds")
Next we render the OM report documenting all the parameter values specified under the base-case OM, along with the rationale behind their selection. The base-case OM report is available in Appendix B.
# Modified versions of the MSEtool scripts solve bugs, in addition to adding the
# inclusion and better integration in another document as an embedded html
source("../MSEtool_fixes/OM_init_doc_dmp.R")
source("../MSEtool_fixes/OM_plots_dmp.R")
OMdoc(
OM = krill_base_OM,
openFile = FALSE,
rmd.source = "OM_krill_mse_base.rmd",
bib_file = "../references.json",
html_theme = "lumen",
inc_title = FALSE
)
4.2.2 Specify Management Procedures
[FO->] The choice of MPs applicable to the krill stock is conditioned by their data requirements. The krill fishery can be classified as data-limited, with mostly time-series of catches and effort available on a consistent basis. There are frequent scientific surveys but only cover specific sub-areas of the management region [<-FO]
The following assumptions are required in terms of data availability in order to apply the MPs described in Table 4.1:
Time-series of catch at length can be estimated using length-frequency data collected from observer sampling.
Time-series of fishery-dependent CPUE are obtainable from annual catch and effort data. These CPUE estimates can be standardized to provide a suitable relative index of abundance.
Prescribed MSY-based reference points can be either calculated (e.g. the method by Martell and Froese, 2012) or specified via expert elicitation.
Code
<- read_xlsx(
MPs "krill applicable MPs.xlsx",
sheet = "picked_MPs_description"
)
<- MPs$Name
MPs_names
|>
MPs flextable() |>
add_header_row(
values = c("General Category", "Name", "Description", "Data Requirements"),
colwidths = c(1, 1, 1, 5)
|>
) merge_v( j = 1:3, part = "header") |>
merge_v( j = 1, part = "body") |>
align(i = 1:2, align = "center", part = "header") |>
align(j = 4:8, align = "center", part = "body") |>
footnote(
#i = ~select(Name, starts_with("Fdem")), j = 8,
i = ~str_detect(Name, "Fdem"),
j = "Prescribed F_MSY/M",
value = as_paragraph(
"Requirement according to documentation and input validation in source code. However FMSY_M is not used anywhere in `Fdem_` functions... so assuming requirement is non-valid."
), ref_symbols = "ǂ") |>
bg(j = ~`Catch series`, i = ~str_detect(`Catch series`, "X"), bg = "#E1F5FE", part = "body") |>
bg(j = ~`Index series`, i = ~str_detect(`Index series`, "X"), bg = "#E1F5FE", part = "body") |>
bg(j = ~`Catch@length series`, i = ~str_detect(`Catch@length series`, "X"), bg = "#E1F5FE", part = "body") |>
bg(j = ~`Life history parameters`, i = ~str_detect(`Life history parameters`, "X"), bg = "#E1F5FE", part = "body") |>
bg(j = ~`Prescribed F_MSY/M`, i = ~str_detect(`Prescribed F_MSY/M`, "X"), bg = "#E1F5FE", part = "body") |>
bg(bg = "#FFFFFF", part = "header") |>
set_table_properties(
layout = "autofit",
opts_word = list(split = TRUE),
opts_html = list(scroll = list(height = "800px"))
)
General Category | Name | Description | Data Requirements | ||||
---|---|---|---|---|---|---|---|
Catch series | Index series | Catch@length series | Life history parameters | Prescribed F_MSY/M | |||
Status-quo | AvC | Constant TAC over projection period based on average historical catch. Represents the "status quo" management option. | X | ||||
Stabilisation | Islope1 | TAC ajusted incrementally to maintain stable CPUE or abundance index. Based on average recent catch (last 5 years) and the trajectory of index of abundance over the past 5 years. | X | X | |||
Islope4 | Similar to Islope1, but more precautionary. Uses a fraction (0.6) of average recent catch and forces slower changes in TAC in response to changes in cpue/index trajectory | X | X | ||||
LstepCC1 | TAC adjusted stepwise in relation to recent changes in mean length of recent catches. Takes the average historical catch (last 5 years) and applies a (upwards or downwards) step change depending on the ratio between mean length in recent catch (passt 5 years) and mean length in historical catches (last 10 years). | X | X | ||||
LstepCC4 | Similar toLstepCC1 but more precautionary. Uses a fraction (0.7) of average historical catch | X | X | ||||
Target-based | Itarget1 | TAC adjusted to achieve a target CPUE/index. Based on average historical catch (last 5 years) and adjustment term expressing deviations between historical, recent and target indices. Target index defined as 1.5 of average index over the last 10 years of historical period. Recent average index calculated from past 5 years. | X | X | |||
Itarget4 | Similar to Itarget1 but more precautionary. Uses a fraction (0.7) of average historical catch and target index is higher (2.5 of average historical index) | X | X | ||||
Ltarget1 | TAC incrementally adjusted to reach a target mean length in catches. Based on average historical catch (last 5 years) and adjustment term expressing deviations between historical, recent and target mean lengths. Target mean length defined as 1.05 of average length over the last 10 years of historical period. Recent average length in catch calculated from past 5 years | X | X | ||||
Ltarget4 | Similar to Ltarget1 but more precautionary. Uses a fraction (0.8) of average historical catch and target mean length is higher (1.15 of historical mean length) | X | X | ||||
L95target | Same as Ltarget1 but here the target mean length is based on the length at maturity rather than an arbitrary multiplicative | X | X | X | |||
L95target4 | As L95target but more precautionary. Uses a fraction (0.8) of average historical catch | X | X | X | |||
MSY-based | Fdem_ML | Annual TAC set for harvesting at MSY levels based on F_MSY. F_MSY calculated as r/2, where r Is the intrinsic rate of population growth. r is estimated from life history parameters. Current abundance estimated from mean length | X | X | X | Xǂ | |
Fdem_ML_25 | As Fdem_ML but with a precautionary buffer of 0.25 of the recommended TAC | X | X | X | Xǂ | ||
Fdem_ML_50 | As Fdem_ML but with a precautionary buffer of 0.50 of the recommended TAC | X | X | X | Xǂ | ||
Fdem_ML_75 | As Fdem_ML but with a precautionary buffer of 0.75 of the recommended TAC | X | X | X | Xǂ | ||
SPMSY | Sets TAC to achieve harvesting at MSY. MSY estimated from Martell and Froese surplus production model. Stock trajectories estimated based on trends in catch data and life-history information | X | X | ||||
SPMSY_25 | As SPMSY but with a precautionary buffer of 0.25 of the recommended TAC | X | X | ||||
SPMSY_50 | As SPMSY but with a precautionary buffer of 0.50 of the recommended TAC | X | X | ||||
SPMSY_75 | As SPMSY but with a precautionary buffer of 0.75 of the recommended TAC | X | X | ||||
DD | Sets TAC to achieve exploitation at UMSY, i.e. the harvest rate (the fraction of population being harvested every year) that will produce MSY. UMSY estimated from a simple delay-difference model (described in chap 9 of Hilborn and Walters, 1992) using time-series of catch and index of abundance | X | X | X | |||
DD_25 | As DD but with a precautionary buffer of 0.25 of the recommended TAC | X | X | X | |||
DD_50 | As DD but with a precautionary buffer of 0.50 of the recommended TAC | X | X | X | |||
DD_75 | As DD but with a precautionary buffer of 0.75 of the recommended TAC | X | X | X | |||
DD4010 | Similar to DD but superimposing a 40-10 HCR to constrain TAC recommendation as a function of depletion (B/B0). 40-10 rule specifies that the stock is not fished if depletion < 10% (i.e. TAC = 0), while TAC is set at UMSY levels (as DD) if depletion > 40%. If depletion is between 10 and 40%, TAC follows a linear increase from 0 to 100% UMSY levels. | X | X | X | |||
DD4010_25 | As DD4010 but with a precautionary buffer of 0.25 of the recommended TAC | X | X | X | |||
DD4010_50 | As DD4010 but with a precautionary buffer of 0.50 of the recommended TAC | X | X | X | |||
DD4010_75 | As DD4010 but with a precautionary buffer of 0.75 of the recommended TAC | X | X | X | |||
Yield-per-recruit | BK_ML | Annual TAC based on F_Max. F_max derived using length at first capture relative to L_inf and vB growth parameter K. Current vulnerable abundance estimated from recent catches and F, with F estimated from mean length | X | X | X | ||
BK_ML_25 | As BK_ML but with a precautionary buffer of 0.25 of the recommended TAC | X | X | X | |||
BK_ML_50 | As BK_ML but with a precautionary buffer of 0.50 of the recommended TAC | X | X | X | |||
BK_ML_75 | As BK_ML but with a precautionary buffer of 0.75 of the recommended TAC | X | X | X | |||
YPR_ML | TAC set to achieve harvest at F_0.1. Yield-per-recruit curve calculated from an age-structured model at equilibrium with life-history and selectivity parameters sampled from OM. Current abundance inferred from an estimate of Z calculated from mean length in catches and life-history parameters | X | X | X | |||
ǂRequirement according to documentation and input validation in source code. However FMSY_M is not used anywhere in `Fdem_` functions... so assuming requirement is non-valid. |
4.2.3 Set Performance Metrics
[Add details on newly introduced performance metrics]
Code
<- ESC(short_krill_mse)
esc_metric <- PD(short_krill_mse)
pd_metric <- SSB_FvU(short_krill_mse, Ref = 0.70)
ssb_fvu_metric <- YRC(short_krill_mse)
yrc_metric <- LTY(short_krill_mse)
lty_metric <- AAVY(short_krill_mse)
aavy_metric
<- tribble(
PMs ~ Category, ~ Name, ~ Description, ~ Detail,
"Spawning Biomass", "ESC", esc_metric@Name, esc_metric@Caption,
"Spawning Biomass", "PD", pd_metric@Name, pd_metric@Caption,
"Spawning Biomass", "SSB_FvU", ssb_fvu_metric@Name, ssb_fvu_metric@Caption,
"Yield", "YRC", yrc_metric@Name, yrc_metric@Caption,
"Yield", "LTY", lty_metric@Name, lty_metric@Caption,
"Yield", "AAVY", aavy_metric@Name, aavy_metric@Caption
)
|>
PMs flextable() |>
merge_v(j = ~Category) |>
fix_border_issues() |>
footnote(
i = ~ str_detect(Name, "ESC|PD"),
j = "Name",
value = as_paragraph("CCAMLR's default metrics"), ref_symbols = "ǂ")
Category | Name | Description | Detail |
---|---|---|---|
Spawning Biomass | ESCǂ | Escapement: Final Spawning Biomass relative to Virgin Spawning Biomass | median(SSB at Year 20)/median(SSB0) |
PDǂ | Depletion: Projected Spawning Biomass relative to Virgin Spawning Biomass | Prob. min(SSB) < 0.2 SSB0 (Years 1 - 20) | |
SSB_FvU | Proportion of projection years with precautionary levels of exploitation | Proportion of years with SSB > 0.7 Unfished SSB (Years 1-20) | |
Yield | YRC | Projected Average Yield relative to Historical Average Yield | Prob. Average Projected Yield (Years 11-20) > Average Historical Yield (-9-0) |
LTY | Average Yield relative to Reference Yield (Years 11-20) | Prob. Yield > 0.5 Ref. Yield (Years 11-20) | |
AAVY | Average Annual Variability in Yield (Years 1-20) | Prob. AAVY < 20% (Years 1-20) | |
ǂCCAMLR's default metrics |
4.2.4 Generate Operating models for robustness testing
Considering five cases for testing the robustness of results under the base-case MSE (Table 4.3):
Sensitivity to higher variability in length-at-age (parameter LenCV)
Increase in catchability for the projection period (parameter qinc), i.e. fishing becomes more efficient and one unit of effort will lead to higher fishing mortality. Setting it to 1% annual increase (resulting in a 20% increase in fishing efficiency after a 20 year projection), to express advances in e.g. gear technology, generalized use of continuous fishing systems, etc.
Presence of persistent bias in reported catches (parameter Cbiascv), e.g. due to inconsistencies in the estimation of green weight. A CV of 5% implies that 95% of simulations are between 90% and 110% of the true simulated catches.
Presence of hyperstability in the estimation of abundance (parameter beta), i.e. acknowledging that estimated CPUE indices may decrease slower than the true actual abundance. This phenomenon may occur, for instance, if fishing vessels tend to move uni-directionally across sub-areas during each fishing season while krill spatial distribution is uniform.
Presence of persistent bias in estimates of natural mortality rate (parameter Mbiascv), e.g. as a by-product of the Proportional Recruitment method. A CV of 5% implies that 95% of simulations are between 90% and 110% of the true simulated natural mortality.
Code
<- list(
rbstn_vals LenCV = c(0.15, 0.20),
qinc = c(0.01, 0.01),
Cbiascv = 0.05,
beta = c(0.8, 0.9),
Mbiascv = 0.05
)
<- tribble(
rbstn_tbl ~"Robustness Test ID", ~"OM Parameter", ~"Base-case", ~"Robustness",
"Length@Age", "LenCV", "[0.05, 0.08]", glue("[{toString(rbstn_vals$LenCV)}]"),
"Fishing-efficiency", "qinc", "[0, 0]", glue("[{toString(rbstn_vals$qinc)}]"),
"Catch-bias", "Cbiascv", "0", glue("{toString(rbstn_vals$Cbiascv)}"),
"Hyperstability", "beta", "[0, 0]", glue("[{toString(rbstn_vals$beta)}]"),
"M-bias", "Mbiascv", "0", glue("{toString(rbstn_vals$Mbiascv)}"),
)
flextable(rbstn_tbl) |>
set_table_properties(width = 0.75, layout = "autofit")
Robustness Test ID | OM Parameter | Base-case | Robustness |
---|---|---|---|
Length@Age | LenCV | [0.05, 0.08] | [0.15, 0.2] |
Fishing-efficiency | qinc | [0, 0] | [0.01, 0.01] |
Catch-bias | Cbiascv | 0 | 0.05 |
Hyperstability | beta | [0, 0] | [0.8, 0.9] |
M-bias | Mbiascv | 0 | 0.05 |
Code
<- krill_base_OM
temp_base_OM
<- imap(rbstn_vals, \(x, y){
robustness_OMs slot(temp_base_OM, name = y) <- x
temp_base_OM
})
names(robustness_OMs) <- glue("rbst_{names(robustness_OMs)}_OM")
write_rds(robustness_OMs, "inputs/robustness_OMs.rds")
4.3 Run MSE Simulations
4.3.1 Base-case scenario
#' -------------------------------------------
#' Run Simulations for Base-Case MSE
#' ------------------------------------------
# WARNING: Simulations are actually run on a separate file
# 'mse_application_simulations.r'. Code provided below is just for reference
# Running this code in the quarto document is not advisable
# following recommended in documentation that Length bins should be specified when running in 'sac1 parallel mode.
# Bins based on length frequency samples published in te Krill Fishery report (2023)
@cpars$CAL_bins <- seq(0, krill_base_OM@Linf[2] + 5, by = 2)
krill_base_OM
tic()
<- runMSE(OM = krill_base_OM, MPs = MPs_names, parallel = "sac")
krill_mse toc()
write_rds(
krill_mse,file = fs::path(outputs_path, "krill_mse_basecase.rds"),
compress = "gz"
)
4.3.2 Robustness scenario
# WARNING: Simulations are actually run on a separate file
# 'mse_application_simulations.r'. Code provided below is just for reference.
# Running this code in the quarto document is not advisable
#' -------------------------------------------
#' Run Simulations for robustness MSE
#' ------------------------------------------
<- robustness_OMs[4:5] |>
robustness_mse imap(\(x, y){
#x <- robustness_OMs$rbst_rbst_LenCV_OM_OM
#y <- "rbst_rbst_LenCV_OM_OM"
#x@nsim <- 100
::cli_h1("Starting MSE run for {y} @ {Sys.time()}")
cli
@cpars$CAL_bins <- seq(0, x@Linf[2] + 5, by = 2)
x
# run MSE for current scenario
::tic()
tictoc<- runMSE(
mse_output OM = x,
MPs = MPs_names,
parallel = "sac"
)
<- tictoc::toc(quiet = TRUE)
runtime
# write out mse outputs
write_rds(
mse_output,file = fs::path(outputs_path, glue::glue("krill_mse_{y}.rds")),
compress = "gz"
)
::cli_alert_success("Finished MSE for {y}: {runtime$callback_msg}")
cli
return(mse_output)
})
4.4 Results
Code
<- read_rds("outputs/krill_mse_basecase.rds")
krill_base_mse #krill_base_mse <- read_rds("outputs/krill_mse_basecase_mini.rds")
#krill_mse_prelim <- read_rds("outputs/krill_mse_base_outputs_preliminary.rds")
# Run PMs on MSE simulations
<- list(
krill_base_PMs_outputs PD = PD(krill_base_mse, Ref = 0.2),
ESC = ESC(krill_base_mse),
SSB_FvU = SSB_FvU(krill_base_mse, Ref = 0.70),
YRC = YRC(krill_base_mse),
LTY = LTY(krill_base_mse),
AAVY = AAVY(krill_base_mse)
)
write_rds(krill_base_PMs_outputs, "outputs/PM_results/krill_base_PMs_outputs.rds", "gz")
# Virgin Biomass SSB0
<- krill_base_mse@OM$SSB0
krill_base_ssb0 write_rds(krill_base_ssb0, "outputs/PM_results/krill_base_SSB0.rds", "gz")
# draws of SSB in final projection year, per MP
<- krill_base_mse@SSB[, , krill_base_mse@proyears]
krill_base_ssbY write_rds(krill_base_ssbY, "outputs/PM_results/krill_base_SSBY.rds", "gz")
Code
# read in PM outputs
<- read_rds("outputs/PM_results/krill_base_PMs_outputs.rds")
kb_pms
# extract PM summary
<- kb_pms |>
kb_pms_summ imap(\(x, y){
tibble(
MP = x@MPs,
:= x@Mean)
{{y}} |>
}) reduce(full_join, by = "MP") |>
mutate(`1 - PD` = 1 - PD, .after = "PD")
# lookup table for MP names and position in PM outputs
<- tibble::tibble(
MP_idx2name mp = kb_pms$PD@MPs,
mp_idx = 1:length(kb_pms$PD@MPs)
)
# set colors for facet strips
<- ggh4x::strip_themed(
MP_strips_theme background_x = ggh4x::elem_list_rect(
fill = ifelse(kb_pms$PD@MPs == "AvC", col_status_quo, col_facet_strip_bg)
), by_layer_x = FALSE
)
Spawning Stock Status Projections
Code
<- reshape2::melt(
krill_base_SSS $PD@Stat,
kb_pmsvarnames = c("sim", "mp_idx", "year"),
value.name = "SSS") |>
::left_join(MP_idx2name, by = "mp_idx") |>
dplyr::mutate(
dplyrbelow_ref = if_else(min(SSS) < kb_pms$PD@Ref, TRUE, FALSE),
.by = c(sim, mp)
)
<- tibble(
krill_base_PD_mtc mp = kb_pms$PD@MPs,
PD = kb_pms$PD@Mean,
x = max(krill_base_SSS$year),
y = max(krill_base_SSS$SSS),
PF_text = glue("{round(PD, 3)}")
)
<- krill_base_SSS |>
p_base_sss ggplot(aes(x = year, y = SSS, group = sim)) +
geom_path(
data = ~filter(.x, below_ref == FALSE),
alpha = 0.3,
color = "#7CB342",
linewidth = 0.3
+
) geom_path(
data = ~filter(.x, below_ref == TRUE),
alpha = 0.5,
color = "#E53935",
linewidth = 0.5
+
) geom_hline(yintercept = kb_pms$PD@Ref, linetype = "dashed") +
geom_label(
data = krill_base_PD_mtc,
#aes(x = x, y = y, label = PF_text),
aes(x = 18, y = 3.75, label = PF_text),
#hjust = 1, vjust = 1,
size = 2.5, colour = "gray25",
inherit.aes = FALSE
+
) ::facet_wrap2(.~mp, ncol = 4, strip = MP_strips_theme) +
ggh4xlabs(
x = "Year",
y = expression(paste("Spawning stock status (SSB/", SSB[0], ")"))
)
ggsave(
plot = p_base_sss,
filename = "outputs/plots/fig_krill_mse_base_SSS_trajectories.png",
width = 8,
height = 10
)
Virgin Spawning Biomass Vs Spawning Biomass in last Projection Year
Code
<- read_rds("outputs/PM_results/krill_base_SSBY.rds") |>
krill_base_SSBY ::melt( varnames = c("sim", "mp_idx")) |>
reshape2::left_join(MP_idx2name, by = "mp_idx") |>
dplyrmutate(ssb_type = "Final Projection Year")
<- tibble(
krill_base_SSB0 value = read_rds("outputs/PM_results/krill_base_SSB0.rds") ,
sim = 1:length(value),
mp = "",
ssb_type = "Pre-exploitation")
<- tibble(
krill_base_ESC_mtc mp = kb_pms$ESC@MPs,
ESC = kb_pms$ESC@Mean,
ESC_text = glue("{round(ESC, 3)}"),
ssb_type = "Final Projection Year") |>
mutate(ssb_type = fct_relevel(ssb_type, "Pre-exploitation"))
<- ifelse(kb_pms$ESC@MPs == "AvC", col_status_quo, "#616161")
x_text_col <- ifelse(kb_pms$ESC@MPs == "AvC", "bold", "plain")
x_text_face
<- krill_base_SSBY |>
p_base_ssb0_ssby add_row(krill_base_SSB0) |>
mutate(ssb_type = fct_relevel(ssb_type, "Pre-exploitation")) |>
ggplot(aes(y = fct_relevel(mp, rev), x = value, color = ssb_type)) +
::stat_interval(aes(color_ramp = after_stat(level))) +
ggdiststat_summary(geom = "point", fun = "median", col = "black") +
geom_vline(aes(xintercept = median(krill_base_SSB0$value)*0.75), linetype = "dashed") +
geom_text(data = krill_base_ESC_mtc, aes(x = Inf, y = mp, label = ESC_text), size = 2.5, hjust = 1.2, col = "gray40") +
labs(x = "Spawning Biomass", y = "Management Procedures") +
theme(legend.position="bottom") +
facet_wrap(~ssb_type, strip.position = "right", ncol = 1, scales = "free_y") +
force_panelsizes(rows = c(0.1, 2)) +
scale_colour_ramp_discrete(name = "Quantile Interval (prob)")+
scale_colour_discrete(name = "", type = c("#27AE60", "#3498DB")) +
guides(
# emphasize AvC
y = guide_axis_manual(
label_colour = rev(x_text_col),
label_face = rev(x_text_face)
),x.sec = guide_axis_manual(
breaks = median(krill_base_SSB0$value)*0.75,
labels = expression(paste("0.75*med(", SSB[0], ")")), label_color = "gray30"
)+
) theme(
#remove facet_wrap panels
strip.background = element_blank(),
strip.text = element_blank()
)
ggsave(
plot = p_base_ssb0_ssby,
filename = "outputs/plots/fig_krill_mse_base_SSS0_vs_SSBY.png",
width = 7,
height = 8
)
Fished Vs Unfished Spawning Biomass
Code
<- kb_pms[c("SSB_FvU", "LTY", "YRC", "AAVY")] |>
kb_pms_subset imap(\(x, y){
if(y == "YRC"){
@Stat |>
x::melt(
reshape2varnames = c("sim", "mp_idx")
|>
) ::left_join(MP_idx2name, by = "mp_idx") |>
dplyrmutate(
pm = y,
caption = str_wrap(x@Name, 50)
) else{
}@Prob |>
x::melt(
reshape2varnames = c("sim", "mp_idx")
|>
) ::left_join(MP_idx2name, by = "mp_idx") |>
dplyrmutate(pm = y, caption = str_wrap(x@Caption, 50))
}
})
<- kb_pms_subset |>
kb_pms_subset_plots imap(\(x, y){
if(y %in% c("SSB_FvU", "YRC")){
<- ifelse(unique(x$mp) == "AvC", col_status_quo, "#616161")
y_text_col <- ifelse(unique(x$mp) == "AvC", "bold", "plain")
y_text_face
<- x |>
p ggplot(aes(y = fct_relevel(mp, rev), x = value)) +
stat_pointinterval() +
# stat_interval() +
# stat_summary(geom = "point", fun = "median", col = "black") +
# scale_color_brewer() +
facet_wrap(~pm) +
labs(x = unique(x$caption), y = "") +
guides(
# emphasize AvC
y = guide_axis_manual(
label_colour = rev(y_text_col),
label_face = rev(y_text_face)
)
)else{
}<- x |>
p ggplot(aes(y = fct_relevel(mp, rev), x = value)) +
stat_pointinterval() +
# stat_interval() +
# stat_summary(geom = "point", fun = "median", col = "black") +
# scale_color_brewer() +
facet_wrap(~pm) +
labs(x = unique(x$caption)) +
theme(
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank()
)
}+ theme(axis.title.x = element_text(size = 10))
p
})
# Y-axis title-only plot
<- ggplot(data.frame(l = "Management Procedures", x = 1, y = 1)) +
y_title geom_text(aes(x, y, label = l), angle = 90, size = 4) +
theme_void() +
coord_cartesian(clip = "off")
<- y_title + (wrap_plots(kb_pms_subset_plots, nrow = 2)) + plot_layout(widths = c(1, 25))
p_base_pms_sub
ggsave(
plot = p_base_pms_sub,
filename = "outputs/plots/fig_krill_mse_base_draws_PMs_subset.png",
width = 8,
height = 10
)
Trade-off plots
Code
<- kb_pms_summ |>
radars_base_pms split(f = ~MP) |>
map(\(x){
|>
x ::select(-PD) |>
dplyrrelocate(`1 - PD`, .after = AAVY) |>
::ggradar(
ggradarvalues.radar = c(0, 0.5, 1),
axis.label.offset = 1.12,
# Polygons
group.line.width = 1,
group.point.size = 2,
group.colours = ifelse(x$MP == "AvC", col_status_quo, "#26A69A"),
# Background
background.circle.colour = "white",
#grid lines
gridline.label.offset = -.15 * (1 - (0 - ((1/9) * (1 - 0)))),
gridline.mid.colour = "grey",
# text size
axis.label.size = 2.3,
grid.label.size = 3,
# general stuff
fill = TRUE,
plot.title = x$MP
+
) theme(
plot.title = element_text(
size = 8.5, face = "bold", hjust = 0.5, #vjust = -1,
margin = margin(0, 0, 0, 0)
),plot.margin = margin(1,1,1,1)
)
})
<- wrap_plots(radars_base_pms, ncol = 5)
radars_base_pms_export
ggsave(
plot = radars_base_pms_export,
filename = "outputs/plots/fig_krill_mse_base_PMs_radars.png",
width = 10,
height = 12.5
)
Satisficing CCAMLR’s Precautionary Rules
Code
<- 0.1
ccamlr_pd_lim <- 0.75
ccamlr_esc_lim <- str_replace_all(kb_pms$ESC@Caption, "SSB0", "SSB<sub>0</sub>")
x_label_pd <- str_replace_all(kb_pms$PD@Caption, "SSB0", "SSB<sub>0</sub>")
y_label_esc
# Define satisficing areas in plot with associated color shading
# - fail both PD and ESC rules => top-left => red
# - satisfy PD but not ESC => bottom-left => yellow
# - satisfy ESC but not PP => top-right => yellow
# - satisfy both ESC and PP => bottom-right => green
<- expand_grid(
cammlr_areas position = c("top", "bottom"),
side = c("left", "right")
|>
) mutate(
area = glue("{position}-{side}"),
xmin = ifelse(str_detect(area, "left"), -Inf, ccamlr_esc_lim),
xmax = ifelse(str_detect(area, "left"), ccamlr_esc_lim, Inf),
ymin = ifelse(str_detect(area, "top"), ccamlr_pd_lim, -Inf),
ymax = ifelse(str_detect(area, "top"), Inf, ccamlr_pd_lim),
col = case_when(
== "bottom-right" ~ "#4CAF50",
area == "top-left" ~ "#D32F2F",
area %in% c("top-right", "bottom-left") ~ "#FFEB3B"
area
)
)
<- kb_pms_summ |>
p_satisficing select(MP, PD, ESC) |>
mutate(is_status_quo = ifelse(MP == "AvC", "yes", "no")) |>
ggplot(aes(x = ESC, y = PD, label = MP, col = is_status_quo)) +
geom_rect(
data = cammlr_areas,
aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = col),
alpha = 0.1,
inherit.aes = FALSE
+
) geom_point(size = 3) +
geom_point(data = ~filter(.x, MP == "AvC"), size = 3) +
geom_text_repel(size = 3.5) +
geom_vline(xintercept = ccamlr_esc_lim, linetype = "dashed", col = "gray60") +
geom_hline(yintercept = ccamlr_pd_lim, linetype = "dashed", col = "gray60") +
scale_fill_identity() +
scale_color_manual(values = c("gray10", col_status_quo)) +
labs(x = x_label_pd, y = y_label_esc) +
theme(
axis.title.x = element_markdown(),
axis.title.y = element_markdown(),
legend.position = "none"
+
) guides(
y.sec = guide_axis_manual(
breaks = 0.1,
labels = "Depletion\nrule"),
x.sec = guide_axis_manual(
breaks = 0.75,
labels = "Escapement\nrule")
)
ggsave(
plot = p_satisficing,
filename = "outputs/plots/fig_krill_mse_base_ccamlr_satisficing.png",
width = 9,
height = 7
)
4.4.1 Robustness Results
Code
# Run PM calculations on each robustness scenario
<- dir_ls(path = "outputs/", regexp = "_rbst_") |>
krill_rbst_pm map(\(mse_rbst_path){
<- read_rds(mse_rbst_path)
mseobj
list(
PD = PD(mseobj, Ref = 0.2),
ESC = ESC(mseobj),
SSB_FvU = SSB_FvU(mseobj, Ref = 0.70),
YRC = YRC(mseobj),
LTY = LTY(mseobj),
AAVY = AAVY(mseobj)
)
}, .progress = TRUE)
names(krill_rbst_pm) <- str_extract(path_ext_remove(names(krill_rbst_pm)), "(?<=_rbst_)\\w+")
# store outputs
write_rds(krill_rbst_pm, "outputs/PM_results/krill_robustness_PMs_outputs.rds", "gz")
Code
<- read_rds("outputs/PM_results/krill_robustness_PMs_outputs.rds")
krill_rbst_pm
# Extract PM summary data
<- krill_rbst_pm |>
krill_rbst_pm_sums # iterate over robustness scenarios
imap(\(rbst_pms_out, rbst_name){
|>
rbst_pms_out # iterate over PM metrics
imap(\(pm_out, pm_name){
tibble(
MP = pm_out@MPs,
:= pm_out@Mean
{{pm_name}}
)|>
}) reduce(full_join, by = "MP") |>
mutate(
#scn = paste0("rbst_", rbst_name),
scn = rbst_name,
scn_group = "Robustness\nScenarios",
.before = 1)
|>
}) list_rbind()
# Best MPs based on satisficing both CCAMLR rules (ESC and PD)
<- kb_pms_summ |>
base_best_mps select(-`1 - PD`) |>
filter(PD < 0.1 & ESC > 0.75) |>
mutate(scn = "base", scn_group = "Base\ncase")
Code
# ------------------------------------------------------------------------------
# helper function for tabulating
# set icons setting trend of robustness scenarios relative to base-case, for each considered MP and PM
<- function(x, ref){
trend_indicator case_when(
< ref ~ "images/caret-down.png",
x > ref ~ "images/caret-up.png",
x .default = "images/minus.png"
)
}
<- function(x){
satisfy_pd_rule ifelse(x > 0.1, "#FFCDD2", "transparent")
}
<- function(x){
satisfy_esc_rule ifelse(x < 0.75, "#FFCDD2", "transparent")
}# ---------------------------------------------------------------
# Prepare data for tabulating
<- krill_rbst_pm_sums |>
krill_rbst_tbl filter(MP %in% base_best_mps$MP) |>
bind_rows(base_best_mps) |>
select(-c(scn_group, SSB_FvU:AAVY)) |>
pivot_longer(cols = -c(scn, MP), names_to = "PM") |>
pivot_wider(names_from = scn, values_from = value) |>
relocate(base, .after = PM) |>
mutate(across(c(beta:qinc), ~trend_indicator(.x, base), .names = "{.col}_trend"))
<- str_subset(names(krill_rbst_tbl), "trend", negate = TRUE)
key_cols
|>
krill_rbst_tbl flextable(
col_keys = key_cols
|>
) add_header_row(
values = c("Management Procedure", "Performance Metric", "Base Case", "Robustness Scenarios"),
colwidths = c(1, 1, 1, 5)) |>
align(align = "center", part = "all") |>
set_header_labels(
MP = "Management Procedure",
PM = "Performance Metric",
base = "Base Case",
beta = "Hyperstability",
qinc = "Increasing Fishing Efficiency",
LenCV = "Higher CV in Length-at-age",
Cbiascv = "Bias in Catch",
Mbiascv = "Bias in Natural Mortality"
|>
) merge_v( j = 1:3, part = "header", ) |>
merge_v(j = ~ MP) |>
colformat_double() |>
append_chunks(j = ~beta, as_chunk(" "), as_image(src = beta_trend, width = .15, height = .2)) |>
append_chunks(j = ~Cbiascv, as_chunk(" "), as_image(src = Cbiascv_trend, width = .15, height = .2)) |>
append_chunks(j = ~LenCV, as_chunk(" "), as_image(src = LenCV_trend, width = .15, height = .2)) |>
append_chunks(j = ~Mbiascv, as_chunk(" "), as_image(src = Mbiascv_trend, width = .15, height = .2)) |>
append_chunks(j = ~qinc, as_chunk(" "), as_image(src = qinc_trend, width = .15, height = .2)) |>
highlight(i = ~ PM %in% "PD", j = ~beta + Cbiascv + LenCV + Mbiascv + qinc , color = satisfy_pd_rule) |>
highlight(i = ~ PM %in% "ESC", j = ~beta + Cbiascv + LenCV + Mbiascv + qinc, color = satisfy_esc_rule) |>
bg(j = ~ base, bg = "#F5F5F5", part = "all") |>
fix_border_issues()
Management Procedure | Performance Metric | Base Case | Robustness Scenarios | ||||
---|---|---|---|---|---|---|---|
Hyperstability | Bias in Catch | Higher CV in Length-at-age | Bias in Natural Mortality | Increasing Fishing Efficiency | |||
AvC | PD | 0.0086 | 0.0086 | 0.0088 | 0.0076 | 0.0086 | 0.0086 |
ESC | 0.7717 | 0.7717 | 0.7725 | 0.7751 | 0.7717 | 0.7717 | |
Itarget1 | PD | 0.0104 | 0.0098 | 0.0102 | 0.0090 | 0.0104 | 0.0104 |
ESC | 0.7504 | 0.7513 | 0.7491 | 0.7538 | 0.7504 | 0.7504 | |
Itarget4 | PD | 0.0022 | 0.0022 | 0.0022 | 0.0020 | 0.0022 | 0.0022 |
ESC | 0.8343 | 0.8352 | 0.8354 | 0.8377 | 0.8343 | 0.8343 | |
Ltarget4 | PD | 0.0112 | 0.0112 | 0.0118 | 0.0102 | 0.0108 | 0.0112 |
ESC | 0.7756 | 0.7759 | 0.7779 | 0.7810 | 0.7759 | 0.7756 | |
Fdem_ML_25 | PD | 0.0420 | 0.0428 | 0.0432 | 0.0578 | 0.0422 | 0.0420 |
ESC | 0.8879 | 0.8891 | 0.8900 | 0.8739 | 0.8919 | 0.8879 | |
Fdem_ML_50 | PD | 0.0750 | 0.0716 | 0.0782 | 0.1170 | 0.0788 | 0.0750 |
ESC | 0.8634 | 0.8639 | 0.8626 | 0.8294 | 0.8651 | 0.8634 | |
SPMSY | PD | 0.0330 | 0.0412 | 0.0378 | 0.0354 | 0.0380 | 0.0330 |
ESC | 0.8480 | 0.8454 | 0.8397 | 0.8514 | 0.8363 | 0.8480 | |
SPMSY_25 | PD | 0.0010 | 0.0010 | 0.0010 | 0.0008 | 0.0012 | 0.0010 |
ESC | 0.9465 | 0.9466 | 0.9442 | 0.9439 | 0.9483 | 0.9465 | |
SPMSY_50 | PD | 0.0012 | 0.0016 | 0.0014 | 0.0010 | 0.0010 | 0.0012 |
ESC | 0.9286 | 0.9273 | 0.9268 | 0.9288 | 0.9249 | 0.9286 | |
SPMSY_75 | PD | 0.0042 | 0.0042 | 0.0040 | 0.0036 | 0.0040 | 0.0042 |
ESC | 0.9045 | 0.9025 | 0.9015 | 0.9073 | 0.9031 | 0.9045 |
Graphical alternative to above table.
Code
<- krill_rbst_pm_sums |>
krill_rbst_pm_sums_best filter(MP %in% base_best_mps$MP)
<- left_join(krill_rbst_pm_sums_best, rbstn_tbl |> select(c(`Robustness Test ID`, `OM Parameter`)), by = c("scn" = "OM Parameter")) |>
krill_rbst_pm_sums_best select(-scn) |>
rename(scn = "Robustness Test ID")
<- bind_rows(base_best_mps, krill_rbst_pm_sums_best) |>
p_robustness select(scn, MP, PD, ESC, scn_group) |>
mutate(scn = ifelse(scn == "base", "Base-case", scn)) |>
ggplot() +
geom_rect(
data = cammlr_areas,
aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = col),
alpha = 0.1,
inherit.aes = FALSE
+
) geom_point(aes(x = ESC, y = PD, col = scn), size = 2) +
geom_text_repel(
aes(x = ESC, y = PD, col = scn, label = scn),
max.overlaps = 15,
#fontface = "bold",
family = "sans"
+
) geom_vline(xintercept = ccamlr_esc_lim, linetype = "dashed", col = "gray60") +
geom_hline(yintercept = ccamlr_pd_lim, linetype = "dashed", col = "gray60") +
facet_wrap2(vars(MP), ncol = 2, strip = MP_strips_theme) +
labs(x = x_label_pd, y = y_label_esc) +
theme(
axis.title.x = element_markdown(),
axis.title.y = element_markdown(),
legend.position = "none"
+
) scale_fill_identity() +
#scale_color_met_d("Moreau") ++
scale_color_met_d("Juarez") +
guides(colour="none")
#p_robustness
ggsave(
plot = p_robustness,
filename = "outputs/plots/fig_krill_mse_robustness.png",
width = 8,
height = 11
)
Value of Information plots
Exploring the sensitivity of Management Procedures to variability in the observation process.
Code
source("helpers/VOI_hack.r")
# run VOI calculations for robustness scenarios accounting for observation bias
<- dir_ls(path = "outputs/", regexp = "bias") |>
krill_rbst_voi map(\(mse_rbst_path){
<- read_rds(mse_rbst_path)
mseobj
<- Sub(mseobj, MPs = base_best_mps$MP)
mseobj_best
# calculate average SSS in last 5 years for each simulation (row) and MP (column)
<- apply(PD(mseobj_best, Yrs = -5)@Stat, c(1, 2), mean)
SSS
VOI_hack(
mseobj_best, Ut = SSS,
Utnam = "Average Spawning Stock Status (last 5 projection years)",
plot = TRUE,
maxrow = 10,
ref_MP = "AvC", col_refMP = col_status_quo, col_otherMP = col_facet_strip_bg
)
}, .progress = TRUE)
names(krill_rbst_voi) <- str_extract(path_ext_remove(names(krill_rbst_voi)), "(?<=_rbst_)\\w+")
|>
krill_rbst_voi iwalk(\(x, y){
ggsave(
plot = x$p,
filename = paste0("outputs/plots/fig_krill_robustness_voi_", y, ".png"),
width = 8,
height = 12
) })
4.5 Session Info
::session_info() devtools
─ Session info ───────────────────────────────────────────────────────────────
setting value
version R version 4.3.2 (2023-10-31 ucrt)
os Windows 11 x64 (build 22621)
system x86_64, mingw32
ui RTerm
language (EN)
collate English_United Kingdom.utf8
ctype English_United Kingdom.utf8
tz Europe/London
date 2023-12-20
pandoc 3.1.1 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
─ Packages ───────────────────────────────────────────────────────────────────
! package * version date (UTC) lib source
P abind 1.4-5 2016-07-21 [?] CRAN (R 4.3.0)
P askpass 1.1 2019-01-13 [?] CRAN (R 4.3.1)
P bit 4.0.5 2022-11-15 [?] CRAN (R 4.3.1)
P bit64 4.0.5 2020-08-30 [?] CRAN (R 4.3.1)
P bitops 1.0-7 2021-04-24 [?] CRAN (R 4.3.0)
P cachem 1.0.8 2023-05-01 [?] CRAN (R 4.3.1)
P caTools 1.18.2 2021-03-28 [?] CRAN (R 4.3.1)
P cellranger 1.1.0 2016-07-27 [?] CRAN (R 4.3.1)
P cli * 3.6.1 2023-03-23 [?] CRAN (R 4.3.1)
P codetools 0.2-19 2023-02-01 [?] CRAN (R 4.3.2)
P colorspace 2.1-0 2023-01-23 [?] CRAN (R 4.3.1)
P commonmark 1.9.0 2023-03-17 [?] CRAN (R 4.3.1)
P crayon 1.5.2 2022-09-29 [?] CRAN (R 4.3.1)
P crul 1.4.0 2023-05-17 [?] CRAN (R 4.3.1)
P curl 5.0.2 2023-08-14 [?] CRAN (R 4.3.1)
P data.table 1.14.8 2023-02-17 [?] CRAN (R 4.3.1)
P devtools 2.4.5 2022-10-11 [?] CRAN (R 4.3.2)
P digest 0.6.33 2023-07-07 [?] CRAN (R 4.3.1)
P distributional 0.3.2 2023-03-22 [?] CRAN (R 4.3.1)
P DLMtool * 6.0.6 2022-06-20 [?] CRAN (R 4.3.1)
P dplyr * 1.1.2 2023-04-20 [?] CRAN (R 4.3.1)
P dtplyr * 1.3.1 2023-03-22 [?] CRAN (R 4.3.1)
P ellipsis 0.3.2 2021-04-29 [?] CRAN (R 4.3.1)
P equatags 0.2.0 2022-06-13 [?] CRAN (R 4.3.1)
P evaluate 0.21 2023-05-05 [?] CRAN (R 4.3.1)
P fansi 1.0.4 2023-01-22 [?] CRAN (R 4.3.1)
P farver 2.1.1 2022-07-06 [?] CRAN (R 4.3.1)
P fastmap 1.1.1 2023-02-24 [?] CRAN (R 4.3.1)
P flextable * 0.9.2 2023-06-18 [?] CRAN (R 4.3.1)
P fontBitstreamVera 0.1.1 2017-02-01 [?] CRAN (R 4.3.0)
P fontLiberation 0.1.0 2016-10-15 [?] CRAN (R 4.3.0)
P fontquiver 0.2.1 2017-02-01 [?] CRAN (R 4.3.1)
P forcats * 1.0.0 2023-01-29 [?] CRAN (R 4.3.1)
P fs * 1.6.3 2023-07-20 [?] CRAN (R 4.3.1)
P furrr * 0.3.1 2022-08-15 [?] CRAN (R 4.3.1)
P future * 1.33.0 2023-07-01 [?] CRAN (R 4.3.1)
P gdtools 0.3.3 2023-03-27 [?] CRAN (R 4.3.1)
P generics 0.1.3 2022-07-05 [?] CRAN (R 4.3.1)
P gfonts 0.2.0 2023-01-08 [?] CRAN (R 4.3.1)
P ggblend * 0.1.0 2023-05-22 [?] CRAN (R 4.3.1)
P ggdensity * 1.0.0 2023-02-09 [?] CRAN (R 4.3.1)
P ggdist * 3.3.0 2023-05-13 [?] CRAN (R 4.3.1)
P ggh4x * 0.2.6 2023-08-30 [?] CRAN (R 4.3.2)
P ggplot2 * 3.4.3 2023-08-14 [?] CRAN (R 4.3.1)
ggradar * 0.2 2023-12-12 [1] Github (ricardo-bion/ggradar@53404a5)
P ggrepel * 0.9.4 2023-10-13 [?] CRAN (R 4.3.2)
P ggtext * 0.1.2 2022-09-16 [?] CRAN (R 4.3.2)
P globals 0.16.2 2022-11-21 [?] CRAN (R 4.3.0)
P glue * 1.6.2 2022-02-24 [?] CRAN (R 4.3.1)
P gplots 3.1.3 2022-04-25 [?] CRAN (R 4.3.1)
P gridtext 0.1.5 2022-09-16 [?] CRAN (R 4.3.2)
Grym * 0.1.1 2023-08-28 [1] Github (AustralianAntarcticDivision/Grym@6a2d6a1)
P gtable 0.3.4 2023-08-21 [?] CRAN (R 4.3.1)
P gtools 3.9.4 2022-11-27 [?] CRAN (R 4.3.1)
P hms 1.1.3 2023-03-21 [?] CRAN (R 4.3.1)
P htmltools 0.5.7 2023-11-03 [?] CRAN (R 4.3.2)
P htmlwidgets 1.6.4 2023-12-06 [?] CRAN (R 4.3.2)
P httpcode 0.3.0 2020-04-10 [?] CRAN (R 4.3.1)
P httpuv 1.6.11 2023-05-11 [?] CRAN (R 4.3.1)
P jsonlite 1.8.7 2023-06-29 [?] CRAN (R 4.3.1)
P katex 1.4.1 2022-11-28 [?] CRAN (R 4.3.1)
P KernSmooth 2.23-22 2023-07-10 [?] CRAN (R 4.3.2)
P knitr 1.43 2023-05-25 [?] CRAN (R 4.3.1)
P labeling 0.4.2 2020-10-20 [?] CRAN (R 4.3.0)
P later 1.3.1 2023-05-02 [?] CRAN (R 4.3.1)
P lattice 0.21-9 2023-10-01 [?] CRAN (R 4.3.2)
P lifecycle 1.0.3 2022-10-07 [?] CRAN (R 4.3.1)
P listenv 0.9.0 2022-12-16 [?] CRAN (R 4.3.1)
P lmtest 0.9-40 2022-03-21 [?] CRAN (R 4.3.1)
P lubridate * 1.9.2 2023-02-10 [?] CRAN (R 4.3.1)
P magrittr 2.0.3 2022-03-30 [?] CRAN (R 4.3.1)
P markdown 1.12 2023-12-06 [?] CRAN (R 4.3.2)
P MASS 7.3-60 2023-05-04 [?] CRAN (R 4.3.2)
P Matrix 1.6-1.1 2023-09-18 [?] CRAN (R 4.3.2)
P memoise 2.0.1 2021-11-26 [?] CRAN (R 4.3.1)
P MetBrewer * 0.2.0 2022-03-21 [?] CRAN (R 4.3.1)
P mime 0.12 2021-09-28 [?] CRAN (R 4.3.0)
P miniUI 0.1.1.1 2018-05-18 [?] CRAN (R 4.3.2)
P MSEtool * 3.7.0 2023-07-19 [?] CRAN (R 4.3.1)
P munsell 0.5.0 2018-06-12 [?] CRAN (R 4.3.1)
P mvtnorm * 1.2-3 2023-08-25 [?] CRAN (R 4.3.1)
P nlme 3.1-163 2023-08-09 [?] CRAN (R 4.3.2)
P officer 0.6.2 2023-03-28 [?] CRAN (R 4.3.1)
P openMSE * 1.0.0 2021-02-08 [?] CRAN (R 4.3.1)
P openssl 2.1.0 2023-07-15 [?] CRAN (R 4.3.1)
P openxlsx * 4.2.5.2 2023-02-06 [?] CRAN (R 4.3.1)
P parallelly 1.36.0 2023-05-26 [?] CRAN (R 4.3.0)
P patchwork * 1.1.3 2023-08-14 [?] CRAN (R 4.3.1)
P pbapply 1.7-2 2023-06-27 [?] CRAN (R 4.3.1)
P pillar 1.9.0 2023-03-22 [?] CRAN (R 4.3.1)
P pkgbuild 1.4.3 2023-12-10 [?] CRAN (R 4.3.2)
P pkgconfig 2.0.3 2019-09-22 [?] CRAN (R 4.3.1)
P pkgload 1.3.3 2023-09-22 [?] CRAN (R 4.3.2)
P plyr 1.8.8 2022-11-11 [?] CRAN (R 4.3.1)
P profvis 0.3.8 2023-05-02 [?] CRAN (R 4.3.2)
P progressr * 0.14.0 2023-08-10 [?] CRAN (R 4.3.1)
P promises 1.2.1 2023-08-10 [?] CRAN (R 4.3.1)
P purrr * 1.0.2 2023-08-10 [?] CRAN (R 4.3.1)
P R6 2.5.1 2021-08-19 [?] CRAN (R 4.3.1)
P ragg 1.2.5 2023-01-12 [?] CRAN (R 4.3.1)
P Rcpp 1.0.11 2023-07-06 [?] CRAN (R 4.3.1)
PD RcppParallel 5.1.7 2023-02-27 [?] CRAN (R 4.3.2)
P RcppZiggurat 0.1.6 2020-10-20 [?] CRAN (R 4.3.2)
P readr * 2.1.4 2023-02-10 [?] CRAN (R 4.3.1)
P readxl * 1.4.3 2023-07-06 [?] CRAN (R 4.3.1)
P remotes 2.4.2.1 2023-07-18 [?] CRAN (R 4.3.1)
renv 0.17.0 2023-03-02 [1] CRAN (R 4.3.1)
P reshape2 1.4.4 2020-04-09 [?] CRAN (R 4.3.1)
P Rfast 2.1.0 2023-11-09 [?] CRAN (R 4.3.2)
P rlang * 1.1.1 2023-04-28 [?] CRAN (R 4.3.1)
P rmarkdown 2.24 2023-08-14 [?] CRAN (R 4.3.1)
P rstudioapi 0.15.0 2023-07-07 [?] CRAN (R 4.3.1)
P SAMtool * 1.6.1 2023-08-23 [?] CRAN (R 4.3.1)
P sandwich 3.0-2 2022-06-15 [?] CRAN (R 4.3.1)
P scales 1.2.1 2022-08-20 [?] CRAN (R 4.3.1)
P sessioninfo 1.2.2 2021-12-06 [?] CRAN (R 4.3.2)
P shiny 1.7.5 2023-08-12 [?] CRAN (R 4.3.1)
P snow * 0.4-4 2021-10-27 [?] CRAN (R 4.3.0)
P snowfall * 1.84-6.2 2022-07-05 [?] CRAN (R 4.3.0)
P stringi 1.7.12 2023-01-11 [?] CRAN (R 4.3.0)
P stringr * 1.5.0 2022-12-02 [?] CRAN (R 4.3.1)
P strucchange 1.5-3 2022-06-15 [?] CRAN (R 4.3.1)
P svglite * 2.1.2 2023-10-11 [?] CRAN (R 4.3.2)
P systemfonts 1.0.4 2022-02-11 [?] CRAN (R 4.3.1)
P textshaping 0.3.6 2021-10-13 [?] CRAN (R 4.3.1)
P tibble * 3.2.1 2023-03-20 [?] CRAN (R 4.3.1)
P tictoc * 1.2 2023-04-23 [?] CRAN (R 4.3.1)
P tidyr * 1.3.0 2023-01-24 [?] CRAN (R 4.3.1)
P tidyselect 1.2.0 2022-10-10 [?] CRAN (R 4.3.1)
P tidyverse * 2.0.0 2023-02-22 [?] CRAN (R 4.3.1)
P timechange 0.2.0 2023-01-11 [?] CRAN (R 4.3.1)
D TMB 1.9.6 2023-08-11 [1] CRAN (R 4.3.1)
P tzdb 0.4.0 2023-05-12 [?] CRAN (R 4.3.1)
P urca 1.3-3 2022-08-29 [?] CRAN (R 4.3.1)
P urlchecker 1.0.1 2021-11-30 [?] CRAN (R 4.3.2)
P usethis 2.2.2 2023-07-06 [?] CRAN (R 4.3.2)
P utf8 1.2.3 2023-01-31 [?] CRAN (R 4.3.1)
P uuid 1.1-1 2023-08-17 [?] CRAN (R 4.3.1)
P V8 4.3.3 2023-07-18 [?] CRAN (R 4.3.1)
P vars 1.5-9 2023-03-22 [?] CRAN (R 4.3.1)
P vctrs 0.6.3 2023-06-14 [?] CRAN (R 4.3.1)
P vroom 1.6.3 2023-04-28 [?] CRAN (R 4.3.1)
P withr 2.5.0 2022-03-03 [?] CRAN (R 4.3.1)
P xfun 0.40 2023-08-09 [?] CRAN (R 4.3.1)
P xml2 1.3.5 2023-07-06 [?] CRAN (R 4.3.1)
P xslt 1.4.4 2023-02-21 [?] CRAN (R 4.3.1)
P xtable 1.8-4 2019-04-21 [?] CRAN (R 4.3.1)
P yaml 2.3.7 2023-01-23 [?] CRAN (R 4.3.0)
P zip 2.3.0 2023-04-17 [?] CRAN (R 4.3.1)
P zoo 1.8-12 2023-04-13 [?] CRAN (R 4.3.1)
[1] C:/Users/bruno/Dropbox/krill/krill_mse/renv/library/R-4.3/x86_64-w64-mingw32
[2] C:/Users/bruno/AppData/Local/R/cache/R/renv/sandbox/R-4.3/x86_64-w64-mingw32/7df9739c
P ── Loaded and on-disk path mismatch.
D ── DLL MD5 mismatch, broken installation.
──────────────────────────────────────────────────────────────────────────────
#library(gratitude)