RAINBOWSTATS™ · COLUMBIA RIVER STUDY, PART TWO

A River Has a Memory

Warmer air, warmer water, migrating salmon—and why the observations refuse to forget yesterday.

Run the complete RainbowStats study →

In “Remembering the River,” I described how reading Jason Dove Mark’s The Earth Said Remember Me during two weeks in Wisconsin’s Northwoods prompted me to add ecological data to RainbowStats. Our first exercise examined Chinook passage at Bonneville Dam. Temperature, outflow, spill and seasonal controls explained part of the daily record. What they left behind was strikingly persistent.

A day with more fish than the model expected tended to be followed by another such day. We tried modeling that persistence. It remained. At some point, another regression becomes a distraction from the river itself.

My working conclusion is this: we should expect dependence in biological life cycles, appreciate what it represents, and account for it when making statistical claims. A migration does not restart each morning. Neither does a reservoir, a warm spell or a seasonal run.

This follow-up expands the view to Bonneville, McNary and Lower Granite. We connect air temperature to water temperature, introduce distance and migration delays, estimate three equations together, and examine shared rhythms with spectral analysis. The result is a clearer account of what the data say—and what they do not.

Warmer air accompanies warmer water

The most accessible finding is also the least surprising. Warm air and warm water go together. That observation is worth documenting because water temperature is part of the environment through which salmon must migrate.

The script retrieves air temperatures from EPA’s Air Quality System at Hermiston Municipal Airport in Oregon. AQS includes meteorological observations as well as pollution measurements. We convert the reported Fahrenheit temperatures to Celsius and compare them with DART water temperatures at our three dams. Hermiston is a regional weather proxy; it is not a local air station at each dam.

Figure 1. Daily mean air and water temperatures, June–August 2024. Each panel contains 92 paired daily observations and a fitted straight line. These descriptive fits include shared seasonality and serial dependence; the lines are not estimates of a causal response to changing climate. Open SVG

The daily plots contain more than an immediate response to the weather. Both air and water move through the summer season, and the river retains heat. A cluster of warm days is not a collection of independent experiments. To look beyond the daily seasonal progression, we also compare summer averages across years.

Our supplementary calculation identifies 13 years between 2007 and 2024 with complete June–August air and water records: 92 days in each summer. Across those years, the air–water correlations are 0.863 at Bonneville, 0.847 at McNary and 0.803 at Lower Granite. Warmer summers in the regional air record generally coincide with warmer summers in the water record.

Figure 2. Each point represents one complete paired summer, rather than one day. These 13-summer summaries supplement the saved slideshow: the script reports their correlations in text, while the accompanying Python calculation and input snapshots reproduce this figure. Open SVG

That is a stronger comparison than simply observing that July is warmer than June. It is still an association. Air temperature shares influences with cloud cover, radiation, runoff and other conditions; reservoir operations also matter. We have not isolated an air-temperature treatment or estimated the share of warming caused by any single influence.

A warming atmosphere changes the river’s setting

There is a broader reason to take the air–water relationship seriously. EPA’s 2020 Columbia and Snake River temperature assessment identifies rising air temperatures as an important driver of water-temperature increases. Its analysis for 1970–2016 estimated annual air-temperature increases of about 0.21°C per decade at Portland, 0.22°C at Lewiston and 0.25°C at Yakima. Those are historical regional estimates from EPA, not trends estimated from our Hermiston sample. [1]

Air temperature is an indicator of a changing heat environment, not a complete river heat budget. Radiation, evaporation, inflowing water, snowmelt, groundwater and water storage affect how atmospheric conditions translate into river temperatures. A warmer atmosphere can increase thermal pressure while particular reaches respond differently.

Scott and colleagues’ 2023 study of the lower Columbia, from 1853 to 2018 makes the longer perspective concrete. Combining archival measurements with models using lagged air temperature and river flow, they estimated an approximately 2.2°C increase in annual mean water temperature since the 1850s. They also found that warming differed by season and that reservoirs reduced sensitivity to short-term atmospheric forcing. [2]

Our shorter DART record should not be forced to tell an identical story at every dam. The supplemental summer summaries show positive slopes at Bonneville and McNary and a negative slope at Lower Granite over their respective available periods. The periods differ, and source continuity and operations need examination before interpreting those slopes. Appendix B shows the comparison.

There is a practical example of why management matters. The Army Corps of Engineers uses cold-water releases from Dworshak to manage summer temperatures in the lower Snake system. That demonstrates a mechanism capable of modifying local thermal conditions; it does not, by itself, explain our historical Lower Granite trend. [3]

Three dams do not see the same migration

It is tempting to line up fish counts at different dams and treat the columns as repeated observations of one population. The geography makes that too simple. Bonneville is downstream of McNary. Fish continuing toward Lower Granite turn into the Snake River. Other fish have other destinations. The mix passing one dam differs from the mix passing another.

Figure 3. Daily Chinook passage during April–October 2025. Different run shapes and magnitudes are visible across the three sites. These are recorded passage counts, not matched individuals, survival estimates or a census of all salmon in the basin. Open SVG

Distance is an obvious starting variable. Using approximate river positions, Bonneville to McNary is about 236 km, McNary to Lower Granite about 225 km, and Bonneville to Lower Granite about 461 km. Intervening dams add further opportunities for delay. These are useful scales, not surveyed distances for individual fish.

