GoA Marine Mammal Species Review

Response to SEFSC feedback on 12 species in Eastern Gulf (v2 → v6)

Published

2026-03-25 16:20:53

1 Executive Summary

NOAA SEFSC flagged 12 marine mammal species that the Marine Sensitivity Tool (MST) showed as occurring in the Eastern Gulf of America but shouldn’t be there. As of v6, all 12 species are resolved — none remain erroneously in the Gulf:

Resolution # Species Mechanism
Removed from GOA (v5) 7 Hooded Seal, Long-Finned Pilot Whale, Gray Seal, Northern Bottlenose Whale, White-Beaked Dolphin, Sowerby’s Beaked Whale, Harp Seal IUCN range mask clipped AquaMaps to expert range (outside Gulf)
Excluded as duplicate (v5) 1 B. brydei Taxonomic synonym of B. edeni; is_ok=FALSE
Reduced GOA footprint (v5) 2 B. edeni (GAA+GAB only), P. phocoena (GOA only) IUCN range mask trimmed to actual Gulf extent
Removed from GOA (v6) 1 Harbor Seal (Phoca vitulina) IUCN range from newer MAMMALS.zip download; range is Atlantic/Pacific coasts only
Excluded — range outside EEZ (v6) 1 Guiana Dolphin (Sotalia guianensis) IUCN range produces 0 cells in US EEZ; merged model truncated, is_ok=FALSE

The two species that remained problematic through v5 were resolved in v6 by:

  1. Ingesting 3 missing mammal IUCN ranges from a newer MAMMALS.zip download (the original MAMMALS_MARINE_ONLY.zip and MAMMALS_MARINE_AND_TERRESTRIAL.zip were incomplete).
  2. Excluding 371 species (343 fish, 20 invertebrates, 6 corals, 2 mammals) whose IUCN ranges fall entirely outside the US EEZ — their AquaMaps predictions in US waters were edge-of-range artifacts with near-zero suitability.

See investigate_iucn_masking.qmd for the broader impact analysis across all taxa groups.

Code
librarian::shelf(
  DBI,
  dplyr,
  duckdb,
  DT,
  fs,
  glue,
  here,
  htmltools,
  knitr,
  purrr,
  readr,
  stringr,
  tibble,
  tidyr,
  webshot2,
  quiet = T)

knitr::opts_chunk$set(echo = TRUE, warning = FALSE)

source(here("libs/paths.R"))

# v6 database (current version, from paths.R)
con_sdm <- dbConnect(duckdb(dbdir = sdm_db, read_only = TRUE))

# v2 database (outside dir_big/derived on laptop)
sdm_db_v2 <- ifelse(
  is_server,
  "/share/data/big/v2/sdm.duckdb",
  "~/_big/msens/v2/sdm.duckdb")
con_sdm_v2 <- dbConnect(duckdb(dbdir = sdm_db_v2, read_only = TRUE))

# output directory for screenshots
dir_figs <- here("figs/explore_goa-marmam")
dir_create(dir_figs)

# goa program area codes
goa_zones <- c("GAA", "GAB", "GOA")

# zone table names per version
tbl_pra_v2 <- "ply_programareas_2026"
# tbl_pra (v6) already defined by paths.R

2 Background

NOAA SEFSC (Avery Paxton, 2026-01-29) flagged 12 marine mammal species:

One of my action items was to share the list of other marine mammals that the MST shows as occurring in the Eastern Gulf planning area (that’s where we focused our initial review) that don’t currently occur there. There were 12 more (13 if include walrus) of 44 marine mammals.

References:

3 Resolution Table

Code
d_spp <- tibble::tribble(
  ~scientific_name,              ~common_name,                ~v2_mdl_seq,
  "Balaenoptera brydei",         "Bryde's whale",             295L,
  "Balaenoptera edeni",          "Bryde's Whale",             170L,
  "Cystophora cristata",         "Hooded Seal",               1808L,
  "Globicephala melas",          "Long-Finned Pilot Whale",   1434L,
  "Halichoerus grypus",          "Gray Seal",                 4454L,
  "Hyperoodon ampullatus",       "Northern Bottlenose Whale", 1354L,
  "Lagenorhynchus albirostris",  "White-Beaked Dolphin",      1679L,
  "Mesoplodon bidens",           "Sowerby's Beaked Whale",    1308L,
  "Pagophilus groenlandicus",    "Harp Seal",                 3246L,
  "Phoca vitulina",              "Harbor Seal",               770L,
  "Phocoena phocoena",           "Harbor Porpoise",           593L,
  "Sotalia guianensis",          "Guiana dolphin",            9013L)

# look up v6 taxon info
d_taxon_spp <- tbl(con_sdm, "taxon") |>
  filter(scientific_name %in% !!d_spp$scientific_name) |>
  collect()

