Preseason Moisture, Wildfires, and Smoke
November 2, 2026
Illustrative research design
Study preseason moisture and subsequent burned area on a province-year panel. Treat the relationship between burned area and U.S. smoke burden as a separate descriptive analysis.
Preseason moisture
Winter snowfall, snowmelt timing, spring drought
ERA5-Land · Drought Code · CanSWE
province × year
→ Link 1 · forecast
Seasonal burned area
NBAC
province × year
→ Link 2 · descriptive
Smoke in the eastern U.S.
Canadian-dominated person-days above 15 µg/m³
region × year
Link 1 · forecast evaluation
A province-year panel supports comparisons across places and years. Provinces still share seasonal shocks, so province-years are not independent replications.
Link 2 · descriptive context
The course smoke series covers 2006–2025. A short annual series and an extreme season require careful limits on interpretation.
Forecast geography
Define the forested provinces and territories before estimating models. Use consistent geographic units across the study period.
Smoke-source geography
Smoke can arrive from outside a selected fire region. Compare source-province evidence across episodes rather than assuming one source region for every year.
Variable in canadian_dominated_summary.csv |
What it measures |
|---|---|
pop_share_any_gt15_ca |
Share of residents in a county with at least one Canadian-dominated day above 15 µg/m³ |
days_gt15_ca_per_capita |
Canadian-dominated days above 15 µg/m³ for the average resident |
Person-days divided by the population denominator gives days per resident. Report the measure and denominator rather than treating population coverage and duration as interchangeable.
The smoke threshold
The course measure applies 15 µg/m³ to the smoke component. It is not a measure of total ambient PM2.5.
Describe Canadian-dominated county-days as the documented attribution proxy, rather than direct proof of smoke origin or inhaled exposure.
A decision supported by the forecast
Specify a user, such as an air agency or school district, and the decision that could change before the fire season.
Compare against existing seasonal outlooks and a training-only climatology. State the lead time and the information available at that time.
| Debate | Start with | Connection to the design |
|---|---|---|
| Is 2023 an outlier or a changing fire regime? | Jain et al. (2024) | Drivers of the record season |
| Do low snowpack and early melt lengthen the season? | Westerling et al. (2006); Hanes et al. (2019) | Snowmelt timing and season length |
| Dryness or temperature? | Abatzoglou and Williams (2016) | Fuel aridity and burned area |
| Is the Drought Code a seasonal predictor? | Van Wagner (1987) | Fire Weather Index components and moisture accumulation |
| What is at stake downwind? | Zhang et al. (2025) | U.S. smoke burden |
For each paper, record its design, data, finding, and relevance to a specific analysis choice.
Correlated predictors
Temperature and moisture predictors can overlap. Forecast evaluation asks whether they improve held-out predictions; it does not turn their individual coefficients into causal effects.
The Drought Code’s winter
Operational Drought Code procedures use a spring restart and an overwintering adjustment. Check the exact product’s treatment of winter before interpreting an additional snow variable (Van Wagner 1987).
Contribution statement
Identify what the existing literature forecasts, at which spatial scale and lead time. Establish any claimed gap through the literature review rather than assuming that the proposed analysis is new.
| Source | Metadata to record |
|---|---|
| ERA5-Land | Licence, variables, resolution, access date; cite Muñoz-Sabater et al. (2021) |
| CanSWE | Version, coverage, and end year; cite Vionnet et al. (2021) |
| NBAC | Release, geographic coverage, and date definitions |
| CSU smoke | Exact releases and the years supplied by each |
| Course tables | Their inputs and the course data guide as the provenance record |
Analysis units
Link 1 is a province × year panel; Link 2 is a region × year series. County-day smoke files are inputs to those analyses.
burned_area_may_sep_ha
The area of fires that started in May–September
A different quantity
The area that burned during May–September would require a different temporal measurement.
burned_area_ha as a forecast outcome.library(tidyverse)
nbac <- read_csv("wildfire_data/clean/nbac_province_year_1972_2025.csv")
stopifnot(nrow(nbac) == 13 * 54, # supplied course export
!anyDuplicated(nbac[c("prov_abbr", "year")]), # one row per province-year
!anyNA(nbac)) # check documented zeros
fire_panel <- nbac |>
mutate(prov = if_else(prov_abbr %in% c("NT", "NU"), "NT+NU", prov_abbr)) |>
summarise(burned_ha = sum(burned_area_ha),
burned_may_sep_ha = sum(burned_area_may_sep_ha),
.by = c(prov, year)) |>
filter(year >= 1989) |>
mutate(log_ba = log1p(burned_ha))Twelve units × 37 years gives 444 province-years for 1989–2025 before predictor-related exclusions. Audit the actual estimation sample after joins.
Link 2 outcome
person_days_gt15_ca, from the course region-year summary of Canadian-dominated smoke built on CSU
Robustness evidence
Include only with a defined role
Each dataset should supply a defined variable or validation check. Distinguish the smoke outcome from contextual and robustness data.
An existing Drought Code product
Copernicus supplies ERA5-based historical fire-danger indices, including Canadian Fire Weather Index components (Vitolo et al. 2020).
Check the selected product’s version, coverage, and date convention before constructing a pre-season predictor.
A small moisture extract
Begin with a documented snapshot or monthly summary of snow, precipitation, and soil moisture for a small region and period.
Label monthly averages as monthly averages. Add daily snow-off dates only after the smaller workflow is checked.
Keep API keys outside shared files and repositories. Record source versions and the exact queries used.
\[ \bar{x}_{p,y} = \frac{\sum_{g \in p} w_g \, x_{g,y}}{\sum_{g \in p} w_g} \]
\(x_{g,y}\): a moisture variable in grid cell \(g\) and year \(y\); \(p\): province; \(w_g\): the cell’s weight
Documented features
Checks on new predictors
episodes <- read_csv("wildfire_data/clean/smoke_episodes_2006_2025.csv") |>
filter(region == "Mid-Atlantic", canadian_dominated,
year %in% c(2010, 2021)) |>
mutate(window_start = start_date - 3) # illustrative transport window
firms <- read_csv("wildfire_data/clean/firms_canada_province_day_2003_2024.csv")
firms |>
inner_join(episodes, by = join_by(between(local_date, window_start, end_date))) |>
summarise(frp_mw = sum(frp_total_mw), .by = c(year, prov_abbr)) |>
mutate(share = frp_mw / sum(frp_mw), .by = year) |>
arrange(year, desc(share))A daily FRP sum combines satellite snapshots; it is not an energy total. Check whether episode windows overlap and whether the selected source region captures the relevant fire activity.
Illustrative code after constructing and auditing a province-year predictor table:
# predictors: a checked province-year table
link1 <- fire_panel |>
left_join(predictors, by = c("prov", "year"))
link1 |>
ggplot(aes(dc_may31, log_ba, color = prov)) +
geom_point(alpha = 0.7) +
geom_smooth(aes(group = 1), method = "lm", formula = y ~ x,
se = FALSE, color = "grey30") +
labs(x = "Drought Code on May 31",
y = "log(1 + burned area, ha)",
color = NULL)Exploratory evidence
A scatterplot helps inspect scale, coverage, and influential observations. Forecast skill still requires evaluation on held-out years.
Panel (a): burned area by province. Panel (b): documented county-level smoke-burden measures for the same example year.
library(sf)
provinces <- st_read("wildfire_data/clean/canada_provinces_2021.gpkg", quiet = TRUE)
provinces |>
left_join(filter(nbac, year == 2023) |> select(prov_abbr, burned_area_ha),
by = "prov_abbr") |>
ggplot() +
geom_sf(aes(fill = burned_area_ha / 1e6), color = "white", linewidth = 0.2) +
scale_fill_viridis_c(name = "Burned area, 2023\n(million ha)") +
coord_sf(crs = st_crs(3978)) +
theme_void()For panel (b), follow the course data guide’s definitions and combine the required full smoke series, attribution information, and county boundaries. Keep an unmatched observation distinct from a documented zero.
| Model | What it uses |
|---|---|
| B0 · Climatology | Each province’s mean log burned area over the training years |
| B1 · Persistence | Last year’s log burned area |
| M1 · Preseason linear model | B0 plus documented moisture features available by the forecast date |
| M2 · Machine learning | Lasso (glmnet) for correlated moisture predictors; random forest (ranger) as a nonlinear comparison |
Outcome
Consider log(1 + burned area), with an explanation of how the transformation changes the prediction target.
Severe season
A province-specific severe-season threshold should be defined using training data and then applied to the held-out observations.
Potential June 1 predictors
Future information
These belong only in a clearly labeled later-information comparison, not a June 1 forecast.
Verify release lags as well as the dates the variables describe. A retrospective reanalysis experiment does not automatically establish real-time availability.
Leave one year out
Hold out every province in the selected year. This uses the other years for training, including later years when present.
It evaluates transfer across held-out years, rather than an operational historical forecast.
Rolling origin
Train only on years before the forecast year. Hold out every province in that year.
This more closely mimics the information available when making a forecast.
Fold construction
Keep all provinces of each test year together. Use year-based inner folds for model tuning, and fit transformations and climatologies inside each training sample.
skill <- function(y, yhat, yclim) 1 - mean((y - yhat)^2) / mean((y - yclim)^2)
forecast_year <- function(t, data, train_rule) {
train <- filter(data, train_rule(year, t))
test <- filter(data, year == t)
clim <- summarise(train, clim = mean(log_ba), .by = prov)
m1 <- lm(log_ba ~ prov + dc_may31 + swe_apr1_anom + precip_spring_anom,
data = train)
test |>
left_join(clim, by = "prov") |>
mutate(pred_m1 = predict(m1, newdata = test))
}
loyo <- map(1989:2025, forecast_year, data = link1,
train_rule = \(yr, t) yr != t) |> list_rbind()
rolling <- map(2000:2025, forecast_year, data = link1,
train_rule = \(yr, t) yr < t) |> list_rbind()
bind_rows(loyo = loyo, rolling = rolling, .id = "design") |>
summarise(skill_m1 = skill(log_ba, pred_m1, clim), .by = design)This is a template for a checked analysis table. Define predictor timing and anomalies, handle incomplete cases explicitly, and verify that each held-out province appears in training.
\[ \text{Skill} = 1 - \frac{\text{MSE}_{\text{model}}}{\text{MSE}_{\text{climatology}}} \]
Primary metric
Skill relative to climatology on the stated outcome scale. Positive values indicate lower MSE than the baseline.
Ranking seasons
Spearman correlation between predicted and observed burned area
Severe-season probabilities
Brier score for probability forecasts, with a stated event definition
Interpretation
Correlated predictors can help forecasts while complicating coefficient interpretation. Predictive performance alone does not establish a causal effect of an individual moisture variable.
Limits
Useful displays
This link supplies descriptive context for downwind consequences. Keep its claims separate from the evaluated moisture-to-burned-area forecast.
Data and evaluation risks
Choices to record in advance
Data preparation
Acquire a small documented extract, construct province-level predictors, check coverage against CanSWE, and produce a descriptive figure and map.
Baselines
Compare climatology, persistence, and the pre-season linear model using clearly distinguished year-based evaluation designs.
Descriptive context
Compare source provinces and smoke products for selected years and episodes.
Model extension
Evaluate a justified machine-learning comparison and explain whether it improves the stated metric.
Data
Which predictors and releases could have been available at the proposed forecast date?
Results
What conclusion follows if the model does not improve on climatology?
Policy
Which decision could change because of an early-season forecast, and what evidence would justify that change?