17 Stability & Resistance: Ecosystem Resistance

Data Type: Tabular Data (within eco_indicators)

Spatial Scope: Maritimes

Duration 1970-2022

Source: Bundy et al. 2017

17.1 Introduction to Indicator

The eco_indicators dataset provides indicators to describe the resistance of the marine ecosystem, or its ability to withstand disturbances, whether Anthropogenic or natural (Bundy, Gomez, and Cook 2017).

  • Mean Lifespan: Mean of the maximum longevity of each species observed in a survey.
  • Mean Maximum Length (Abundance): Mean maximum length of fish species in a survey, weighted by abundance.
  • Mean Maximum Length (Biomass): Mean maximum length of fish species in a survey, weighted by biomass.
  • Intrinsic Vulnerability Index (IVI) of Landings: Intrinsic Vulnerability is a measure of a species’ vulnerability to fishing, driven by life history traits. IVI of landings is the total intrinsic vulnerability of species in a catch.

The first three of these indicators are measures of the “potential” of fish species to resist perturbation. Species that are longer-lived and larger can be more resistant to change, and are the same species that are generally targeted by fishing activities. These proxies can indicate the changes to the resistance potential of the community as a result of fishing activities.

Intrinsic Vulnerability Index of the catch is a measure of the average vulnerability of harvested species. Species with larger body size, greater longevity, higher age at maturity, and lower growth rates are generally more vulnerable to fishing pressure. Therefore, IVI is a measure of the average of the Intrinsic Vulnerability Index per fish species, weighted by their annual catch. IVI of landings is expected to increase with increased fishing pressure (Bundy, Gomez, and Cook 2017). Note that decreases in IVI could be the result of a decrease in the catch of these species due to overexploitation or reductions in fishing pressure to avoid overexploitation.

17.2 View Data


library(tidyr)
library(plotly)
library(stringr)

plotly_df <- data@data %>% inner_join(global_cols3)