d_spp <- d_spp |>
  left_join(
    d_taxon_spp |>
      select(
        scientific_name, taxon_id,
        v6_mdl_seq = mdl_seq,
        is_ok, is_mmpa, er_score,
        extrisk_code, redlist_code, n_ds),
    by = "scientific_name")

# v2 and v6 GOA zone_taxon
d_goa_v2 <- dbGetQuery(con_sdm_v2, glue(
  "SELECT sp_scientific, zone_value, avg_suit, rl_score, suit_rl, area_km2
   FROM zone_taxon
   WHERE zone_tbl = '{tbl_pra_v2}'
     AND zone_value IN ('GAA', 'GAB', 'GOA')
     AND sp_scientific IN ({paste0(\"'\", d_spp$scientific_name, \"'\", collapse = ', ')})
   ORDER BY sp_scientific, zone_value")) |>
  as_tibble()

d_goa_v6 <- dbGetQuery(con_sdm, glue(
  "SELECT sp_scientific, zone_value, avg_suit, er_score, suit_rl, area_km2
   FROM zone_taxon
   WHERE zone_tbl = '{tbl_pra}'
     AND zone_value IN ('GAA', 'GAB', 'GOA')
     AND sp_scientific IN ({paste0(\"'\", d_spp$scientific_name, \"'\", collapse = ', ')})
   ORDER BY sp_scientific, zone_value")) |>
  as_tibble()

# rng_iucn cell counts per species
d_iucn_cells <- tbl(con_sdm, "taxon_model") |>
  filter(
    ds_key   == "rng_iucn",
    taxon_id %in% !!d_spp$taxon_id) |>
  left_join(
    tbl(con_sdm, "model_cell") |>
      group_by(mdl_seq) |>
      summarize(n_iucn_cells = n(), .groups = "drop"),
    by = "mdl_seq") |>
  collect() |>
  mutate(n_iucn_cells = coalesce(n_iucn_cells, 0L)) |>
  select(taxon_id, n_iucn_cells)

# build resolution table
spp_in_goa_v6 <- d_goa_v6 |> distinct(sp_scientific) |> pull()
goa_zones_v2  <- d_goa_v2 |>
  group_by(sp_scientific) |>
  summarize(goa_zones_v2 = paste(sort(zone_value), collapse = ", "), .groups = "drop")
goa_zones_v6  <- d_goa_v6 |>
  group_by(sp_scientific) |>
  summarize(goa_zones_v6 = paste(sort(zone_value), collapse = ", "), .groups = "drop")

d_resolution <- d_spp |>
  left_join(d_iucn_cells, by = "taxon_id") |>
  left_join(goa_zones_v2, by = c("scientific_name" = "sp_scientific")) |>
  left_join(goa_zones_v6, by = c("scientific_name" = "sp_scientific")) |>
  mutate(
    in_goa_v2 = scientific_name %in% d_goa_v2$sp_scientific,
    in_goa_v6 = scientific_name %in% spp_in_goa_v6,
    resolution = case_when(
      scientific_name == "Balaenoptera brydei" ~
        "excluded (v5): taxonomic duplicate of B. edeni",
      scientific_name == "Sotalia guianensis" ~
        "excluded (v6): IUCN range outside US EEZ (0 cells)",
      scientific_name == "Phoca vitulina" ~
        "removed from GOA (v6): IUCN range ingested from MAMMALS.zip; Atlantic/Pacific only",
      scientific_name == "Balaenoptera edeni" ~
        "reduced (v5): IUCN range limits to GAA+GAB (no GOA)",
      scientific_name == "Phocoena phocoena" ~
        "reduced (v5): IUCN range limits to GOA only",
      !is_ok & !in_goa_v6 ~
        "removed from GOA (v5): IUCN range mask outside Gulf",
      in_goa_v2 & !in_goa_v6 ~
        "removed from GOA (v5): IUCN range mask outside Gulf",
      .default = "unchanged")) |>
  select(
    scientific_name, common_name,
    is_ok, n_iucn_cells,
    goa_zones_v2, goa_zones_v6,
    resolution) |>
  arrange(resolution, scientific_name)

datatable(
  d_resolution,
  caption = "resolution status for all 12 SEFSC-flagged species in v6",
  escape  = FALSE,
  filter  = "top",
  options = list(dom = "ft", pageLength = 15, scrollX = TRUE))

4 Database Interrogation (v6)

Code
# all models per species (per-dataset and merged)
d_models_spp <- tbl(con_sdm, "taxon_model") |>
  filter(taxon_id %in% !!d_taxon_spp$taxon_id) |>
  collect() |>
  left_join(
    d_taxon_spp |> select(taxon_id, scientific_name, common_name),
    by = "taxon_id")

# cell counts per model (left_join: 0-cell rng_iucn models have no model_cell rows)
d_counts_spp <- tbl(con_sdm, "model_cell") |>
  filter(mdl_seq %in% !!d_models_spp$mdl_seq) |>
  group_by(mdl_seq) |>
  summarize(
    n_cells = n(),
    v_min   = min(value, na.rm = TRUE),
    v_max   = max(value, na.rm = TRUE),
    .groups = "drop") |>
  collect()

d_summary_spp <- d_models_spp |>
  left_join(d_counts_spp, by = "mdl_seq") |>
  mutate(n_cells = coalesce(n_cells, 0L)) |>
  select(scientific_name, common_name, ds_key, mdl_seq, n_cells, v_min, v_max) |>
  arrange(scientific_name, ds_key)

datatable(
  d_summary_spp,
  caption = "v6 models per species by dataset (n_cells=0 means IUCN range outside US EEZ)",
  filter  = "top",
  options = list(dom = "ft", pageLength = 50))

4.1 Dataset summary (wide)

Code
d_ds_wide <- d_summary_spp |>
  select(scientific_name, ds_key, n_cells) |>
  pivot_wider(
    names_from  = ds_key,
    values_from = n_cells,
    names_prefix = "n_")

d_taxon_wide <- d_taxon_spp |>
  select(
    scientific_name, common_name, sp_cat,
    er_score, is_mmpa, is_ok,
    extrisk_code, redlist_code, n_ds) |>
  left_join(d_ds_wide, by = "scientific_name")

datatable(
  d_taxon_wide,
  caption = "v6 species summary with cell counts per dataset",
  filter  = "top",
  options = list(dom = "ft", scrollX = TRUE))

5 GOA Scores: v2 vs v6

Code
d_goa_v2_r <- d_goa_v2 |>
  rename(er_score_v2 = rl_score, avg_suit_v2 = avg_suit,
         suit_rl_v2  = suit_rl,  area_km2_v2 = area_km2)
d_goa_v6_r <- d_goa_v6 |>
  rename(er_score_v6 = er_score, avg_suit_v6 = avg_suit,
         suit_rl_v6  = suit_rl,  area_km2_v6 = area_km2)

d_goa_cmp <- d_goa_v2_r |>
  full_join(d_goa_v6_r, by = c("sp_scientific", "zone_value")) |>
  left_join(
    d_spp |> select(scientific_name, common_name),
    by = c("sp_scientific" = "scientific_name")) |>
  relocate(common_name, .after = sp_scientific) |>
  arrange(sp_scientific, zone_value)

datatable(
  d_goa_cmp,
  caption = "GOA Program Area scores: v2 vs v6 (NA = absent from zone in that version)",
  filter  = "top",
  options = list(dom = "ft", scrollX = TRUE, pageLength = 30))

6 Screenshots: v2 vs v6

Code
for (i in 1:nrow(d_spp)) {
  sp <- d_spp[i, ]
  sp_slug <- str_replace_all(sp$scientific_name, " ", "-")

  # v2 screenshot
  url_v2 <- glue("https://app.marinesensitivity.org/mapsp_v2/?mdl_seq={sp$v2_mdl_seq}")
  png_v2 <- glue("{dir_figs}/{sp_slug}_v2.png")
  if (!file.exists(png_v2)) {
    tryCatch(
      webshot(url_v2, png_v2, vwidth = 1200, vheight = 800, zoom = 2, delay = 15),
      error = function(e) message(glue("webshot failed for {sp$scientific_name} v2: {e$message}")))
  }

  # v6 screenshot (skip if no v6 mdl_seq)
  if (!is.na(sp$v6_mdl_seq)) {
    url_v6 <- glue("https://app.marinesensitivity.org/mapsp/?mdl_seq={sp$v6_mdl_seq}&splash=false")
    png_v6 <- glue("{dir_figs}/{sp_slug}_v6.png")
    if (!file.exists(png_v6)) {
      tryCatch(
        webshot(url_v6, png_v6, vwidth = 1200, vheight = 800, zoom = 2, delay = 15),
        error = function(e) message(glue("webshot failed for {sp$scientific_name} v6: {e$message}")))
    }
  }
}

7 Per-Species Details

7.1 Bryde’s whale (Balaenoptera brydei)

Warning

Excluded in v6 (is_ok=FALSE): excluded (v5): taxonomic duplicate of B. edeni

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.0462 0.2 0.0092 304441.06 NA NA NA NA
GAB 0.0617 0.2 0.0123 85526.94 NA NA NA NA
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 295 286231 1 100
ms_merge 32033 286231 1 100

7.2 Bryde’s Whale (Balaenoptera edeni)

Note

Resolution: reduced (v5): IUCN range limits to GAA+GAB (no GOA)

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.4748 0.2 0.0950 390080.59 0.4922 20 0.0984 390080.59
GAB 0.7424 0.2 0.1485 85526.94 0.7424 20 0.1485 85526.94
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 170 330493 1 100
ms_merge 54389 300873 20 100
rng_iucn 23502 300873 1 1

7.3 Hooded Seal (Cystophora cristata)

Note

Resolution: removed from GOA (v5): IUCN range mask outside Gulf

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.0265 0.6 0.0159 237456.51 NA NA NA NA
GAB 0.0239 0.6 0.0143 68897.37 NA NA NA NA
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 1808 59465 1 96
ms_merge 54384 3217 25 25
rng_iucn 23489 3217 25 25

7.4 Long-Finned Pilot Whale (Globicephala melas)

Note

Resolution: removed from GOA (v5): IUCN range mask outside Gulf

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.0480 0.2 0.0096 381277.20 NA NA NA NA
GAB 0.0491 0.2 0.0098 85526.94 NA NA NA NA
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 1434 72057 1 100
ms_merge 54395 28942 20 100
rng_iucn 23515 28942 1 1

7.5 Gray Seal (Halichoerus grypus)

Note

Resolution: removed from GOA (v5): IUCN range mask outside Gulf

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.0946 0.2 0.0189 143371.693 NA NA NA NA
GAB 0.0160 0.2 0.0032 6264.711 NA NA NA NA
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 4454 21937 1 100
ms_merge 54385 8148 20 100
rng_iucn 23492 8148 1 1

7.6 Northern Bottlenose Whale (Hyperoodon ampullatus)

Note

Resolution: removed from GOA (v5): IUCN range mask outside Gulf

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.0480 0.4 0.0192 363103.11 NA NA NA NA
GAB 0.0521 0.4 0.0208 85526.94 NA NA NA NA
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 1354 76021 1 100
ms_merge 54910 21420 20 100
rng_iucn 23518 21420 2 2

7.7 White-Beaked Dolphin (Lagenorhynchus albirostris)

Note

Resolution: removed from GOA (v5): IUCN range mask outside Gulf

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.0642 0.2 0.0128 194022.17 NA NA NA NA
GAB 0.0240 0.2 0.0048 23794.23 NA NA NA NA
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 1679 59204 1 100
ms_merge 54398 2533 50 100
rng_iucn 23523 2533 1 1

7.8 Sowerby’s Beaked Whale (Mesoplodon bidens)

Note

Resolution: removed from GOA (v5): IUCN range mask outside Gulf

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.1347 0.2 0.0269 376124.07 NA NA NA NA
GAB 0.1601 0.2 0.0320 85526.94 NA NA NA NA
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 1308 78689 1 100
ms_merge 54411 16687 20 100
rng_iucn 23526 16687 1 1

7.9 Harp Seal (Pagophilus groenlandicus)

Note

Resolution: removed from GOA (v5): IUCN range mask outside Gulf

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.0108 0.2 0.0022 8719.66 NA NA NA NA
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 3246 27979 1 100
ms_merge 54480 1541 41 100
rng_iucn 23532 1541 2 2

7.10 Harbor Seal (Phoca vitulina)

Note

Resolution: removed from GOA (v6): IUCN range ingested from MAMMALS.zip; Atlantic/Pacific only

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.1155 0.2 0.0231 149897.53 NA NA NA NA
GAB 0.0248 0.2 0.0050 9962.64 NA NA NA NA
GOA 0.5376 0.2 0.1075 117176.66 0.4956 1 0.005 142769.7
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 770 138167 1 100
ms_merge 56531 73084 20 100
rng_iucn 51920 73084 1 1

7.11 Harbor Porpoise (Phocoena phocoena)

Note

Resolution: reduced (v5): IUCN range limits to GOA only

v2 (app link)

v6 (app link)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.0973 0.2 0.0195 205175.78 NA NA NA NA
GAB 0.0384 0.2 0.0077 23468.37 NA NA NA NA
GOA 0.6290 0.2 0.1258 148574.51 0.7811 20 0.1562 109182.3
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 593 184428 1 100
ms_merge 54409 94177 20 100
rng_iucn 23534 94177 1 1

7.12 Guiana dolphin (Sotalia guianensis)

Warning

Excluded in v6 (is_ok=FALSE): excluded (v6): IUCN range outside US EEZ (0 cells)

v2 (app link)

v6: no merged model (is_ok=FALSE)

v2 vs v6 scores in GOA Program Areas
zone_value avg_suit_v2 er_score_v2 suit_rl_v2 area_km2_v2 avg_suit_v6 er_score_v6 suit_rl_v6 area_km2_v6
GAA 0.4037 0.4 0.1615 75829.06 NA NA NA NA
v6 datasets and cell counts
ds_key mdl_seq n_cells v_min v_max
am_0.05 9013 9236 1 100
rng_iucn 53847 0 NA NA