Earlier field work provides a sensible range for an exploratory delay. A Columbia River Inter-Tribal Fish Commission report on the 2013 migration, published in 2015, tracked PIT-tagged fish and reported Chinook migration rates between mainstem dams ranging from 18.5 to 46.0 km per day. Dividing roughly 236 km by those rates suggests about five to thirteen days. The report’s own reach-distance convention differs slightly from our rounded river-position estimate. [4]

We therefore create a simple predictor: the average Bonneville passage count from five through thirteen days earlier. The average allows an arriving pulse to spread over time. We chose this range as a biologically informed exploratory window; we did not estimate an optimal travel-time distribution.

This variable asks whether earlier downstream passage helps explain later McNary passage after accounting for local conditions and broad monthly timing. Its coefficient cannot tell us what fraction of Bonneville fish survived to McNary. We have counts, not linked fish histories.

Three regressions, estimated together

For each dam, we regress daily Chinook passage on local water temperature, outflow, spill and monthly indicators. The comparison uses the same 164 consecutive daily observations, April 14 through September 24, 2025. We then add the lagged Bonneville average to the McNary equation and leave the other two specifications unchanged.

RainbowStats collects the three equations in a SIMU_REGRESSION object and estimates them jointly with SUR_REGRESSION—seemingly unrelated regression. The name is slightly amusing here: these rivers and migrations are plainly connected. SUR allows the unexplained parts of the equations to covary on the same day.

That addresses dependence across equations. It does not automatically address dependence across days. The script reports both conventional SUR results and system HAC inference, which allows for lagged dependence in the estimated uncertainty. Neither method turns the remaining residuals into independent observations.

The direct McNary comparison: separate-equation OLS, identical 164-day sample
MeasureLocal conditions + monthsAdd earlier Bonneville passage
R²0.5240.686
Adjusted R²0.4960.666
Durbin–Watson0.6110.826

The improvement is substantial in this sample: explained variation rises from about 52% to 69%, and adjusted R² also increases. That is a useful result. Including the upstream history accounts for variation that local temperature, flow, spill and monthly indicators leave unexplained.

Figure 4. Actual and fitted McNary passage before and after adding the Bonneville lag average. Both panels use the same 164 dates. These are OLS fitted values; the SUR coefficient and uncertainty comparisons appear below and in the appendix. All fits are in sample. Open SVG

The joint model reinforces the importance of migration history. The migration-augmented SUR coefficient on the Bonneville average is about 0.415, with a system HAC statistic of 7.81 under the reported four-lag specification. Holding the included controls fixed, an increase of 1,000 fish/day in that lag average corresponds to about 415 additional fish/day in fitted McNary passage. This is a conditional association, not a conversion or survival rate.

There is a second, more cautionary result. McNary’s SUR temperature coefficient changes from approximately −301 to −150 fish/day per °C when migration history enters. Its HAC statistic moves from −2.28 to −1.69. A coefficient that initially looked like a stronger local temperature relationship becomes smaller and less precisely distinguished from zero once the model recognizes earlier passage.

This does not contradict the air–water finding. One question concerns the relationship between air and water temperature; the other concerns fish counts conditional on several covariates. It does show why an aggregate passage regression should not be read as a direct experiment on salmon physiology.

Autocorrelation belongs in the interpretation

The improved model still has a McNary Durbin–Watson statistic well below two: about 0.83 for both OLS and SUR. The residual autocorrelation charts make the persistence visible. We have explained more of the passage record without explaining all of its temporal structure.

Figure 5. OLS residual autocorrelation through 24 daily observation lags. Persistence at the first lag falls from about 0.69 to 0.59 after adding migration history. Dashed lines are the chart’s approximate reference bands, not a correction for the model’s remaining dependence. Open SVG

There are ecological reasons to expect memory. Migration unfolds over days and seasons. Fish encounter sequences of conditions rather than isolated temperatures. Water storage carries the influence of earlier inflows and weather. Monthly controls cannot fully describe the shape of every run.

But we should distinguish dependence in the process from dependence left in our model’s errors. The former is unsurprising. The latter can reflect omitted dynamics, an imperfect seasonal model, changing population composition, measurement issues or other influences. We cannot assign every residual pattern to biology simply because the subject is biological.

Accepting autocorrelation therefore means accepting a responsibility: show it, avoid treating each day as an independent replication, and qualify inference. HAC standard errors help with uncertainty under suitable assumptions; they do not repair omitted-variable bias, establish exogeneity or guarantee that four lags capture all relevant dependence.

What we can avoid is an endless search for a comforting diagnostic. We do not add lag after lag merely to push Durbin–Watson toward two. For this exploratory account, the migration variable answers a substantive question, the diagnostic remains visible, and the claims stay within the evidence.

The river also has shared rhythms

A regression works through relationships observed over time. Spectral analysis offers another view: at which cycle lengths do two passage records vary together, and how are their oscillations offset?

The script uses Welch transfer functions for the three dam pairs. Coherence describes their linear association at a particular frequency. Gain describes relative amplitude. Phase describes the offset, which can be expressed as an implied lead or lag. None of these quantities is a tagged-fish travel time.

