The Pacific Salmon Foundation’s State of Salmon Report aims to provide the public with answers to general questions regarding the state of salmon in British Columbia (BC) and the Yukon, such as:
This report, first released in September 2024, takes a data-driven approach to provide historical perspective and context for current news about salmon returns. The State of Salmon Report is being updated annually to reflect new data and changes to the state of Pacific salmon populations.
As part of this work, PSF has developed simple metrics to report on the status and trends in regional abundance for each species. This document outlines the specific data sources and analytical approach that we used to estimate time series of spawner abundance and total abundance (including catch and en-route mortality) for each species and region, as well as draft results. Our analyses are ongoing, and the information here is subject to change on a regular basis, but we will endeavor to keep it up-to-date.
We report spawner abundance for each of ten regions that represent all major Pacific salmon-bearing watersheds in Canada: Yukon, Northern Transboundary, Haida Gwaii, Nass, Skeena, Central Coast, Fraser, East Vancouver Island & Mainland Inlets, West Vancouver Island, and Columbia. These regions are also used to organize data in the Pacific Salmon Explorer. Note that there was a change from the 2024 Report to split the former Vancouver Island & Mainland Inlets region into two to better reflect the unique ecology and environments of salmon between West Vancouver Island and East Vancouver Island & Mainland Inlets. There are a relatively small number of Pacific salmon that spawn in the MacKenzie River basin in Arctic Canada that are currently not included in the State of Salmon report.
We report on six species of Pacific salmon (Oncorhynchus spp.): Chinook, chum, coho, pink, sockeye, and steelhead. For each species, we report on state and trends based on generational averages. For pink salmon, we take the running average of even- and odd-year lineages, but do not separate assessments of even- and odd-year pink populations as is sometimes done in status assessments due to their consistent 2-year life cycle. Our approach of using generation running averages also smooths over dominant years for sockeye salmon, for which many populations display cyclic dominance. Shifts in dominance between even- and odd-year pink populations or declines in sub-dominant years of sockeye salmon are considered in a more nuanced way in our reporting when discussing how changes in abundance have been reflected in the diversity and distribution of each species within the region.
For each of these species, where data are available, we construct an index of spawner abundance at the regional scale. We focus on spawner abundance because these data are more readily accessible and easily summarised at different spatial scales. Spawners represent the abundance of salmon available to reproduce and contribute to future generations, as well as to meet cultural and ecological needs within watersheds, and thus provides a measure of status relevant to communities and ecosystems. We recognize that commercial catch has historically been a substantial portion of salmon that return to the coast, and that ignoring declines in catch will underestimate the declines in overall salmon abundance. There is also increasing rates of pre-spawn mortality (i.e. mortality of salmon after their enter the river but before they successfully spawn) that mean that spawner abundance may be less than the number of fish that survive to maturity. Therefore, where data are available, we include information on total abundance (i.e. the number of salmon that survive to maturity, calculated as spawners plus catch plus pre-spawn mortality (where applicable)).
We have based our assessments on the best available data for each region and species. For example, stocks that are governed by international treaties may be monitored by the Pacific Salmon Commission (PSC), and tend to have reliable time series of abundance available at regional scales. These data sources are outlined in the Region-Specific Data section. For species and regions where aggregate abundance is not reported by the PSC or DFO at the scale needed, we adapted our approach to make the best use of available data. In most cases, this meant expanding spawner abundance from stream-level estimates to get a regional scale index of spawner abundance using two types of expansion factors (English et al. 2018). This expansion process is described in the Expansion Factors section.
R code and data for the analyses described here are
available on GitHub at https://github.com/salmonwatersheds/state-of-salmon.
Here we describe specific data sources for the abundance of salmon and steelhead at the regional scale.
The Canadian portion of the Yukon River is home to Chinook, chum, and coho salmon. Border escapement and total abundance (i.e. run size) of Canadian-origin Chinook and fall chum salmon in the mainstem Yukon River are counted at the Eagle Sonar station on the Yukon/Alaska border, and are available from the Yukon River Panel in their Joint Technical Committee (JTC) Reports.
There are also Chinook, chum, and coho salmon in the Canadian portion of the Porcupine River, which joins the mainstem Yukon River in Alaska. Data on escapement to the Porcupine River are more patchy and not currently included here.
We used Chinook RR Spawning escapement estimate and
RR Canadian origin total run size estimate from Appendix
B11 of Yukon River Joint Technical Committee (2025).
# Load data ---
ytck <- read.csv(here('data/yukon_chinook_appendixB11.csv'), na.strings = "-")
# Note: Use Run Reconstruction (RR) estimates of spawning escapement and total
# run size, not "Historical" or Mark-Recapture estimates
# Check if years are continuous
#unique(diff(ytck$Year)) # Yes, all one year apart # commented out to avoid outputting in Rmd
# Reformat data for SPS ---
ytck_sps <- data.frame(
region = rep("Yukon", dim(ytck)[1]),
species = rep("Chinook", dim(ytck)[1]),
year = ytck$Year,
spawners = ytck$RR.Spawning.escapement.estimate,
smoothedSpawners = NA,
runsize = ytck$RR.Canadian.origin.total.run.size.estimate,
smoothedRunsize = NA,
source_id = rep("JTC_202603", dim(ytck)[1])
)
# Smoothing
ytck_sps$smoothedSpawners <- genSmooth(
abund = ytck_sps$spawners,
years = ytck_sps$year,
genLength = genLength$gen_length[genLength$region == "Yukon" & genLength$species == "Chinook"]
)
ytck_sps$smoothedRunsize <- genSmooth(
abund = ytck_sps$runsize,
years = ytck_sps$year,
genLength = genLength$gen_length[genLength$region == "Yukon" & genLength$species == "Chinook"]
)
# Add to SPS data
sps_data <- rbind(sps_data, ytck_sps)
# Generate standard plot
plot_abund(ytck_sps)
Above: Spawner abundance (grey) and total abundance (black) of Yukon River Chinook salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
Canadian-origin fall chum spawner abundance was taken as the
Spawning escapement estimate in Appendix B16 and total
abundance as the Total estimated Canadian-origin run size
from Appendix B20 of Yukon River Joint Technical
Committee (2025).
# Load data ---
ytcm_B16 <- read.csv(here('data/yukon_chum_appendixB16.csv')) # Historical data
names(ytcm_B16)[1] <- "Year"
ytcm_B20 <- read.csv(here('data/yukon_chum_appendixB20.csv')) # Most recent estimates
# Check if years are continuous
#unique(diff(ytcm_B16$Year)) # Yes, all one year apart
#unique(diff(ytcm_B20$Year)) # Yes, all one year apart
# Reformat data for SPS
ytcm_sps <- data.frame(
region = rep("Yukon", dim(ytcm_B16)[1]),
species = rep("Chum", dim(ytcm_B16)[1]),
year = ytcm_B16$Year,
spawners = ytcm_B16$Spawning.escapement.estimate,
smoothedSpawners = NA,
runsize = ytcm_B20$Total.estimated.Canadian.origin.run.size[match(ytcm_B16$Year, ytcm_B20$Year)],
smoothedRunsize = NA,
source_id = rep("JTC_202603", dim(ytcm_B16)[1])
)
# Smoothing
ytcm_sps$smoothedSpawners <- genSmooth(
abund = ytcm_sps$spawners,
years = ytcm_sps$year,
genLength = genLength$gen_length[genLength$region == "Yukon" & genLength$species == "Chum"]
)
ytcm_sps$smoothedRunsize <- genSmooth(
abund = ytcm_sps$runsize,
years = ytcm_sps$year,
genLength = genLength$gen_length[genLength$region == "Yukon" & genLength$species == "Chum"]
)
# Add to SPS data
sps_data <- rbind(sps_data, ytcm_sps)
# Generate standard plot
plot_abund(ytcm_sps, cols = c("#000000", grey(0.6), 2), red_points = "Spawner (Appendix B20)")
points(ytcm_B20$Year, ytcm_B20$Spawning.escapement*10^-3, col = 2, pch = 19, cex = 0.6)
Above: Spawner abundance (grey) and total abundance (black) of Yukon River chum salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each. We use the spawning escapement from Appendix B16 for spawner abundance, while the escapement data from Appendix B20 makes up part of the total abundance. There are small differences between the two datasets in the early 2000s.
The best-available information on salmon abundance in the Northern Transboundary region is from the PSC’s Joint Transboundary Technical Committee Reports. The most recent TTC report (Transboundary Technical Committee 2026) includes data through 2024. Updated report appendices were provided by Aaron Foos (DFO) on July 8, 2026 in advance of report publication, and numbers for 2025 should be considered preliminary.
We recognize that our approach in the Transboundary lacks information from many un-monitored watersheds, in particular the smaller watersheds of the Chilkat, Unuk, and Whiting Rivers. In the absence of better monitoring, we choose to report available data as a proxy for regional abundance, and note that the contribution of these smaller watersheds to total regional abundance for each species is likely small.
The regional spawner abundance and total return of Chinook was calculated as the sum of escapement and total return, respectively, to the Stikine, Alsek, and Taku indicator stocks. For each of these stocks, we used escapement and exploitation rates provided by the PSC’s Chinook Technical Committee as part of their Synoptic Evaluations of Stock Status. These data were downloaded from their Data Application. Total abundance was calculated from the escapement, \(E\), and exploitation rate, \(r\), as \(E/(1-r)\).
For 2025, the Synoptic Evaluations of Stock Status are not yet available. We used the escapement estimates for Stikine, Alsek, and Taku Chinook from Table B2 of Appendix B - Detailed Escapement, available as a downloadable dataset from the Chinook Technical Committee. Canadian and US harvest of Chinook provided by Aaron Foos (DFO) as updated tables from the Transboundary Technical Committee report. Specifically, harvest for Stikine Chinook from Table B12 and harvest of Taku Chinook from Table D8. Total harvest of Alsek Chinook was provided by Teresa Wallace (DFO, pers. comm.): US Commercial: 194, US Subsistence: 8, CAN (Aboriginal): 94, CAN Recreational: 0 (No CAN recreational harvest permitted in 2025) (Total harvest = 296).
# Load data ---
# Get Synoptic evaluation data (up to 2024)
tbrck_raw <- read.csv(here("data/CTC_Synoptic_evaluation_data_all_2026-08-19.csv")) %>%
filter(Year > 1975) %>% # Remove 1975 -> missing Alsek data
filter(Stock %in% c("Alsek", "Taku", "Stikine")) %>%
dplyr::select(Stock, Year, Escapement, RateType, Rate) %>%
mutate(TotalRun = Escapement/(1 - Rate))
# Get CTC detailed escapement (Appendix B) data - for 2025
tbrck_esc <- readxl::read_xlsx(here("data/TCCHINOOK-26-03-Appendix-B-Escapement-Detailed.xlsx"), sheet = "B2", range = "A5:G54", col_names = c("year", "Alsek_esc", "Alsek_cv", "Taku_esc", "Taku_cv", "Stikine_esc", "Stikine_cv")) %>%
mutate(Total_esc = Alsek_esc + Taku_esc + Stikine_esc)
# 2025 Harvest data - from data provided by Aaron Foos on 2026-07-08 and Teresa Wallace on 2026-08-21
tbrck_harvest <- data.frame(Year = rep(c(2025), 3),
Stock = rep(c("Alsek", "Taku", "Stikine")),
CAD_harv = c(94, 44, 263),
USA_harv = c((194+8), 857, 12)) %>%
mutate(Total_harv = CAD_harv + USA_harv)
# For 2025, take harvest from TTC B12, D8, Provided by Aaron Foos; Alsek harvest provided by email (Teresa Wallace, DFO)
tbrck <- tbrck_raw %>%
group_by(Year) %>%
summarise(Escapement_all = sum(Escapement),
TotalRun_all = sum(TotalRun),
source_id = "PSC_20260819") %>%
bind_rows(data.frame(Year = 2025,
Escapement_all = (tbrck_esc$Alsek_esc + tbrck_esc$Taku_esc + tbrck_esc$Stikine_esc)[tbrck_esc$year == 2025],
TotalRun_all = sum(tbrck_harvest$Total_harv) + tbrck_esc$Total_esc[tbrck_esc$year == 2025], # Total run = sum of escapements and harvests
source_id = "Foos_20260708"))
# Reformat data for SPS
tbrck_sps <- data.frame(
region = rep("Northern Transboundary", length(tbrck$Year)),
species = rep("Chinook", length(tbrck$Year)),
year = tbrck$Year,
spawners = tbrck$Escapement_all,
smoothedSpawners = NA,
runsize = tbrck$TotalRun_all,
smoothedRunsize = NA,
source_id = tbrck$source_id
)
# Smoothing
tbrck_sps$smoothedSpawners <- genSmooth(
abund = tbrck_sps$spawners,
years = tbrck_sps$year,
genLength = genLength$gen_length[genLength$region == "Northern Transboundary" & genLength$species == "Chinook"]
)
tbrck_sps$smoothedRunsize <- genSmooth(
abund = tbrck_sps$runsize,
years = tbrck_sps$year,
genLength = genLength$gen_length[genLength$region == "Northern Transboundary" & genLength$species == "Chinook"]
)
# Plot abund using ggplot instead of base?
# plot_abund(tbrck_sps)
ggplot(tbrck_sps, aes(x = year)) +
geom_line(aes(y = spawners/1000, colour = "Spawner"), lwd = 0.5) +
geom_point(aes(y = spawners/1000, colour = "Spawner"),
pch = 21, fill = "white") +
geom_line(aes(y = runsize/1000, colour = "Total"), lwd = 0.5) +
geom_point(aes(y = runsize/1000, colour = "Total"),
pch = 21, fill = "white") +
geom_line(aes(y = smoothedRunsize/1000), lwd = 1.2) +
geom_line(aes(y = smoothedSpawners/1000),
lwd = 1.2, colour = grey(0.6)) +
scale_colour_manual(
name = NULL,
values = c(
"Spawner" = grey(0.7),
"Total" = "black"
)
) +
labs(
title = "Northern Transboundary Chinook",
y = "Abundance (thousands)"
) +
lims(
y = c(0, max(c(tbrck_sps$spawners, tbrck_sps$runsize),
na.rm = TRUE)/1000)
) +
theme_minimal() +
theme(
legend.position = c(0.98, 0.98),
legend.justification = c("right", "top")
)
Above: Spawner abundance (grey) and total abundance (black) of Transboundary chinook salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
# Add to master sps dataframe
sps_data <- rbind(sps_data, tbrck_sps)
Above: Northern Transboundary Chinook salmon (a) spawner abundance and (b) total abundance showing the contributions of the Alsek, Taku, and Stikine river basins.
Sockeye spawner abundance and total return were taken from the
updated TTC report appendices. Specifically, Stikine sockeye spawner and
total abundance were the Escapement/broodstock and
Terminal Run, respectively, summed across the Stikine River
(Appendix B26) and the Taku River (Appendix D17).
# TBR Sockeye data are the sum of the Stikine (Appendix B26) and Taku (Appendix D17)
# In 2024, the Appendix numbers given were B21 and D15 respectively, but that's changed.
tbrse_stik <- read.csv(here('data/tbr_sockeye_appendixB26.csv'))
tbrse_taku <- read.csv(here('data/tbr_sockeye_appendixD17.csv'))
# Remove Stikine data prior to 1984
tbrse_stik <- subset(tbrse_stik, tbrse_stik$Year >= 1984)
# Reformat data for SPS
tbrse_sps <- data.frame(
region = rep("Northern Transboundary", dim(tbrse_stik)[1]),
species = rep("Sockeye", dim(tbrse_stik)[1]),
year = tbrse_stik$Year,
spawners = tbrse_stik$StikineRiver_EscapementBroodstock + tbrse_taku$Escapement,
smoothedSpawners = NA,
runsize = tbrse_stik$StikineRiver_TerminalRun + tbrse_taku$Run,
smoothedRunsize = NA,
source_id = rep("Foos_20250415", dim(tbrse_stik)[1])
)
# Smoothing
tbrse_sps$smoothedSpawners <- genSmooth(
abund = tbrse_sps$spawners,
years = tbrse_sps$year,
genLength = genLength$gen_length[genLength$region == "Northern Transboundary" & genLength$species == "Sockeye"]
)
tbrse_sps$smoothedRunsize <- genSmooth(
abund = tbrse_sps$runsize,
years = tbrse_sps$year,
genLength = genLength$gen_length[genLength$region == "Northern Transboundary" & genLength$species == "Sockeye"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, tbrse_sps)
# Generate standard plot
plot_abund(tbrse_sps)
Above: Spawner abundance (grey) and total abundance (black) of Transboundary sockeye salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
Above: Sockeye salmon spawner abundance (top) and total abundance (bottom) in the Taku and Stikine river basins. We report regional abundance only from 1984 onwards when data for both rivers are available; prior to 1984, only dat for the Stikine are available.
Coho spawner abundance and total abundance are available for the Taku
River only, taken from Appendix D22 (Escapement and
Terminal Run respectively) of the TTC updated report
appendices.
# Load data ---
tbrco <- read.csv(here('data/tbr_coho_appendixD22.csv'))
# Check if years are continuous
#unique(diff(tbrco$Year)) # Yes, all one year apart
# Reformat data for SPS
tbrco_sps <- data.frame(
region = rep("Northern Transboundary", dim(tbrco)[1]),
species = rep("Coho", dim(tbrco)[1]),
year = tbrco$Year,
spawners = tbrco$Escapement,
smoothedSpawners = NA,
runsize = tbrco$TerminalRun,
smoothedRunsize = NA,
source_id = rep("Foos_20250415", dim(tbrco)[1])
)
# Smoothing
tbrco_sps$smoothedSpawners <- genSmooth(
abund = tbrco_sps$spawners,
years = tbrco_sps$year,
genLength = genLength$gen_length[genLength$region == "Northern Transboundary" & genLength$species == "Coho"]
)
tbrco_sps$smoothedRunsize <- genSmooth(
abund = tbrco_sps$runsize,
years = tbrco_sps$year,
genLength = genLength$gen_length[genLength$region == "Northern Transboundary" & genLength$species == "Coho"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, tbrco_sps)
# Generate standard plot
plot_abund(tbrco_sps, red_points = "App D22 Total run")
points(x=tbrco$Year, y=tbrco$TotalRun/1000, col=2, pch = 19, cex = 0.6, xpd = NA)
Above: Spawner abundance (grey) and total abundance (black) of Transboundary coho salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each. We used terminal run as the total abundance, but total run (including US fisheries outside of District 111) is shown as red points (not available for 2025).
Monitoring of chum salmon, pink salmon, and steelhead in the Transboundary region is limited, and the best available information is the Canyon Island fish wheel on the Taku River. Data from the fish wheel are reported in the annual Transboundary Technical Committee reports. The window of operation, number of operating days, and hours of operation have varied from year to year, and thus the raw counts are not a reliable index of abundance through time. For example, fish wheel operation decreased from 24 hours to 16 hours per day in 2018 and further to 8 hours a day in 2023 (Transboundary Technical Committee 2025).
appD24 <- read_xlsx(here("data/2025 PSF Pacific Salmon Explorer Data.xlsx"), sheet = "TAK Appen D.24", range = "A8:P50")
# Calculate annual operating days
z <- strsplit(appD24$Operation, split = "-")
operationDates <- data.frame(
Year = appD24$Year,
startDate = NA,
endDate = NA
)
ny <- length(appD24$Year)
for(i in 1:ny){
operationDates$startDate[i] <- as.Date(paste0(z[[i]][1], "/", operationDates$Year[i]), format = "%m/%d/%Y")
operationDates$endDate[i] <- as.Date(paste0(z[[i]][2], "/", operationDates$Year[i]), format = "%m/%d/%Y")
}
operationDates$nDays <- operationDates$endDate - operationDates$startDate + 1
operationDates$startDate <- as.Date(operationDates$startDate, origin = "1970-01-01")
operationDates$endDate <- as.Date(operationDates$endDate, origin = "1970-01-01")
operationDates$startMonth <- as.numeric(strftime(operationDates$startDate, format = "%m"))
operationDates$startDay <- as.numeric(strftime(operationDates$startDate, format = "%d"))
operationDates$endMonth <- as.numeric(strftime(operationDates$endDate, format = "%m"))
operationDates$endDay <- as.numeric(strftime(operationDates$endDate, format = "%d"))
par(mfrow = c(2,1), mar = c(3,4,1,4), oma = c(0,0,2,0))
plot(range(operationDates$Year), as.Date(c("2000-04-01", "2000-10-31")), "n", xlab= "", ylab = "Operating window", las = 1, bty = "l")
abline(h = as.Date(paste(rep(2000, 8), c(4:11), rep(1, 8), sep = "-")), lty = 2)
for(i in 1:ny){
segments(x0 = operationDates$Year[i],
x1 = operationDates$Year[i],
y0 = as.Date(paste(2000, operationDates$startMonth[i], operationDates$startDay[i], sep = "-")),
y1 = as.Date(paste(2000, operationDates$endMonth[i], operationDates$endDay[i], sep = "-")),
lwd = 5, lend = 1)
}
mtext(side = 3, line = 0.5, adj = 0, "a)")
plot(operationDates$Year, operationDates$nDays, "o", pch = 21, bg = 'white', ylab = "Number of operating days", xlab = "", las = 1, bty = "l")
par(new = TRUE)
plot(appD24$Year, appD24$hours, "l", col = 2, xaxt = "n", yaxt = "n", xlab = "", ylab = "", lwd = 2)
axis(side = 4, col = 2, las = 1)
mtext(side = 3, line = 0.5, adj = 0, "b)")
mtext(side = 3, outer= TRUE, "Canyon Island Fish Wheel Operation")
mtext(side = 4, "Operating hours per day", col = 2, line = 2.5)
Above: Operation of the Canyon Island fish wheel on th Taku River from 1982 to 2025: a) Operating window each year occurred between April and October. (b) Total number of operating days varied between 73 and 172 with an average of 138.8, while the hours of operation each day decreased from 24 (1982-2017) to 16 (2018-2022) to 8 (2023-2025).
To account for changes in fish wheel operation through time we calculate an index of abundance for chum, pink, and steelhead as the annual catch per unit effort (CPUE) multiplied by the average effort across all years. Catch per unit effort (CPUE) is calculated each year as the raw count \(C_t\) divided by the operating days: \[ \text{CPUE }_t = \frac{C_{t}}{d_t \times h_t/24} \] where \(d_t\) is the number of operating days in year \(t\) and \(h_t\) is the operating hours per day. The resulting index of abundance was used as the spawner abundance for the regional population.
# Check if years are continuous
#unique(diff(tbrpk$Year)) # Yes, all one year apart
# Reformat data for SPS
tbrpk_sps <- data.frame(
region = rep("Northern Transboundary", nrow(tbr_cmpksh)),
species = rep("Pink", nrow(tbr_cmpksh)),
year = tbr_cmpksh$Year,
spawners = tbr_cmpksh$pink_adj,
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep("Foos_20260708", nrow(tbr_cmpksh))
)
# Smoothing
tbrpk_sps$smoothedSpawners <- genSmooth(
abund = tbrpk_sps$spawners,
years = tbrpk_sps$year,
genLength = genLength$gen_length[genLength$region == "Northern Transboundary" & genLength$species == "Pink"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, tbrpk_sps)
# Generate standard plot
plot_abund(tbrpk_sps, red_points = "Raw fish wheel count")
points(tbr_cmpksh$Year, tbr_cmpksh$pink_raw*10^-3, col = 2, pch = 19, cex = 0.6)
Above: Spawner abundance of Transboundary pink salmon. The annual spawner abundance is shown by points and the smoothed metric by solid lines. The small red points are the raw counts from the Canyon Island fish wheel prior to adjusting by CPUE. Dashed horizonal lines represent the long-term average.
# Reformat data for SPS
tbrcm_sps <- data.frame(
region = rep("Northern Transboundary", nrow(tbr_cmpksh)),
species = rep("Chum", nrow(tbr_cmpksh)),
year = tbr_cmpksh$Year,
spawners = tbr_cmpksh$chum_adj,
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep("Foos_20260708", nrow(tbr_cmpksh))
)
# Smoothing
tbrcm_sps$smoothedSpawners <- genSmooth(
abund = tbrcm_sps$spawners,
years = tbrcm_sps$year,
genLength = genLength$gen_length[genLength$region == "Northern Transboundary" & genLength$species == "Chum"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, tbrcm_sps)
# Generate standard plot
plot_abund(tbrcm_sps, red_points = "Raw fish wheel count")
points(tbr_cmpksh$Year, tbr_cmpksh$chum_raw*10^-3, col = 2, pch = 19, cex = 0.6)
Above: Spawner abundance of Transboundary chum salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
Steelhead trout have also been enumerated at the Canyon Island fish wheel since 1987, though in past versions of datasets estimates have been patchy and the timing of the fish wheel likely misses a substantial portion of the Taku summer run steelhead. Thus, we have not previously used the Canyon Island counts. However, the 2026 dataset included a more complete time series for Steelhead and we were able to adjust for changes in fish wheel operation as described above.
# Reformat data for SPS
tbrsh_sps <- data.frame(
region = rep("Northern Transboundary", nrow(tbr_cmpksh)),
species = rep("Steelhead", nrow(tbr_cmpksh)),
year = tbr_cmpksh$Year,
spawners = tbr_cmpksh$steelhead_adj,
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep("Foos_20260708", nrow(tbr_cmpksh))
) %>% filter(year > 1986) # Take out early years with no steelhead data
# Smoothing
tbrsh_sps$smoothedSpawners <- genSmooth(
abund = tbrsh_sps$spawners,
years = tbrsh_sps$year,
genLength = genLength$gen_length[genLength$region == "Northern Transboundary" & genLength$species == "Steelhead"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, tbrsh_sps)
# Generate standard plot
plot_abund(tbrsh_sps, red_points = "Raw fish wheel count")
points(tbr_cmpksh$Year, tbr_cmpksh$steelhead_raw*10^-3, col = 2, pch = 19, cex = 0.6)
Above: Spawner abundance of Transboundary steelhead. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average. Red points show the raw fish wheel counts, which were used to calculate an index of abundance based on CPUE.
The only available data for Chinook salmon in Haida Gwaii are from a single enumeration project on the Yakoun River. Monitoring on the Yakoun was restored in 2021. An automatic sonar device enumerates migrating Chinook, and the counts are verified using manually operated nets. Data were provided by Mark Spoljaric, Haida Nation.
Estimates prior to 2006 were from DFO spawner surveys, and the two time series are believed to be comparable. Old estimates (prior to 2006) also match the estimated escapement to Area 1 in the Northern Boundary Technical Committee (2023) (Appendix 30).
# Get spawner survey data to compare
hgck_ss <- read.csv(here("data/spawner_surveys.csv")) %>%
subset(species_name == "Chinook" & region == "Haida Gwaii") %>%
subset(stream_name_pse == "YAKOUN RIVER")
hgck <- read.csv(here("data/Yakoun_Chinook_1952-2025.csv"))
# There are some missing years of data; want to impute in between when smoothing
#diff(hgck$year)
hgck_years <- min(hgck$year):max(hgck$year)
# Reformat data for SPS
hgck_sps <- data.frame(
region = rep("Haida Gwaii", length(hgck_years)),
species = rep("Chinook", length(hgck_years)),
year = hgck_years,
spawners = hgck$stream_observed_count[match(hgck_years, hgck$year)],
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = c(rep(hgck$source_id[1], length(hgck_years[1]:2020)),
rep(hgck$source_id[nrow(hgck)], length(2021:2025)))
)
# Smoothing
hgck_sps$smoothedSpawners <- genSmooth(
abund = hgck_sps$spawners,
years = hgck_sps$year,
genLength = genLength$gen_length[genLength$region == "Haida Gwaii" & genLength$species == "Chinook"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, hgck_sps)
# Generate standard plot
plot_abund(hgck_sps)
points(hgck_ss$year, hgck_ss$stream_observed_count/1000, col="purple")
Above: Spawner abundance of Haida Gwaii chinook salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average. here, purple points are from NuSEDS spawner surveys and grey are from recent enumeration project.
For chum, coho, pink, and sockeye in Haida Gwaii, we followed the Expansion Factors approach described below. The full list of indicator streams used for this expansion are in the table below. We compared our expansion approach to estimates of Area 1 escapement as reported in the Northern Boundary Technical Committee (2023) (Appendix 30), but found the Area 1 estimates were much lower for chum (see “alternate” series in figure below).
# Load data ---
region_spawners <- sp <- readRDS(here("output/expanded-spawners/Haida Gwaii-spawners.rds"))
yrs <- as.numeric(dimnames(sp)[[3]])
expansion_factors <- readRDS(here("output/expanded-spawners/Haida Gwaii-expansion-factors.rds"))
# PSC Northern Boundary data (Appendix 30) for comparison
hg_table30 <- read.csv(here("data/TCNB-23-01_Table30_Area1escapement.csv"))
names(hg_table30) <- c("year", "Sockeye", "Coho", "Pink", "Chum", "Chinook") # Change names to be consistent with species
# Data loaded above
hg.s <- sp[2, "Chum", ]
# Reformat data for SPS
hg.s_sps <- data.frame(
region = rep("Haida Gwaii", length(hg.s)),
species = rep("Chum", length(hg.s)),
year = as.numeric(names(hg.s)),
spawners = as.numeric(hg.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(hg.s))
)
# Smoothing
hg.s_sps$smoothedSpawners <- genSmooth(
abund = hg.s_sps$spawners,
years = hg.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Haida Gwaii" & genLength$species == "Chum"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, hg.s_sps)
# Generate standard figure
plot_abund(hg.s_sps)
Above: Spawner abundance of Haida Gwaii chum salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
# Additional series to plot
added_series.s <- hg_table30 %>%
select(year, "Chum") %>%
rename("value" = "Chum")
# Expansion plot(s)
plot_expansions(speciesname = "Chum",
regionname = "Haida Gwaii",
region_spawners = region_spawners,
expansion_factors = expansion_factors,
added_series = added_series.s)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (purple) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. Alternative time series from the PSC’s Northern Boundary Technical Committee Report (Appendix 30) is shown in blue. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade. See section on Expansion Factors below for further details.
| Ain River | Dana Creek #1 | Inskip Creek | Mud Bay Creek | Saltspring Bay Creek |
| Anna Inlet Creek | Dana Creek #2 | Island Bay Creeks-R/H | Mudge Creek | Sandy Creek |
| Awun River | Dana Creek #3 | Kano Inlet Head Creek | Naden River | Security Inlet Creek-L/H |
| Bag Harbour Creek | Dawson Harbour Creek | Kootenay Inlet North Arm Creek | North Arm Creek-Rh | Security Inlet Creek-R/H |
| Big Goose Creek | Dawson Inlet Creek | Kootenay Inlet South Arm Creek | North Arm Head Creek | Sedgwick Bay Creek |
| Botany Inlet Creek-Head | Deena Creek | Kostan Creek | Oxalis Creek | Skaat Harbour Creek-L/H |
| Botany Inlet Creek-Outer | East Narrows Creek | Lagins Creek | Pacofi Creek | Slatechuck Creek |
| Bottle Inlet Creek | Fairfax Creek | Lagoon Creek | Pallant Creek | Sleeping Beauty Creek |
| Browns Cabin Creek | Fairfax Inlet Creek-Outer | Little Goose Creek | Peel Inlet Creek-L/H #1 | Stanley Creek |
| Buck Channel Creek #3 | Flat Creek | Louscoone Inlet Creek | Peel Inlet Creek-L/H #2 | Tangle Cove Creek |
| Canoe Pass Creek | George Bay Creek | Mace Creek | Peel Inlet Head Creek | Tasu Creek |
| Carmichael Creek | Gold Harbour Creek | Matheson Creek-L/H | Powrivco Creek | Thorsen Creek |
| Chadsey Creek | Goski Bay Creek | Matheson Creek-R/H | Rennell Creek | Thurston Harbour Creek |
| Clapp Basin Creek | Hutton Creek-Head | Mckenzie Cove Creek | Richardson Creek | Waterfall Creek |
| Clint Creek | Hutton Creek-L/H | Mercer Creek | Rockrun Creek | Wilson Bay Creek |
| Crescent Inlet Creek | Indian Cabin Creek | Mountain Creek | Salmon River | Yakulanas Creek |
For chum, coho, pink, and sockeye in Haida Gwaii, we followed the Expansion Factors approach described below. The full list of indicator streams used for this expansion are in the table below. We compared our expansion approach to estimates of escapement to Area 1 reported in the Northern Boundary Technical Committee (2023) (Appendix 30) but found the Area 1 estimates were much lower for coho.
# Data loaded above
hg.s <- sp[2, "Coho", ]
# Reformat data for SPS
hg.s_sps <- data.frame(
region = rep("Haida Gwaii", length(hg.s)),
species = rep("Coho", length(hg.s)),
year = as.numeric(names(hg.s)),
spawners = as.numeric(hg.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(hg.s))
)
# Smoothing
hg.s_sps$smoothedSpawners <- genSmooth(
abund = hg.s_sps$spawners,
years = hg.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Haida Gwaii" & genLength$species == "Coho"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, hg.s_sps)
# Generate standard figure
plot_abund(hg.s_sps)
Above: Spawner abundance of Haida Gwaii coho salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
# Additional series to plot
added_series.s <- hg_table30 %>%
select(year, "Coho") %>%
rename("value" = "Coho")
# Expansion plot(s)
plot_expansions(speciesname = "Coho",
regionname = "Haida Gwaii",
region_spawners = region_spawners,
expansion_factors = expansion_factors,
added_series = added_series.s)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (purple) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. Alternative time series from the PSC’s Northern Boundary Technical Committee Report (Appendix 30) is shown in blue. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade. See section on Expansion Factors below for further details.
| Botany Inlet Creek-Head | Dawson Harbour Creek | Lagoon Creek |
| Botany Inlet Creek-Outer | Deena Creek | Pallant Creek |
| Crescent Inlet Creek | Lagins Creek | Tlell River |
For chum, coho, pink, and sockeye in Haida Gwaii, we followed the Expansion Factors approach described below. The full list of indicator streams used for this expansion are in the table below. We compared our expansion approach to estimates of Area 1 escapement as reported in the Northern Boundary Technical Committee (2023) (Appendix 30), but found the Area 1 estimates were much lower for pink (see “alternate” series in figure below).
# Data loaded above
hg.s <- sp[2, "Pink", ]
# Reformat data for SPS
hg.s_sps <- data.frame(
region = rep("Haida Gwaii", length(hg.s)),
species = rep("Pink", length(hg.s)),
year = as.numeric(names(hg.s)),
spawners = as.numeric(hg.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(hg.s))
)
# Smoothing
hg.s_sps$smoothedSpawners <- genSmooth(
abund = hg.s_sps$spawners,
years = hg.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Haida Gwaii" & genLength$species == "Pink"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, hg.s_sps)
# Generate standard figure
plot_abund(hg.s_sps)
Above: Spawner abundance of Haida Gwaii pink salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
# Additional series to plot
added_series.s <- hg_table30 %>%
select(year, "Pink") %>%
rename("value" = "Pink")
# Expansion plot(s)
plot_expansions(speciesname = "Pink",
regionname = "Haida Gwaii",
region_spawners = region_spawners,
expansion_factors = expansion_factors,
added_series = added_series.s)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (purple) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. Alternative time series from the PSC’s Northern Boundary Technical Committee Report (Appendix 30) is shown in blue. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade. See section on Expansion Factors below for further details.
| Ain River | Echo Harbour Creek | Matheson Creek-R/H | Security Inlet Creek-R/H |
| Big Goose Creek | Gate Creek | Mckenzie Cove Creek | Skedans Creek |
| Bonanza Creek | Gregory Creek | Naden River | Slatechuck Creek |
| Boomchain Bay Creek | Honna River | Pacofi Creek | Tarundl Creek |
| Browns Cabin Creek | Kano Inlet Head Creek | Pallant Creek | Tasu Creek |
| Chadsey Creek | Lagins Creek | Peel Inlet Creek-L/H #2 | Thorsen Creek |
| Copper Creek | Lignite Creek | Riley Creek | Tlell River |
| Crescent Inlet Creek | Little Goose Creek | Sachs Creek | Windy Bay Creek |
| Datlamen Creek | Mamin River | Salmon River | Yakoun River |
| Davidson Creek | Mathers Creek | Seal Inlet Creek | |
| Deena Creek | Matheson Creek-L/H | Security Inlet Creek-L/H |
For chum, coho, pink, and sockeye in Haida Gwaii, we followed the Expansion Factors approach described below. The full list of indicator streams used for this expansion are in the table below. We compared our expansion approach to estimates of Area 1 escapement as reported in the Northern Boundary Technical Committee (2023) (Appendix 30), but found the Area 1 estimates were much lower for sockeye (see “alternate” series in figure below).
# Data loaded above
hg.s <- sp[2, "Sockeye", ]
# Reformat data for SPS
hg.s_sps <- data.frame(
region = rep("Haida Gwaii", length(hg.s)),
species = rep("Sockeye", length(hg.s)),
year = as.numeric(names(hg.s)),
spawners = as.numeric(hg.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(hg.s))
)
# Smoothing
hg.s_sps$smoothedSpawners <- genSmooth(
abund = hg.s_sps$spawners,
years = hg.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Haida Gwaii" & genLength$species == "Sockeye"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, hg.s_sps)
# Generate standard figure
plot_abund(hg.s_sps)
Above: Spawner abundance of Haida Gwaii sockeye salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
# Additional series to plot
added_series.s <- hg_table30 %>%
select(year, "Sockeye") %>%
rename("value" = "Sockeye")
# Expansion plot(s)
plot_expansions(speciesname = "Sockeye",
regionname = "Haida Gwaii",
region_spawners = region_spawners,
expansion_factors = expansion_factors,
added_series = added_series.s)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (purple) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. Alternative time series from the PSC’s Northern Boundary Technical Committee Report (Appendix 30) is shown in blue. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade. See section on Expansion Factors below for further details.
| Awun River | Mercer Creek |
| Copper Creek | Naden River |
| Mathers Creek | Yakoun River |
We use data from the PSC’s
Chinook Technical Committee (CTC) data sets for both spawners and
total abundance. Specifically, we use Esc and
t.run respectively of Nass River (Area 3) escapement and
terminal run provided in Table B3 of Appendix B - Detailed Escapement,
available as a downloadable dataset from the Chinook
Technical Committee.
We compare these data below to estimates of spawners (purple open circles) and total run (blue open circles) to 2025 from the 2025 Nass River Salmon Stock Assessment Post-Season Summary published by the Nisga’a nation, Tables 20 and 22. The escapement estimates correspond closely, though less so in 2018 and 2022. The ‘Total run’ data from the Nisga’a report is typically higher than ‘t.run’ from the CTC dataset, and may include more marine catch than CTC estimates.
# Load data ---
# TCCHINOOK Table B3
nass_ctc <- readxl::read_xlsx(here("data/TCCHINOOK-26-03-Appendix-B-Escapement-Detailed.xlsx"), sheet = "B3", range = "A5:D55", col_types = "numeric", col_names = c("Year", "Above_Gitwinksihlkw2", "Esc", "t.run"))
# Nisgaa data for comparison
nass_nisgaa <- read.csv(here("data/2025NassStockAssessment_Table20+22.csv"))
# Reformat data for SPS
nassck_sps <- data.frame(
region = rep("Nass", length(nass_ctc$Year)),
species = rep("Chinook", length(nass_ctc$Year)),
year = nass_ctc$Year,
spawners = nass_ctc$Esc,
smoothedSpawners = NA,
runsize = nass_ctc$t.run,
smoothedRunsize = NA,
source_id = rep(ctc_id, length(nass_ctc$Year))
)
# Smoothing
nassck_sps$smoothedSpawners <- genSmooth(
abund = nassck_sps$spawners,
years = nassck_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Chinook"]
)
nassck_sps$smoothedRunsize <- genSmooth(
abund = nassck_sps$runsize,
years = nassck_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Chinook"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, nassck_sps)
# Generate standard plot
plot_abund(nassck_sps)
points(x=nass_nisgaa$Year, y=nass_nisgaa$ESC_Chinook/1000, col="purple")
points(x=nass_nisgaa$Year, y=nass_nisgaa$TOTAL_RUN_Chinook/1000, col="blue") # Big difference!
Above: Spawner abundance (grey) and total abundance (black) of Nass chinook salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
Nass sockeye escapement and total return were derived from the
Northern Boundary Sockeye Run Reconstruction (NBSRR) Model that
estimates total escapement and total return for the Skeena and Nass
Rivers (English et al.
2004; English et
al. 2017). Specifically, we used fields TE
(Total Escapement) and Total run for Area 3 sockeye from
the 2022 update to the North and Central Coast (NCC) Salmon Database
Version 2, maintained by LGL Ltd. with support from PSF (Challenger et al.
2018; English et al.
2018). For 2023-2025, we obtained the same model output from
Nisga’a Fisheries and Wildlife Department (2024).
As can be seen in the figure below, historical numbers from these two
sources closely matched, giving us confidence that it was justifiable to
combine the two sources.
# Load Nisgaa data
nass_nisgaa <- read.csv(here("data/2025NassStockAssessment_Table20+22.csv"))
# use NBSRR data provided by LGL up to 2022 and Nisga'a Post-season for 2023, 2024
nassse <- read.csv(here("data/nassskeena_sockeye_lgl.csv")) %>%
subset(Region == "Nass") %>%
mutate(source_id = "English_20230930") %>%
bind_rows(
data.frame(Year = c(2023:2025),
TE = nass_nisgaa$ESC_Sockeye[nass_nisgaa$Year %in% c(2023:2025)],
Total.Run = nass_nisgaa$TOTAL_RUN_Sockeye[nass_nisgaa$Year %in% c(2023:2025)],
source_id = rep("Nisgaa_20251202", 3)
)
)
# Reformat data for SPS
nassse_sps <- data.frame(
region = rep("Nass", dim(nassse)[1]),
species = rep("Sockeye", dim(nassse)[1]),
year = nassse$Year,
spawners = nassse$TE,
smoothedSpawners = NA,
runsize = nassse$Total.Run,
smoothedRunsize = NA,
source_id = nassse$source_id
)
# Smoothing
nassse_sps$smoothedSpawners <- genSmooth(
abund = nassse_sps$spawners,
years = nassse_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Sockeye"]
)
nassse_sps$smoothedRunsize <- genSmooth(
abund = nassse_sps$runsize,
years = nassse_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Sockeye"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, nassse_sps)
# Generate standard plot
plot_abund(nassse_sps)
# Add Nisgaa estimates
points(x=nass_nisgaa$Year, y=nass_nisgaa$ESC_Sockeye/1000, col="purple")
points(x=nass_nisgaa$Year, y=nass_nisgaa$TOTAL_RUN_Sockeye/1000, col="blue")
Above: Spawner abundance (grey) and total abundance (black) of Nass sockeye salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
Nass coho escapement and total return were available from the Nisga’a Fisheries and Wildlife Department (Nisga’a Fisheries and Wildlife Department (2024)) for 1992 to 2024. These data closely matched previous estimates from English et al. (2023) used in the 2024 report. Spawner surveys in NuSEDS tended to generally underestimate spawner abundance to the region, and were not used because other data were available.
# Reformat data for SPS
nassco_sps <- data.frame(
region = rep("Nass", length(nass_nisgaa$Year)),
species = rep("Coho", length(nass_nisgaa$Year)),
year = nass_nisgaa$Year,
spawners = nass_nisgaa$ESC_Coho,
smoothedSpawners = NA,
runsize = nass_nisgaa$TOTAL_RUN_Coho,
smoothedRunsize = NA,
source_id = rep("Nisgaa_20251202",length(nass_nisgaa$Year))
)
# Smoothing
nassco_sps$smoothedSpawners <- genSmooth(
abund = nassco_sps$spawners,
years = nassco_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Coho"]
)
nassco_sps$smoothedRunsize <- genSmooth(
abund = nassco_sps$runsize,
years = nassco_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Coho"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, nassco_sps)
# Generate standard plot
plot_abund(nassco_sps)
Above: Spawner abundance (grey) and total abundance (black) of Nass coho salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
Chum salmon spawner abundances were expanded from available spawner surveys from 1950 to 1991, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. Note that the designation of indicator streams for the Nass region was based on English et al. (2018) rather than the indicator designation in NuSEDS. From 1992 to 2025, estimates of spawner and total abundance were provided in the 2025 post-season report from the Nisga’a Fisheries and Wildlife Department (2025b).
# Load data ---
# Use expanded spawner abundance to 1991 then Nisga'a final report data
region_spawners <- sp <- readRDS(here("output/expanded-spawners/Nass-spawners.rds"))
yrs <- as.numeric(dimnames(sp)[[3]])
expansion_factors <- readRDS(here("output/expanded-spawners/Nass-expansion-factors.rds"))
nasscm <- data.frame(
year = c(yrs),
esc = c(round(sp["expanded", "Chum", which(yrs %in% c(1950:1991))]), nass_nisgaa$ESC_Chum),
run = c(rep(NA, length(c(1950:1991))), nass_nisgaa$TOTAL_RUN_Chum),
source_id = c(rep(nuseds_id, length(c(1950:1991))), rep("Nisgaa_20251202", length(nass_nisgaa$TOTAL_RUN_Chum)))
)
# Reformat data for SPS
nasscm_sps <- data.frame(
region = rep("Nass", length(nasscm$year)),
species = rep("Chum", length(nasscm$year)),
year = nasscm$year,
spawners = nasscm$esc,
smoothedSpawners = NA,
runsize = nasscm$run,
smoothedRunsize = NA,
source_id = nasscm$source_id
)
# Smoothing
nasscm_sps$smoothedSpawners <- genSmooth(
abund = nasscm_sps$spawners,
years = nasscm_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Chum"]
)
nasscm_sps$smoothedRunsize <- genSmooth(
abund = nasscm_sps$runsize,
years = nasscm_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Chum"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, nasscm_sps)
#Generate standard figure
plot_abund(nasscm_sps)
Above: Spawner abundance (grey) and total abundance (black) of Nass chum salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
# Expansion plot(s)
plot_expansions(speciesname = "Chum",
regionname = "Nass",
region_spawners = region_spawners,
expansion_factors = expansion_factors)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (purple) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. Alternative time series from the PSC’s Northern Boundary Technical Committee Report (Appendix 30) is shown in blue. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade. See section on Expansion Factors below for further details.
| Ensheshese River | Kshwan River | Stumaun Creek |
| Illiance River | Ksi Gingolx | Toon River |
| Khutzeymateen River | Ksi X’anmas | Wilauks Creek |
| Kitsault River | Lachmach River | |
| Ksemamaith Creek | Stagoo Creek |
Pink salmon spawner abundances were expanded from available spawner surveys from 1950 to 1991, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. Note that the designation of indicator streams for the Nass region was based on English et al. (2018) rather than the indicator designation in NuSEDS. From 1992 to 2025, estimates of spawner and total abundance were provided in the 2025 post-season report from the Nisga’a Fisheries and Wildlife Department (2025b).
nasspk <- data.frame(
year = c(yrs),
esc = c(round(sp["expanded", "Pink", which(yrs %in% c(1950:1991))]), nass_nisgaa$ESC_Pink),
run = c(rep(NA, length(c(1950:1991))), nass_nisgaa$TOTAL_RUN_Pink),
source_id = c(rep(nuseds_id, length(c(1950:1991))), rep("Nisgaa_20251202", length(nass_nisgaa$TOTAL_RUN_Pink)))
)
# Reformat data for SPS
nasspk_sps <- data.frame(
region = rep("Nass", length(nasspk$year)),
species = rep("Pink", length(nasspk$year)),
year = nasspk$year,
spawners = nasspk$esc,
smoothedSpawners = NA,
runsize = nasspk$run,
smoothedRunsize = NA,
source_id = nasspk$source_id
)
# Smoothing
nasspk_sps$smoothedSpawners <- genSmooth(
abund = nasspk_sps$spawners,
years = nasspk_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Pink"]
)
nasspk_sps$smoothedRunsize <- genSmooth(
abund = nasspk_sps$runsize,
years = nasspk_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Pink"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, nasspk_sps)
# Generate standard figure
plot_abund(nasspk_sps)
Above: Spawner abundance (grey) and total abundance (black) of Nass pink salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
# Expansion plot(s)
plot_expansions(speciesname = "Pink",
regionname = "Nass",
region_spawners = region_spawners,
expansion_factors = expansion_factors)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (purple) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. Alternative time series from the PSC’s Northern Boundary Technical Committee Report (Appendix 30) is shown in blue. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade. See section on Expansion Factors below for further details.
| Chambers Creek | Ksi Gingolx | Salmon Cove Creek | Tracy Bay Creek #2 |
| Crag Creek | Ksi X’anmas | Sam Bay Creek | Wilauks Creek |
| Dogfish Creek | Lachmach River | Stagoo Creek | Xnukw |
| Ensheshese River | Lizard Creek | Stumaun Creek | |
| Illiance River | Manzanita Cove Creek | Toon River | |
| Khutzeymateen River | Mouse Creek | Tracy Bay Creek |
The index of Nass steelhead spawner abundance and total return are for the Nass Summer CU, developed in collaboration with the Nisga’a Fisheries and Wildlife Department (2025a) and LGL Ltd. (English et al. (2023)). There is another steelhead CU in the Nass region - Nass Winter - which is not well monitored and therefore not included in our index of spawner abundance.
# Reformat data for SPS
nasssh_sps <- data.frame(
region = rep("Nass", length(nass_nisgaa$Year)),
species = rep("Steelhead", length(nass_nisgaa$Year)),
year = nass_nisgaa$Year,
spawners = nass_nisgaa$ESC_Steelhead,
smoothedSpawners = NA,
runsize = nass_nisgaa$TOTAL_RUN_Steelhead,
smoothedRunsize = NA,
source_id = rep("Nisgaa_20251202",length(nass_nisgaa$Year))
)
# Smoothing
nasssh_sps$smoothedSpawners <- genSmooth(
abund = nasssh_sps$spawners,
years = nasssh_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Steelhead"]
)
nasssh_sps$smoothedRunsize <- genSmooth(
abund = nasssh_sps$runsize,
years = nasssh_sps$year,
genLength = genLength$gen_length[genLength$region == "Nass" & genLength$species == "Steelhead"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, nasssh_sps)
# Generate standard figure
plot_abund(nasssh_sps)
Above: Spawner abundance (grey) and total abundance (black) of Nass steelhead salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
Chinook spawners were taken from the PSC’s
Chinook Technical Committee (CTC) data sets and are reported on in
Chinook Technical Committee (2025).
Specifically, Skeena River (Area 4) escapement is provided in Table B3
(GSI esc). There is no total return for the Skeena River
provided in the CTC data sets.
# Load data ---
# TCCHINOOK Table B3
sk_ctc <- readxl::read_xlsx(here("data/TCCHINOOK-26-03-Appendix-B-Escapement-Detailed.xlsx"), sheet = "B3", range = "A5:G55", col_types = "numeric", col_names = c("Year", "Nass_Above_Gitwinksihlkw2", "Nass_Esc", "Nass_t.run", "Skeena_Total esc.", "Skeena_GSI esc", "Skeena_GSI SD"))
# For comparison: NBTC report (all years included) for escapement - Table 32
skck_nbtc <- read.csv(file=here("data/2026_Skeena_escapement_NBTC_Table32.csv"), na.strings = c("UNK", "UKN")) %>% select(YEAR, CHINOOK)
# Reformat data for SPS
skck_sps <- data.frame(
region = rep("Skeena", length(sk_ctc$Year)),
species = rep("Chinook", length(sk_ctc$Year)),
year = sk_ctc$Year,
spawners = sk_ctc$`Skeena_GSI esc`,
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(ctc_id, length(sk_ctc$Year))
)
# Smoothing
skck_sps$smoothedSpawners <- genSmooth(
abund = skck_sps$spawners,
years = skck_sps$year,
genLength = genLength$gen_length[genLength$region == "Skeena" & genLength$species == "Chinook"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, skck_sps)
#Generate standard figure
plot_abund(skck_sps)
Above: Spawner abundance of Skeena chinook salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
#points(x=skck_nbtc$YEAR, y=skck_nbtc$CHINOOK/1000, col="purple")
Skeena sockeye escapement and total return were derived from the
Northern Boundary Sockeye Run Reconstruction (NBSRR) model that
estimates total escapement and total return for the Skeena and Nass
Rivers (English et al.
2004; English et
al. 2017). Specifically, we used fields TE
(Total Escapement) and Total run for Area 4 sockeye from
the 2022 update to the North and Central Coast (NCC) Salmon Database
Version 2, maintained by LGL Ltd. with support from PSF (Challenger et al.
2018; English et al.
2018).
For 2023, NBSSR model outputs were provided by Charmaine Carr-Harris (DFO) on request. Data for 2024 are preliminary numbers from Joint Northern Boundary Technical Report (Joint Northern Boundary Technical Committee 2026). Purple open circles show Escapement estimates for 1970-2024 from Table 32 of the Joint Northern Boundary Technical Report (Joint Northern Boundary Technical Committee 2026) and match relatively closely, lending confidence to the combination of these sources.
# Compare to NCC run reconstruction: https://github.com/LGLLimited/nccdbv2/tree/master/run/2022-nass-update/data/KarlEnglish-2023-05-29
skse_LGL <- read.csv(here("data/nassskeena_sockeye_lgl.csv")) %>%
subset(Region == "Skeena") %>%
mutate(source_id = "English_20230930")
# From PSC Run Size app:
skse_ch2 <- read.csv(here("data/Chapter2_Data_2025_07_22.csv")) %>%
filter(Region == "Skeena River") %>%
mutate(source_id = "PSC_20250722")
# Add 2023 data from Charmaine (pers. comm. July 24 2025)
skse_2023 <- data.frame(
Year = 2023,
TE = 1437788,
catch = 656984
) %>%
mutate(Total.Run = TE + catch,
source_id = "CarrHarris_20250724")
# Add 2024 data from Joint Northern Boundary Tech Report
skse_2024 <- data.frame(
Year = 2024,
TE = 2683467,
catch = NA
) %>%
mutate(Total.Run = 2807467,
source_id = "NBTC_202602")
# combine sources
skse <- skse_ch2[ , c("Year", "Spawners", "Returns", "source_id")] %>% # Use PSC data
rename(TE = Spawners,
Total.Run = Returns) %>%
bind_rows(skse_LGL[which(skse_LGL$Year < 1982), c("Year", "TE", "Total.Run", "source_id")]) %>% # Use LGL data for pre-1982
bind_rows(skse_2023[ c("Year", "TE", "Total.Run", "source_id")]) %>% # Add 2023 data from Charmaine
bind_rows(skse_2024[ c("Year", "TE", "Total.Run", "source_id")]) %>% # Add 2024 data from NBTC report
arrange(Year)
# Alternative source: NBTC report (all years included) for escapement
skse_nbtc <- read.csv(file=here("data/2026_Skeena_escapement_NBTC_Table32.csv"), na.strings = c("UNK", "UKN")) %>% select(YEAR, SOCKEYE)
#unique(diff(skse$Year)) # Yes, all one year apart
# Reformat data for SPS
skse_sps <- data.frame(
region = rep("Skeena", dim(skse)[1]),
species = rep("Sockeye", dim(skse)[1]),
year = skse$Year,
spawners = skse$TE,
smoothedSpawners = NA,
runsize = skse$Total.Run,
smoothedRunsize = NA,
source_id = skse$source_id
)
# Smoothing
skse_sps$smoothedSpawners <- genSmooth(
abund = skse_sps$spawners,
years = skse_sps$year,
genLength = genLength$gen_length[genLength$region == "Skeena" & genLength$species == "Sockeye"]
)
skse_sps$smoothedRunsize <- genSmooth(
abund = skse_sps$runsize,
years = skse_sps$year,
genLength = genLength$gen_length[genLength$region == "Skeena" & genLength$species == "Sockeye"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, skse_sps)
# Generate standard figure
plot_abund(skse_sps)
points(x=skse_nbtc$YEAR, y=skse_nbtc$SOCKEYE/1000, col="purple")
Above: Spawner abundance (grey) and total abundance (black) of Skeena sockeye salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
The index of Skeena steelhead spawner abundance is derived from estimated escapement of Skeena Summer steelhead at the Tyee Test Fishery (1956 - present), provided by email by Kenji Miyazaki at the B.C. Ministry of Water, Land and Resource Stewardship. As in other regions, these estimates may not capture winter-run steelhead, for which data are not available.
# Load data ---
# Use Skeena steelhead run size from BC Updates
sksh <- read.csv(here("data/SkeenaSteelhead_1956-2025.csv"))
# Reformat data for SPS
sksh_sps <- data.frame(
region = rep("Skeena", dim(sksh)[1]),
species = rep("Steelhead", dim(sksh)[1]),
year = sksh$Year,
spawners = sksh$TyeeEscapement,
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = "ProvBC_20250903"
)
# Smoothing
sksh_sps$smoothedSpawners <- genSmooth(
abund = sksh_sps$spawners,
years = sksh_sps$year,
genLength = genLength$gen_length[genLength$region == "Skeena" & genLength$species == "Steelhead"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, sksh_sps)
# Generate standard figure
plot_abund(sksh_sps)
Above: Spawner abundance of Skeena steelhead salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
Chum salmon spawner abundances in the Skeena were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. Note that the designation of indicator streams for the Skeena region was based on English et al. (2018) rather than the indicator designation in NuSEDS.
region_spawners <- sp <- readRDS(here("output/expanded-spawners/Skeena-spawners.rds"))
yrs <- as.numeric(dimnames(sp)[[3]])
expansion_factors <- readRDS(here("output/expanded-spawners/Skeena-expansion-factors.rds"))
sk_table32 <- read.csv(here("data/TCNB-23-01_Table32_Area4escapement.csv"))
names(sk_table32) <- c("year", "Sockeye", "Coho", "Pink", "Chum", "Chinook") # Change names to be consistent with species
# Load Joint N. Boundary Tech Committee data (Table 32) for comparison to spawner expansions
nbtc_tbl32 <- read.csv(file=here("data/2026_Skeena_escapement_NBTC_Table32.csv"), na.strings = c("UNK", "UKN"))
# Load indicator streams list
streams <- readRDS(here("output/stream-names/Skeena-stream-names.RDS"))
## Process data
skeena.s <- sp[2, "Chum", ]
skeena.s <- skeena.s[!is.na(skeena.s)]
# Reformat data for SPS
skeena.s_sps <- data.frame(
region = rep("Skeena", length(skeena.s)),
species = rep("Chum", length(skeena.s)),
year = as.numeric(names(skeena.s)),
spawners = as.numeric(skeena.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(skeena.s))
)
# Smoothing
skeena.s_sps$smoothedSpawners <- genSmooth(
abund = skeena.s_sps$spawners,
years = skeena.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Skeena" & genLength$species == "Chum"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, skeena.s_sps)
# Generate standard figure
plot_abund(skeena.s_sps)
Above: Spawner abundance of Skeena chum salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
#points(x=nbtc_tbl32$YEAR, y=nbtc_tbl32$CHUM/1000, col="purple")
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (purple) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. Alternative time series from the PSC’s Northern Boundary Technical Committee Report (Appendix 32) is shown in blue. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade. See section on Expansion Factors below for further details.
| Alpha Creek | Ecstall River | Kumealon Creek |
| Andesite Creek | Gitnadoix River | Pa-Aat River |
| Captain Cove Creek | Kasiks River | Silver Creek |
| Date Creek | Kitkatla Creek | Stumaun Creek |
| Denise Creek | Kitwanga River | |
| Dog Tag Creek | Kleanza Creek |
Coho salmon spawner abundances in the Skeena were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. Note that the designation of indicator streams for the Skeena region was based on English et al. (2018) rather than the indicator designation in NuSEDS.
## Process data
skeena.s <- sp[2, "Coho", ]
skeena.s <- skeena.s[!is.na(skeena.s)]
# Reformat data for SPS
skeena.s_sps <- data.frame(
region = rep("Skeena", length(skeena.s)),
species = rep("Coho", length(skeena.s)),
year = as.numeric(names(skeena.s)),
spawners = as.numeric(skeena.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(skeena.s))
)
# Smoothing
skeena.s_sps$smoothedSpawners <- genSmooth(
abund = skeena.s_sps$spawners,
years = skeena.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Skeena" & genLength$species == "Coho"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, skeena.s_sps)
# Generate standard figure
plot_abund(skeena.s_sps)
Above: Spawner abundance of Skeena coho salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
#points(x=nbtc_tbl32$YEAR, y=nbtc_tbl32$COHO/1000, col="purple")
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (purple) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. Alternative time series from the PSC’s Northern Boundary Technical Committee Report (Appendix 32) is shown in blue. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade. See section on Expansion Factors below for further details.
| Andalas Creek | Deep Creek | Kadeen Creek | Salmon Run Creek |
| Asitka River | Diana Lake Creek | Kasiks River | Schulbuckhand Creek |
| Bear River | Dry Creek | Kathlyn Creek | Shawatlan River |
| Billy Creek | Ecstall River | Kitwanga River | Singlehurst Creek |
| Buck Creek | Erlandsen Creek | Kumealon Creek | Skunsnat Creek |
| Bulkley River - Upper | Exchamsiks River | Lakelse River | Snass Creek |
| Canyon Creek | Exstew River | Morice River | Station Creek |
| Captain Cove Creek | Foote Creek | Motase Lake | Steep Canyon Creek |
| Clear Creek | Footsore Lake Creek | Murder Creek | Stephens Creek |
| Clearwater Creek | Gitnadoix River | Nangeese River | Telkwa River |
| Clifford Creek | Goat Creek | Pa-Aat River | Toboggan Creek |
| Club Creek - Lower (Between Club Lake And Stephens Lake) | Gosnell Creek | Phoenix Creek | Williams Creek |
| Cullon Creek | Herman Creek | Porcher Creek | Zymagotitz River |
| Damshilgwit Creek | Ironside Creek | Prudhomme Creek |
Skeena pink salmon spawner abundances were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. Note that the designation of indicator streams for the Skeena region was based on English et al. (2018) rather than the indicator designation in NuSEDS.
## Process data
skeena.s <- sp[2, "Pink", ]
skeena.s <- skeena.s[!is.na(skeena.s)]
# Reformat data for SPS
skeena.s_sps <- data.frame(
region = rep("Skeena", length(skeena.s)),
species = rep("Pink", length(skeena.s)),
year = as.numeric(names(skeena.s)),
spawners = as.numeric(skeena.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(skeena.s))
)
# Smoothing
skeena.s_sps$smoothedSpawners <- genSmooth(
abund = skeena.s_sps$spawners,
years = skeena.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Skeena" & genLength$species == "Pink"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, skeena.s_sps)
# Generate standard figure
plot_abund(skeena.s_sps)
Above: Spawner abundance of Haida Gwaii chinook salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
#points(x=nbtc_tbl32$YEAR, y=nbtc_tbl32$PINK/1000, col="purple")
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (purple) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. Alternative time series from the PSC’s Northern Boundary Technical Committee Report (Appendix 32) is shown in bkue. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade. See section on Expansion Factors below for further details.
| Alpha Creek | Gitnadoix River | Kumealon Creek | Sandy Bay Creek |
| Babine River - Section 4 | Head Creek | La Hou Creek | Silver Creek |
| Brundige Creek | Kasiks River | Lakelse River | Spiller River |
| Captain Cove Creek | Khyex River | Morice River | Stumaun Creek |
| Ecstall River | Kitwanga River | Oona River | Whitly Point Creek |
| Exchamsiks River | Kleanza Creek | Pa-Aat River | Wolf Creek |
| False Stewart Creek | Kloiya River | Porcher Creek |
For Central Coast Chinook, the PSC’s Chinook Technical Committee
(CTC) reported escapement for two indicator stocks on the Central Coast:
the Atnarko River and Rivers Inlet (Chinook
Technical Committee 2026). Rivers Inlet is monitored “using
an index of escapements to the Wannock, Kilbella, and Chuckwalla rivers”
(Chinook
Technical Committee 2026). Because monitoring of Central
Coast Chinook reported in NuSEDS has recently declined, expansions from
spawner surveys are unreliable. As such, in 2025 we moved to using a
composite indicator equal to the sum of the Atnarko River
(Total esc.) and Rivers Inlet index reported by the CTC in
Appendix Table B3.
## Load data ---
# TCCHINOOK Table B3
cc_ctc <- readxl::read_xlsx(here("data/TCCHINOOK-26-03-Appendix-B-Escapement-Detailed.xlsx"), sheet = "B3", range = "H5:K55", col_types = "numeric", col_names = c("Atnarko_Total_esc", "Atnarko_CV", "Atnarko_Wild", "Rivers_Inlet")) %>%
mutate(Year = c(1975:2025))
# Reformat data for SPS
ccck_sps <- data.frame(
region = rep("Central Coast", length(cc_ctc$Year)),
species = rep("Chinook", length(cc_ctc$Year)),
year = cc_ctc$Year,
spawners = cc_ctc$Atnarko_Total_esc + cc_ctc$Rivers_Inlet,
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(ctc_id, length(cc_ctc$Year))
)
# Smoothing
ccck_sps$smoothedSpawners <- genSmooth(
abund = ccck_sps$spawners,
years = ccck_sps$year,
genLength = genLength$gen_length[genLength$region == "Central Coast" & genLength$species == "Chinook"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, ccck_sps)
#Generate standard figure
plot_abund(ccck_sps)
Above: Spawner abundance of Central Coast chinook salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
## Code to generate index comparison plot:
# Expanded spawner estimate
ccck_ex <- readRDS(here("output/expanded-spawners/Central Coast-spawners.rds"))[2, "Chinook", ]
yrs <- as.numeric(names(ccck_ex))
e <- readRDS(here("output/expanded-spawners/Central Coast-expansion-factors.rds"))[[1]]
# TCCHINOOK Table B3
cc_ctc <- readxl::read_xlsx(here("data/TCCHINOOK-26-03-Appendix-B-Escapement-Detailed.xlsx"), sheet = "B3",
range = "H5:K55", col_types = "numeric",
col_names = c("Atnarko_Total_esc", "Atnarko_CV",
"Atnarko_Wild", "Rivers_Inlet")) %>%
mutate(Year = c(1975:2025))
par(mar = c(3,4,2,4))
plot(yrs, e$exp1, pch = 4, bty = "n", xaxt = "n", yaxt = "n", xlab = "", ylab = "", col = grey(0.6), ylim = c(0, 30), lwd = 2)
axis(side = 4, col = grey(0.6), las = 1)
mtext(side = 4, line = 2.5, "Expansion factor x", col = grey(0.6))
par(new = TRUE)
plot(yrs, ccck_ex*10^-3, "o", pch = 21, bg = "white", bty = "l", xlab = "", ylab = "Spawner abundance (thousands)", ylim = c(0, 150), las = 1, yaxs = "i", col="purple")
abline(v = seq(1950, 2025, 5), lty = 3, col = grey(0.8))
abline(h = seq(0, 150, 50), lty = 3, col = grey(0.8))
points(cc_ctc$Year, cc_ctc$Atnarko_Total_esc*10^-3, "o", pch = 21, bg = "white", col = 2)
points(cc_ctc$Year, cc_ctc$Rivers_Inlet*10^-3, "o", pch = 21, bg = "white", col = 4)
points(cc_ctc$Year, cc_ctc$Atnarko_Total_esc*10^-3 + cc_ctc$Rivers_Inlet*10^-3, pch = 19, col = "black", cex = 0.6)
legend("topleft", col = c("purple", 2,4, "black"), c("NuSEDS expansion", "CTC Atnarko Total esc.", "CTC Rivers Inlet index esc.", "CTC sum"), pch = c(rep(21, 3), 19), pt.bg = "white", lwd = c(rep(1, 3),NA), bty = "n")
Above: Comparison of Chinook escapements on the Central Coast. The sum of Atnarko escapement (red) and Rivers Inlet escapement index (blue) from the CTC (purple points) was used in 2025. The expanded data from NuSEDS, not used, are in black with expansion factors used shown by grey ‘x’
There are two spawner surveys for Steelhead trout on the Central Coast that we report in the Pacific Salmon Explorer. However, these surveys have been patchy through time with the most recent estimates from 2016. Therefore, spawner abundance and total return for Central Coast steelhead is considered unknown.
Estimates of spawner abundance for chum salmon on the Central Coast were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. Monitoring and reporting of observed spawners on the Central Coast has declined in recent decades, thus requiring larger expansion factors to arrive at an area-wide estimate that can be compared through time. As such, estimates of spawner abundance for the Central Coast over the past decade are more uncertain and should be interpreted with caution.
region_spawners <- sp <- readRDS(here("output/expanded-spawners/Central Coast-spawners.rds"))
yrs <- as.numeric(dimnames(sp)[[3]])
expansion_factors <- readRDS(here("output/expanded-spawners/Central Coast-expansion-factors.rds"))
## Process data
cc.s <- sp[2, "Chum", ]
# Reformat data for SPS
cc.s_sps <- data.frame(
region = rep("Central Coast", length(cc.s)),
species = rep("Chum", length(cc.s)),
year = as.numeric(names(cc.s)),
spawners = as.numeric(cc.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(cc.s)))
# Smoothing
cc.s_sps$smoothedSpawners <- genSmooth(
abund = cc.s_sps$spawners,
years = cc.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Central Coast" & genLength$species == "Chum"])
# Add to master sps dataframe
sps_data <- rbind(sps_data, cc.s_sps)
# Generate standard figure
plot_abund(cc.s_sps)
Above: Spawner abundance of Central Coast chum salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
| Aaltanhash River | Cooper Inlet-Ada Cove Creek | Head Creek | Limestone Creek | Sagar Creek |
| Airport Side Channel | Cooper Inlet-Fannie Cove Lh Creek | Hevenor Inlet Creek | Little Creek | Salloomt River |
| Arnoup Creek | Crab River | Hird Point Creek | Little Tillhorn Creek | Salmon Bay Creek |
| Barnard Creek | Crane Bay Creek | Hook Nose Creek | Lockhart Gordon Creek | Scow Bay Creek |
| Belowe Creek | Dala River | Hotspring Creek | Macnair Creek | Scribner Creek |
| Big Bay Creek | Dally Creek | Hugh Creek | Markle Inlet Creek | Snootli Creek |
| Big Creek | Dean River | James Bay Creek | Mcloughlin Creek | Soda Creek |
| Big Tillhorn Creek | Draney Creek | Jenny Bay Creeks | Milton River | Tankeeah River |
| Bish Creek | Duthie Creek | Kadjusdis River | Mussel River | Tastsquan Creek |
| Black Rock Creek | Eagle Bay Creek | Kainet Creek | Neekas Creek | Thorsen Creek |
| Blee Creek | Eagle Creek | Kemano River | Nekite River | Tsimtack Lake Creek |
| Bloomfield Creek | East Arm Creek | Khutze River | Nekite Spawning Channel | Turn Creek |
| Bolin Bay Creek | Elcho Creek | Kilbella River | Nias Creek | Turtle Creek |
| Borrowman Creek | Evelyn Creek | Kiltuish River | Noohalk Creek | Tyler Creek |
| Brim River | Fancy Cove Head Creek | Kimsquit River | Nooklikonnik Creek | Verney Passage Creek |
| Bullock Channel #2 Creek | Fish Creek | Kiskosh Creek | Pa-Aat River | Wahoo Creek |
| Bullock Channel #3 North Creek | Flux Creek | Kitasoo Creek | Paril River | Walkum Creek |
| Bullock Channel #3 South Creek | Foch River | Kitkiata Creek | Poison Cove Creek | Wathl Creek |
| Canyon Creek | Four Lakes Creek | Klekane River | Price Creek | Webster Lake Creek |
| Captain Cove Creek | Frenchman Creek | Korich Creek | Pyne Creek | Weewanie Creek |
| Carter River | Gabion River | Kumealon Creek | Quaal River | West Arm Creek |
| Cascade River | Garbage Dump Creek | Kunsoot River | Quartcha Creek | Whalen Creek |
| Cheenis Lake Creek | George Hall Creek | Kwakusdis River | Quatlena River | Wilson Creek |
| Chuckwalla River | Gil Creek | Kwatna River | Rainbow Creek | Windy Bay Creek |
| Clatse Creek | Gorilla Creek | Lard Creek | Riordan Creek | Woran Creek |
| Clyak River | Grantham Creek | Lee Creek | Roscoe Creek |
Estimates of spawner abundance for coho salmon on the Central Coast were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. Monitoring and reporting of observed spawners on the Central Coast has declined in recent decades, thus requiring larger expansion factors to arrive at an area-wide estimate that can be compared through time. As such, estimates of spawner abundance for the Central Coast over the past decade are more uncertain and should be interpreted with caution.
## Process data
cc.s <- sp[2, "Coho", ]
# Reformat data for SPS
cc.s_sps <- data.frame(
region = rep("Central Coast", length(cc.s)),
species = rep("Coho", length(cc.s)),
year = as.numeric(names(cc.s)),
spawners = as.numeric(cc.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(cc.s)))
# Smoothing
cc.s_sps$smoothedSpawners <- genSmooth(
abund = cc.s_sps$spawners,
years = cc.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Central Coast" & genLength$species == "Coho"])
# Add to master sps dataframe
sps_data <- rbind(sps_data, cc.s_sps)
# Generate standard figure
plot_abund(cc.s_sps)
Above: Spawner abundance of Central Coast coho salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
| Aaltanhash River | Curtis Inlet Creek | Green River | Kitasoo Creek | Quaal River |
| Airport Side Channel | Dala River | Hankin Creek | Kooryet Creek | Quartcha Creek |
| Anderson Creek | Deer Lake Creek | Hevenor Inlet Creek | Kumealon Creek | Riordan Creek |
| Banks Lakes Creek | Devon Lake Creek | Hugh Creek | Kumowdah River | Roscoe Creek |
| Bella Coola River | Docee River | Indian Harbour Creek | Lewis Creek | Ryan Creek |
| Belowe Creek | East Arm Creek | Kainet Creek | Martin River | Salloomt River |
| Blee Creek | Elcho Creek | Keecha Creek | Mcloughlin Creek | Shaw Creek |
| Brim River | End Hill Creek | Keswar Creek | Mikado Lake Creek | Snooka Creek |
| Canoe Creek | Evelyn Creek | Khutze River | Molly Creek | Sylvia Creek |
| Canoona River | Fish Creek | Kilbella River | Necleetsconnay River | Thorsen Creek |
| Captain Cove Creek | Foch River | Kildala River | Nooklikonnik Creek | Tsimtack Lake Creek |
| Cascade River | Gabion River | Kiltuish River | Pa-Aat River | Tyler Creek |
| Chuckwalla River | Garbage Dump Creek | Kingkown Inlet Creeks | Paril River | Wahoo Creek |
| Cooper Inlet-Fannie Cove Lh Creek | George Hall Creek | Kiskosh Creek | Port Stephens Creek | Whalen Creek |
Estimates of spawner abundance for pink salmon on the Central Coast were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. Monitoring and reporting of observed spawners on the Central Coast has declined in recent decades, thus requiring larger expansion factors to arrive at an area-wide estimate that can be compared through time. As such, estimates of spawner abundance for the Central Coast over the past decade are more uncertain and should be interpreted with caution.
## Process data
cc.s <- sp[2, "Pink", ]
# Reformat data for SPS
cc.s_sps <- data.frame(
region = rep("Central Coast", length(cc.s)),
species = rep("Pink", length(cc.s)),
year = as.numeric(names(cc.s)),
spawners = as.numeric(cc.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(cc.s)))
# Smoothing
cc.s_sps$smoothedSpawners <- genSmooth(
abund = cc.s_sps$spawners,
years = cc.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Central Coast" & genLength$species == "Pink"])
# Add to master sps dataframe
sps_data <- rbind(sps_data, cc.s_sps)
# Generate standard figure
plot_abund(cc.s_sps)
Above: Spawner abundance of Central Coast pink salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
| Aaltanhash River | Chuckwalla River | Gil Creek | Korich Creek | Quaal River |
| Arnoup Creek | Clatse Creek | Hankin Creek | Kumealon Creek | Quartcha Creek |
| Ashlulm Creek | Clyak River | Head Creek | Kunsoot River | Quatlena River |
| Barnard Creek | Crab River | Hird Point Creek | Kwakusdis River | Quigley Creek |
| Bella Coola River | Crane Bay Creek | Hook Nose Creek | Kwatna River | Riordan Creek |
| Belowe Creek | Dala River | Hotspring Creek | Lard Creek | Roscoe Creek |
| Big Bay Creek | Dallery Creek | Hugh Creek | Limestone Creek | Salmon Bay Creek |
| Big Tillhorn Creek | Dally Creek | Hunter Creek | Little Tillhorn Creek | Scow Bay Creek |
| Bish Creek | Dean River | James Bay Creek | Lockhart Gordon Creek | Shaw Creek |
| Black Rock Creek | Draney Creek | Jenny Bay Creeks | Macnair Creek | Skowquiltz River |
| Blee Creek | Duthie Creek | Johnston Creek | Marmot Cove Creek | Soda Creek |
| Bloomfield Creek | Eagle Bay Creek | Kainet Creek | Milton River | Tankeeah River |
| Bolin Bay Creek | East Arm Creek | Kemano River | Mussel River | Tsimtack Lake Creek |
| Bolton Creek | Elcho Creek | Khutze River | Necleetsconnay River | Turn Creek |
| Borrowman Creek | Evelyn Creek | Kilbella River | Neekas Creek | Turtle Creek |
| Brim River | Fancy Cove Head Creek | Kiltuish River | Nekite River | Tyler Creek |
| Canoona River | Fifer Cove Creek | Kiskosh Creek | Nias Creek | Verney Passage Creek |
| Canyon Creek | Fishtrap Bay Creek | Kitasoo Creek | Nicknaqueet River | Wahoo Creek |
| Captain Cove Creek | Foch River | Kitkiata Creek | Nooseseck River | Weewanie Creek |
| Carter River | Frenchman Creek | Klekane River | Pa-Aat River | West Arm Creek |
| Cascade River | Gabion River | Koeye River | Paril River | Woran Creek |
| Cheenis Lake Creek | Genesee Creek | Kooryet Creek | Pyne Creek |
Estimates of spawner abundance for sockeye salmon on the Central Coast were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. Monitoring and reporting of observed spawners on the Central Coast has declined in recent decades, thus requiring larger expansion factors to arrive at an area-wide estimate that can be compared through time. As such, estimates of spawner abundance for the Central Coast over the past decade are more uncertain and should be interpreted with caution.
## Process data
cc.s <- sp[2, "Sockeye", ]
# Reformat data for SPS
cc.s_sps <- data.frame(
region = rep("Central Coast", length(cc.s)),
species = rep("Sockeye", length(cc.s)),
year = as.numeric(names(cc.s)),
spawners = as.numeric(cc.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(cc.s)))
# Smoothing
cc.s_sps$smoothedSpawners <- genSmooth(
abund = cc.s_sps$spawners,
years = cc.s_sps$year,
genLength = genLength$gen_length[genLength$region == "Central Coast" & genLength$species == "Sockeye"])
# Add to master sps dataframe
sps_data <- rbind(sps_data, cc.s_sps)
# Generate standard figure
plot_abund(cc.s_sps)
Above: Spawner abundance of Central Coast sockeye salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
| Ashlulm Creek | Green River | Koeye River | Quaal River |
| Bella Coola River | Hook Nose Creek | Kooryet Creek | Quartcha Creek |
| Bloomfield Creek | Hunter Creek | Kumowdah River | Smokehouse Creek |
| Canoe Creek | Inziana River | Kwakusdis River | Tankeeah River |
| Canoona River | Kadjusdis River | Kwakwa Creek | Tsimtack Lake Creek |
| Curtis Inlet Creek | Kainet Creek | Lagoon Creek | Tzeo River |
| Dallery Creek | Keecha Creek | Mary Cove Creek | Washwash River |
| Devon Lake Creek | Khutze River | Mikado Lake Creek | |
| Evelyn Creek | Kitlope River | Namu River | |
| Gabion River | Klewnuggit Inlet Creek | Neechanz River |
PSC’s Chinook Technical Committee (CTC) reports escapement (spawner
abundance) and run size (total abundance) for three indicator stocks in
the Strait of Georgia: Nanaimo, Cowichan, and Phillips (Chinook
Technical Committee 2026). We report spawner abundance and
total abundance as the sum of Esc and t.run,
respectively, across these three indicator stocks as reported in
Appendix Table B4 available from the PSC’s
Chinook Technical Committee (CTC) data sets.
## Load data --
# (1) CTC data
evimi_ctc <- readxl::read_xlsx(here("data/TCCHINOOK-26-03-Appendix-B-Escapement-Detailed.xlsx"), sheet = "B4", range = "A5:G55", col_types = "numeric", col_names = c("Year", "Nanaimo_esc", "Nanaimo_trun", "Cowichan_esc", "Cowichan_trun", "Phillips_esc", "Phillips_trun")) # Southern BC
evimi_ctc_summed <- evimi_ctc %>%
group_by(Year) %>%
summarise(esc_sum = sum(Nanaimo_esc, Cowichan_esc, Phillips_esc),
trun_sum = sum(Nanaimo_trun, Cowichan_trun, Phillips_trun))
# Put in SPS format
evimick_sps <- data.frame(
region = rep("East Vancouver Island & Mainland Inlets", dim(evimi_ctc_summed)[1]),
species = rep("Chinook", dim(evimi_ctc_summed)[1]),
year = evimi_ctc_summed$Year,
spawners = evimi_ctc_summed$esc_sum,
smoothedSpawners = NA,
runsize = evimi_ctc_summed$trun_sum,
smoothedRunsize = NA,
source_id = rep(ctc_id, dim(evimi_ctc_summed)[1])
)
# Smoothing
evimick_sps$smoothedSpawners <- genSmooth(
abund = evimick_sps$spawners,
years = evimick_sps$year,
genLength = genLength$gen_length[genLength$region == "East Vancouver Island & Mainland Inlets" & genLength$species == "Chinook"]
)
evimick_sps$smoothedRunsize <- genSmooth(
abund = evimick_sps$runsize,
years = evimick_sps$year,
genLength = genLength$gen_length[genLength$region == "East Vancouver Island & Mainland Inlets" & genLength$species == "Chinook"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, evimick_sps)
#Generate standard figures
plot_abund(evimick_sps)
Above: Spawner abundance (grey) and total abundance (black) of East Vancouver Island & Mainland Inlets chinook salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
Above: (a) Chinook salmon spawner abundance and (b) total abundance showing the contributions of the Cowichan, Nanaimo, and Philips indicator stocks.
Initial time series of spawner abundances for chum salmon in East Vancouver Island & Mainland Inlets were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. We truncated the time series of spawner abundance to years 1953+ because earlier years had high expansion factor values indicating lack of monitoring on key indicator streams (see figures below).
region_spawners <- sp <- readRDS(here("output/expanded-spawners/East Vancouver Island & Mainland Inlets-spawners.rds"))
yrs <- as.numeric(dimnames(sp)[[3]])
expansion_factors <- readRDS(here("output/expanded-spawners/East Vancouver Island & Mainland Inlets-expansion-factors.rds"))
## Process data
evimi.s <- sp[2, "Chum", ]
# Get rid of NAs (esp in 2024)
evimi.s <- evimi.s[1:max(which(!is.na(evimi.s)))]
# For all VIMI species, start in 1953 - earlier expansion factors are large
evimi.s <- evimi.s[which(as.numeric(names(evimi.s)) >= 1953)]
# Reformat data for SPS
evimi.s_sps <- data.frame(
region = rep("East Vancouver Island & Mainland Inlets", length(evimi.s)),
species = rep("Chum", length(evimi.s)),
year = as.numeric(names(evimi.s)),
spawners = as.numeric(evimi.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(evimi.s))
)
# Smoothing
evimi.s_sps$smoothedSpawners <- genSmooth(
abund = evimi.s_sps$spawners,
years = evimi.s_sps$year,
genLength = genLength$gen_length[genLength$region == "East Vancouver Island & Mainland Inlets" & genLength$species == "Chum"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, evimi.s_sps)
# Generate standard figure
plot_abund(evimi.s_sps)
Above: Spawner abundance of East Vancouver Island & Mainland Inlets chum salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
added_series.s <- sps_data %>%
filter(region == "East Vancouver Island & Mainland Inlets", species == "Chum") %>%
select(year, spawners) %>%
rename("value" = "spawners")
plot_expansions(speciesname = "Chum",
regionname = "East Vancouver Island & Mainland Inlets",
region_spawners = region_spawners,
expansion_factors = expansion_factors,
added_series = added_series.s,
exp_ylim = c(1, 2))
abline(v = 1952.5)
text(1953, 1.5, "Data prior to 1953 were discarded", adj = 0)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
| Alison River | Drew Creek | Mckercher Creek | Rainbow Creek |
| Apple River | Englishman River | Myrtle Creek | Salmon River |
| Bird Cove Creek | Goldstream River | Nanaimo River | Skwawka River |
| Campbell River | Heydon Creek | Nimpkish River | Tzoonie River |
| Chemainus River | Homathko River | Open Bay Creek | Viner Sound Creek |
| Clear Creek | Jap Creek | Puntledge River | Waump Creek |
| Cowichan River | Lang Creek | Qualicum River | Wortley Creek |
| Deserted River | Little Qualicum River | Quinsam River |
Initial time series of spawner abundances for coho salmon in East Vancouver Island & Mainland Inlets were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. For the assessments, we truncated the time series of spawner abundance to years 1953+ because earlier years had high expansion factor values indicating lack of monitoring on key indicator streams (see figures below).
## Process data
evimi.s <- sp[2, "Coho", ]
# Get rid of NAs (esp in 2024)
evimi.s <- evimi.s[1:max(which(!is.na(evimi.s)))]
# For all VIMI species, start in 1953 - earlier expansion factors are large
evimi.s <- evimi.s[which(as.numeric(names(evimi.s)) >= 1953)]
# Reformat data for SPS
evimi.s_sps <- data.frame(
region = rep("East Vancouver Island & Mainland Inlets", length(evimi.s)),
species = rep("Coho", length(evimi.s)),
year = as.numeric(names(evimi.s)),
spawners = as.numeric(evimi.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(evimi.s))
)
# Smoothing
evimi.s_sps$smoothedSpawners <- genSmooth(
abund = evimi.s_sps$spawners,
years = evimi.s_sps$year,
genLength = genLength$gen_length[genLength$region == "East Vancouver Island & Mainland Inlets" & genLength$species == "Coho"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, evimi.s_sps)
# Generate standard figure
plot_abund(evimi.s_sps)
Above: Spawner abundance of East Vancouver Island & Mainland Inlets coho salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
added_series.s <- sps_data %>%
filter(region == "East Vancouver Island & Mainland Inlets", species == "Coho") %>%
select(year, spawners) %>%
rename("value" = "spawners")
plot_expansions(speciesname = "Coho",
regionname = "East Vancouver Island & Mainland Inlets",
region_spawners = region_spawners,
expansion_factors = expansion_factors,
added_series = added_series.s,
exp_ylim = c(1,2))
abline(v = 1952.5)
text(1953, 1.5, "Data prior to 1953 were discarded", adj = 0)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
| Adam River | Colquitz River | Keogh River | Salmon River |
| Ahta River | Cook Creek | Lang Creek | Sechelt Creek |
| Alison River | Cowichan River | Mckercher Creek | Simms Creek |
| Amor De Cosmos Creek | Cowie Creek | Millard Creek | Trent River |
| Black Creek | Craigflower Creek | Mixal Lake Creek | Tsable River |
| Bonell Creek | Docee River | Myrtle Creek | Tsitika River |
| Bonsall Creek | Driftwood Creek | Nanaimo River | Viner Sound Creek |
| Bush Creek | Englishman River | Nanoose Creek | Waterloo Creek |
| Canoe Creek | Goldstream River | Nile Creek | Waump Creek |
| Charles Creek | Granite Bay Creek | Open Bay Creek | Wilfred Creek |
| Chase River | Haslam Creek | Qualicum River | Willow Creek |
| Clear Creek | Heydon Creek | Quinsam River | Woods Creek |
Initial time series of spawner abundances for pink salmon in East Vancouver Island & Mainland Inlets were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. For the assessments, we truncated the time series of spawner abundance to years 1953+ because earlier years had high expansion factor values indicating lack of monitoring on key indicator streams (see figures below).
For chum, coho, sockeye, and steelhead, we relied on NuSEDS’ designations of indicator or non-indicator streams, but for pink salmon in this region we designated indicator streams as those with at least 10 years of data in the most recent 20 years.
## Process data
evimi.s <- sp[2, "Pink", ]
# Get rid of NAs (esp in 2024)
evimi.s <- evimi.s[1:max(which(!is.na(evimi.s)))]
# For all VIMI species, start in 1953 - earlier expansion factors are large
evimi.s <- evimi.s[which(as.numeric(names(evimi.s)) >= 1953)]
# Reformat data for SPS
evimi.s_sps <- data.frame(
region = rep("East Vancouver Island & Mainland Inlets", length(evimi.s)),
species = rep("Pink", length(evimi.s)),
year = as.numeric(names(evimi.s)),
spawners = as.numeric(evimi.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(evimi.s))
)
# Smoothing
evimi.s_sps$smoothedSpawners <- genSmooth(
abund = evimi.s_sps$spawners,
years = evimi.s_sps$year,
genLength = genLength$gen_length[genLength$region == "East Vancouver Island & Mainland Inlets" & genLength$species == "Pink"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, evimi.s_sps)
# Generate standard figure
plot_abund(evimi.s_sps)
Above: Spawner abundance of East Vancouver Island & Mainland Inlets pink salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
added_series.s <- sps_data %>%
filter(region == "East Vancouver Island & Mainland Inlets", species == "Pink") %>%
select(year, spawners) %>%
rename("value" = "spawners")
plot_expansions(speciesname = "Pink",
regionname = "East Vancouver Island & Mainland Inlets",
region_spawners = region_spawners,
expansion_factors = expansion_factors,
added_series = added_series.s,
exp_ylim = c(1, 2))
abline(v = 1952.5)
text(1953, 1.5, "Data prior to 1953 were discarded", adj = 0)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
| Adam River | Frazer Creek | Menzies Creek | Read Creek |
| Ahnuhati River | Glendale Creek | Nanaimo River | Salmon River |
| Ahta River | Gray Creek | Orford River | Shoal Harbour Creek |
| Amor De Cosmos Creek | Heydon Creek | Phillips River | Sliammon Creek |
| Campbell River | Kakweiken River | Puntledge River | Tsolum River |
| Clearwater Creek | Keogh River | Qualicum River | Viner Sound Creek |
| Embley Creek | Lang Creek | Quatam River | Wakeman River |
| Englishman River | Little Qualicum River | Quinsam River | Willow Creek |
Initial time series of spawner abundances for sockeye salmon in East Vancouver Island & Mainland Inlets were expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. For the assessments, we truncated the time series of spawner abundance to years 1953+ because earlier years had high expansion factor values indicating lack of monitoring on key indicator streams (see figures below).
## Process data
evimi.s <- sp[2, "Sockeye", ]
# Get rid of NAs (esp in 2024)
evimi.s <- evimi.s[1:max(which(!is.na(evimi.s)))]
# For all VIMI species, start in 1953 - earlier expansion factors are large
evimi.s <- evimi.s[which(as.numeric(names(evimi.s)) >= 1953)]
# Reformat data for SPS
evimi.s_sps <- data.frame(
region = rep("East Vancouver Island & Mainland Inlets", length(evimi.s)),
species = rep("Sockeye", length(evimi.s)),
year = as.numeric(names(evimi.s)),
spawners = as.numeric(evimi.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(evimi.s))
)
# Smoothing
evimi.s_sps$smoothedSpawners <- genSmooth(
abund = evimi.s_sps$spawners,
years = evimi.s_sps$year,
genLength = genLength$gen_length[genLength$region == "East Vancouver Island & Mainland Inlets" & genLength$species == "Sockeye"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, evimi.s_sps)
# Generate standard figure
plot_abund(evimi.s_sps)
Above: Spawner abundance of East Vancouver Island & Mainland Inlets sockeye salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
added_series.s <- sps_data %>%
filter(region == "East Vancouver Island & Mainland Inlets", species == "Sockeye") %>%
select(year, spawners) %>%
rename("value" = "spawners")
plot_expansions(speciesname = "Sockeye",
regionname = "East Vancouver Island & Mainland Inlets",
region_spawners = region_spawners,
expansion_factors = expansion_factors,
added_series = added_series.s,
exp_ylim = c(1, 2))
abline(v = 1952.5)
text(1953, 1.5, "Data prior to 1953 were discarded", adj = 0)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
| Canoe Creek | Nimpkish River |
| Clearwater Creek | Phillips River |
| Heydon Creek | Quatse River |
| Mackenzie River | Ruby Creek |
Initial time series of spawner abundances for steelhead salmon in East Vancouver Island & Mainland Inlets were expanded from available spawner surveys, as described below in Expansion Factors The full list of indicator streams used for this expansion are in the table below. For the assessments, we truncated the time series of spawner abundance to years 1953+ because earlier years had high expansion factor values indicating lack of monitoring on key indicator streams (see figures below).
## Process data
evimi.s <- sp[2, "Steelhead", ]
# Get rid of NAs (esp in 2024)
evimi.s <- evimi.s[1:max(which(!is.na(evimi.s)))]
# For all VIMI species, start in 1953 - earlier expansion factors are large
evimi.s <- evimi.s[which(as.numeric(names(evimi.s)) >= 1953)]
# Reformat data for SPS
evimi.s_sps <- data.frame(
region = rep("East Vancouver Island & Mainland Inlets", length(evimi.s)),
species = rep("Steelhead", length(evimi.s)),
year = as.numeric(names(evimi.s)),
spawners = as.numeric(evimi.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(evimi.s))
)
# Smoothing
evimi.s_sps$smoothedSpawners <- genSmooth(
abund = evimi.s_sps$spawners,
years = evimi.s_sps$year,
genLength = genLength$gen_length[genLength$region == "East Vancouver Island & Mainland Inlets" & genLength$species == "Steelhead"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, evimi.s_sps)
# Generate standard figure
plot_abund(evimi.s_sps)
Above: Spawner abundance of East Vancouver Island & Mainland Inlets steelhead salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
added_series.s <- sps_data %>%
filter(region == "East Vancouver Island & Mainland Inlets", species == "Steelhead") %>%
select(year, spawners) %>%
rename("value" = "spawners")
plot_expansions(speciesname = "Steelhead",
regionname = "East Vancouver Island & Mainland Inlets",
region_spawners = region_spawners,
expansion_factors = expansion_factors,
added_series = added_series.s,
exp_ylim = c(1, 2))
abline(v = 1952.5)
text(1953, 1.5, "Data prior to 1953 were discarded", adj = 0)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
| Cheakamus River | Salmon River |
| Englishman River | Tsitika River |
| Keogh River |
For Chinook spawner abundance, we used the Chinook Technical Committee 14-stream index (Chinook Technical Committee 2025). We compare this below to a 17-stream index of escapements from DFO (Nicholas Brown, pers. comm.). We find the two sources similar.
Chinook total abundance was reported by DFO in 2025 (DFO 2025). The data shown in Figure 3 of DFO (2025) are available for download at https://zenodo.org/records/14847020 [accessed 25-Aug-2025]. We assumed that total abundance is the sum of the (non-terminal) ocean catch, hatchery-origin terminal return, and natural-origin terminal return. We note that this estimate of total abundance represents a total count of all Chinook from the region, and thus cannot be compared to the index of spawner abundance, which is only an index of selected streams.
region_spawners <- sp <- readRDS(here("output/expanded-spawners/West Vancouver Island-spawners.rds"))
yrs <- as.numeric(dimnames(sp)[[3]])
expansion_factors <- readRDS(here("output/expanded-spawners/West Vancouver Island-expansion-factors.rds"))
## Process spawner survey data ---
wvi.s <- sp[2, "Chinook", ]
# Get rid of NAs (esp in 2024)
wvi.s <- wvi.s[1:max(which(!is.na(wvi.s)))]
# For all VIMI species, start in 1953 - earlier expansion factors are large
wvi.s <- wvi.s[which(as.numeric(names(wvi.s)) >= 1953)]
## Load other data ---
# 17 stream index from Nicholas Brown @ DFO (pers comm.)
wvi_ck_dfo <- read.csv(here("data/R-OUT_infilled_indicators_escapement_timeseries.csv")) %>%
group_by(year) %>% summarize(tot_esc = sum(escapement))
# Compare the 17 stream index and Nuseds reconstruction (same streams)
wvi.s_recon <- data.frame(year=as.numeric(names(wvi.s)), spwn = wvi.s)
#wvi_ck_dfo %>% ggplot(aes(x=year, y=tot_esc/1000)) + geom_line(aes(col="DFO 17-Stream Index")) +
# geom_line(data=wvi.s_recon, aes(x=year, y=spwn/1000, col="Reconstructed 17-stream")) +
# scale_colour_manual(values = c("DFO 17-Stream Index" = "blue", "CTC 14-Stream Index" = "red",
# "Reconstructed 17-stream" = "purple")) +
# labs(col="Source", y="Spawner escapement (000s)", x="Year") + lims(x=c(1979, 2025))
## ---------------------------
## Data sources actually used:
## ---------------------------
# Alternate source: 14 Stream index from CTC
wvi_ck_ctc <- readxl::read_xlsx(here("data/TCCHINOOK-26-03-Appendix-B-Escapement-Detailed.xlsx"), sheet = "B5", range = "K24:K54", col_names = "WCVI_14Stream_Index") %>%
mutate(Year = c(1995:2025)) # Escapement methods changed in 1995; only use earlier data for assessments
# Total abundance from Brown et al. 2025
wvi_ck_tot <- read_xlsx(here("data/WCVI_Chinook_total_abundance.xlsx"))
wvi_ck_tot$total_abundance <- wvi_ck_tot$`Hatchery origin Terminal Return` + wvi_ck_tot$`Natural origin Terminal Return` + wvi_ck_tot$`non-terminal Ocean catch`
yrs <- sort(wvi_ck_ctc$Year) # years in Nick Brown's spawner index
# Put in SPS format
wvick_sps <- data.frame(
region = rep("West Vancouver Island", length(yrs)),
species = rep("Chinook", length(yrs)),
year = yrs,
spawners = wvi_ck_ctc$WCVI_14Stream_Index[match(yrs, wvi_ck_ctc$Year)],
smoothedSpawners = NA,
runsize = wvi_ck_tot$total_abundance[match(yrs, wvi_ck_tot$`Return year`)],
smoothedRunsize = NA,
source_id = rep(ctc_id, length(yrs))
)
# Smoothing
wvick_sps$smoothedSpawners <- genSmooth(
abund = wvick_sps$spawners,
years = wvick_sps$year,
genLength = genLength$gen_length[genLength$region == "West Vancouver Island" & genLength$species == "Chinook"]
)
wvick_sps$smoothedRunsize <- genSmooth(
abund = wvick_sps$runsize,
years = wvick_sps$year,
genLength = genLength$gen_length[genLength$region == "West Vancouver Island" & genLength$species == "Chinook"]
)
if(1 == 2){ # Visualize the time peries put on the same scale
avg <- c(spawners = exp(mean(log(wvick_sps$spawners), na.rm = TRUE)),
total = exp(mean(log(wvick_sps$runsize), na.rm = TRUE)))
plot(wvick_sps$year, (wvick_sps$smoothedRunsize - avg[2])/avg[2], "o", pch = 19)
abline(h= avg[2])
points(wvick_sps$year, (wvick_sps$smoothedSpawners - avg[1])/avg[1], "o", col = grey(0.6))
}
# Add to master sps dataframe
sps_data <- rbind(sps_data, wvick_sps)
# Generate standard plot
plot_abund(wvick_sps)
Above: Spawner abundance (grey) and total abundance (black) of West Vancouver Island chinook salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
# Generate plot of spawners ONLY so CTC comparison is more visible
sp_compare <- wvi.s_recon %>% ggplot(aes(x=year, y=spwn/1000)) +
geom_line(aes(col="DFO 17-Stream Index")) +
geom_point(aes(col="DFO 17-Stream Index"), shape=21) +
geom_point(data=wvi_ck_ctc, aes(x=Year, y=WCVI_14Stream_Index/1000, col="CTC 14-Stream Index"), shape=21) +
geom_line(data=wvi_ck_ctc, aes(x=Year, y=WCVI_14Stream_Index/1000, col="CTC 14-Stream Index"), alpha=0.5) +
scale_colour_manual(values = c("DFO 17-Stream Index" = "grey50", "CTC 14-Stream Index" = "red")) +
labs(col="Source", y="Spawner escapement (000s)", x="Year") +
theme_minimal() +
theme(legend.position=c(0.6, 0.9)) +
lims(x=c(1979,2025))
suppressWarnings(print(sp_compare))
Above: Spawner abundance (grey) and total abundance (black) of West Vancouver Island chinook salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
Reconstructions of sockeye spawners and recruitment are completed by DFO (Nicholas Brown, pers. comm.) for three Conservation Units on West Vancouver Island: Sproat, Great Central, and Huckutlis (formerly Henderson). We used the sum of spawners and total return for these three Conservation Units as the index of sockeye spawner and total abundance for WVI. We acknowledge that this index does not account for lake-type sockeye in other watersheds (e.g., Muchalat, Kennedy, Clayoquot) or river-type sockeye in West Vancouver Island and Northwest Vancouver Island CUs, which tend to be in much lower abundance.
# Sum of CU abundance from Sproat, Great Central, and Henderson
## Load data ---
wvi_se_raw <- readxl::read_xlsx(here("data/Barkley_Sockeye_stock-recruit_infilled.xlsx"), sheet = "S-R data")
wvi_se_summed <- wvi_se_raw %>%
dplyr::select(year, stock, S, N) %>% # S = escapement, N = annual terminal run size
filter(year >= 1977) %>% # Remove 1972 to 2076 for HUC because not available for other stocks
group_by(year) %>%
summarise(totalS = sum(S),
totalN = sum(N))
# plot(wvi_se_summed$year, wvi_se_summed$totalN, "o", ylim = c(0, 2e6), main = "WVI Sockeye", xlab = "", ylab = "")
# points(wvi_se_summed$year, wvi_se_summed$totalS, "o", col = 2)
# points(yrs, sp[2, "Sockeye", ], "o", col = 4)
# legend("topleft", col = c(1,2,4), c("3 CU - Total run", "3 CU - Escape.", "NuSEDS expanded"), pch = 1, lty = 1)
# Reformat data for SPS
wvise_sps <- data.frame(
region = rep("West Vancouver Island", dim(wvi_se_summed)[1]),
species = rep("Sockeye", dim(wvi_se_summed)[1]),
year = wvi_se_summed$year,
spawners = wvi_se_summed$totalS,
smoothedSpawners = NA,
runsize = wvi_se_summed$totalN,
smoothedRunsize = NA,
source_id = rep("Brown_20260420", dim(wvi_se_summed)[1])
)
# Smoothing
wvise_sps$smoothedSpawners <- genSmooth(
abund = wvise_sps$spawners,
years = wvise_sps$year,
genLength = genLength$gen_length[genLength$region == "West Vancouver Island" & genLength$species == "Sockeye"]
)
wvise_sps$smoothedRunsize <- genSmooth(
abund = wvise_sps$runsize,
years = wvise_sps$year,
genLength = genLength$gen_length[genLength$region == "West Vancouver Island" & genLength$species == "Sockeye"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, wvise_sps)
# Generate standard figure
plot_abund(wvise_sps)
Above: Spawner abundance (grey) and total abundance (black) of West Vancouver Island sockeye salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
For West Vancouver Island chum salmon, spawner abundance was expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. The latest year of data (2025) were extracted from West Coast of Vancouver Island Stock Assessment bulletin dated October 24, 2025, and should be considered preliminary. We truncated the time series of spawner abundance to years 1953+ because earlier years had high expansion factor values indicating lack of monitoring on key indicator streams (see figures below).
## Process data ---
wvi.s <- sp[2, "Chum", ]
# Get rid of NAs (esp in 2024)
wvi.s <- wvi.s[1:max(which(!is.na(wvi.s)))]
# For all VIMI species, start in 1953 - earlier expansion factors are large
wvi.s <- wvi.s[which(as.numeric(names(wvi.s)) >= 1953)]
# Reformat data for SPS
wvi.s_sps <- data.frame(
region = rep("West Vancouver Island", length(wvi.s)),
species = rep("Chum", length(wvi.s)),
year = as.numeric(names(wvi.s)),
spawners = as.numeric(wvi.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(wvi.s))
)
# Smoothing
wvi.s_sps$smoothedSpawners <- genSmooth(
abund = wvi.s_sps$spawners,
years = wvi.s_sps$year,
genLength = genLength$gen_length[genLength$region == "West Vancouver Island" & genLength$species == "Chum"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, wvi.s_sps)
# Generate standard figure
plot_abund(wvi.s_sps)
Above: Spawner abundance of West Vancouver Island chum salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
# added_series.s <- sps_data %>%
# filter(region == "West Vancouver Island", species == "Chum") %>%
# select(year, spawners) %>%
# rename("value" = "spawners")
plot_expansions(speciesname = "Chum",
regionname = "West Vancouver Island",
region_spawners = region_spawners,
expansion_factors = expansion_factors,
exp_ylim = c(1,2))
# added_series = added_series.s)
abline(v = 1952.5)
text(1953, 1.8, "Data prior to 1953 were discarded", adj = 0)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
#rm(added_series.s)
| Artlish River | Conuma River | Marble River | Sucwoa River |
| Bedwell River | Cypre River | Megin River | Tahsis River |
| Burman River | Deserted Creek | Moyeha River | Tahsish River |
| Canton Creek | Goodspeed River | Nahmint River | Tlupana River |
| Carnation Creek | Kaouk River | Nitinat River | Toquart River |
| Cayeghle Creek | Kirby Creek | Sarita River | Tranquil Creek |
| Colonial Creek | Leiner River | Sooke River | Tsowwin River |
For West Vancouver Island coho salmon, spawner abundance was expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. The latest year of data (2025) were extracted from West Coast of Vancouver Island Stock Assessment bulletin dated October 24, 2025, and should be considered preliminary. We truncated the time series of spawner abundance to years 1953+ because earlier years had high expansion factor values indicating lack of monitoring on key indicator streams (see figures below).
## Process data ---
wvi.s <- sp[2, "Coho", ]
# Get rid of NAs (esp in 2024)
wvi.s <- wvi.s[1:max(which(!is.na(wvi.s)))]
# For all VIMI species, start in 1953 - earlier expansion factors are large
wvi.s <- wvi.s[which(as.numeric(names(wvi.s)) >= 1953)]
# Reformat data for SPS
wvi.s_sps <- data.frame(
region = rep("West Vancouver Island", length(wvi.s)),
species = rep("Coho", length(wvi.s)),
year = as.numeric(names(wvi.s)),
spawners = as.numeric(wvi.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(wvi.s))
)
# Smoothing
wvi.s_sps$smoothedSpawners <- genSmooth(
abund = wvi.s_sps$spawners,
years = wvi.s_sps$year,
genLength = genLength$gen_length[genLength$region == "West Vancouver Island" & genLength$species == "Coho"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, wvi.s_sps)
# Generate standard figure
plot_abund(wvi.s_sps)
Above: Spawner abundance of West Vancouver Island coho salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
# added_series.s <- sps_data %>%
# filter(region == "West Vancouver Island", species == "Coho") %>%
# select(year, spawners) %>%
# rename("value" = "spawners")
plot_expansions(speciesname = "Coho",
regionname = "West Vancouver Island",
region_spawners = region_spawners,
expansion_factors = expansion_factors)#,
# added_series = added_series.s)
abline(v = 1952.5)
text(1953, 2, "Data prior to 1953 were discarded", adj = 0)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
#rm(added_series.s)
| Artlish River | Kennedy River - Upper | Nitinat River | Tlupana River |
| Bedwell River | Kirby Creek | Renfrew Creek | Toquart River |
| Burman River | Leiner River | Sarita River | Tranquil Creek |
| Canton Creek | Malksope River | Somass River | Tsowwin River |
| Carnation Creek | Marble River | Sucwoa River | Tugwell Creek |
| Conuma River | Moyeha River | Tahsis River | Watershed Above Stamp Falls |
| Cypre River | Muir Creek | Tahsish River | Zeballos River |
| Kaouk River | Nahmint River | Thornton Creek |
For West Vancouver Island pink salmon, spawner abundance was expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. The latest year of data (2025) were extracted from West Coast of Vancouver Island Stock Assessment bulletin dated October 24, 2025, and should be considered preliminary. We truncated the time series of spawner abundance to years 1953+ because earlier years had high expansion factor values indicating lack of monitoring on key indicator streams (see figures below).
For chum, coho, and steelhead, we relied on NuSEDS’ designations of indicator or non-indicator streams, but for pink salmon in this region we designated indicator streams as those with at least 10 years of data in the most recent 20 years. As a result, expansion factors were higher in historical years, but data from both indicator and non-indicator streams show markedly higher counts in the period 1960-1980 than in subsequent decades and it is unlikely that the observed decline is a result of uncertain expansions.
## Process data ---
wvi.s <- sp[2, "Pink", ]
# Get rid of NAs
wvi.s <- wvi.s[1:max(which(!is.na(wvi.s)))]
# For all VIMI species, start in 1953 - earlier expansion factors are large
wvi.s <- wvi.s[which(as.numeric(names(wvi.s)) >= 1953)]
# Reformat data for SPS
wvi.s_sps <- data.frame(
region = rep("West Vancouver Island", length(wvi.s)),
species = rep("Pink", length(wvi.s)),
year = as.numeric(names(wvi.s)),
spawners = as.numeric(wvi.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(wvi.s))
)
# Smoothing
wvi.s_sps$smoothedSpawners <- genSmooth(
abund = wvi.s_sps$spawners,
years = wvi.s_sps$year,
genLength = genLength$gen_length[genLength$region == "West Vancouver Island" & genLength$species == "Pink"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, wvi.s_sps)
# Generate standard figure
plot_abund(wvi.s_sps)
Above: Spawner abundance of West Vancouver Island pink salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
# added_series.s <- sps_data %>%
# filter(region == "West Vancouver Island", species == "Pink") %>%
# select(year, spawners) %>%
# rename("value" = "spawners")
plot_expansions(speciesname = "Pink",
regionname = "West Vancouver Island",
region_spawners = region_spawners,
expansion_factors = expansion_factors)#,
# added_series = added_series.s)
abline(v = 1952.5)
text(1953, par('usr')[4]/3, "Data prior to 1953 were discarded", adj = 0)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
#rm(added_series.s)
| Bedwell River | Kaouk River | Sarita River |
| Cayeghle Creek | Leiner River | Tahsis River |
| Colonial Creek | Marble River | Tahsish River |
| Conuma River | Megin River | Toquart River |
| Cypre River | Moyeha River | Ursus Creek |
| Espinosa Creek | San Juan River |
For West Vancouver Island steelhead, spawner abundance was expanded from available spawner surveys, as described below in Expansion Factors. The full list of indicator streams used for this expansion are in the table below. Data from the Englishman, Gold, Herber, Gordon, and Tsitika Rivers were provided by Michael McCulloch from BC’s Ministry of Water, Land and Resource Stewardship.
## Process data ---
wvi.s <- sp[2, "Steelhead", ]
# Get rid of NAs (esp in 2024)
wvi.s <- wvi.s[1:max(which(!is.na(wvi.s)))]
# For all VIMI species, start in 1953 - earlier expansion factors are large
wvi.s <- wvi.s[which(as.numeric(names(wvi.s)) >= 1953)]
# Reformat data for SPS
wvi.s_sps <- data.frame(
region = rep("West Vancouver Island", length(wvi.s)),
species = rep("Steelhead", length(wvi.s)),
year = as.numeric(names(wvi.s)),
spawners = as.numeric(wvi.s),
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep(nuseds_id, length(wvi.s))
)
# Smoothing
wvi.s_sps$smoothedSpawners <- genSmooth(
abund = wvi.s_sps$spawners,
years = wvi.s_sps$year,
genLength = genLength$gen_length[genLength$region == "West Vancouver Island" & genLength$species == "Steelhead"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, wvi.s_sps)
# Generate standard figure
plot_abund(wvi.s_sps)
Above: Spawner abundance of West Vancouver Island steelhead salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
# added_series.s <- sps_data %>%
# filter(region == "West Vancouver Island", species == "Steelhead") %>%
# select(year, spawners) %>%
# rename("value" = "spawners")
plot_expansions(speciesname = "Steelhead",
regionname = "West Vancouver Island",
region_spawners = region_spawners,
expansion_factors = expansion_factors)#,
# added_series = added_series.s)
abline(v = 1952.5)
text(1953, 3, "Data prior to 1953 were discarded", adj = 0)
Above: (a) Time series of spawner abundances showing raw sum of counts for indicator streams (red) and expanded estimates of spawner abudnance to indicator and non-indicator streams (black). This expanded time series is what is used to assess the current state and trends in spawner abundance for the region and species. (b) The values of Expansion Factor 1 that accounts for unmonitored indicator streams in a given year, and is calculated based on the proportional contribution of the unmonitored indicator stream(s) to the sum of all indicator streams in a (reference) decade.
#rm(added_series.s)
| Gold River | Heber River |
| Gordon River |
Escapement and run size for Fraser Chinook were provided to PSF by Lauren Weir, DFO (pers. comm.). We took the sum of escapement and terminal run for five major stocks (Fraser Spring 4-2 (age 1.2), Fraser Spring 5-2 (age 1.3), Fraser Summer 5-2 (age 1.3), Fraser Summer 4-1 (age 0.3), and Harrison (Fraser Fall 4-1, age 0.3)). Escapement numbers match those in Table B6 of the PSC’s Chinook Technical Committee (CTC) data sets as shown by purple open circles below. The ‘t.run’ in the CTC dataset excludes the Harrison stock.
# Data from Lauren Weir (shared 2026-04-24 by email)
frck <- readxl::read_xlsx(here("data/1975-2025 Fraser Chinook escapement and terminal run by SMU - for PSF.xlsx"), skip=1, .name_repair = "unique_quiet")
frck_smu <- readxl::read_xlsx(here("data/1975-2025 Fraser Chinook escapement and terminal run by SMU - for PSF.xlsx"), range="A1:K1", col_names=F, .name_repair = "unique_quiet") # get smu names
frck_smu <- rep(stringr::str_remove_all(frck_smu, "Fraser|age|-run|[[:punct:]]|[[:space:]]")[!is.na(frck_smu)], each=2)
names(frck)[2:ncol(frck)] <- paste(frck_smu, stringr::str_extract_all(names(frck)[2:ncol(frck)], "Esc|Run"), sep="_") # stitch together smu and col names
names(frck) <- stringr::str_to_lower(names(frck))
# Cut data to only 1984 onward when Harrison data were available.
frck <- frck %>% dplyr::filter(year >= 1984)
# Sum across SMUs
frck_esc <- round(apply(frck[, grep("esc", names(frck))], 1, sum))
frck_run <- round(apply(frck[, grep("run", names(frck))], 1, sum))
yrs <- frck$year
# Put in SPS format
frck_sps <- data.frame(
region = rep("Fraser", length(yrs)),
species = rep("Chinook", length(yrs)),
year = yrs,
spawners = frck_esc,
smoothedSpawners = NA,
runsize = frck_run,
smoothedRunsize = NA,
source_id = rep("Weir_20260424", length(yrs))
)
# Smoothing
frck_sps$smoothedSpawners <- genSmooth(
abund = frck_sps$spawners,
years = frck_sps$year,
genLength = genLength$gen_length[genLength$region == "Fraser" & genLength$species == "Chinook"]
)
frck_sps$smoothedRunsize <- genSmooth(
abund = frck_sps$runsize,
years = frck_sps$year,
genLength = genLength$gen_length[genLength$region == "Fraser" & genLength$species == "Chinook"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, frck_sps)
# Generate standard figure
plot_abund(frck_sps)
# Load CTC data for comparison
frck_ctc <- readxl::read_xlsx(here("data/TCCHINOOK-26-03-Appendix-B-Escapement-Detailed.xlsx"), sheet = "B6", range = "A5:G54", col_types = "numeric", col_names = c("Year", "Spr12_esc", "Spr13_esc", "Sum03_esc", "Sum13_esc", "SprSum_trun", "Harr_esc"))
frck_ctc <- frck_ctc %>% mutate(total_esc = Spr12_esc + Spr13_esc + Sum03_esc + Sum13_esc + Harr_esc)
# Plot comparison
points(x=frck_ctc$Year, y=frck_ctc$total_esc/1000, col="purple")
Above: Spawner abundance (grey) and total abundance (black) of Fraser chinook salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
## New names:
## New names:
## • `Total Escapement` -> `Total Escapement...2`
## • `Terminal Run` -> `Terminal Run...3`
## • `Total Escapement` -> `Total Escapement...4`
## • `Terminal Run` -> `Terminal Run...5`
## • `Total Escapement` -> `Total Escapement...6`
## • `Terminal Run` -> `Terminal Run...7`
## • `Total Escapement` -> `Total Escapement...8`
## • `Terminal Run` -> `Terminal Run...9`
## • `Total Escapement` -> `Total Escapement...10`
## • `Terminal Run` -> `Terminal Run...11`
Above: (a) Aggregate escapement of Fraser Chinook with the contribution of escapement to each of five stocks shown as coloured regions. Note that the Harrison River (Fall 4-1) time series begins later (1984) than the other four stocks (1975), and thus we only report spawner abundance from 1984 onward. (b) The proportional contribution of each of five stocks to aggregate Fraser Chinook escapement.
Fraser chum escapement and total run estimates were provided to us upon request by Brittany Jenewin (DFO, pers. comm.).
Above: Spawner abundance (grey) and total abundance (black) of Fraser Chum salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
New Interior Fraser Coho estimates were provided by Tanya Vivian (DFO) in 2026. “Total Prefishery Abundance” is total return plus harvest, and can be considered equivalent to run size, while “Total Return” is spawners plus fish removed later for brood collection or AFC sacrifices (applicable only to the three indicator stocks).
## Load data ---
frco <- readxl::read_excel(here("data/IFC-Data-TanyaVivian-2026.xlsx"), sheet=2) %>%
summarize(Run.size = sum(Total.Prefishery.Abundance),
Spawners = sum(Total.Return),
Natural.Spawners = sum(Natural.Returns),
Hatchery.Spawners = sum(`Hatchery Returns`), .by=ReturnYear)
frco_old <- read.csv(here("data/IFC_data_compiled.csv"))
# Put in SPS format
frco_sps <- data.frame(
region = rep("Fraser", length(frco$ReturnYear)),
species = rep("Coho", length(frco$ReturnYear)),
year = frco$ReturnYear,
spawners = frco$Spawners, # Note this is the fish that returned to spawn, NOT a mistake!
smoothedSpawners = NA,
runsize = frco$Run.size,
smoothedRunsize = NA,
source_id = "Vivian_20260527" # c(rep("Glavas_20231006", length(frco$year) - 2), rep("DFO_20250225", 2))
)
# Smoothing
frco_sps$smoothedSpawners <- genSmooth(
abund = frco_sps$spawners,
years = frco_sps$year,
genLength = genLength$gen_length[genLength$region == "Fraser" & genLength$species == "Coho"]
)
frco_sps$smoothedRunsize <- genSmooth(
abund = frco_sps$runsize,
years = frco_sps$year,
genLength = genLength$gen_length[genLength$region == "Fraser" & genLength$species == "Coho"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, frco_sps)
# Generate standard figure
plot_abund(frco_sps)
Above: Spawner abundance (grey) and total abundance (black) of Fraser coho salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
#points(frco_old$year, frco_old$spawners/1000, col="purple")
#points(frco_old$year, frco_old$runsize/1000, col="blue")
Data on total return and spawner abundance of pink salmon in the Fraser region are provided by the PSC and accessed through the Fraser Panel Annual Report: Data Application (Pacific Salmon Commission 2026). We note that Fraser River pink salmon are only counted in the dominant, odd-year run.
## Load data ---
# Note: Only odd year data, so no change in some years
# From PSC
frpk <- read.csv(here("data/pink_run_size_2026-04-20.csv"))
# Put in SPS format
frpk_sps <- data.frame(
region = rep("Fraser", length(frpk$Year)),
species = rep("Pink", length(frpk$Year)),
year = frpk$Year,
spawners = frpk$Escapement, # Note this is the fish that returned to spawn, NOT a mistake!
smoothedSpawners = NA,
runsize = frpk$Run.Size,
smoothedRunsize = NA,
source_id = rep("PSC_20260417", length(frpk$Year))
)
# Smoothing - don't do this for pink salmon in the Fraser - no even year data!
frpk_sps$smoothedSpawners <- frpk_sps$spawners
frpk_sps$smoothedRunsize <- frpk_sps$runsize
# Add to master sps dataframe
sps_data <- rbind(sps_data, frpk_sps)
#Generate standard figure
plot_abund(frpk_sps)
Above: Spawner abundance (grey) and total abundance (black) of Fraser pink salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
Data on total return and spawner abundance of sockeye salmon in the Fraser region are provided by the PSC and accessed through the Fraser Panel Annual Report: Data Application (Pacific Salmon Commission 2026). The 2025 total return is considered preliminary (in-season estimate) and the 2025 escapement is “near-final” (Provided by email by Sean Everitt).
## Load data ---
# From PSC
frse <- read.csv(here("data/Fraser Sockeye Run Size_2026-04-20.csv")) %>%
filter(Management.Group == "Total Fraser")
# Load 2025 Near-final escapement estimates
frse_esc_2025 <- readxl::read_xlsx(here("data/2025 Fraser Sockeye Escapement Summary.xlsx"), sheet=2)
# Put in SPS format
frse_sps <- data.frame(
region = rep("Fraser", length(frse$Year)),
species = rep("Sockeye", length(frse$Year)),
year = frse$Year,
spawners = c(frse$Spawning.Escapement[which(frse$Year<2025)],
frse_esc_2025$escapement[frse_esc_2025$area_cu=="Total"]), # Add 2025 near-final estimate # Note this is the fish that returned to spawn, NOT a mistake!
smoothedSpawners = NA,
runsize = frse$Run.Size,
smoothedRunsize = NA,
source_id = c(rep("PSC_20260417", length(frse$Year)-1), "Everitt_20260708")
)
# Fill in run size with in-season estimates if available
if(sum(is.na(frse_sps$runsize)) > 0){
if(sum(!is.na(frse$In.season.Run.Size[which(frse$Year %in% frse_sps$year[is.na(frse_sps$runsize)])])) > 0){
frse_sps$runsize[which(frse$Year %in% frse_sps$year[is.na(frse_sps$runsize)])] <- frse$In.season.Run.Size[which(frse$Year %in% frse_sps$year[is.na(frse_sps$runsize)])]
}
}
# Smoothing
frse_sps$smoothedSpawners <- genSmooth(
abund = frse_sps$spawners,
years = frse_sps$year,
genLength = genLength$gen_length[genLength$region == "Fraser" & genLength$species == "Sockeye"]
)
frse_sps$smoothedRunsize <- genSmooth(
abund = frse_sps$runsize,
years = frse_sps$year,
genLength = genLength$gen_length[genLength$region == "Fraser" & genLength$species == "Sockeye"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, frse_sps)
# Generate standard figure
# plot_abund(frse_sps[frse$Year >= 1980,]); abline(v = 2024)
plot_abund(frse_sps)
Above: Spawner abundance (grey) and total abundance (black) of Fraser sockeye salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
Steelhead trout in the Fraser are monitored by the Province in at least 10 different streams, but these data are not readily available. Relatively reliable estimates of steelhead spawner abundance are available at the CU-level for interior Fraser steelhead from the Thompson Summer CU (monitored at the Thompson River) and Mid Fraser Summer CU (primarily monitored at the Chilcotin River; data in the Pacific Salmon Explorer). We used the sum of CU-level spawner abundance for these two CUs as an index of Fraser steelhead abundance. We note that this approach does not include more coastal populations, such as the Lower Fraser Summer steelhead monitored in the Coquihalla River or Boundary Bay Winter steelhead, which may not have declined to the same extent over the past decade. However, a lack of publicly accessible data on coastal Fraser steelhead has limited our ability to include these CUs in our index of abundance.
## Load data ---
# Use sum of two main Fraser steelhead CUs
frsh <- read.csv("https://raw.githubusercontent.com/salmonwatersheds/steelhead-data/refs/heads/main/output/dataset1_spawner-abundance_Steelhead.csv") %>%
filter(region == "Fraser", species_name == "Steelhead") %>%
filter(cu_name_pse %in% c("Thompson Summer", "Mid Fraser Summer")) %>%
filter(!is.na(estimated_count) & estimated_count != -989898)
frsh_sum <- tapply(as.numeric(frsh$estimated_count), frsh$year, sum)
frsh_sum <- frsh_sum[min(which(!is.na(frsh_sum))): max(which(!is.na(frsh_sum)))]
# Put in SPS format
frsh_sps <- data.frame(
region = rep("Fraser", length(frsh_sum)),
species = rep("Steelhead", length(frsh_sum)),
year = as.numeric(names(frsh_sum)),
spawners = frsh_sum, # Note this is the fish that returned to spawn, NOT a mistake!
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep("Bison_20241129", length(frsh_sum))
)
# Smoothing
frsh_sps$smoothedSpawners <- genSmooth(
abund = frsh_sps$spawners,
years = frsh_sps$year,
genLength = genLength$gen_length[genLength$region == "Fraser" & genLength$species == "Steelhead"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, frsh_sps)
# Generate standard figure
plot_abund(frsh_sps)
Above: Spawner abundance of Fraser steelhead salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
We used CU-level estimates of spawner abundance (run reconstructions) sourced from DFO (Athena Ogden, pers. comm.) for 2006-2023 and Okanagan Nation Alliance (Katherine Fegan, pers. comm.) for 2024-2025.
colck <- read.csv(here("data/Chinook_Okanagan_NEW.csv")) %>% filter(Year >= 2006)
# Downloaded from https://github.com/SOLV-Code/Scanner-Data-Processing/blame/main/DATA_IN/Chinook_Okanagan_NEW.csv
# on March 18, 2025
# Put in SPS format
colck_sps <- data.frame(
region = rep("Columbia", length(colck$Year)),
species = rep("Chinook", length(colck$Year)),
year = colck$Year,
spawners = as.numeric(colck$NatOrigSpn + colck$HatchOrigSpn), # Note this is the fish that returned to spawn, NOT a mistake!
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep("DFO_20250318", length(colck$Year))
) %>%
bind_rows(data.frame(
region = rep("Columbia", 2),
species = rep("Chinook", 2),
year = 2024:2025,
spawners = c(36, 12),
source_id = rep("Fegan_20260827", 2)
))
# Smoothing
colck_sps$smoothedSpawners <- genSmooth(
abund = colck_sps$spawners,
years = colck_sps$year,
genLength = genLength$gen_length[genLength$region == "Columbia" & genLength$species == "Chinook"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, colck_sps)
# Generate standard figure
plot_abund(colck_sps)
Above: Spawner abundance of Columbia chinook salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
We used CU-level estimates of spawner abundance (run reconstructions) sourced from Athena Ogden (DFO) for Chinook and sockeye. Spawner abundance for Columbia sockeye was the sum of estimates for Osoyoos and, more recently, Skaha Lakes and were the most up-to-date estimates as of June 2025 (Athena Ogden, pers. comm.). Total abundance for sockeye was provided by Howard Stiff at DFO.
# Load data ---
colse_old <- read.csv(here("data/spawner_abundance.csv")) %>%
subset(region == "Columbia" & species_name == "Lake sockeye") %>%
subset(!is.na(estimated_count))
# Total abundance data received by email from Howard Stiff on 9/11/2026
colse <- read.csv(here("data/OSO_SKA_Recruitment_251115.csv"))
colse2 <- readxl::read_xlsx(here("data/Okanagan Sockeye Esc for KR_revJn2025.xlsx"), sheet = "CAN Escapement", range = "A1:E65")
# Put in SPS format
yrs <- c(sort(colse2$Year), 2025) # don't use pre-2004 (not comparable; DFO 2024)
colse_sps <- data.frame(
region = rep("Columbia", length(yrs)),
species = rep("Sockeye", length(yrs)),
year = yrs,
spawners = c(round(colse2$`Total spawners`[match(yrs[1:64], colse2$Year)]), 9440+1756), # 2025 numbers from Patrick Thompson email dated August 26 2026
smoothedSpawners = NA,
runsize = c(colse$Okanagan.Bound.Sockeye[match(yrs[1:64], colse$Year)], 81887+14907), # 2025 numbers from Patrick Thompson email dated August 26 2026
smoothedRunsize = NA,
source_id = c(rep("Ogden_20250627, Stiff_20260911", length(yrs) - 1), "Thompson_20260826")
)
# Smoothing
colse_sps$smoothedSpawners <- genSmooth(
abund = colse_sps$spawners,
years = colse_sps$year,
genLength = genLength$gen_length[genLength$region == "Columbia" & genLength$species == "Sockeye"]
)
colse_sps$smoothedRunsize <- genSmooth(
abund = colse_sps$runsize,
years = colse_sps$year,
genLength = genLength$gen_length[genLength$region == "Columbia" & genLength$species == "Sockeye"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, colse_sps)
# Generate standard figure
plot_abund(colse_sps)
Above: Spawner abundance (grey) and total abundance (black) of Columbia sockeye salmon. For both, the raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average for each.
There is no monitoring of steelhead trout in the Canadian portion of the Columbia region, but the Okanagan Nation Alliance does enumerate steelhead in akskwəkwant (Inkaneep Creek) and estimate a Canadian portion of steelhead spawning abundance. These data can be found in Table 8 of the associated report (e.g. OBMEP (2026)) and are available for the Mid Columbia Summer Conservation Unit in the Pacific Salmon Explorer. We use the sum of natural and hatchery-origin spawners.
colsh <- read.csv(here("data/Columbia_Steelhead_OBMEP.csv"))
# Put in SPS format
colsh_sps <- data.frame(
region = rep("Columbia", length(colsh$year)),
species = rep("Steelhead", length(colsh$year)),
year = colsh$year,
spawners = colsh$total_spawners, # Note this is the fish that returned to spawn, NOT a mistake!
smoothedSpawners = NA,
runsize = NA,
smoothedRunsize = NA,
source_id = rep("OBMEP_20260228", length(colsh$year))
)
# Smoothing
colsh_sps$smoothedSpawners <- genSmooth(
abund = colsh_sps$spawners,
years = colsh_sps$year,
genLength = genLength$gen_length[genLength$region == "Columbia" & genLength$species == "Steelhead"]
)
# Add to master sps dataframe
sps_data <- rbind(sps_data, colsh_sps)
# Generate standard figure
plot_abund(colsh_sps)
Above: Spawner abundance of Columbia steelhead salmon. The raw data is shown by points and the smoothed metric by solid lines. Dashed horizonal lines represent the long-term average.
# Round abundances
sps_data$spawners <- round(sps_data$spawners)
sps_data$runsize <- round(sps_data$runsize)
sps_data$smoothedSpawners <- round(sps_data$smoothedSpawners, 1)
sps_data$smoothedRunsize <- round(sps_data$smoothedRunsize, 1)
if(write.output == TRUE){
write.csv(sps_data, here("output/sps-data.csv"), row.names = FALSE) # Always have most recent
write.csv(sps_data, paste0(Dropbox_dir, "/output/archive/", "sps-data_", Sys.Date(), ".csv"), row.names = FALSE) # Archive with date
}
For species and regions that lacked reliable data on spawner abundance and total return at the appropriate scale, we estimated regional-scale abundance from stream-level surveys. We started with spawner survey data shown in the Pacific Salmon Explorer. Spawner surveys were each assigned to one of the ten regions based on their geographic location. We note that this is slightly different from how spawner survey data are organized in the Pacific Salmon Explorer, where data are organized by Conservation Units (CUs) that may span regional boundaries (e.g. for pink salmon that have relatively geographically large CUs). In cases of trans-regional CUs, the spawner surveys appear in both regions in the Pacific Salmon Explorer, whereas here we assign spawner surveys to the region in which they fall geographically, regardless of the CU boundary.
Spawner survey data are largely derived from river-level estimates in
DFO’s New
Salmon Escapement Database System (NuSEDS), but are cleaned up to
address issues of, for example, inconsistent naming of streams through
time or duplicate data. The spawner survey abundance is equal to the
MAX_ESTIMATE in NUSEDS for each year and river population,
calculated as the maximum of all fields containing spawner abundance
data (e.g. natural adult spawners, natural jack spawners, total
broodstock removals). Each of these river populations has been
designated as an indicator stream or
non-indicator. Indicator streams are observed more
consistently in recent decades, tend to have higher spawner abundance,
and tend to be monitored using more intensive methods that provide
greater accuracy (English et al.
2018). We designate indicator streams based on the NuSEDS
field with two exceptions: for regions in the north and central coast we
relied on a review of indicator streams by English et al. (2018) and for
WVI pink salmon we assigned indicator streams based on monitoring
frequency (see Region Specific Data Sources: West Vancouver Island). The
choice of indicator streams seemed to have minimal impact on results:
outcomes did not change substantially when comparing between indicators
designated by English et al. (2018) and in
NuSEDS. Nonetheless, revisiting indicator designations is a priority in
future years given ongoing declines in monitoring effort (Atkinson et
al. 2025). For further information on the compilation of spawner survey
data, see the Pacific
Salmon Explorer Technical Report.
Expansion Factor 1, \(F_{1,y/d}\), expands the observed spawner abundances in indicator streams to account for indicator streams that are not monitored in a given year. It is calculated for each year \(y\) of the spawner time series, and relies on a decadal contribution of each indicator stream to the total escapement to all indicator streams, \(P_{d,i}\) in decade \(d\) (English et al. 2018). The calculation of this decadal contribution requires at least one estimate from each indicator stream for the decade. If a decade does not contain sufficient information (i.e. one or more indicator streams are not monitored at all in a decade), then a reference decade is used to calculate \(P_{d,i}\). This reference decade is chosen to be: (1) the closest decade (historical or future) with sufficient information, or failing (1), (2) the 20-year period from 1980-1999 (Challenger et al. 2018).
For each decade (or reference decade if insufficient information) \(d\), the average number of spawners returning to indicator stream \(i\) is calculated as:
\[\bar{S}_{d,i} = \sum_{y = 1}^{Y_{d,i}} \frac{\hat{S}_{y/d, i}}{Y_{d,i}} \] where \(Y_{d,i}\) is the number of years for which spawner estimates are available within decade \(d\) for stream \(i\). From the average number of spawners for all indicator streams, the decadal proportional contribution of each indicator stream is calculated as:
\[P_{d,i} = \frac{\bar{S}_{d,i}}{\sum_{i=1}^{I} \bar{S}_{d,i}}\] where \(I\) is the total number of indicator streams.
Expansion Factor 1 is then calculated for each year within the decade \(y/d\) based on the decadal contributions and which streams were monitored or not in a given year:
\[F_{1,y/d}=\left( \sum_{i=1}^I P_{d,i} w_{y/d,i} \right)\] where \(w_{y/d,i}\) is 1 if stream \(i\) was monitored in year \(y\) and 0 if stream \(i\) was not monitored in year \(y\). Expansion Factor 1 is then multiplied by the sum of the observed spawners in all indicator stream to yield the expanded estimate of spawner abundances in all indicator streams in the region:
\[S'_{y} = F_{1,y/d} \sum_{i=1}^I \hat{S}_{y,i}\]
Expansion Factor 2 \(F_{2,d}\) expands the spawner abundance to all indicator streams, \(S'_{y}\), to account for non-indcator streams. Unlike Expansion Factor 1, this is calculated for each decade (rather than each year) and then applied to all years within a decade. Like Expansion Factor 1, there needs to be sufficient information within the given decade in order to calculate \(F_{2,d}\), or else a reference decade is chosen. See English et al. (2018) for detailed on how reference decades are chosen in that case.
Expansion Factor 2 is calculated as:
\[F_{2,d} = \frac{\sum_{i = 1}^I \bar{S}_{d,i} + \sum_{j = 1}^{J} \bar{S}_{d,j}}{\sum_{i = 1}^I \bar{S}_{d,i}}\] where \(\bar{S}_{d,i}\) and \(\bar{S}_{d,j}\) are the deacdal average number of spawners in indicator and non-indicator streams, respectively, calculated above. \(J\) is the total number of non-indicator streams. The adjusted total number of spawners in both indicator and non-indicator streams is then calculated as: \[ S''_{y} = F_{2,d} S'_{y} \]
Note that when expanding spawner abundance for spawner-recruit analysis, a third expansion factor is applied to account for streams that are never monitored and for observer (in)efficiency (Peacock et al. 2020). We did not apply this third expansion factor because it is highly undertain and we are interested in relative changes in abundance through time, so we do not require to expand to absolute abundance.
We smoothed time series of spawner abundance and total return using a right-aligned running geometric mean over the length of a generation. This reduces the influence of dominant years and produces an index that is less sensitive to stochastic interannual variability that is common in salmon population dynamics. The generation length was based on the dominant life-history type for each species in a particular region. The smoothed spawner abundance in year \(y\) given a generation length \(g\) was calculated as: \[ \bar{S_{y}} = \left( \prod_{t = y-g+1}^y {S''_t} \right)^{1/g} \]
We smoothed abundance from the first year to the most recent year of
raw abundance data. If there were intermediate years with missing data,
the smoothed abundance was still calculated using the available years
(i.e. ignoring the missing data, with the exponent \(1/g\) adjusted so that \(g\) reflected the number of years with data
in the generation). If all years in a generation were missing data, than
the smoothed abundance was NA.
When plotting, we show the smoothed abundance relative to the long-term historical average, so that species that have vastly different abundances within a region can be plotted on the same y-axis for comparison.
We summarize the time series of smoothed spawner abundance or total return at the regional scale using three different metrics:
The currents status provides information on how the most recent spawner abundance compares to past values, while the two trend metrics provide information on the average direction of change and are less sensitive to the magnitude of current abundance.
The current status relative to historical average is calculated as: \[ (\bar{S_{y}} - \bf{S}) / \bf{S} \] where \(y\) is the most recent year for which the index of spawner abundance could be calculated and \(\bf{S}\) is the average smoothed spawner abundance over the entire time series.
The long-term trend is calculated following the recommendations of D’Eon-Eggertson et al. (2015), who found that the correct identification of declines in salmon population abundance may be most reliable when considering the entire time series, and applying regression-based estimates of change calculated from log-transformed and smoothed spawner abundances. As such, we fit a simple linear model to the time series of \(\log ( \bar{S}_{y} )\) over \(y\). The resulting slope, \(m\), gives an average estimate of annual change:
\[ m = \log \left( \frac{\bar{S}_{y}}{\bar{S}_{y-1}} \right)\].
With some rearranging, we can calculate the average annual percent change as: \[ \frac{\bar{S}_{y} - \bar{S}_{y-1}}{\bar{S}_{y-1}} = \frac{ e^m \bar{S}_{y-1} - \bar{S}_{y-1}}{\bar{S}_{y-1}} = e^m - 1\]. If the slope \(m\) is not significantly different from zero (\(p \geq 0.05\)), then the trend is classified as “stable” regardless of the magnitude of the estimated slope. If the slope is significantly different from zero (\(p < 0.05\)), then the trend is classified as increasing if \(m > 0\) or decreasing if \(m < 0\).
The short-term trend is calculated as described above, but only using the time series over the most recent three generations.
Above: Simulated time series of spawner abundance (grey line), smoothed with a running geometric mean over the generation length (4 years; black line). The three metrics are illustrated: Current status relative to historical average (black); Long-term trend over the entire time series (green); and Short-term trend over the most recent three generations (clay). The shaded regions of the regression lines indicate the 95% prediction intervals. In this example, the short-term trend is not statistically significant (p > 0.05), and so the trend is characterized as ‘stable’ despite the negative slope.
The standardized approach to quantifying change described above was applied across regions and species. We then considered two additional attributes prior to reporting on the State of Salmon:
If the species and region had no data in the most recent generation, the current status was “Unknown” even if historical abundance information was available.
If there was reliable information that the absolute population size was < 1,500 spawners, then the species and region was considered at risk of extirpation regardless of the outcome of the metrics above. This was the case for Columbia Chinook which have been assessed as Endangered by COSEWIC due to low population size (COSEWIC 2017) and Columbia steelhead. There were other regions and species that had spawner abundance < 1,500, but none of these had reliable estimates of absolute spawner abundance.
These trends in aggregated spawner abundance provide a broad overview of how salmon are doing, but must be interpreted with caution due to the diversity of populations with potentially different outlooks within each region and species.
The status of spawner abundance is, in most cases, more positive than the status in total return, highlighting that declines in fisheries have been pervasive. In all cases, the most complete picture is obtained by looking at all of the metrics we calculate.
Highlights from the 2026 State of Salmon report:
The state of salmon remains precarious, with approximately half of all salmon populations across British Columbia and the Yukon below their long-term average.
Sockeye had above-average spawner abundance in all but one region – East Vancouver Island & Mainland Inlets.
Coho populations are up in some southern regions, while most northern populations remain near or below average.
Steelhead are in serious decline with below-average spawners in nearly every region.
Below: Summary of current state for spawner or total abundance (tabs) across regions and species, comparing between previous years’ outcomes and revised outcomes. Regions and species below historical average are in red and above historical average are in green. Black cells indicate species that are not thought to be present in the given region, and grey cells indicate status was Unknown.
Below: Summary of the three metrics for spawners and total return. For long-term trends and short-term trends, the percentage is the average annual change calculated over the respective time period. Grey values indicate the % change was not significantly different from zero (i.e., stable), red values indicate declining trends, and green values indicate increasing trends.
Above: Detailed status and trend metrics for Yukon Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Yukon Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Yukon Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Yukon Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Below: Summary of the three metrics for spawners and total return. For long-term trends and short-term trends, the percentage is the average annual change calculated over the respective time period. Grey values indicate the % change was not significantly different from zero (i.e., stable), red values indicate declining trends, and green values indicate increasing trends.
Above: Detailed status and trend metrics for Transboundary Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Transboundary Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Transboundary Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Transboundary Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Transboundary Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Transboundary Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Transboundary Chum: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Transboundary Pink: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Transboundary Steelhead: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Below: Summary of the three metrics for spawners and total return. For long-term trends and short-term trends, the percentage is the average annual change calculated over the respective time period. Grey values indicate the % change was not significantly different from zero (i.e., stable), red values indicate declining trends, and green values indicate increasing trends.
Above: Detailed status and trend metrics for Haida Gwaii Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Haida Gwaii Chum: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Haida Gwaii Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Haida Gwaii Pink: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Haida Gwaii Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Below: Summary of the three metrics for spawners and total return. For long-term trends and short-term trends, the percentage is the average annual change calculated over the respective time period. Grey values indicate the % change was not significantly different from zero (i.e., stable), red values indicate declining trends, and green values indicate increasing trends.
Above: Detailed status and trend metrics for Nass Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Pink: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Pink: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Chum: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Chum: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Steelhead: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Nass Steelhead: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Below: Summary of the three metrics for spawners and total return. For long-term trends and short-term trends, the percentage is the average annual change calculated over the respective time period. Grey values indicate the % change was not significantly different from zero (i.e., stable), red values indicate declining trends, and green values indicate increasing trends.
Above: Detailed status and trend metrics for Skeena Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Skeena Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Skeena Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Skeena Steelhead: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Skeena Chum: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Skeena Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Skeena Pink: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Below: Summary of the three metrics for spawners and total return. For long-term trends and short-term trends, the percentage is the average annual change calculated over the respective time period. Grey values indicate the % change was not significantly different from zero (i.e., stable), red values indicate declining trends, and green values indicate increasing trends.
Above: Detailed status and trend metrics for Central Coast Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
## No data for Central Coast Steelhead
Above: Detailed status and trend metrics for Central Coast Chum: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Central Coast Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Central Coast Pink: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Central Coast Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Below: Summary of the three metrics for spawners and total return. For long-term trends and short-term trends, the percentage is the average annual change calculated over the respective time period. Grey values indicate the % change was not significantly different from zero (i.e., stable), red values indicate declining trends, and green values indicate increasing trends.
Above: Detailed status and trend metrics for East Vancouver Island & Mainland Inlets Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for East Vancouver Island & Mainland Inlets Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for East Vancouver Island & Mainland Inlets Chum: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for East Vancouver Island & Mainland Inlets Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for East Vancouver Island & Mainland Inlets Pink: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for East Vancouver Island & Mainland Inlets Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for East Vancouver Island & Mainland Inlets Steelhead: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Below: Summary of the three metrics for spawners and total return. For long-term trends and short-term trends, the percentage is the average annual change calculated over the respective time period. Grey values indicate the % change was not significantly different from zero (i.e., stable), red values indicate declining trends, and green values indicate increasing trends.
Above: Detailed status and trend metrics for West Vancouver Island Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for West Vancouver Island Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for West Vancouver Island Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for West Vancouver Island Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for West Vancouver Island Chum: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for West Vancouver Island Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for West Vancouver Island Pink: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for West Vancouver Island Steelhead: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Below: Summary of the three metrics for spawners and total return. For long-term trends and short-term trends, the percentage is the average annual change calculated over the respective time period. Grey values indicate the % change was not significantly different from zero (i.e., stable), red values indicate declining trends, and green values indicate increasing trends.
Above: Detailed status and trend metrics for Fraser Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Fraser Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Fraser Chum: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Fraser Chum: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Fraser Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Fraser Coho: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Fraser Pink: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Fraser Pink: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Fraser Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Fraser Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Fraser Steelhead: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Below: Summary of the three metrics for spawners and total return. For long-term trends and short-term trends, the percentage is the average annual change calculated over the respective time period. Grey values indicate the % change was not significantly different from zero (i.e., stable), red values indicate declining trends, and green values indicate increasing trends.
Above: Detailed status and trend metrics for Columbia Chinook: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Columbia Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Columbia Sockeye: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.
Above: Detailed status and trend metrics for Columbia Steelhead: short-term (3-generation) and long-term trend lines with 95% confidence intervals, the long-term average (dashed line), and current status relative to that average.