library(pacea)
library(dplyr)
library(tibble) # Else prints all of a tibble
library(ggplot2)The Fraser River is the longest river in British Columbia and one of the most important waterways in western Canada. Fraser River discharge is particularly significant for salmon populations, as it is an important determinant of survival for Fraser River Sockeye Salmon during juvenile migration from freshwater to the ocean, and during return migration back to the spawning grounds.
In pacea we include two Fraser River discharge data sets, both measured at Hope, British Columbia:
fraser_discharge_mean - monthly mean discharge datafraser_discharge_peak - monthly peak discharge dataBoth data sets are derived from measurements at the Hope station and provide monthly time series from 1912 onwards, downloaded from Environment and Climate Change Canada. The data are of class pacea_index and contain measurements in cubic meters per second (m³/s). See ?fraser_discharge_mean for further details.
The mean discharge values are the monthly averages:
fraser_discharge_mean
#> # A tibble: 1,360 × 3
#> year month value
#> <dbl> <dbl> <dbl>
#> 1 1912 3 485.
#> 2 1912 4 1154.
#> 3 1912 5 4989.
#> 4 1912 6 6128
#> 5 1912 7 4781.
#> 6 1912 8 3961.
#> 7 1912 9 2162.
#> 8 1912 10 1531.
#> 9 1912 11 1065.
#> 10 1912 12 761.
#> # ℹ 1,350 more rows
tail(fraser_discharge_mean)
#> # A tibble: 6 × 3
#> year month value
#> <dbl> <dbl> <dbl>
#> 1 2025 1 1131.
#> 2 2025 2 802.
#> 3 2025 3 1141.
#> 4 2025 4 2354
#> 5 2025 5 3959.
#> 6 2025 6 5224.The columns are year and month (1-12), and value, which is the mean over the month of the daily means (calculated from measurements throughout the day), in m³/s.
summary(fraser_discharge_mean)
#> year month value
#> Min. :1912 Min. : 1.000 Min. : 482.2
#> 1st Qu.:1940 1st Qu.: 3.750 1st Qu.: 1045.8
#> Median :1968 Median : 6.000 Median : 1938.2
#> Mean :1968 Mean : 6.494 Mean : 2710.7
#> 3rd Qu.:1997 3rd Qu.: 9.000 3rd Qu.: 3914.5
#> Max. :2025 Max. :12.000 Max. :10752.3Built-in plotting functions are included in pacea, with automatic axis labelling:
plot(fraser_discharge_mean)This plot shows the long-term patterns in monthly mean discharge, revealing both seasonal cycles and inter-annual variability.
The peak discharge data are monthly peaks calculated from daily mean values:
fraser_discharge_peak
#> # A tibble: 1,360 × 3
#> year month value
#> <dbl> <dbl> <int>
#> 1 1912 3 578
#> 2 1912 4 2070
#> 3 1912 5 6850
#> 4 1912 6 7420
#> 5 1912 7 6340
#> 6 1912 8 4390
#> 7 1912 9 3000
#> 8 1912 10 2030
#> 9 1912 11 1270
#> 10 1912 12 864
#> # ℹ 1,350 more rows
tail(fraser_discharge_peak)
#> # A tibble: 6 × 3
#> year month value
#> <dbl> <dbl> <int>
#> 1 2025 1 1470
#> 2 2025 2 1050
#> 3 2025 3 1360
#> 4 2025 4 2900
#> 5 2025 5 5590
#> 6 2025 6 6950The columns are year and month (1-12), and value, which is the peak over the month of the daily means (calculated from measurements thoughout the day), in m³/s.
summary(fraser_discharge_peak)
#> year month value
#> Min. :1912 Min. : 1.000 Min. : 538
#> 1st Qu.:1940 1st Qu.: 3.750 1st Qu.: 1440
#> Median :1968 Median : 6.000 Median : 2800
#> Mean :1968 Mean : 6.494 Mean : 3643
#> 3rd Qu.:1997 3rd Qu.: 9.000 3rd Qu.: 5320
#> Max. :2025 Max. :12.000 Max. :15200
plot(fraser_discharge_peak)The peak discharge plot shows the variability in monthly maximum flows, which is important for understanding flood conditions and extreme hydrological events.
That desribes the two data objects. The rest of this vignette provides example analyses that can be conducted.
The Fraser River exhibits strong seasonal discharge patterns due to its snowmelt-dominated hydrological regime:
Calculate long-term statistics of monthly means and then monthly peaks:
monthly_mean_stats <- fraser_discharge_mean %>%
group_by(month) %>%
summarise(
avg = mean(value),
min = min(value),
max = max(value)) %>%
ungroup() %>%
mutate(month_name = month.name[month])
monthly_mean_stats
#> # A tibble: 12 × 5
#> month avg min max month_name
#> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 1 952. 516. 1855. January
#> 2 2 898. 497. 2201. February
#> 3 3 900. 482. 2563. March
#> 4 4 1878. 676. 3807. April
#> 5 5 5007. 2694. 9107. May
#> 6 6 6940. 4209. 10752. June
#> 7 7 5477. 2547. 9601. July
#> 8 8 3445. 2014. 6437. August
#> 9 9 2302. 1289 4456 September
#> 10 10 1924. 924. 3458. October
#> 11 11 1632. 727. 2933 November
#> 12 12 1138. 540. 2416. December
monthly_peak_stats <- fraser_discharge_peak %>%
group_by(month) %>%
summarise(
avg = mean(value),
min = min(value),
max = max(value)) %>%
ungroup() %>%
mutate(month_name = month.name[month])
monthly_peak_stats
#> # A tibble: 12 × 5
#> month avg min max month_name
#> <dbl> <dbl> <int> <int> <chr>
#> 1 1 1313. 555 3870 January
#> 2 2 1167. 555 3210 February
#> 3 3 1182. 538 5160 March
#> 4 4 3293. 917 8240 April
#> 5 5 7251. 3840 15200 May
#> 6 6 8408. 4570 14800 June
#> 7 7 6873. 3170 11100 July
#> 8 8 4441. 2290 7650 August
#> 9 9 3030. 1610 6260 September
#> 10 10 2660. 1180 5320 October
#> 11 11 2393. 912 5370 November
#> 12 12 1651. 694 4210 DecemberNow plot the average seasonal cycle
par(mfrow = c(2, 1))
y_lim = c(0,
max(c(monthly_mean_stats$avg, monthly_peak_stats$avg)))
plot(monthly_mean_stats$month,
monthly_mean_stats$avg,
type = "l",
lwd = 2,
xlab = "Month",
ylab = "Average daily mean discharge (m³/s)",
ylim = y_lim,
main = "Average seasonal cycle - mean discharge",
xaxt = "n")
axis(1, at = 1:12, labels = month.abb)
plot(monthly_peak_stats$month,
monthly_peak_stats$avg,
type = "l",
lwd = 2,
col = "red",
xlab = "Month",
ylab = "Average peak discharge (m³/s)",
main = "Average seasonal cycle - peak discharge",
ylim = y_lim,
xaxt = "n")
axis(1, at = 1:12, labels = month.abb)fraser_discharge_mean %>%
arrange(desc(value))
#> # A tibble: 1,360 × 3
#> year month value
#> <dbl> <dbl> <dbl>
#> 1 1972 6 10752.
#> 2 1948 6 10737
#> 3 1964 6 10219.
#> 4 1967 6 9962.
#> 5 1920 7 9601.
#> 6 1997 6 9582.
#> 7 2012 6 9400.
#> 8 1921 6 9317
#> 9 2002 6 9303
#> 10 2011 6 9166.
#> # ℹ 1,350 more rows
fraser_discharge_peak %>%
arrange(desc(value))
#> # A tibble: 1,360 × 3
#> year month value
#> <dbl> <dbl> <int>
#> 1 1948 5 15200
#> 2 1948 6 14800
#> 3 1972 6 12900
#> 4 1950 6 12500
#> 5 2012 6 11700
#> 6 1964 6 11600
#> 7 1955 6 11300
#> 8 1997 6 11300
#> 9 1921 6 11100
#> 10 1955 7 11100
#> # ℹ 1,350 more rowsfraser_discharge_mean %>%
arrange(value)
#> # A tibble: 1,360 × 3
#> year month value
#> <dbl> <dbl> <dbl>
#> 1 1917 3 482.
#> 2 1912 3 485.
#> 3 1929 2 497.
#> 4 1919 3 497.
#> 5 1929 3 505.
#> 6 1913 1 516.
#> 7 1929 1 520.
#> 8 1937 2 528.
#> 9 2001 3 537.
#> 10 1928 12 540.
#> # ℹ 1,350 more rows
fraser_discharge_peak %>%
arrange(value)
#> # A tibble: 1,360 × 3
#> year month value
#> <dbl> <dbl> <int>
#> 1 1917 3 538
#> 2 1929 1 555
#> 3 1929 2 555
#> 4 1917 2 558
#> 5 1937 2 566
#> 6 1929 3 575
#> 7 1912 3 578
#> 8 1927 3 592
#> 9 1919 3 612
#> 10 2023 3 624
#> # ℹ 1,350 more rowsAnnual statistics based on the monthly means, and also the annual peak (being the maximum monthly peak each year):
annual_mean_stats <- fraser_discharge_mean %>%
group_by(year) %>%
summarise(
annual_mean = mean(value),
annual_min = min(value),
annual_max = max(value)) %>%
ungroup()
# Calculate annual peaks
annual_peak <- fraser_discharge_peak %>%
group_by(year) %>%
summarise(
annual_peak = max(value)) %>%
ungroup()
annual_summary <- annual_mean_stats %>%
left_join(annual_peak,
by = "year")
annual_summary
#> # A tibble: 114 × 5
#> year annual_mean annual_min annual_max annual_peak
#> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 1912 2702. 485. 6128 7420
#> 2 1913 2806. 516. 8282. 10300
#> 3 1914 2910. 787. 7144. 8550
#> 4 1915 2262. 585. 5021. 5800
#> 5 1916 2503. 543. 6582. 8720
#> 6 1917 2702. 482. 7880 8980
#> 7 1918 3046. 837 7971. 9770
#> 8 1919 2628. 497. 6930. 8520
#> 9 1920 3261. 648. 9601. 10800
#> 10 1921 3202. 824. 9317 11100
#> # ℹ 104 more rows
annual_summary %>% tail()
#> # A tibble: 6 × 5
#> year annual_mean annual_min annual_max annual_peak
#> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 2020 3605. 872. 8639. 10600
#> 2 2021 2957. 1157. 7643 9640
#> 3 2022 2941. 589. 8940 10400
#> 4 2023 1943. 579. 7174. 8970
#> 5 2024 2097. 763. 4230 4990
#> 6 2025 2435. 802. 5224. 6950