Figure 6. Passage coherence for April–October 2025, using 64-day HANN windows and 50% overlap. The arrows identify input and response, not a demonstrated causal direction. The horizontal 0.20 line is a display threshold, not a statistical significance cutoff. Open SVG

The shared variation depends on the pair and the cycle length. For example, the McNary–Lower Granite comparison reaches coherence of about 0.91 near a 12.8-day cycle. Bonneville–McNary’s strongest reported band is instead a roughly 2.2-day cycle, with phase implying a small reversal of the geographically expected lead. These patterns do not support reducing the whole river to one travel-time number.

There are only five overlapping Welch segments in this season, and they are not independent replications. Phase wraps; seasonal pulses and stock mixtures can generate shared variation; a strong band can move when the window changes. The spectral results are useful descriptions and prompts for further work, not a calibration of migration speed.

We also examine the Bonneville and McNary OLS residuals spectrally. Shared cycles remain after the chosen regressors are removed. Spectral analysis helps us see the structure of that remainder. It does not remove it, or “clear up” Durbin–Watson.

Building on the biologists’ work

We are not the first to connect temperature, migration and delay. Caudill and colleagues’ 2013 study used radiotelemetry at four dams and found that larger temperature differences within fish ladders were associated with reversals and passage delays. Its relevance here is that a dam’s reported daily water temperature cannot fully describe the thermal conditions a fish encounters while passing it. [5]

Keefer and colleagues’ 2018 study combined radiotelemetry and temperature loggers to reconstruct thermal histories for 212 adult Chinook and 200 steelhead. Exposure and behavioral responses varied among populations and river reaches. Their individual-level evidence gives ecological meaning to questions that our aggregate counts can only approach indirectly. [6]

Our contribution is a modest one: bringing public fish, water and air records into a transparent workflow that readers can run, inspect and change. The combination of distance-informed lags, joint regressions, robust inference and spectral diagnostics makes the connections—and the limitations—easier to see. It complements field research rather than replacing it.

I began this project because a book asked me to think about memory and the Earth. The statistics have brought me back to that word. Yesterday’s water, weather and migration leave traces in today’s record. We should understand those traces well enough to use the data honestly, without demanding that a living river forget its past.

Explore the three-dam study →

TECHNICAL APPENDIX

Appendix A · What is being compared?

ComponentPeriod / samplePurpose
Long water-temperature chart in slideshowAvailable observations requested for 2000–2025Historical and seasonal context; unequal coverage
Daily air–water scattersJune–August 2024; 92 daily pairs per damWithin-summer association
Supplementary summer means13 complete paired summers, 2007–2024Across-summer association
OLS and two SUR systemsApril 14–September 24, 2025; 164 datesSame-sample model comparison
Passage transfer functionsApril 1–October 31, 2025; 214 datesShared cycles in the seasonal passage record
OLS residual transfer functionThe 164-date estimation sampleShared cycles after included controls

The supplementary complete summers are 2007, 2008, 2010–2015, 2017, 2020 and 2022–2024. AQS coverage does not support treating this as a complete air record beginning in 2000. Complete-year selection also means these 13 summers need not represent every intervening summer.

Air metadata: AQS state 41, county 059, site 1003, parameter 62101, POC 1, sample duration 1 HOUR, event selection No Events. The series is the daily arithmetic mean, converted by (°F − 32) × 5/9. Water is °C; outflow and spill are thousands of cubic feet per second; passage is fish/day. Consult DART metadata for original monitoring sources and measurement conventions.

Alignment matters. RainbowStats’ SAME_DATE_RANGE can interpolate or extrapolate when aligning series. A common date is not a certification that every underlying value was observed. The supplemental annual analysis instead matches exact returned dates and does not interpolate or replace missing observations with zero. Its raw input snapshots are included.

LAG counts observations. The migration lag is constructed on the consecutive daily fish series before environmental alignment; in this 2025 window the observation shifts correspond to calendar days. That equivalence should not be assumed for gappy records or pooled migration seasons.

Appendix B · Across summers and through the longer record

DamAir–water r, 13 summer meansDaily anomaly r*Summer water slope, °C/decade†
Bonneville0.8630.484+0.366; 2001–2025, 25 summers
McNary0.8470.399+0.549; 2005–2025, 21 summers
Lower Granite0.8030.205−0.391; 2000–2025, 25 summers

*Daily anomalies remove both calendar-day and year means from the balanced 13 × 92 panel. Positive associations remain after removing those additive effects, but serial dependence remains too; no independent-day significance test is implied. †Descriptive straight-line slopes using summers with 92 returned daily water values. Lower Granite’s incomplete 2021 summer is excluded. Different coverage and possible source or operational changes limit comparisons and attribution. These supplemental calculations are not regression coefficients from the fish-passage models.

Figure A1. Supplementary complete-summer mean water temperatures. Different sample periods and the contrasting Lower Granite slope are explicit. These are descriptive trends in the retrieved series, not estimates of a common climate effect. Open SVG

A separate exploratory measure asks what share of recorded summer passage occurred on matched dates with water temperature above 20°C. Its correlations with summer air means are about 0.686, 0.722 and 0.687 at Bonneville, McNary and Lower Granite. The threshold is illustrative. This count-weighted share is neither individual thermal exposure nor mortality, and incomplete fish-count dates can affect it. The supplementary code records coverage and its eligibility rule.

