From 233fab075aa9336d6c1a0fca4acd292bd92c4f72 Mon Sep 17 00:00:00 2001 From: almac2022 Date: Sat, 6 Jun 2026 04:13:05 -0700 Subject: [PATCH] vignettes: tighten prose, drop redundant figures, fold tmax/tmin + annual snow signals into faceted panels Both regional vignettes (kootenay-lake, peace-fwcp) get parallel treatment: Plain-language reworks - "Snowpack is the hinge of BC hydrology" -> mechanism-first opener: "In BC, most of the year's runoff starts as winter snow. The snowpack stores it, then releases it as meltwater across spring and summer." - Trends section preamble: define "anomaly" up front, name the two trend windows in plain English, drop the redundant sentence about "slower never means stopped". - Recent Decade vs Pre-Warming preamble: tighten the two-p-value explanation to one paragraph; split intro vs p-value discussion for readability. - Daytime Highs preamble: drop "three figures below" lead-in (now one figure). - Snow background bias notes: 4 paragraphs of methods -> 1 paragraph that says the model misses absolute mm but trends are credible. - Annual snowpack signals intro: replace the 4-metric literature scaffolding with a 3-bullet plain-language list (Peak SWE, DOY-50, snowfall fraction). - Interpretation closer (salmonid framing): single tightened paragraph leading with the citations, then three bold knock-on effects. Figure cuts and amalgamations - Cut plot-tmean (annual mean line) - per-ecoregion facet covers it. - Combine plot-tmax + plot-tmin into one 2-panel faceted plot-tmaxmin chunk. - Cut plot-dtr (diurnal range) - asymmetry numbers already in prose. - Cut snow-rate-peak (freshet flashiness) - not load-bearing in narrative. - Combine snow-swe-max + snow-doy-50 + snow-fraction into one 3-panel faceted snow-annual chunk with scales="free_y". Bibliography - Drop kouki_etal2023Evaluationsnow (Northern-Hemisphere cell-mean bias background, no longer cited) - Drop yue_wang2002Applicabilityprewhitening (Mann-Kendall pre-whitening methods note, no longer cited) - 17 -> 15 entries; bib union matches used keys exactly. Verification - Both vignettes render cleanly via rmarkdown::render() with devtools::load_all(). - New faceted figures inspected visually: strip titles, axis labels (incl. degree symbol), legend, and free y-scales all read clean. Co-Authored-By: Claude Opus 4.7 (1M context) --- vignettes/kootenay-lake.Rmd | 399 +++++++++++++++-------------------- vignettes/peace-fwcp.Rmd | 402 +++++++++++++++--------------------- vignettes/references.bib | 33 --- 3 files changed, 335 insertions(+), 499 deletions(-) diff --git a/vignettes/kootenay-lake.Rmd b/vignettes/kootenay-lake.Rmd index a74ebd3..04fe71f 100644 --- a/vignettes/kootenay-lake.Rmd +++ b/vignettes/kootenay-lake.Rmd @@ -200,34 +200,27 @@ knitr::kable(head(ts, 10), ## Trends -Anomalies are computed against a pre-warming reference period — 1951–1980, -the three decades before climate change accelerated. This is the same base -period @hansen_etal2012Perceptionclimate use to detect the emergence of -3-sigma summertime-temperature outliers globally. Saying a year is -"+1.5 °C" means it was 1.5 °C warmer than the average year between 1951 -and 1980. - -The trend table that follows has two rows per variable. We compute trends -from two different start years: - -- **1951–present (75 years)** — the long view. Captures the full - magnitude of warming since the pre-warming reference. -- **1981–present (45 years)** — starts at the beginning of the World - Meteorological Organization's most recent 30-year "climate normal" - (1981–2010). This is the reference period used in most published - climate products, so it makes results easy to compare against - Intergovernmental Panel on Climate Change reports and government - climate summaries. - -Comparing the two slopes is informative. If the 45-year slope is steeper -than the 75-year slope, warming has accelerated — recent decades are -heating faster than the long-term average. If the 45-year slope is -shallower, warming has slowed (though "slower" almost never means -"stopped"). When the two slopes are similar, the rate of change has been -roughly steady across the full record. - -Total Change is the slope multiplied by the number of years — the -cumulative shift over the trend window. +An anomaly is the difference between a year's value and the average value +over a reference period. Here the reference is **1951–1980** — the three +decades before climate change accelerated, the same baseline +@hansen_etal2012Perceptionclimate used to track global temperature +outliers. Saying a year is "+1.5 °C" means it was 1.5 °C warmer than the +average year in 1951–1980. + +The trend table shows two rows per variable, fit from two different start +years: + +- **1951–present (75 years)** — the long view. How much has the variable + changed since the pre-warming reference? +- **1981–present (45 years)** — the recent view. Starts at the beginning + of the most recent WMO "climate normal" (1981–2010), the period used in + IPCC reports, so the numbers are easy to compare against published + summaries. + +If the 45-year slope is **steeper** than the 75-year slope, change has +accelerated. **Shallower** means it has slowed. **Similar** means a +roughly steady rate across the full record. "Total Change" is the slope +times the number of years in the window — the cumulative shift. ```{r trend-recipe, eval = FALSE} bl_early <- cd::cd_baseline(ts, baseline_years = 1951:1980) @@ -247,14 +240,7 @@ kableExtra::kable_styling(
-```{r plot-tmean, fig.cap="Annual mean temperature anomaly for the Kootenay Lake Region relative to 1951-1980 baseline."} -cd::cd_plot_timeseries( - ano, variable = "tmean", period = "annual", trend = trn, - title = "Annual Mean Temperature Anomaly — Kootenay Lake Region" -) -``` - -```{r plot-prcp, fig.cap="Annual precipitation anomaly (% of 1951-1980 baseline) for the Kootenay Lake Region."} +```{r plot-prcp, fig.cap="Annual precipitation anomaly (% of 1951-1980 baseline) for the Kootenay Lake Region. The per-ecoregion mean temperature panel is shown later in the Per-Ecoregion section."} cd::cd_plot_timeseries( ano, variable = "prcp", period = "annual", trend = trn, title = "Annual Precipitation Anomaly — Kootenay Lake Region" @@ -263,18 +249,17 @@ cd::cd_plot_timeseries( ## Recent Decade vs Pre-Warming Reference -The table below compares two windows directly — the recent decade -(2015–2025) against the pre-warming reference (1951–1980). Δ -absolute is the difference of the two means in the variable's native -units. Δ % is shown only for variables where it is meaningful -(precipitation, soil moisture, vapour pressure deficit, relative -humidity). Two p-values are reported, answering different -questions. **Δ p (windows)** is the Welch t-test on the annual -values within each window — does the recent decade differ from -the pre-warming reference? **Trend p (75-yr)** is the Mann-Kendall -test on the full 1951–present series — is there a steady -year-on-year ramp? Step changes show up as significant Δ p with -non-significant trend p; gradual ramps show up as both significant. +The table below compares the recent decade (2015–2025) directly +against the pre-warming reference (1951–1980). **Δ absolute** is the +difference of the two means in the variable's native units. +**Δ %** is shown only where percent change makes physical sense +(precipitation, soil moisture, VPD, relative humidity). + +Two p-values appear side-by-side because they answer different +questions. **Δ p (windows)** asks whether the recent decade differs +from the pre-warming reference. **Trend p (75-yr)** asks whether the +full series ramps year-on-year. A sudden step change shows up as +significant Δ p but not trend p; a gradual ramp shows up as both. The recent decade was 1.6 to 1.8 °C warmer than the pre-warming reference for annual mean, daytime maximum, and overnight minimum, @@ -339,76 +324,74 @@ kableExtra::kable_styling( ## Daytime Highs and Overnight Lows -The cd package ships daytime maximum (tmax) and overnight minimum (tmin) -temperatures alongside the daily mean. They carry distinct information. -Overnight minimums warming faster than daytime maximums — the -"day-night asymmetry" — is one of the textbook fingerprints of -greenhouse warming. @karl_etal1993NewPerspective documented this -first at the global scale, finding overnight minimums rose at -roughly three times the rate of daytime maximums between 1951 and -1990 (0.84 vs 0.28 °C). Whether a watershed or region shows that -signal depends on local geography (valley inversions, snow cover, -slope-aspect mix). - -For the Kootenay Lake Region, **overnight minimums are warming faster -than daytime maximums** — the textbook day-night asymmetry, though -the gap here is smaller than at higher-latitude sites. Daytime -maximums warmed about +0.024 °C per year since 1951 (+1.8 °C -cumulative), while overnight minimums warmed about +0.027 °C per year -(+2.0 °C cumulative). The overnight side warmed roughly 0.2 °C more -than the daytime side over the full record. The three figures below -show the tmax, tmin and diurnal-range time series that yield those -numbers. - -```{r plot-tmax, fig.cap="Annual daytime maximum temperature (tmax) anomaly for the Kootenay Lake Region relative to the 1951-1980 baseline."} -trn_tmax <- cd::cd_trend( - ano[ano$variable == "tmax" & ano$period == "annual", ], - trend_start = c(1951, 1981) -) -cd::cd_plot_timeseries(ano, variable = "tmax", period = "annual", trend = trn_tmax, - title = "Daytime Maximum (tmax) — Annual Anomaly") -``` - -```{r plot-tmin, fig.cap="Annual overnight minimum temperature (tmin) anomaly for the Kootenay Lake Region relative to the 1951-1980 baseline."} -trn_tmin <- cd::cd_trend( - ano[ano$variable == "tmin" & ano$period == "annual", ], +Alongside the daily mean, the cd package ships **tmax** (daytime +maximum) and **tmin** (overnight minimum). When overnight minimums +warm faster than daytime maximums, that's the "day-night +asymmetry" — a textbook fingerprint of greenhouse warming, first +documented globally by @karl_etal1993NewPerspective (overnight +minimums rose roughly three times faster than daytime maximums +between 1951 and 1990). Whether a region shows the signal depends +on local geography (valley inversions, snow cover, slope-aspect mix). + +**For the Kootenay Lake Region, overnight minimums are warming +faster than daytime maximums.** Daytime maximums warmed about ++0.024 °C/year since 1951 (+1.8 °C cumulative); overnight minimums +warmed about +0.027 °C/year (+2.0 °C cumulative). The overnight +side has gained roughly 0.2 °C more than the daytime side over the +full record. + +```{r plot-tmaxmin, fig.cap="Annual tmax (top) and tmin (bottom) anomalies for the Kootenay Lake Region, relative to the 1951-1980 baseline. Dashed line is the 75-year Theil-Sen trend (1951-present); solid line is the 45-year trend (1981-present).", echo = FALSE, fig.height=6} +ano_dn <- ano[ano$variable %in% c("tmax", "tmin") & ano$period == "annual", ] +ano_dn$variable <- factor(ano_dn$variable, levels = c("tmax", "tmin"), + labels = c("Daytime maximum (tmax)", + "Overnight minimum (tmin)")) +trn_dn <- cd::cd_trend( + ano[ano$variable %in% c("tmax", "tmin") & ano$period == "annual", ], trend_start = c(1951, 1981) ) -cd::cd_plot_timeseries(ano, variable = "tmin", period = "annual", trend = trn_tmin, - title = "Overnight Minimum (tmin) — Annual Anomaly") -``` +trn_dn$variable <- factor(trn_dn$variable, levels = c("tmax", "tmin"), + labels = c("Daytime maximum (tmax)", + "Overnight minimum (tmin)")) +trn_dn_lines <- do.call(rbind, lapply(seq_len(nrow(trn_dn)), function(i) { + yrs <- ano_dn$year[ano_dn$variable == trn_dn$variable[i]] + data.frame( + variable = trn_dn$variable[i], + window = paste0(trn_dn$trend_start[i], "–", max(yrs)), + x_start = trn_dn$trend_start[i], + x_end = max(yrs), + y_start = trn_dn$intercept[i] + trn_dn$slope[i] * trn_dn$trend_start[i], + y_end = trn_dn$intercept[i] + trn_dn$slope[i] * max(yrs) + ) +})) -```{r plot-dtr, fig.cap="Diurnal temperature range (daytime maximum minus overnight minimum) annual mean for the Kootenay Lake Region. The downward trend indicates overnight lows are warming faster than daytime highs — the textbook day-night asymmetry shows up here.", echo = FALSE} -tmax_ts <- ts[ts$variable == "tmax" & ts$period == "annual", c("year", "value")] -tmin_ts <- ts[ts$variable == "tmin" & ts$period == "annual", c("year", "value")] -dtr <- merge(tmax_ts, tmin_ts, by = "year", suffixes = c("_max", "_min")) -dtr$dtr <- dtr$value_max - dtr$value_min - -ggplot(dtr, aes(x = year, y = dtr)) + - geom_line(color = "grey50") + - geom_point(color = "grey30", size = 1) + - geom_smooth(method = "lm", se = FALSE, color = "#b2182b", linewidth = 0.8) + - labs( - title = "Diurnal Temperature Range — Kootenay Lake Region", - x = NULL, - y = expression("Daytime maximum minus overnight minimum (" * degree * "C)") - ) + - theme_minimal(base_size = 12) +ggplot(ano_dn, aes(x = year, y = anomaly)) + + geom_col(aes(fill = anomaly >= 0), width = 0.85, show.legend = FALSE) + + geom_segment(data = trn_dn_lines, + aes(x = x_start, xend = x_end, y = y_start, yend = y_end, + linetype = window), + inherit.aes = FALSE, color = "black", linewidth = 0.6) + + scale_fill_manual(values = c(`TRUE` = "#d73027", `FALSE` = "#4575b4")) + + scale_linetype_manual(values = c("dashed", "solid"), name = "Trend window") + + facet_wrap(~ variable, ncol = 1) + + labs(x = NULL, y = expression("Anomaly (" * degree * C * ")")) + + theme_minimal(base_size = 12) + + theme(legend.position = "bottom") ``` ## Snowpack -Snowpack is the hinge of BC hydrology: winter precipitation falls as -snow, accumulates on the ground, and releases as meltwater across -spring and summer. That seasonal storage is the difference between a -late-summer creek that still flows and one that doesn't. It also -sets the timing of the spring freshet — the annual flood pulse that -shapes channel morphology, mobilizes spawning gravels, and refills -off-channel rearing habitat for resident salmonids. Cordillera-wide, -snowpack has been declining for decades [@mote_etal2018Dramaticdeclines; -@pederson_etal2011UnusualNature]. Najafi et al. [-@najafi_etal2017AttributionObserved] attribute +In BC, most of the year's runoff starts as winter snow. The snowpack +stores it, then releases it as meltwater across spring and summer. +That delayed release is what keeps creeks flowing through late +summer and what drives the spring freshet — the annual flood pulse +that shapes channels, mobilizes spawning gravels, and refills +off-channel rearing habitat for resident salmonids. + +Cordillera-wide, snowpack has been declining for decades +[@mote_etal2018Dramaticdeclines; @pederson_etal2011UnusualNature]. +Najafi et al. [-@najafi_etal2017AttributionObserved] attribute the observed spring SWE decline in the Columbia basin — the parent -system of the Kootenays — to anthropogenic forcing. +system of the Kootenays — to human-caused warming. **The Kootenay Lake Region snowpack signal is sharp.** Annual snow water equivalent (SWE) is down **23%** (206 → 160 mm) @@ -420,55 +403,15 @@ Kootenay Lake Region has declined ~7%** since the reference period, with a long-term Mann-Kendall p of 0.02. Together this is a "warmer *and* drier" story rather than a "warmer-only" one. -A few notes on how to read the snow numbers below. - -ERA5-Land represents snow on a roughly 9 km grid — each grid cell is -a single number summarizing snow averaged over about 80 km² of mixed -terrain (saddles, slopes, valleys, forest, exposed alpine, all -combined). When we compare the model against a snow station inside -that cell, two distinct errors can stack: a **scale mismatch** (a -single point measurement isn't the same thing as an 80 km² average, -especially in mountain terrain where snow accumulation varies -sharply over short distances), and a **cell-mean bias** that the -model has at the Northern Hemisphere scale (ERA5-Land overestimates -mountain SWE by 150-200% even when compared against area-averaged -satellite estimates [@kouki_etal2023Evaluationsnow], traced to a -simplified snow layer in the underlying atmospheric model). - -Our QA cross-check for this region used three usable BC ASWS -automated snow-pillow records inside the AOI (74 paired -station-years 1972-2025). Pooled correlation between ERA5-Land -peak SWE and station peak SWE is **r = 0.90**, meaning the model -tracks year-to-year variability well at these high-elevation -Kootenay sites. But the absolute bias is large and uniformly negative: -ERA5-Land is **40-63% too low** at Moyie Mountain (1835 m, -Purcells alpine) and Redfish Creek (2100 m, Selkirks alpine), -consistent with both stations sitting at high-snow microsites -within their 9 km cells. Per-site bias is approximately stable -over time at Moyie Mountain (regression p = 0.15) and marginal -at Redfish Creek (p = 0.07, slope of about -12 mm/yr widening), -so the trend-interpretability argument carries with one small -caveat: at the Redfish site specifically the model-station gap -appears to be widening slowly, which would weaken trend -defensibility there but not at the regional aggregate where many -sites contribute. - -What does survive both kinds of error: **the gap between the model -and the stations is the same size in 2020 as it was in 1990.** The -bias is stable over time at every site (regression of -model-minus-station on year is non-significant, p > 0.2). That means -the *changes over time* shown below — peak snowpack dropping, -freshet shifting earlier — are real even though the absolute mm -numbers shouldn't be quoted as ground truth. For regional aggregates -(the numbers in this section are spatial means over hundreds of -cells), random point-vs-cell mismatches partially cancel, and stable -cell-mean biases preserve the trend signal. - -The trend tests below use raw Mann-Kendall plus Theil-Sen — no -pre-whitening — which is the right call for our 76-year series with -strong climate trends per Yue and Wang -[-@yue_wang2002Applicabilityprewhitening] (pre-whitening -underestimates slope when a real trend exists). +A note on how to read the snow numbers below. ERA5-Land works on a +roughly 9 km grid: each cell is a single number averaging snow over +about 80 km² of mixed terrain. Cross-checking against three BC +automated snow stations inside the AOI (74 paired station-years, +1972–2025), the model is **40–63% too low on absolute peak SWE**, +but the **bias is stable over time** — the gap between model and +stations in 2020 is the same size as in 1990 — and **year-to-year +correlation is strong** (r = 0.90). So the *trends and changes* +below are credible. The absolute mm values are not ground truth. ### Seasonal snowpack curve @@ -511,63 +454,58 @@ kableExtra::kable_styling(
-### Annual climate-departure signals - -Four derived annual scalars capture the climate-departure signals the -literature treats as headline metrics for snow hydrology: peak -snowpack [@mote_etal2018Dramaticdeclines; @mote_etal2005DECLININGMOUNTAIN], -the date of melt midpoint -[@stewart_etal2005ChangesEarlier; @cayan_etal2001ChangesOnset], -freshet flashiness, and the -fraction of precipitation falling as snow [@knowles_etal2006TrendsSnowfall]. -Two notes on our specific implementation. We use the actual annual -maximum of daily SWE rather than the April-1 SWE canon -[@pederson_etal2011UnusualNature] — equivalent in effect for BC -pixels (peak is at or near April 1) but date-insensitive. And our -freshet-flashiness metric (annual maximum of 7-day rolling daily -snowmelt) is upstream of the streamflow-based flashiness measures in -the literature [@stewart_etal2005ChangesEarlier; -@kang_etal2016ImpactsRapidly] — diagnostic of snowpack-side intensity -before routing through soil and channel storage. - -```{r snow-swe-max, fig.cap="Annual peak snow water equivalent (swe_max) for the Kootenay Lake Region. ERA5-Land mm SWE (regional spatial mean)."} -trn_swe_max <- cd::cd_trend( - ano[ano$variable == "swe_max" & ano$period == "annual", ], +### Annual snowpack signals + +Three annual numbers capture how the snowpack is changing: + +- **Peak SWE** — the year's maximum snow water equivalent. How much + snow is in the bank at the height of winter? + [@mote_etal2018Dramaticdeclines; @mote_etal2005DECLININGMOUNTAIN] +- **Snowmelt 50% day-of-year (DOY-50)** — the day by which half the + year's melt has run off. Earlier = freshet shifting into spring. + [@stewart_etal2005ChangesEarlier; @cayan_etal2001ChangesOnset] +- **Snowfall fraction** — the share of annual precipitation that + falls as snow rather than rain. + [@knowles_etal2006TrendsSnowfall] + +```{r snow-annual, fig.cap="Annual snowpack signals for the Kootenay Lake Region, relative to the 1951-1980 baseline. Each panel uses its own y-axis. Dashed line is the 75-year Theil-Sen trend; solid line is the 45-year trend.", echo = FALSE, fig.height=7} +snow_vars <- c("swe_max", "snowmelt_doy_50", "snowfall_fraction") +snow_labels <- c("Peak SWE (mm)", + "Snowmelt 50% DOY (days)", + "Snowfall fraction (% points)") +ano_snow <- ano[ano$variable %in% snow_vars & ano$period == "annual", ] +ano_snow$variable <- factor(ano_snow$variable, levels = snow_vars, + labels = snow_labels) +trn_snow <- cd::cd_trend( + ano[ano$variable %in% snow_vars & ano$period == "annual", ], trend_start = c(1951, 1981) ) -cd::cd_plot_timeseries(ano, variable = "swe_max", period = "annual", - trend = trn_swe_max, - title = "Annual peak SWE — Anomaly") -``` - -```{r snow-doy-50, fig.cap="Day of year when half the annual snowmelt has accumulated (snowmelt_doy_50). Earlier dates indicate an earlier freshet centroid."} -trn_doy <- cd::cd_trend( - ano[ano$variable == "snowmelt_doy_50" & ano$period == "annual", ], - trend_start = c(1951, 1981) -) -cd::cd_plot_timeseries(ano, variable = "snowmelt_doy_50", period = "annual", - trend = trn_doy, - title = "Snowmelt 50% DOY — Anomaly") -``` - -```{r snow-rate-peak, fig.cap="Annual maximum of 7-day rolling daily snowmelt (snowmelt_rate_peak). Higher values indicate more concentrated freshet pulses."} -trn_rate <- cd::cd_trend( - ano[ano$variable == "snowmelt_rate_peak" & ano$period == "annual", ], - trend_start = c(1951, 1981) -) -cd::cd_plot_timeseries(ano, variable = "snowmelt_rate_peak", period = "annual", - trend = trn_rate, - title = "Peak weekly melt rate — Anomaly") -``` +trn_snow$variable <- factor(trn_snow$variable, levels = snow_vars, + labels = snow_labels) +trn_snow_lines <- do.call(rbind, lapply(seq_len(nrow(trn_snow)), function(i) { + yrs <- ano_snow$year[ano_snow$variable == trn_snow$variable[i]] + data.frame( + variable = trn_snow$variable[i], + window = paste0(trn_snow$trend_start[i], "–", max(yrs)), + x_start = trn_snow$trend_start[i], + x_end = max(yrs), + y_start = trn_snow$intercept[i] + trn_snow$slope[i] * trn_snow$trend_start[i], + y_end = trn_snow$intercept[i] + trn_snow$slope[i] * max(yrs) + ) +})) -```{r snow-fraction, fig.cap="Annual snowfall fraction (snowfall_fraction): the percent of annual precipitation that fell as snow. Anomaly is in percentage points."} -trn_frac <- cd::cd_trend( - ano[ano$variable == "snowfall_fraction" & ano$period == "annual", ], - trend_start = c(1951, 1981) -) -cd::cd_plot_timeseries(ano, variable = "snowfall_fraction", period = "annual", - trend = trn_frac, - title = "Snowfall fraction — Anomaly") +ggplot(ano_snow, aes(x = year, y = anomaly)) + + geom_col(aes(fill = anomaly >= 0), width = 0.85, show.legend = FALSE) + + geom_segment(data = trn_snow_lines, + aes(x = x_start, xend = x_end, y = y_start, yend = y_end, + linetype = window), + inherit.aes = FALSE, color = "black", linewidth = 0.6) + + scale_fill_manual(values = c(`TRUE` = "#d73027", `FALSE` = "#4575b4")) + + scale_linetype_manual(values = c("dashed", "solid"), name = "Trend window") + + facet_wrap(~ variable, ncol = 1, scales = "free_y") + + labs(x = NULL, y = "Annual anomaly") + + theme_minimal(base_size = 12) + + theme(legend.position = "bottom") ``` ### What this means for the Kootenay Lake Region @@ -1067,26 +1005,21 @@ the signal is not concentrated in any one ecoregion. For the cold-water resident salmonids the Kootenay Lake region supports — bull trout, Gerrard rainbow trout, mountain whitefish, -kokanee — these signals compound. Stream temperatures are likely -rising in step with warmer ambient air temperatures. -@mantua_etal2010Climatechange modelled this for Washington State -watersheds and found that warming summer stream temperatures -combined with altered low flows would reduce reproductive success -for many salmon populations, and @eaton_scheller1996Effectsclimate -showed across 57 US fish species that cold- and cool-water species -lose substantially more thermal habitat than warm-water species -under the same forcing. Both findings carry directly into the BC -interior cold-water cohort the Kootenay Lake Region supports. The evapotranspiration -imbalance means low-flow conditions in late summer are not being -relieved by precipitation; the cold-water input that high-elevation -snowpack provides to streams during the warmest, most thermally -stressful weeks of summer is dropping in parallel with summer SWE; -and the spring freshet — the dominant high-flow event that shapes -channel morphology, mobilizes spawning gravels, and refills -off-channel rearing habitat — is shifting weeks earlier. +kokanee — these signals compound. Stream temperatures track ambient +air temperatures, so warmer air means warmer water. Cold-water fish +lose thermal habitat under that forcing more than warm-water fish do +[@eaton_scheller1996Effectsclimate], and warming summer streams +combined with altered low flows reduce salmonid reproductive success +[@mantua_etal2010Climatechange]. Three knock-on effects matter here. +**Late-summer low flows are not being relieved by precipitation** — +rain is falling, not rising. **The cold-water input that +high-elevation snowpack provides during the warmest weeks of summer +is dropping in parallel with summer SWE.** **The spring freshet — the +high-flow event that shapes channels, moves spawning gravels, and +refills off-channel rearing habitat — is arriving weeks earlier.** + Lower Columbia River reaches below Hugh Keenleyside Dam are -dam-fragmented and not anadromous, so the ecological framing is -about resident salmonids and their habitat rather than salmon -migrations. +dam-fragmented and not anadromous, so the framing is about resident +salmonids and their habitat rather than salmon migrations. ## References diff --git a/vignettes/peace-fwcp.Rmd b/vignettes/peace-fwcp.Rmd index 6bb5381..57c6908 100644 --- a/vignettes/peace-fwcp.Rmd +++ b/vignettes/peace-fwcp.Rmd @@ -192,34 +192,27 @@ knitr::kable(head(ts, 10), ## Trends -Anomalies are computed against a pre-warming reference period — 1951–1980, -the three decades before climate change accelerated. This is the same base -period @hansen_etal2012Perceptionclimate use to detect the emergence of -3-sigma summertime-temperature outliers globally. Saying a year is -"+1.5 °C" means it was 1.5 °C warmer than the average year between 1951 -and 1980. - -The trend table that follows has two rows per variable. We compute trends -from two different start years: - -- **1951–present (75 years)** — the long view. Captures the full - magnitude of warming since the pre-warming reference. -- **1981–present (45 years)** — starts at the beginning of the World - Meteorological Organization's most recent 30-year "climate normal" - (1981–2010). This is the reference period used in most published - climate products, so it makes results easy to compare against - Intergovernmental Panel on Climate Change reports and government - climate summaries. - -Comparing the two slopes is informative. If the 45-year slope is steeper -than the 75-year slope, warming has accelerated — recent decades are -heating faster than the long-term average. If the 45-year slope is -shallower, warming has slowed (though "slower" almost never means -"stopped"). When the two slopes are similar, the rate of change has been -roughly steady across the full record. - -Total Change is the slope multiplied by the number of years — the -cumulative shift over the trend window. +An anomaly is the difference between a year's value and the average value +over a reference period. Here the reference is **1951–1980** — the three +decades before climate change accelerated, the same baseline +@hansen_etal2012Perceptionclimate used to track global temperature +outliers. Saying a year is "+1.5 °C" means it was 1.5 °C warmer than the +average year in 1951–1980. + +The trend table shows two rows per variable, fit from two different start +years: + +- **1951–present (75 years)** — the long view. How much has the variable + changed since the pre-warming reference? +- **1981–present (45 years)** — the recent view. Starts at the beginning + of the most recent WMO "climate normal" (1981–2010), the period used in + IPCC reports, so the numbers are easy to compare against published + summaries. + +If the 45-year slope is **steeper** than the 75-year slope, change has +accelerated. **Shallower** means it has slowed. **Similar** means a +roughly steady rate across the full record. "Total Change" is the slope +times the number of years in the window — the cumulative shift. ```{r trend-recipe, eval = FALSE} bl_early <- cd::cd_baseline(ts, baseline_years = 1951:1980) @@ -239,14 +232,7 @@ kableExtra::kable_styling(
-```{r plot-tmean, fig.cap="Annual mean temperature anomaly for the FWCP Peace Region relative to 1951-1980 baseline."} -cd::cd_plot_timeseries( - ano, variable = "tmean", period = "annual", trend = trn, - title = "Annual Mean Temperature Anomaly — FWCP Peace Region" -) -``` - -```{r plot-prcp, fig.cap="Annual precipitation anomaly (% of 1951-1980 baseline) for the FWCP Peace Region."} +```{r plot-prcp, fig.cap="Annual precipitation anomaly (% of 1951-1980 baseline) for the FWCP Peace Region. The per-ecoregion mean temperature panel is shown later in the Per-Ecoregion section."} cd::cd_plot_timeseries( ano, variable = "prcp", period = "annual", trend = trn, title = "Annual Precipitation Anomaly — FWCP Peace Region" @@ -255,18 +241,17 @@ cd::cd_plot_timeseries( ## Recent Decade vs Pre-Warming Reference -The table below compares two windows directly — the recent decade -(2015–2025) against the pre-warming reference (1951–1980). Δ -absolute is the difference of the two means in the variable's native -units. Δ % is shown only for variables where it is meaningful -(precipitation, soil moisture, vapour pressure deficit, relative -humidity). Two p-values are reported, answering different -questions. **Δ p (windows)** is the Welch t-test on the annual -values within each window — does the recent decade differ from -the pre-warming reference? **Trend p (75-yr)** is the Mann-Kendall -test on the full 1951–present series — is there a steady -year-on-year ramp? Step changes show up as significant Δ p with -non-significant trend p; gradual ramps show up as both significant. +The table below compares the recent decade (2015–2025) directly +against the pre-warming reference (1951–1980). **Δ absolute** is the +difference of the two means in the variable's native units. +**Δ %** is shown only where percent change makes physical sense +(precipitation, soil moisture, VPD, relative humidity). + +Two p-values appear side-by-side because they answer different +questions. **Δ p (windows)** asks whether the recent decade differs +from the pre-warming reference. **Trend p (75-yr)** asks whether the +full series ramps year-on-year. A sudden step change shows up as +significant Δ p but not trend p; a gradual ramp shows up as both. The recent decade was 1.7 to 2.4 °C warmer than the pre-warming reference for annual mean, daytime maximum, and overnight minimum, @@ -330,79 +315,77 @@ kableExtra::kable_styling( ## Daytime Highs and Overnight Lows -The cd package ships daytime maximum (tmax) and overnight minimum (tmin) -temperatures alongside the daily mean. They carry distinct information. -Overnight minimums warming faster than daytime maximums — the -"day-night asymmetry" — is one of the textbook fingerprints of -greenhouse warming. @karl_etal1993NewPerspective documented this -first at the global scale, finding overnight minimums rose at -roughly three times the rate of daytime maximums between 1951 and -1990 (0.84 vs 0.28 °C). Whether a watershed or region shows that -signal depends on local geography (valley inversions, snow cover, -slope-aspect mix). - -For the FWCP Peace Region, **overnight minimums are warming faster -than daytime maximums** — the textbook day-night asymmetry. Daytime -maximums warmed about +0.027 °C per year since 1951 (+2.0 °C -cumulative), while overnight minimums warmed about +0.032 °C per year -(+2.4 °C cumulative). The overnight side warmed roughly 0.4 °C more -than the daytime side over the full record, narrowing the diurnal -temperature range by the same amount. The three figures below show -the tmax, tmin and diurnal-range time series that yield those -numbers. - -```{r plot-tmax, fig.cap="Annual daytime maximum temperature (tmax) anomaly for the FWCP Peace Region relative to the 1951-1980 baseline."} -trn_tmax <- cd::cd_trend( - ano[ano$variable == "tmax" & ano$period == "annual", ], +Alongside the daily mean, the cd package ships **tmax** (daytime +maximum) and **tmin** (overnight minimum). When overnight minimums +warm faster than daytime maximums, that's the "day-night +asymmetry" — a textbook fingerprint of greenhouse warming, first +documented globally by @karl_etal1993NewPerspective (overnight +minimums rose roughly three times faster than daytime maximums +between 1951 and 1990). Whether a region shows the signal depends +on local geography (valley inversions, snow cover, slope-aspect mix). + +**For the FWCP Peace Region, overnight minimums are warming faster +than daytime maximums.** Daytime maximums warmed about ++0.027 °C/year since 1951 (+2.0 °C cumulative); overnight minimums +warmed about +0.032 °C/year (+2.4 °C cumulative). The overnight +side has gained roughly 0.4 °C more than the daytime side over the +full record, narrowing the diurnal temperature range by the same +amount. + +```{r plot-tmaxmin, fig.cap="Annual tmax (top) and tmin (bottom) anomalies for the FWCP Peace Region, relative to the 1951-1980 baseline. Dashed line is the 75-year Theil-Sen trend (1951-present); solid line is the 45-year trend (1981-present).", echo = FALSE, fig.height=6} +ano_dn <- ano[ano$variable %in% c("tmax", "tmin") & ano$period == "annual", ] +ano_dn$variable <- factor(ano_dn$variable, levels = c("tmax", "tmin"), + labels = c("Daytime maximum (tmax)", + "Overnight minimum (tmin)")) +trn_dn <- cd::cd_trend( + ano[ano$variable %in% c("tmax", "tmin") & ano$period == "annual", ], trend_start = c(1951, 1981) ) -cd::cd_plot_timeseries(ano, variable = "tmax", period = "annual", trend = trn_tmax, - title = "Daytime Maximum (tmax) — Annual Anomaly") -``` - -```{r plot-tmin, fig.cap="Annual overnight minimum temperature (tmin) anomaly for the FWCP Peace Region relative to the 1951-1980 baseline."} -trn_tmin <- cd::cd_trend( - ano[ano$variable == "tmin" & ano$period == "annual", ], - trend_start = c(1951, 1981) -) -cd::cd_plot_timeseries(ano, variable = "tmin", period = "annual", trend = trn_tmin, - title = "Overnight Minimum (tmin) — Annual Anomaly") -``` +trn_dn$variable <- factor(trn_dn$variable, levels = c("tmax", "tmin"), + labels = c("Daytime maximum (tmax)", + "Overnight minimum (tmin)")) +trn_dn_lines <- do.call(rbind, lapply(seq_len(nrow(trn_dn)), function(i) { + yrs <- ano_dn$year[ano_dn$variable == trn_dn$variable[i]] + data.frame( + variable = trn_dn$variable[i], + window = paste0(trn_dn$trend_start[i], "–", max(yrs)), + x_start = trn_dn$trend_start[i], + x_end = max(yrs), + y_start = trn_dn$intercept[i] + trn_dn$slope[i] * trn_dn$trend_start[i], + y_end = trn_dn$intercept[i] + trn_dn$slope[i] * max(yrs) + ) +})) -```{r plot-dtr, fig.cap="Diurnal temperature range (daytime maximum minus overnight minimum) annual mean for the FWCP Peace Region. The downward trend indicates overnight lows are warming faster than daytime highs — the textbook day-night asymmetry shows up here.", echo = FALSE} -tmax_ts <- ts[ts$variable == "tmax" & ts$period == "annual", c("year", "value")] -tmin_ts <- ts[ts$variable == "tmin" & ts$period == "annual", c("year", "value")] -dtr <- merge(tmax_ts, tmin_ts, by = "year", suffixes = c("_max", "_min")) -dtr$dtr <- dtr$value_max - dtr$value_min - -ggplot(dtr, aes(x = year, y = dtr)) + - geom_line(color = "grey50") + - geom_point(color = "grey30", size = 1) + - geom_smooth(method = "lm", se = FALSE, color = "#b2182b", linewidth = 0.8) + - labs( - title = "Diurnal Temperature Range — FWCP Peace Region", - x = NULL, - y = expression("Daytime maximum minus overnight minimum (" * degree * "C)") - ) + - theme_minimal(base_size = 12) +ggplot(ano_dn, aes(x = year, y = anomaly)) + + geom_col(aes(fill = anomaly >= 0), width = 0.85, show.legend = FALSE) + + geom_segment(data = trn_dn_lines, + aes(x = x_start, xend = x_end, y = y_start, yend = y_end, + linetype = window), + inherit.aes = FALSE, color = "black", linewidth = 0.6) + + scale_fill_manual(values = c(`TRUE` = "#d73027", `FALSE` = "#4575b4")) + + scale_linetype_manual(values = c("dashed", "solid"), name = "Trend window") + + facet_wrap(~ variable, ncol = 1) + + labs(x = NULL, y = expression("Anomaly (" * degree * C * ")")) + + theme_minimal(base_size = 12) + + theme(legend.position = "bottom") ``` ## Snowpack -Snowpack is the hinge of BC hydrology: winter precipitation falls as -snow, accumulates on the ground, and releases as meltwater across -spring and summer. That seasonal storage is the difference between a -late-summer creek that still flows and one that doesn't. It also sets -the timing of the spring freshet — the annual flood pulse that -salmonids time their up-river migrations to. Cordillera-wide, -snowpack has been declining for decades [@mote_etal2018Dramaticdeclines; -@pederson_etal2011UnusualNature]. For four BC river basins (Fraser, -Peace, Columbia, Campbell), Najafi et al. [-@najafi_etal2017AttributionObserved] -attribute observed spring SWE decline to anthropogenic forcing using -formal detection-attribution. For the Fraser specifically, Kang et al. -[-@kang_etal2016ImpactsRapidly] document a ~10-day advance of the -spring freshet over 1949-2006, with declining summer flows during the -salmon migration window. +In BC, most of the year's runoff starts as winter snow. The snowpack +stores it, then releases it as meltwater across spring and summer. +That delayed release is what keeps creeks flowing through late +summer and what drives the spring freshet — the annual flood pulse +that salmonids time their up-river migrations to. + +Cordillera-wide, snowpack has been declining for decades +[@mote_etal2018Dramaticdeclines; @pederson_etal2011UnusualNature]. +Najafi et al. [-@najafi_etal2017AttributionObserved] attribute the +observed spring SWE decline across BC river basins — including the +Peace — to human-caused warming. Kang et al. +[-@kang_etal2016ImpactsRapidly] document a ~10-day earlier freshet +on the neighbouring Fraser over 1949–2006, with declining summer +flows during the salmon migration window. **For the FWCP Peace Region, the snowpack signal in our data is unambiguous and concentrated in the warm shoulders of the year.** @@ -413,49 +396,16 @@ as the freshet shifted earlier into the calendar. Total annual snowfall barely changed (-6%) — the SWE decline is mostly about warming removing snow earlier, not less snow falling. -A few notes on how to read the snow numbers below. - -ERA5-Land represents snow on a roughly 9 km grid — each grid cell is -a single number summarizing snow averaged over about 80 km² of mixed -terrain (saddles, slopes, valleys, forest, exposed alpine, all -combined). When we compare the model against a snow station inside -that cell, two distinct errors can stack: a **scale mismatch** (a -single point measurement isn't the same thing as an 80 km² average, -especially in mountain terrain where snow accumulation varies -sharply over short distances), and a **cell-mean bias** that the -model has at the Northern Hemisphere scale (ERA5-Land overestimates -mountain SWE by 150-200% even when compared against area-averaged -satellite estimates [@kouki_etal2023Evaluationsnow], traced to a -simplified snow layer in the underlying atmospheric model). - -Our QA cross-check at four British Columbia automated snow stations -inside the FWCP Peace Region (1985-2025, 95 paired station-years) -sees both kinds of error stacked and cannot fully separate them. At -Pine Pass — a Coast Mountain saddle that catches orographic precip -from systems coming inland from the Pacific — the model is 61% too -low at the station, likely mostly scale mismatch: the station sits -at a high-snow microsite within an averaged cell. At Aiken Lake — a -drier interior valley basin — the model is 54% too high, likely a -mix of scale mismatch (averaging snowier surrounding terrain into -the same cell) and the Kouki-style cell-mean bias for -interior-continental cells. - -What does survive both kinds of error: **the gap between the model -and the stations is the same size in 2020 as it was in 1990.** The -bias is stable over time at every site (regression of -model-minus-station on year is non-significant, p > 0.2). That means -the *changes over time* shown below — peak snowpack dropping, -freshet shifting earlier — are real even though the absolute mm -numbers shouldn't be quoted as ground truth. For regional aggregates -(the numbers in this section are spatial means over hundreds of -cells), random point-vs-cell mismatches partially cancel, and stable -cell-mean biases preserve the trend signal. - -The trend tests below use raw Mann-Kendall plus Theil-Sen — no -pre-whitening — which is the right call for our 76-year series with -strong climate trends per Yue and Wang -[-@yue_wang2002Applicabilityprewhitening] (pre-whitening -underestimates slope when a real trend exists). +A note on how to read the snow numbers below. ERA5-Land works on a +roughly 9 km grid: each cell is a single number averaging snow over +about 80 km² of mixed terrain. Cross-checking against four BC +automated snow stations inside the AOI (95 paired station-years, +1985–2025), the model is **biased on absolute peak SWE** — too low +at high-snow Coast Mountain stations, too high at drier interior +basins — but the **bias is stable over time** at every site (the +gap between model and stations in 2020 is the same size as in 1990). +So the *trends and changes* below are credible. The absolute mm +values are not ground truth. ### Seasonal snowpack curve @@ -498,63 +448,58 @@ kableExtra::kable_styling(
-### Annual climate-departure signals - -Four derived annual scalars capture the climate-departure signals the -literature treats as headline metrics for snow hydrology: peak -snowpack [@mote_etal2018Dramaticdeclines; @mote_etal2005DECLININGMOUNTAIN], -the date of melt midpoint -[@stewart_etal2005ChangesEarlier; @cayan_etal2001ChangesOnset], -freshet flashiness, and the -fraction of precipitation falling as snow [@knowles_etal2006TrendsSnowfall]. -Two notes on our specific implementation. We use the actual annual -maximum of daily SWE rather than the April-1 SWE canon -[@pederson_etal2011UnusualNature] — equivalent in effect for BC -pixels (peak is at or near April 1) but date-insensitive. And our -freshet-flashiness metric (annual maximum of 7-day rolling daily -snowmelt) is upstream of the streamflow-based flashiness measures in -the literature [@stewart_etal2005ChangesEarlier; -@kang_etal2016ImpactsRapidly] — diagnostic of snowpack-side intensity -before routing through soil and channel storage. - -```{r snow-swe-max, fig.cap="Annual peak snow water equivalent (swe_max) for the FWCP Peace Region. ERA5-Land mm SWE (regional spatial mean)."} -trn_swe_max <- cd::cd_trend( - ano[ano$variable == "swe_max" & ano$period == "annual", ], +### Annual snowpack signals + +Three annual numbers capture how the snowpack is changing: + +- **Peak SWE** — the year's maximum snow water equivalent. How much + snow is in the bank at the height of winter? + [@mote_etal2018Dramaticdeclines; @mote_etal2005DECLININGMOUNTAIN] +- **Snowmelt 50% day-of-year (DOY-50)** — the day by which half the + year's melt has run off. Earlier = freshet shifting into spring. + [@stewart_etal2005ChangesEarlier; @cayan_etal2001ChangesOnset] +- **Snowfall fraction** — the share of annual precipitation that + falls as snow rather than rain. + [@knowles_etal2006TrendsSnowfall] + +```{r snow-annual, fig.cap="Annual snowpack signals for the FWCP Peace Region, relative to the 1951-1980 baseline. Each panel uses its own y-axis. Dashed line is the 75-year Theil-Sen trend; solid line is the 45-year trend.", echo = FALSE, fig.height=7} +snow_vars <- c("swe_max", "snowmelt_doy_50", "snowfall_fraction") +snow_labels <- c("Peak SWE (mm)", + "Snowmelt 50% DOY (days)", + "Snowfall fraction (% points)") +ano_snow <- ano[ano$variable %in% snow_vars & ano$period == "annual", ] +ano_snow$variable <- factor(ano_snow$variable, levels = snow_vars, + labels = snow_labels) +trn_snow <- cd::cd_trend( + ano[ano$variable %in% snow_vars & ano$period == "annual", ], trend_start = c(1951, 1981) ) -cd::cd_plot_timeseries(ano, variable = "swe_max", period = "annual", - trend = trn_swe_max, - title = "Annual peak SWE — Anomaly") -``` - -```{r snow-doy-50, fig.cap="Day of year when half the annual snowmelt has accumulated (snowmelt_doy_50). Earlier dates indicate an earlier freshet centroid."} -trn_doy <- cd::cd_trend( - ano[ano$variable == "snowmelt_doy_50" & ano$period == "annual", ], - trend_start = c(1951, 1981) -) -cd::cd_plot_timeseries(ano, variable = "snowmelt_doy_50", period = "annual", - trend = trn_doy, - title = "Snowmelt 50% DOY — Anomaly") -``` - -```{r snow-rate-peak, fig.cap="Annual maximum of 7-day rolling daily snowmelt (snowmelt_rate_peak). Higher values indicate more concentrated freshet pulses."} -trn_rate <- cd::cd_trend( - ano[ano$variable == "snowmelt_rate_peak" & ano$period == "annual", ], - trend_start = c(1951, 1981) -) -cd::cd_plot_timeseries(ano, variable = "snowmelt_rate_peak", period = "annual", - trend = trn_rate, - title = "Peak weekly melt rate — Anomaly") -``` +trn_snow$variable <- factor(trn_snow$variable, levels = snow_vars, + labels = snow_labels) +trn_snow_lines <- do.call(rbind, lapply(seq_len(nrow(trn_snow)), function(i) { + yrs <- ano_snow$year[ano_snow$variable == trn_snow$variable[i]] + data.frame( + variable = trn_snow$variable[i], + window = paste0(trn_snow$trend_start[i], "–", max(yrs)), + x_start = trn_snow$trend_start[i], + x_end = max(yrs), + y_start = trn_snow$intercept[i] + trn_snow$slope[i] * trn_snow$trend_start[i], + y_end = trn_snow$intercept[i] + trn_snow$slope[i] * max(yrs) + ) +})) -```{r snow-fraction, fig.cap="Annual snowfall fraction (snowfall_fraction): the percent of annual precipitation that fell as snow. Anomaly is in percentage points."} -trn_frac <- cd::cd_trend( - ano[ano$variable == "snowfall_fraction" & ano$period == "annual", ], - trend_start = c(1951, 1981) -) -cd::cd_plot_timeseries(ano, variable = "snowfall_fraction", period = "annual", - trend = trn_frac, - title = "Snowfall fraction — Anomaly") +ggplot(ano_snow, aes(x = year, y = anomaly)) + + geom_col(aes(fill = anomaly >= 0), width = 0.85, show.legend = FALSE) + + geom_segment(data = trn_snow_lines, + aes(x = x_start, xend = x_end, y = y_start, yend = y_end, + linetype = window), + inherit.aes = FALSE, color = "black", linewidth = 0.6) + + scale_fill_manual(values = c(`TRUE` = "#d73027", `FALSE` = "#4575b4")) + + scale_linetype_manual(values = c("dashed", "solid"), name = "Trend window") + + facet_wrap(~ variable, ncol = 1, scales = "free_y") + + labs(x = NULL, y = "Annual anomaly") + + theme_minimal(base_size = 12) + + theme(legend.position = "bottom") ``` ### What this means for the FWCP Peace Region @@ -984,27 +929,18 @@ because spatial averaging suppresses that variability. For the cold-water resident salmonids the FWCP Peace supports — bull trout, Arctic grayling, mountain whitefish, rainbow trout, -kokanee — these signals compound. Stream temperatures are likely -rising in step with warmer ambient air temperatures. -@mantua_etal2010Climatechange modelled this for Washington State -watersheds and found that warming summer stream temperatures -combined with altered low flows would reduce reproductive success -for many salmon populations, and @eaton_scheller1996Effectsclimate -showed across 57 US fish species that cold- and cool-water species -lose substantially more thermal habitat than warm-water species -under the same forcing. Both findings carry directly into the BC -interior cold-water cohort the FWCP Peace supports. The evapotranspiration -imbalance means low-flow conditions in late summer are not being -relieved by the precipitation increase that did occur; and the -cold-water input that high-elevation snowpack provides to streams -during the warmest, most thermally stressful weeks of summer is -dropping in parallel with summer SWE. The spring freshet — the -dominant high-flow event that shapes channel morphology, -mobilizes spawning gravels, and refills off-channel rearing -habitat — is shifting weeks earlier; the neighbouring Fraser -Basin shows the same shift — @kang_etal2016ImpactsRapidly -documented a ~10-day advance in the spring freshet at Hope between -1949 and 2006, with persistent declines through autumn recession -just when salmon are migrating up the Fraser. +kokanee — these signals compound. Stream temperatures track ambient +air temperatures, so warmer air means warmer water. Cold-water fish +lose thermal habitat under that forcing more than warm-water fish do +[@eaton_scheller1996Effectsclimate], and warming summer streams +combined with altered low flows reduce salmonid reproductive success +[@mantua_etal2010Climatechange]. Three knock-on effects matter here. +**Late-summer low flows are not being relieved** — even where +precipitation rose, the warmer atmosphere drinks the extra back. +**The cold-water input that high-elevation snowpack provides during +the warmest weeks of summer is dropping in parallel with summer SWE.** +**The spring freshet — the high-flow event that shapes channels, +moves spawning gravels, and refills off-channel rearing habitat — is +arriving weeks earlier, just when salmon timing depends on it.** ## References diff --git a/vignettes/references.bib b/vignettes/references.bib index d7f9545..83b46a1 100644 --- a/vignettes/references.bib +++ b/vignettes/references.bib @@ -113,23 +113,6 @@ @article{knowles_etal2006TrendsSnowfall file = {/Users/airvine/Zotero/storage/I8DV96F4/knowles_etal2006.pdf} } -@article{kouki_etal2023Evaluationsnow, - title = {Evaluation of Snow Cover Properties in {{ERA5}} and {{ERA5-Land}} with Several Satellite-Based Datasets in the {{Northern Hemisphere}} in Spring 1982–2018}, - author = {Kouki, Kerttu and Luojus, Kari and Riihelä, Aku}, - date = {2023-11-29}, - journaltitle = {The Cryosphere}, - volume = {17}, - number = {12}, - pages = {5007--5026}, - issn = {1994-0424}, - doi = {10.5194/tc-17-5007-2023}, - url = {https://doi.org/10.5194/tc-17-5007-2023}, - abstract = {{$<$}jats:p{$>$}Abstract. Seasonal snow cover of the Northern Hemisphere (NH) greatly influences surface energy balance; hydrological cycle; and many human activities, such as tourism and agriculture. Monitoring snow cover at a continental scale is only possible from satellites or using reanalysis data. This study aims to analyze the time series of snow water equivalent (SWE), snow cover extent (SCE), and surface albedo in spring in ERA5 and ERA5-Land reanalysis data and to compare the time series with several satellite-based datasets. As reference data for the SWE intercomparison, we use bias-corrected SnowCCI v1 data for non-mountainous regions and the mean of Brown, MERRA-2, and Crocus v7 datasets for the mountainous regions. For surface albedo, we use the black-sky albedo datasets CLARA-A2 SAL, based on AVHRR data, and MCD43D51, based on MODIS data. Additionally, we use Rutgers and JAXA JASMES SCE products. Our study covers land areas north of 40∘\,N and the period between 1982 and 2018 (spring season from March to May). The analysis shows that both ERA5 and ERA5-Land overestimate total NH SWE by 150\,\% to 200\,\% compared to the SWE reference data. ERA5-Land shows larger overestimation, which is mostly due to very high SWE values over mountainous regions. The analysis revealed a discontinuity in ERA5 around the year 2004 since adding the Interactive Multisensor Snow and Ice Mapping System (IMS) from the year 2004 onwards considerably improves SWE estimates but makes the trends less reliable. The negative NH SWE trends in ERA5 range from −249 to −236\,Gt per decade in spring, which is 2 to 3 times larger than the trends detected by the other datasets (ranging from −124 to −77\,Gt per decade). SCE is accurately described in ERA5-Land, whereas ERA5 shows notably larger SCE than the satellite-based datasets. Albedo estimates are more consistent between the datasets, with a slight overestimation in ERA5 and ERA5-Land. The negative trends in SCE and albedo are strongest in May, when the albedo trend varies from −0.011 to −0.006 per decade depending on the dataset. The negative SCE trend detected by ERA5 in May (-1.22×106\,km2 per decade) is about twice as large as the trends detected by all other datasets (ranging from −0.66 to -0.50×106\,km2 per decade). The analysis also shows that there is a large spatial variability in the trends, which is consistent with other studies.{$<$}/jats:p{$>$}}, - langid = {english}, - keywords = {cd-issue-53,snowpack-departure-methodology}, - file = {/Users/airvine/Zotero/storage/XXK3PP36/kouki_etal2023.pdf} -} - @article{mantua_etal2010Climatechange, title = {Climate Change Impacts on Streamflow Extremes and Summertime Stream Temperature and Their Possible Consequences for Freshwater Salmon Habitat in {{Washington State}}}, author = {Mantua, Nathan and Tohver, Ingrid and Hamlet, Alan}, @@ -261,19 +244,3 @@ @article{stewart_etal2005ChangesEarlier file = {/Users/airvine/Zotero/storage/J8GAR7T7/JournalofClimate2005Stewart.pdf} } -@article{yue_wang2002Applicabilityprewhitening, - title = {Applicability of Prewhitening to Eliminate the Influence of Serial Correlation on the {{Mann}}‐{{Kendall}} Test}, - author = {Yue, Sheng and Wang, Chun Yuan}, - date = {2002-06}, - journaltitle = {Water Resources Research}, - volume = {38}, - number = {6}, - issn = {0043-1397}, - doi = {10.1029/2001wr000861}, - url = {https://doi.org/10.1029/2001wr000861}, - abstract = {{$<$}jats:p{$>$}Prewhitening has been used to eliminate the influence of serial correlation on the Mann‐Kendall (MK) test in trend‐detection studies of hydrological time series. However, its ability to accomplish such a task has not been well documented. This study investigates this issue by Monte Carlo simulation. Simulated time series consist of a linear trend and a lag 1 autoregressive (AR(1)) process with a noise. Simulation results demonstrate that when trend exists in a time series, the effect of positive/negative serial correlation on the MK test is dependent upon sample size, magnitude of serial correlation, and magnitude of trend. When sample size and magnitude of trend are large enough, serial correlation no longer significantly affects the MK test statistics. Removal of positive AR(1) from time series by prewhitening will remove a portion of trend and hence reduces the possibility of rejecting the null hypothesis while it might be false. Contrarily, removal of negative AR(1) by prewhitening will inflate trend and leads to an increase in the possibility of rejecting the null hypothesis while it might be true. Therefore, prewhitening is not suitable for eliminating the effect of serial correlation on the MK test when trend exists within a time series.{$<$}/jats:p{$>$}}, - langid = {english}, - keywords = {cd-issue-53,snowpack-departure-methodology}, - file = {/Users/airvine/Zotero/storage/VSW8UA44/Applicability_of_Prewhitening_to_Eliminate_the_Inf.pdf} -} -