# function to create plot with dropdown menu ------------------------------
make_resistance_dropdown_plot <- function(df,
year_col   = "year",
region_col = "region",
value_suffix = "_value") {
  
  # convert to long format
  long <- df %>%
    janitor::clean_names() %>%
    pivot_longer(
      cols = ends_with(value_suffix),
      names_to = "metric",
      values_to = "value"
    ) %>%
    # remove suffix
    mutate(
      metric = str_remove(metric, "_value")
    ) %>%
    # drop NAs (some regions don't have data for some variables or years)
    tidyr::drop_na(value)
  
  # find all metrics and regions
  metrics <- unique(long$metric)
  regions <- unique(long[[region_col]])
  
  # clean names for dropdown panels, helper
  pretty_label <- function(x) str_to_title(gsub("_", " ", x)) %>% str_replace("Ivi","IVI") %>% str_replace("Mm","Mean Max")
  
  # build plot -----------------
  p <- plot_ly()
  
  # Add bar traces: metric1 has region1..K, metric2 has region1..K, ...
  for (metric_i in seq_along(metrics)) {
    m <- metrics[metric_i]
    
    for (region_i in regions) {
      dat <- long %>%
        filter(metric == m, .data[[region_col]] == region_i) %>%
        group_by(.data[[year_col]],color, linetype, linewidth, region_group, region_group_label) %>%     # in case you have multiple rows per year
        summarise(value = sum(value), .groups = "drop") %>%
        arrange(.data[[year_col]])
      
      group_name <- unique(dat$region_group)
      color <- unique(dat$color)
      linetype <- unique(dat$linetype)
      width <- unique(dat$linewidth)
      
      # If a region truly has no data for that metric, add an empty trace
      # (keeps trace indexing stable)
      if (nrow(dat) == 0) {
        dat <- tibble::tibble(!!year_col := integer(0), value = numeric(0))
      }
      
      p <- p %>% add_lines(
        data = dat,
        x = ~.data[[year_col]],
        y = ~value,
        name = as.character(region_i),
        legendgroup = group_name,
        legendgrouptitle = list(
          text = ifelse(group_name == "ESS",
                        "Eastern Scotian Shelf Zones",
                        "Western Scotian Shelf Zones"
          )),
        showlegend = (metric_i == 1),
        visible = (metric_i == 1),
        line = list(color = color, dash = linetype),
        hovertemplate = paste0("<b>", region_i,":</b> ","%{y:.3f}<extra></extra>")      )
      
    }
  }
  
  n_regions <- length(regions)
  n_traces  <- length(metrics) * n_regions
  
  buttons <- lapply(seq_along(metrics), function(metric_i) {
    vis <- rep(FALSE, n_traces)
    shl <- rep(FALSE, n_traces)
    
    idx_start <- (metric_i - 1) * n_regions + 1
    idx_end   <- metric_i * n_regions
    vis[idx_start:idx_end] <- TRUE
    shl[idx_start:idx_end] <- TRUE
    
    list(
      method = "update",
      args = list(
        list(visible = vis, showlegend = shl),
        list(
          title = pretty_label(metrics[metric_i]),
          yaxis = list(title =  pretty_label(metrics[metric_i]))
        )
      ),
      label = pretty_label(metrics[metric_i])
    )
  })
  
  p %>%
    layout(
      barmode = "stack",
      hovermode = "x unified",
      title = pretty_label(metrics[1]),
      xaxis = list(title = str_to_title(year_col)),  # keep one bar per year
      yaxis = list(title = pretty_label(metrics[1]), fixedrange = TRUE),
      legend = list(
        title = list(text = str_to_title(region_col)),
        x = 1.02, xanchor = "left",
        y = 1,    yanchor = "top",
        groupclick = "toggleitem",
        itemdoubleclick = FALSE
      ),
      updatemenus = list(list(
        type = "dropdown",
        x = -.1, xanchor = "left",
        y = 1.15, yanchor = "top",
        buttons = buttons
      )),
      margin = list(r = 180, t = 80)
    )
}

# usage:
p <- make_resistance_dropdown_plot(plotly_df)
p <- p %>% config(displayModeBar= F)

p

Figure 17.1: eco-resistance Structure Indicators in all NAFO regions and Scotian Shelf regions overall. Use dropdown menu to select indicator, and click legend to toggle regions.

17.4 Relevance to Research and Stock Assessments

Resistance variables offer proximal indicators of a community’s ability to withstand change, and have long-term implications for fisheries and ecosystems.

While negative changes in mean lifespan and mean max length could be the result of fishing pressure targeting larger, long-lived species, positive changes in these variables might also reflect effective fisheries management through time.

17.5 Variable Definitions

Table 17.2: Definitions of eco_indicators eco-resistance structure variables.
variable description unit
year Year of trawl survey
region Region over which values are summarized
MeanLifespan_value Mean estimated lifespan of species in a survey years
MMLength_BIOMASS_value Mean maximum length of species in a survey (weighted by biomass) cm
MMLength_ABUNDANCE_value Mean maximum length of species in a survey (weighted by abundance) cm
IVILandings_value Mean intrinsic vulnerability index of species in a survey

17.6 Additional Data

eco-resistance Structure variables (within eco_indicators) contain data for 4VN, 4VS, 4W, 4X, ESS, and WSS. All are shown on this page, but note that NAFO divisions are nested within Scotian Shelf regions.

17.7 Get the Data

library(marea)
data('eco_indicators')
plot(eco_indicators)

References

Bundy, Alida, Catalina Gomez, and Adam M. Cook. 2017. “Guidance Framework for the Selection and Evaluation of Ecological Indicators.” Canadian Technical Report of Fisheries and Aquatic Sciences 3232. Dartmouth, Nova Scotia, Canada: Fisheries; Oceans Canada, Bedford Institute of Oceanography. https://waves-vagues.dfo-mpo.gc.ca/Library/40648886.pdf.