We also examined the median passage date within an August–October window. Correlations with summer air means were weak, about 0.10–0.16 in the eligible years. Thus these calculations do not establish a strong cross-year shift in fall timing with warmer air.

Appendix C · Equations and SUR results

For dam d, the baseline is:

Passaged,t = αd + βdTemperatured,t + γdOutflowd,t + δdSpilld,t + Σm=5…9θd,mMonthm,t + ud,t

April is the reference month. The migration system adds λ times the following predictor to McNary only:

BonnevilleArrivalt = (BonnevillePassaget−5 + … + BonnevillePassaget−13) / 9

There is no separately estimated distance coefficient: three selected dams provide too few independent reaches for that exercise. Distance motivates a lag window. Nor is this a structural simultaneous-equations identification strategy: SUR alone supplies no instruments or causal identification.

Selected McNary SUR estimates and system HAC statistics
VariableBaseline estimateHAC SEStatisticMigration estimateHAC SEStatistic
Temperature−301.166132.374−2.275−150.28989.159−1.686
Outflow−5.33515.042−0.3556.8105.6731.201
Spill5.43616.3520.332−6.3526.431−0.988
Bonneville lag average———0.4148480.0531367.807

System HAC uses a Newey–West Bartlett kernel with four observation lags and no finite-sample adjustment. Statistics are asymptotic. Strong persistence, a short seasonal sample and possible regressor endogeneity limit their interpretation. The 0.415 migration coefficient is not a population fraction.

Durbin–Watson: same observations, different estimators and specifications
DamBaseline OLSBaseline SURMigration OLSMigration SUR
Bonneville0.4320.4320.4320.429
McNary0.6110.6110.8260.828
Lower Granite1.1591.1591.1591.158

SUR changes coefficients in equations whose own regressors are unchanged because estimation is joint. In the migration SUR system, contemporaneous residual correlations are approximately −0.427 for Bonneville–McNary, −0.215 for Bonneville–Lower Granite and −0.073 for McNary–Lower Granite. These are residual, not raw passage, correlations. SUR permits them; making them vanish is not its objective. Its efficiency advantages are conditional, and an in-sample comparison does not establish a forecast improvement.

Baseline SUR: full system HAC coefficient tables

Newey–West HAC: Bartlett kernel, lag 4; no finite-sample adjustment. HAC statistics are asymptotic.

BON_fish/day_CHINOOK

VariableOLS estimateOLS HAC SEOLS statisticSUR estimateSUR HAC SESUR statistic
Constant-7488.118590.97-0.871626-7374.378010.77-0.920557
BON_degC_TEMPERATURE574.256600.7520.955896585.864559.3881.04733
BON_kcfs_OUTFLOW-14.345616.5814-0.865165-17.477016.5721-1.05460
BON_kcfs_SPILL39.696922.73221.7462842.711422.89461.86557
Month_5-213.8561946.29-0.109879-260.4041805.89-0.144197
Month_6-3315.143742.52-0.885805-3445.103506.28-0.982551
Month_7-5300.065237.66-1.01191-5507.754932.51-1.11662
Month_8-1378.135536.98-0.248896-1518.525265.40-0.288396
Month_97216.305559.091.298117120.055418.931.31392

MCN_fish/day_CHINOOK

VariableOLS estimateOLS HAC SEOLS statisticSUR estimateSUR HAC SESUR statistic
Constant3450.932061.661.673863536.371971.541.79370
MCN_degC_TEMPERATURE-290.297139.888-2.07520-301.166132.374-2.27511
MCN_kcfs_OUTFLOW-4.7519015.8069-0.300622-5.3351215.0418-0.354686
MCN_kcfs_SPILL4.4387517.02520.2607175.4364116.35220.332458
Month_52640.73576.1164.583672674.68550.0494.86263
Month_63058.711032.722.961803153.16994.6793.17002
Month_73417.501396.622.446973565.161339.522.66151
Month_83743.501621.902.308103947.221570.712.51302
Month_95782.561763.283.279435982.871714.953.48865

LWG_fish/day_CHINOOK

VariableOLS estimateOLS HAC SEOLS statisticSUR estimateSUR HAC SESUR statistic
Constant-326.901813.614-0.401788-405.546761.136-0.532816
LWG_degC_TEMPERATURE-4.8208158.9207-0.0818186-1.0106355.9990-0.0180473
LWG_kcfs_OUTFLOW-3.765227.29378-0.516223-3.694546.72974-0.548987
LWG_kcfs_SPILL10.45248.454651.2362910.97487.953381.37989
Month_51013.05287.9253.518441000.63285.6933.50248
Month_6767.269374.2752.05002757.252364.0912.07984
Month_7465.105490.1240.948953458.295477.7680.959242
Month_8582.535520.2891.11964579.047508.1681.13948
Month_91114.46584.0891.908031110.29574.3781.93303

HAC changes inference, not coefficients or residual autocorrelation.

Migration SUR: full system HAC coefficient tables

Newey–West HAC: Bartlett kernel, lag 4; no finite-sample adjustment. HAC statistics are asymptotic.

BON_fish/day_CHINOOK

VariableOLS estimateOLS HAC SEOLS statisticSUR estimateSUR HAC SESUR statistic
Constant-7488.118590.97-0.871626-5501.417620.68-0.721905
BON_degC_TEMPERATURE574.256600.7520.955896478.437534.4270.895233
BON_kcfs_OUTFLOW-14.345616.5814-0.865165-18.460415.8201-1.16690
BON_kcfs_SPILL39.696922.73221.7462839.572121.79521.81563
Month_5-213.8561946.29-0.10987916.68581767.320.00944134
Month_6-3315.143742.52-0.885805-2857.143369.29-0.847996
Month_7-5300.065237.66-1.01191-4752.944748.07-1.00103
Month_8-1378.135536.98-0.248896-735.0825103.19-0.144044
Month_97216.305559.091.298117685.545266.891.45922

MCN_fish/day_CHINOOK

VariableOLS estimateOLS HAC SEOLS statisticSUR estimateSUR HAC SESUR statistic
Constant1473.771337.441.101931089.191275.390.854007
MCN_degC_TEMPERATURE-179.59490.9692-1.97422-150.28989.1588-1.68563
MCN_kcfs_OUTFLOW7.634898.510680.8970966.810085.672581.20053
MCN_kcfs_SPILL-7.994019.36815-0.853318-6.351976.43138-0.987653
Bonneville passage mean lag 5 to 13 days0.3474710.07263524.783780.4148480.05313587.80732
Month_51252.64403.7673.10239959.086345.5132.77583
Month_61806.23675.5042.673901538.53646.5292.37967
Month_72050.57890.3842.303021762.69866.1952.03498
Month_81596.18994.0781.605691318.31932.7261.41339
Month_993.19061400.060.0665617-917.4881131.70-0.810718

LWG_fish/day_CHINOOK

VariableOLS estimateOLS HAC SEOLS statisticSUR estimateSUR HAC SESUR statistic
Constant-326.901813.614-0.401788-369.118738.876-0.499567
LWG_degC_TEMPERATURE-4.8208158.9207-0.0818186-0.78301653.8437-0.0145424
LWG_kcfs_OUTFLOW-3.765227.29378-0.516223-3.867506.41365-0.603011
LWG_kcfs_SPILL10.45248.454651.2362910.59097.491361.41375
Month_51013.05287.9253.518441004.67279.4573.59507
Month_6767.269374.2752.05002742.207357.8852.07387
Month_7465.105490.1240.948953429.742468.3150.917635
Month_8582.535520.2891.11964545.298499.0631.09264
Month_91114.46584.0891.908031073.72565.7591.89785

HAC changes inference, not coefficients or residual autocorrelation.

Appendix D · Spectral settings and interpretation

The saved script calls SPECTRAL_TRANSFER_FUNCTION_WELCH(response,input,64,0.5,HANN). The passage series contain 214 daily values, giving five overlapping 64-day windows with a 32-day step. The residual series contain 164 values, giving four windows. The displayed cycle range is approximately 2–32 days. Where the output labels the horizontal axis “periods,” one period here is one daily observation.

Strongest reported band within the displayed range—not an inferred migration time
Input → responseCycle lengthCoherencePhase interpretation at that band
Bonneville → McNary≈2.2 days0.716Input lags response by ≈0.6 day
Bonneville → Lower Granite≈9.1 days0.603Input leads response by ≈2.6 days
McNary → Lower Granite≈12.8 days0.908Input leads response by ≈5.1 days
Bonneville → McNary OLS residuals≈3.6 days0.683Input leads response by ≈1.5 days
Figure A2. Native implied lead/lag curves for the three passage comparisons. Positive and negative values follow the engine’s phase convention; consult its band-specific verbal interpretation and check a known shifted series before assigning physical meaning. Phase-derived delays are ambiguous modulo a cycle and unreliable where coherence is weak. Open SVG
Figure A3. Coherence between Bonneville OLS residuals and migration-augmented McNary OLS residuals. Remaining shared variation is visible. This is not a SUR residual spectrum or an independence test. Open SVG

Coherence is a normalized frequency-domain association. A value near one does not establish causality, and a value near zero does not establish statistical independence. The engine’s 0.20 display threshold and qualitative strength labels are not calibrated significance tests. Overlapping segments, a short record, smoothing choices and multiple inspected frequencies require restraint. The phase-to-delay conversion also depends on the argument order and cross-spectrum convention.

This is not a multi-decade spectral analysis or a test of long-term climate change. Extending the record requires explicit handling of seasonal boundaries, gaps and changing run composition; stitching separate seasons together as if adjacent observations were adjacent days would change the question.

Appendix E · Reproduce and inspect

The saved 67-equation slideshow regenerates the daily air–water charts, three-dam passage models, SUR/HAC comparisons, residual diagnostics and spectral functions. It includes textual references to our earlier annual summaries. Those 13-summer calculations are reproduced separately by the supplementary Python script, with the retrieved input snapshots in supplement/data; they are not recomputed by the RainbowStats slideshow.

Download the RainbowStats script · Summer means CSV · Daily scatter data CSV · McNary fitted values CSV · Residual ACF CSV · Passage coherence CSV · Phase-derived lag CSV · Supplementary summaries and coverage

Static figures were redrawn as SVG from returned chart data or the explicitly labeled annual calculations. Native tables below retain the returned estimates. Values reflect retrieval on October 22, 2026; source revisions and software changes can alter subsequent runs. All models are exploratory, with no holdout forecast validation. Counts can reflect changing stocks, detection and passage behavior; they cannot identify individual survival.

Show the complete RainbowStats script
intro=TEXT_SLIDE("Warm air, warm water, and a river with memory","Bonneville, McNary and Lower Granite: an exploratory study of temperature, Chinook passage and shared migration patterns.","We examine the available record from 2000, illustrate daily air-water relationships in summer 2024, and compare three-equation models on a fixed 2025 sample.")
climate_note=TEXT_SLIDE("The climate question needs two time scales","Within a summer, hot days and warm water share a seasonal cycle. Across summers, warmer mean air temperatures also accompany warmer mean water temperatures.","Earlier exact-date calculations for 13 complete June-August air summers between 2007 and 2024 gave air-water correlations of 0.863 at Bonneville, 0.847 at McNary and 0.803 at Lower Granite. These are descriptive associations, not attribution of a long-term trend.")
water_record=SERIES_BETWEEN(LIST(DART("BON","TEMPERATURE"),DART("MCN","TEMPERATURE"),DART("LWG","TEMPERATURE")),20000101,20251231)
water_history=SET_TITLE(LINE_CHART(water_record),"Available daily water temperatures, 2000-2025 - Celsius")
record_note=TEXT_SLIDE("The long record is not a uniform warming story","Coverage differs by dam, and the historical Lower Granite series does not follow the same trend as the two Columbia River dams. Check source continuity and river operations before interpreting historical changes.","The paired summer results concern covariation. They do not establish that all three dams warmed at the same rate, or that air temperature alone explains water temperature.")
air2024=SET_NAME((AQS("41","059","1003","62101",20240601,20240831,1,"1 HOUR","","No Events")-32)*5/9,"Hermiston mean air temperature C")
bon_water2024=SERIES_BETWEEN(DART("BON","TEMPERATURE"),20240601,20240831)
mcn_water2024=SERIES_BETWEEN(DART("MCN","TEMPERATURE"),20240601,20240831)
lwg_water2024=SERIES_BETWEEN(DART("LWG","TEMPERATURE"),20240601,20240831)
air_bon=SET_TITLE(POLY_SCATTER(LIST(bon_water2024,air2024),1),"Summer 2024: Bonneville water versus Hermiston air")
air_mcn=SET_TITLE(POLY_SCATTER(LIST(mcn_water2024,air2024),1),"Summer 2024: McNary water versus Hermiston air")
air_lwg=SET_TITLE(POLY_SCATTER(LIST(lwg_water2024,air2024),1),"Summer 2024: Lower Granite water versus Hermiston air")
air_note=TEXT_SLIDE("Reading the air-water scatter plots","Each point is a daily observation in June-August 2024. Hermiston Municipal Airport, Oregon, is one regional air-temperature proxy, not a local air station at every dam. AQS Fahrenheit values are converted to Celsius.","These daily plots are regenerated by this script. The 13-summer correlations reported earlier are a separate aggregation from our prior analysis. Serial dependence and seasonality mean daily points are not independent replications.")
route_note=TEXT_SLIDE("Distance makes a plausible lag, not a fish tag","Approximate river distances: Bonneville to McNary 236 km; McNary to Lower Granite 225 km; Bonneville to Lower Granite 461 km. The Lower Granite route enters the Snake River.","We use a preselected 5-13 day Bonneville passage average as an exploratory predictor of later McNary counts. Stock composition, tributary destinations, intervening dams and river conditions prevent treating aggregate lags as individual travel times.")
fish=SAME_DATE_RANGE(LIST(DART("BON","CHINOOK"),DART("MCN","CHINOOK"),DART("LWG","CHINOOK")))
fish2025=SERIES_BETWEEN(fish,20250401,20251031)
bon=EXTRACT(fish2025,series:0)
mcn=EXTRACT(fish2025,series:1)
lwg=EXTRACT(fish2025,series:2)
bon_lag5=LAG(bon,5)
bon_lag13=LAG(bon,13)
bon_arrival=(LAG(bon,5)+LAG(bon,6)+LAG(bon,7)+LAG(bon,8)+LAG(bon,9)+LAG(bon,10)+LAG(bon,11)+LAG(bon,12)+LAG(bon,13))/9
bon_arrival=SET_NAME(bon_arrival,"Bonneville passage mean lag 5 to 13 days")
all_data=SERIES_BETWEEN(SAME_DATE_RANGE(LIST(bon,DART("BON","TEMPERATURE"),DART("BON","OUTFLOW"),DART("BON","SPILL"),mcn,DART("MCN","TEMPERATURE"),DART("MCN","OUTFLOW"),DART("MCN","SPILL"),lwg,DART("LWG","TEMPERATURE"),DART("LWG","OUTFLOW"),DART("LWG","SPILL"),bon_arrival)),20250414,20250924)
bon_data_months=ADD_MONTHLY_DUMMY_SERIES(LIST(EXTRACT(all_data,series:0),EXTRACT(all_data,series:1),EXTRACT(all_data,series:2),EXTRACT(all_data,series:3)))
bon_data=LIST(EXTRACT(bon_data_months,series:0),EXTRACT(bon_data_months,series:1),EXTRACT(bon_data_months,series:2),EXTRACT(bon_data_months,series:3),EXTRACT(bon_data_months,series:7),EXTRACT(bon_data_months,series:8),EXTRACT(bon_data_months,series:9),EXTRACT(bon_data_months,series:10),EXTRACT(bon_data_months,series:11))
mcn_base_data_months=ADD_MONTHLY_DUMMY_SERIES(LIST(EXTRACT(all_data,series:4),EXTRACT(all_data,series:5),EXTRACT(all_data,series:6),EXTRACT(all_data,series:7)))
mcn_base_data=LIST(EXTRACT(mcn_base_data_months,series:0),EXTRACT(mcn_base_data_months,series:1),EXTRACT(mcn_base_data_months,series:2),EXTRACT(mcn_base_data_months,series:3),EXTRACT(mcn_base_data_months,series:7),EXTRACT(mcn_base_data_months,series:8),EXTRACT(mcn_base_data_months,series:9),EXTRACT(mcn_base_data_months,series:10),EXTRACT(mcn_base_data_months,series:11))
mcn_migration_data_months=ADD_MONTHLY_DUMMY_SERIES(LIST(EXTRACT(all_data,series:4),EXTRACT(all_data,series:5),EXTRACT(all_data,series:6),EXTRACT(all_data,series:7),EXTRACT(all_data,series:12)))
mcn_migration_data=LIST(EXTRACT(mcn_migration_data_months,series:0),EXTRACT(mcn_migration_data_months,series:1),EXTRACT(mcn_migration_data_months,series:2),EXTRACT(mcn_migration_data_months,series:3),EXTRACT(mcn_migration_data_months,series:4),EXTRACT(mcn_migration_data_months,series:8),EXTRACT(mcn_migration_data_months,series:9),EXTRACT(mcn_migration_data_months,series:10),EXTRACT(mcn_migration_data_months,series:11),EXTRACT(mcn_migration_data_months,series:12))
lwg_data_months=ADD_MONTHLY_DUMMY_SERIES(LIST(EXTRACT(all_data,series:8),EXTRACT(all_data,series:9),EXTRACT(all_data,series:10),EXTRACT(all_data,series:11)))
lwg_data=LIST(EXTRACT(lwg_data_months,series:0),EXTRACT(lwg_data_months,series:1),EXTRACT(lwg_data_months,series:2),EXTRACT(lwg_data_months,series:3),EXTRACT(lwg_data_months,series:7),EXTRACT(lwg_data_months,series:8),EXTRACT(lwg_data_months,series:9),EXTRACT(lwg_data_months,series:10),EXTRACT(lwg_data_months,series:11))
bon_reg=REGRESSION(bon_data)
mcn_base=REGRESSION(mcn_base_data)
mcn_migration=REGRESSION(mcn_migration_data)
lwg_reg=REGRESSION(lwg_data)
base_system=SIMU_REGRESSION(bon_reg,mcn_base,lwg_reg)
migration_system=SIMU_REGRESSION(bon_reg,mcn_migration,lwg_reg)
base_sur=SUR_REGRESSION(base_system)
migration_sur=SUR_REGRESSION(migration_system)
passage_chart=SET_TITLE(LINE_CHART(fish2025),"Daily Chinook counts at three dams - April-October 2025")
arrival_chart=SET_TITLE(LINE_CHART(LIST(mcn,bon_arrival)),"McNary counts and Bonneville counts averaged over lags 5-13")
model_note=TEXT_SLIDE("Three equations on one fixed sample","All models use April 14-September 24, 2025, the 164-day common sample established in our earlier run. Each equation includes local water temperature, outflow, spill, an intercept and May-September indicators; April is the reference month.","The baseline contains three local equations. The migration specification adds the Bonneville 5-13 day lag average only to McNary. A changing predictor set makes this a useful SUR comparison. SAME_DATE_RANGE may interpolate source data, so alignment does not certify that every underlying reading was observed.")
sur_note=TEXT_SLIDE("What SUR contributes","SIMU_REGRESSION collects the three equations. SUR_REGRESSION estimates them jointly using contemporaneous cross-equation error covariance.","SUR can improve efficiency when predictor sets differ and equation errors covary. It does not automatically eliminate within-equation serial correlation. Interpret conventional t statistics cautiously; where supplied, HAC diagnostics address inference rather than changing the residual sequence.")
base_label=TEXT_SLIDE("Baseline SUR","Three local passage equations: temperature, outflow, spill and monthly controls.","The following output is generated by SUR_REGRESSION, including its system summaries and equation results.")
migration_label=TEXT_SLIDE("Migration-augmented SUR","The same three-equation system, with the lagged Bonneville passage predictor added to McNary.","Compare the McNary coefficient, fit and Durbin-Watson statistic with the baseline on the identical sample. A better fit is evidence of useful predictive structure, not proof of a causal temperature or migration effect.")
ols_label=TEXT_SLIDE("The direct McNary comparison","The next two model tables show separate-equation OLS before and after adding the migration predictor.","The earlier run improved McNary R-squared from about 0.524 to 0.686 and DW from 0.611 to 0.826. These are reference values; the displayed model tables are the results from this run.")
mcn_base_model=EXTRACT(mcn_base,model)
mcn_migration_model=EXTRACT(mcn_migration,model)
mcn_base_fit=EXTRACT(mcn_base,actualvsfitted)
mcn_migration_fit=EXTRACT(mcn_migration,actualvsfitted)
mcn_base_acf=EXTRACT(mcn_base,autocorrelation)
mcn_migration_acf=EXTRACT(mcn_migration,autocorrelation)
mcn_base_hac=EXTRACT(mcn_base,hac)
mcn_migration_hac=EXTRACT(mcn_migration,hac)
residual_note=TEXT_SLIDE("Autocorrelation is part of the result","The following fit and autocorrelation charts are for the separate-equation McNary regressions, before and after the migration predictor. They are not SUR residual plots.","River conditions and fish passage persist across days. Remaining dependence limits conventional inference and independent-day interpretations. We report it and retain this exploratory model rather than selecting more lags until DW approaches two.")
spectral_note=TEXT_SLIDE("Spectral analysis: shared cycles and phase","Welch transfer functions compare daily passage series in April-October 2025. The first argument is the response and the second is the input: McNary versus Bonneville, Lower Granite versus Bonneville, and Lower Granite versus McNary.","A 64-day HANN window with 50 percent overlap provides five segments from 214 days. Focus on coherent bands and consistent phase patterns. Periods are days for these daily series. Phase wraps, short samples and common seasonality can produce misleading travel-time readings.")
spec_bon_mcn=SPECTRAL_TRANSFER_FUNCTION_WELCH(mcn,bon,64,0.5,HANN)
spec_bon_lwg=SPECTRAL_TRANSFER_FUNCTION_WELCH(lwg,bon,64,0.5,HANN)
spec_mcn_lwg=SPECTRAL_TRANSFER_FUNCTION_WELCH(lwg,mcn,64,0.5,HANN)
resid_bon=EXTRACT(bon_reg,residuals)
resid_mcn=EXTRACT(mcn_migration,residuals)
residual_spectral_note=TEXT_SLIDE("What remains after the regressions","The final transfer function compares Bonneville and migration-augmented McNary OLS residuals on the common 164-day sample, using the same 64-day window and 50 percent overlap.","Coherence here indicates shared variation not removed by the chosen regressors. It does not establish independence when low, nor cure serial correlation when high. This shorter sample provides only four Welch segments.")
spec_residual=SPECTRAL_TRANSFER_FUNCTION_WELCH(resid_mcn,resid_bon,64,0.5,HANN)
conclusion=TEXT_SLIDE("A useful contribution without analysis paralysis","Warmer air accompanies warmer water; migration-related predictors help explain daily passage; the three dams share variation across both equations and frequencies.","The contribution is an integrated, reproducible exploratory analysis. It does not identify individual survival, attribute trends to climate change alone, or turn aggregate phase lags into tagged-fish travel times. Remaining autocorrelation is reported openly.")
sources=TEXT_SLIDE("Data and interpretation","Water temperature, Chinook passage, outflow and spill: Columbia River DART. Air: EPA AQS parameter 62101, state 41, county 059, site 1003; one-hour sample duration, daily mean, No Events selection.","DART metadata: https://www.cbr.washington.edu/dart/metadata/river . Distance and passage-rate context: CRITFC 2013 adult passage report, Table 10, https://www.critfc.org/wp-content/uploads/2015/05/15-02.pdf . Distances and lag ranges are approximate.")
SLIDESHOW(intro,climate_note,water_history,record_note,air_note,air_bon,air_mcn,air_lwg,route_note,passage_chart,arrival_chart,model_note,sur_note,base_label,base_sur,migration_label,migration_sur,ols_label,mcn_base_model,mcn_migration_model,mcn_base_hac,mcn_migration_hac,residual_note,mcn_base_fit,mcn_migration_fit,mcn_base_acf,mcn_migration_acf,spectral_note,spec_bon_mcn,spec_bon_lwg,spec_mcn_lwg,residual_spectral_note,spec_residual,conclusion,sources)

Sources and previous studies

  1. U.S. EPA Region 10 (2020). Assessment and Synthesis of the Literature on Climate Change Impacts on Temperatures of the Columbia and Snake Rivers, Appendix G, especially §2.1 and the discussion of atmospheric and water-temperature links.
  2. Scott, M. H., Talke, S., Jay, D., and Diefenderfer, H. (2023). “Warming of the lower Columbia River, 1853 to 2018.” River Research and Applications. Author repository and abstract.
  3. U.S. Army Corps of Engineers, Walla Walla District (2024). “Dworshak Dam to increase releases beginning July 1st.” Operational context for lower Snake temperature management.
  4. Fryer, J. K., Whiteaker, J., and Kelsey, D. (2015). Upstream Migration Timing of Columbia Basin Chinook and Sockeye Salmon and Steelhead in 2013. CRITFC Technical Report 15-02. Tagged-fish migration rates provide context, not validation of our 2025 lag predictor.
  5. Caudill, C. C., et al. (2013). “Indirect Effects of Impoundment on Migrating Fish: Temperature Gradients in Fish Ladders Slow Dam Passage by Adult Chinook Salmon and Steelhead.” PLOS ONE 8(12): e85586.
  6. Keefer, M. L., et al. (2018). “Thermal exposure of adult Chinook salmon and steelhead: Diverse behavioral strategies in a large and warming river system.” PLOS ONE 13(9): e0204274.

Data and earlier post: DART river metadata · EPA AQS API documentation · Remembering the River · RainbowStats DART command · RainbowStats AQS command.