Replicating the Aquaculture Impact Analysis on Minnow Communities

Authors

Kylie Newcomer

Joaquin Sandoval

Grace Bryan

Published

March 20, 2026

Photo from Canadian Aquaculture Industry Alliance

Introduction

Freshwater aquaculture can influence lake ecosystems through nutrient enrichment, increased primary productivity, and shifts in food web structure. These ecosystem-level changes may cascade to affect fish communities, including small-bodied species such as minnows.

This report replicates and extends part of the analysis presented in “Impacts of freshwater aquaculture on fish communities: A whole-ecosystem experimental approach” by Rennie et al. (2019), which examined ecosystem responses to an experimental rainbow trout aquaculture operation conducted at the Experimental Lakes Area in Ontario, Canada. While the original study evaluates broad ecosystem responses, including nutrient dynamics and food web interactions, the present analysis focuses specifically on whether aquaculture activity influenced the abundance of minnows measured as catch-per-unit-effort (CPUE).

The study uses a Before-After Control-Impact (BACI) design comparing a treated lake, where aquaculture was implemented, with a nearby control lake. Minnow CPUE is observed across three experimental periods: before aquaculture began, during the period of active aquaculture operations, and after operations ended.

While BACI designs are widely used in ecological impact studies, they rely on the assumption that the control site provides a valid counterfactual for the treated site. In this replication, we extend the standard BACI framework by explicitly evaluating this assumption using a Difference-in-Differences (DiD) analysis. This approach allows for a more transparent assessment of whether observed changes in minnow abundance can plausibly be attributed to aquaculture activity. Because the original study focuses on ecosystem-level responses, changes in minnow abundance should be interpreted as one component of broader ecological dynamics rather than a complete measure of aquaculture impacts.

Data Preparation

The dataset contains fish sampling observations collected from lakes within the Experimental Lakes Area. Each observation corresponds to a specific lake, year, and sampling season, and includes CPUE measurements for several fish species.

Two lakes are used in this analysis:

  • Lake 375, which served as the treatment lake where aquaculture operations were introduced

  • Lake 373, which served as a control lake

Minnow CPUE values are aggregated by lake, year, and season to produce an average abundance estimate for each sampling period. Because abundance data are often right-skewed, the CPUE values are square-root transformed prior to analysis to stabilize variance and better satisfy model assumptions.

The following code imports the dataset and constructs the variables used in the analysis.

Data Wrangling

Key variables include:

  • treat - This variable was our predictor variable, assigned as a binary value indicating whether the lake experience aquaculture

  • period - A categorical value indicating the period of time within the study: before, during, and after aquaculture

  • season - Another catagorical variable used to differentiate sampling season between spring and fall

The combination of these variables allows us to analyze how treatment during different periods of the study influenced minnow CPUE. Additionally, separating the regressions by seasons allows for seasonal patterns to be present and not mask overall results.

Code
library(tidyverse)
library(here)
library(janitor)
library(performance)
library(jtools)
library(gt)
library(gtsummary)
library(interactions)
library(car)
library(patchwork)


minnows <- read_csv(here::here("posts", "eds241-final-project", "data", "Minnows_Aquaculture_Rennie19.csv")) %>%
  janitor::clean_names()

aquaculture <- minnows %>%
  # Adding fish sp names to ambiguous columns 
  rename(
    redbell_dace   = f182,
    finescale_dace = f183,
    fathead_minnow = f209,
    pearl_dace     = f214,
    slimy_sculpin  = f382
  )  %>%
  # Drop na values from minnow column 
  drop_na(minnows) %>% 
  # Adding treatment column
  mutate(
    treat = case_when(lake == 375 ~ 1, TRUE ~ 0),
  # Add period column 
    period = case_when(
      year < 2003  ~ "Before",
      year <= 2007 ~ "During",
      TRUE         ~ "After"),
  # Reordering levels; default is alphabetical 
  period = fct_relevel(period, "Before", "During", "After"), 
  # Renaming season row names to be cleaner 
    season = case_when(season == "aSpring" ~ "Spring",
                       season == "zFall" ~ "Fall"),
  # Always order from Fall to Spring 
    season = fct_relevel(season, "Fall", "Spring"),
  sqrt_cpue = sqrt(minnows))

# Mean cpue per lake/year/season, sqrt-transformed

mean_cpue <- aquaculture %>%
  group_by(treat, year, season, period) %>%
  summarise(
    mean_cpue = mean(minnows),
    sqrt_cpue = mean(sqrt_cpue),
    .groups = "drop"
  )

# Prepare plot data
plot_data <- aquaculture %>%
  group_by(treat, year, season) %>%
  summarise(
    mean_cpue = mean(minnows),
    se_cpue   = sd(minnows) / sqrt(n()),
    .groups   = "drop"
  )

Exploratory Time Series

Before estimating statistical models, it is useful to visualize how the minnow abundance changes over time in both lakes. This provides a preliminary view of whether the two lakes appear to respond differently during the aquaculture period.

Code
ggplot(plot_data, aes(x = year, y = mean_cpue, color = factor(treat))) +
  annotate("rect", xmin = 2003, xmax = 2007, # Highlight aquaculture period
           ymin = -Inf, ymax = Inf, fill = "grey80", alpha = 0.5) +
  annotate("text", x = 1996, label = "Aquaculture period",
           y = 400, size = 3) +
  annotate("rect", ymin = 399, ymax = 401, xmin = 2001, xmax = 2004) +
  geom_line(aes(linetype = factor(treat))) +
  geom_point(size = 2) +
  geom_errorbar(aes(ymin = mean_cpue - se_cpue,
                    ymax = mean_cpue + se_cpue), width = 0.3) +
  scale_linetype_manual(values = c("dashed", "solid"),
                        labels = c("Control", "Treated")) +
  scale_color_manual(values = c("black", "red"),
                     labels = c("Control", "Treated")) +
  facet_wrap(~ season) +
  labs(x = "Year", y = "Average catch per unit effort",
       linetype = "", color = "",
       caption = "Figure 1: Time series of average minnow CPUE for the treatment and control lakes.") +
  theme_classic()

In spring sampling, the treated and control lakes follow broadly similar trajectories over time, suggesting limited divergence associated with aquaculture. In contrast, fall observations exhibit greater variability with the treated lake showing more pronounced fluctuations during the aquaculture period.

These patterns suggest that potential treatment effects may be season-dependent and motivate separate analyses for spring and fall observations. They also highlight the importance of formally evaluating whether post-treatment differences reflect aquaculture impacts or pre-existing difference between lakes.

BACI Analysis

A standard Before-After Control-Impact (BACI) analysis evaluates whether the treated site changes differently over time relative to a control site. Statistically, this is implemented using an interaction between treatment status and time period. The interaction term captures whether the change in the treated lake differs from the change observed in the control lake following the intervention.

In this framework, a significant interaction term is often interpreted as evidence of a treatment effect. However, this interpretation depends on the assumption that the control lake provides a valid counterfactual trajectory for the treated lake.

Spring BACI Model

Code
spring <- mean_cpue %>%
  filter(season == "Spring") %>% # Select only spring sampling
  mutate(treat = as.factor(treat), period = as.factor(period))

mod_spring <- aov(sqrt_cpue ~ treat * period, data = spring)
summary(mod_spring)
             Df Sum Sq Mean Sq F value Pr(>F)
treat         1   0.03   0.029   0.009  0.924
period        2  13.81   6.906   2.238  0.123
treat:period  2   0.72   0.361   0.117  0.890
Residuals    33 101.82   3.085               
Code
TukeyHSD(mod_spring)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = sqrt_cpue ~ treat * period, data = spring)

$treat
           diff       lwr      upr     p adj
1-0 -0.05507311 -1.218461 1.108315 0.9238561

$period
                     diff       lwr       upr     p adj
During-Before -1.15849661 -2.827814 0.5108212 0.2192154
After-Before  -1.22403578 -2.954076 0.5060042 0.2071375
After-During  -0.06553917 -2.045921 1.9148427 0.9963713

$`treat:period`
                          diff       lwr      upr     p adj
1:Before-0:Before -0.259309534 -2.683401 2.164782 0.9994828
0:During-0:Before -1.271731117 -4.098683 1.555221 0.7496423
1:During-0:Before -1.263724352 -4.090676 1.563228 0.7544823
0:After-0:Before  -1.474880722 -4.130340 1.180578 0.5544095
1:After-0:Before  -1.022502710 -4.450686 2.405680 0.9432905
0:During-1:Before -1.012421582 -4.040111 2.015268 0.9109378
1:During-1:Before -1.004414817 -4.032104 2.023274 0.9136161
0:After-1:Before  -1.215571188 -4.083795 1.652652 0.7927870
1:After-1:Before  -0.763193176 -4.358702 2.832315 0.9868511
1:During-0:During  0.008006765 -3.350913 3.366926 1.0000000
0:After-0:During  -0.203149606 -3.419070 3.012771 0.9999612
1:After-0:During   0.249228407 -3.629318 4.127775 0.9999578
0:After-1:During  -0.211156371 -3.427077 3.004764 0.9999530
1:After-1:During   0.241221642 -3.637324 4.119768 0.9999641
1:After-0:After    0.452378012 -3.303008 4.207764 0.9990798

The spring BACI model shows no statistically significant effects of treatment, period, or their interaction. This indicates that, during spring sampling, minnow abundance in the treated lake does not change in a way that differs meaningfully from the control lake. Post-hoc comparisons from the Tukey test also fail to detect significant differences across periods. From an ecological perspective, these results provide little evidence that aquaculture activity influenced minnow abundance during the spring season.

Fall BACI Model

Code
fall <- mean_cpue %>%
  filter(season == "Fall") %>% # Select only fall sampling
  mutate(treat = as.factor(treat), period = as.factor(period))

mod_fall <- aov(sqrt_cpue ~ treat * period, data = fall)
summary(mod_fall)
             Df Sum Sq Mean Sq F value  Pr(>F)   
treat         1  65.06   65.06   6.930 0.01280 * 
period        2 102.46   51.23   5.457 0.00896 **
treat:period  2  79.63   39.82   4.241 0.02295 * 
Residuals    33 309.81    9.39                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Code
TukeyHSD(mod_fall)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = sqrt_cpue ~ treat * period, data = fall)

$treat
        diff       lwr      upr     p adj
1-0 2.604591 0.5915739 4.617608 0.0127963

$period
                   diff       lwr       upr     p adj
During-Before  3.944354  1.007041 6.8816682 0.0064908
After-Before   1.483456 -1.453858 4.4207698 0.4390600
After-During  -2.460898 -5.823250 0.9014534 0.1866112

$`treat:period`
                        diff        lwr        upr     p adj
1:Before-0:Before  0.5701233  -3.734546  4.8747927 0.9985471
0:During-0:Before  0.7708930  -4.225804  5.7675897 0.9969932
1:During-0:Before  8.0091708   3.012474 13.0058675 0.0003876
0:After-0:Before   1.3197265  -3.381994  6.0214473 0.9557988
1:After-0:Before   2.1920963  -3.216987  7.6011792 0.8213920
0:During-1:Before  0.2007697  -5.080593  5.4821328 0.9999969
1:During-1:Before  7.4390475   2.157684 12.7204105 0.0020506
0:After-1:Before   0.7496032  -4.253595  5.7528018 0.9973829
1:After-1:Before   1.6219730  -4.051121  7.2950670 0.9522996
1:During-0:During  7.2382778   1.379131 13.0974240 0.0085019
0:After-0:During   0.5488335  -5.060872  6.1585389 0.9996654
1:After-0:During   1.4212033  -4.793360  7.6357664 0.9816651
0:After-1:During  -6.6894443 -12.299150 -1.0797388 0.0119355
1:After-1:During  -5.8170745 -12.031638  0.3974886 0.0773119
1:After-0:After    0.8723698  -5.107596  6.8523360 0.9976943

In contrast, the fall BACI model yields statistically significant effects for treatment, period, and their interaction. The significant interaction indicates that minnow abundance in the treated lake changed differently over time relative to the control lake. Post-hoc comparisons suggest that this divergence is driven primarily by increases in CPUE during the aquaculture period in the treated lake. This pattern is consistent with a potential response of minnow populations to aquaculture-related changes in the lake environment, such as increased nutrient availability or altered food resources. However, this interpretation depends critically on the assumption that the treated and control lakes were following similar trajectories prior to treatment.

The fall ANOVA results can be summarized as follows:

  • treat: The treated lake had significantly higher fall minnow CPUE overall (treated lake was 2.60 sqrt CPUE units higher than control, p = 0.013).
  • period: Fall minnow abundance changed significantly over time across both lakes. During was significantly higher than Before (p = 0.006); After did not differ significantly from Before (p = 0.439).
  • treat:period: Lake 375 responded differently than Lake 373 across periods. The treated lake during aquaculture was significantly higher than: the control lake before aquaculture (1:During-0:Before, p < 0.001), the treated lake before aquaculture (1:During-1:Before, p = 0.002), and the control lake during aquaculture (1:During-0:During, p = 0.009). The comparison 0:After-1:During was also significant (p = 0.012), indicating a decline in the treated lake once operations ended.

Limitations of BACI

One limitation of the traditional BACI framework is that it assumes the control site provides a valid counterfactual for the treated site. In other words, the design assumes that the treated and control lakes would have followed similar trajectories in the absence of treatment. If this assumption is violated, for example, if the lakes were already trending differently before aquaculture began, then the estimated BACI interaction could reflect those pre-existing differences rather than the effect of the intervention. Difference-in-Differences approaches make this assumption explicit through the parallel trends assumption, which requires that treated and control units exhibit similar trends prior to treatment.

DiD: Testing Assumptions

In order to complete a Difference-in-differences analysis, a few assumptions must be met - No spillover: Because these lakes are separated, there is no concern of aquaculture in the treated lake affecting the control lake. - Parallel trends: The control and treatment lakes must have a similar trend of minnow CPUE prior to treatment.

Difference-in-Differences Analysis

Following the evaluation of parallel trends, treatment effects are estimated using a Difference-in-Differences framework. Models are estimated separately by season to account for seasonal variation in ecological responses. Unlike BACI, which compares average differences before and after treatment, the DiD approach explicitly models changes over time between treated and control units. The interaction between treatment and period represents the estimated treatment effect, capturing whether the treated lake experienced a different change in CPUE relative to the control. Separating the analysis into Before-During and Before-During-After comparisons allows us to distinguish between immediate effects of aquaculture and potential legacy effects after operations cease.

Before and During

Fall

Code
pre_aqua_fall <- aquaculture %>%
  filter(period != "After",
         season == "Fall")

mod_did_pre_fall <- lm(sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_fall)

summary(mod_did_pre_fall)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_fall)

Residuals:
     Min       1Q   Median       3Q      Max 
-13.5857  -2.0914  -0.4574   0.9579  23.7357 

Coefficients: (1 not defined because of singularities)
                   Estimate Std. Error t value Pr(>|t|)  
(Intercept)         1.99967    3.57848   0.559   0.5777  
treat               2.47479    1.93544   1.279   0.2042  
periodDuring        4.90326    4.01048   1.223   0.2246  
factor(year)1989    2.09314    4.59219   0.456   0.6496  
factor(year)1990   -0.73068    5.10169  -0.143   0.8864  
factor(year)1991    1.05524    5.10169   0.207   0.8366  
factor(year)1992   -0.96435    4.48829  -0.215   0.8304  
factor(year)1993   -2.02694    4.26968  -0.475   0.6361  
factor(year)1994    6.14593    4.73388   1.298   0.1974  
factor(year)1995    3.52301    7.15696   0.492   0.6237  
factor(year)1996   -0.07277    5.97994  -0.012   0.9903  
factor(year)1998    7.59200    7.15696   1.061   0.2916  
factor(year)1999    0.60837    4.32884   0.141   0.8885  
factor(year)2002    0.10463    4.30628   0.024   0.9807  
factor(year)2003   -6.95595    2.80880  -2.476   0.0151 *
factor(year)2004   -5.84793    2.43429  -2.402   0.0183 *
factor(year)2005   -0.75653    2.70196  -0.280   0.7801  
factor(year)2006   -3.26386    2.24396  -1.455   0.1492  
factor(year)2007         NA         NA      NA       NA  
treat:periodDuring  6.11921    2.55321   2.397   0.0186 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.198 on 92 degrees of freedom
Multiple R-squared:  0.3891,    Adjusted R-squared:  0.2695 
F-statistic: 3.255 on 18 and 92 DF,  p-value: 0.000105
Code
par(mfrow = c(1, 2))
plot(mod_did_pre_fall, which = 1)  # Residuals vs fitted
plot(mod_did_pre_fall, which = 2)  # QQ-plot

Code
durbinWatsonTest(mod_did_pre_fall) # Autocorrelation
 lag Autocorrelation D-W Statistic p-value
   1      -0.1203524      2.230921   0.964
 Alternative hypothesis: rho != 0

Diagnostics: The residuals vs. fitted plot shows increasing spread at higher fitted values, driven by the extreme CPUE spike during aquaculture — the sqrt transformation did not fully stabilize variance. The QQ plot confirms a heavy right tail from these outlier years. The Durbin-Watson test indicates no autocorrelation (DW = 2.23, p = 0.984).

The interaction coefficient in this model is positive and marginally significant, suggesting that minnow CPUE increased in the treated lake during aquaculture operations relative to the control lake.

Spring

Code
pre_aqua_spring <- aquaculture %>%
  filter(period != "After",
         season == "Spring")

mod_did_pre_spring <- lm(sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_spring)

summary(mod_did_pre_spring)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_spring)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.7609 -1.0945 -0.4564  0.9555  6.0714 

Coefficients: (1 not defined because of singularities)
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         10.87506    1.34479   8.087 3.47e-13 ***
treat                0.83532    0.54539   1.532 0.128016    
periodDuring        -8.17150    1.43414  -5.698 7.55e-08 ***
factor(year)1989    -7.04426    1.60607  -4.386 2.34e-05 ***
factor(year)1990    -8.24017    1.47534  -5.585 1.28e-07 ***
factor(year)1991    -8.37095    1.55638  -5.378 3.31e-07 ***
factor(year)1992    -7.88904    1.60607  -4.912 2.62e-06 ***
factor(year)1993    -9.16325    1.49818  -6.116 1.01e-08 ***
factor(year)1994    -7.54756    1.59118  -4.743 5.38e-06 ***
factor(year)1995    -5.82314    1.59118  -3.660 0.000364 ***
factor(year)1996   -10.24260    2.32925  -4.397 2.23e-05 ***
factor(year)1998    -6.49257    1.59118  -4.080 7.74e-05 ***
factor(year)1999    -9.67131    1.61945  -5.972 2.04e-08 ***
factor(year)2001    -9.92257    1.66945  -5.944 2.34e-08 ***
factor(year)2002    -9.11274    1.52806  -5.964 2.13e-08 ***
factor(year)2003    -0.04582    0.70970  -0.065 0.948625    
factor(year)2004    -0.27698    0.72811  -0.380 0.704250    
factor(year)2005    -1.48769    0.65345  -2.277 0.024416 *  
factor(year)2006    -0.87121    0.61827  -1.409 0.161159    
factor(year)2007          NA         NA      NA       NA    
treat:periodDuring  -0.95195    0.69777  -1.364 0.174803    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.902 on 132 degrees of freedom
Multiple R-squared:  0.3654,    Adjusted R-squared:  0.2741 
F-statistic: 4.001 on 19 and 132 DF,  p-value: 9.902e-07
Code
par(mfrow = c(1, 2))
plot(mod_did_pre_spring, which = 1)  # Residuals vs fitted
plot(mod_did_pre_spring, which = 2)  # QQ-plot

Code
durbinWatsonTest(mod_did_pre_spring) # Autocorrelation
 lag Autocorrelation D-W Statistic p-value
   1      0.09870169      1.794782   0.014
 Alternative hypothesis: rho != 0

Diagnostics: The residuals vs. fitted plot shows reasonably even spread. The QQ plot is approximately normal with minor right-tail deviation from a few high-leverage observations. The Durbin-Watson test detects mild positive autocorrelation (DW = 1.79, p = 0.01), which may slightly inflate standard error precision; however, given the non-significant treatment effect, this does not change the substantive conclusion.

The spring DiD model shows no significant treatment effect during the aquaculture period (treat:periodDuring, p = 0.175), consistent with the spring BACI result. This supports the conclusion that aquaculture did not alter minnow abundance in spring, likely due to high overwinter mortality resetting abundance before spring sampling each year.

Robustness Check

Adjusting the window

The robustness check shifts the period boundaries (Before: pre-1996, During: 1996–2004) to assess sensitivity to the period definition.

Code
pre_aqua_fall_mod <- aquaculture %>% 
  mutate(period = case_when(
      year < 1996  ~ "Before",
      year <= 2004 ~ "During",
      TRUE ~ "After")) %>%
  filter(period != "After",
         season == "Fall") 

mod_did_pre_fall_mod <- lm(sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_fall_mod)

summary(mod_did_pre_fall_mod)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_fall_mod)

Residuals:
    Min      1Q  Median      3Q     Max 
-7.7676 -1.5664 -0.6158  0.4748 18.5138 

Coefficients: (1 not defined because of singularities)
                   Estimate Std. Error t value Pr(>|t|)  
(Intercept)          1.9997     2.7198   0.735   0.4653  
treat                0.9902     1.8835   0.526   0.6012  
periodDuring         1.3070     3.1557   0.414   0.6803  
factor(year)1989     2.6870     3.5219   0.763   0.4487  
factor(year)1990    -0.2358     3.8973  -0.061   0.9520  
factor(year)1991     1.5501     3.8973   0.398   0.6923  
factor(year)1992    -0.2220     3.4617  -0.064   0.9491  
factor(year)1993    -1.2022     3.3103  -0.363   0.7179  
factor(year)1994     6.1459     3.5980   1.708   0.0931 .
factor(year)1995     3.5230     5.4397   0.648   0.5199  
factor(year)1996    -2.5453     3.7277  -0.683   0.4975  
factor(year)1998     6.2850     4.9753   1.263   0.2117  
factor(year)1999    -1.4756     2.1451  -0.688   0.4944  
factor(year)2002    -1.7851     2.1902  -0.815   0.4185  
factor(year)2003    -0.5290     2.2856  -0.231   0.8178  
factor(year)2004         NA         NA      NA       NA  
treat:periodDuring   2.6501     2.4853   1.066   0.2909  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 4.711 on 56 degrees of freedom
Multiple R-squared:  0.2197,    Adjusted R-squared:  0.01071 
F-statistic: 1.051 on 15 and 56 DF,  p-value: 0.4205
Code
pre_aqua_spring_mod <- aquaculture %>% 
  mutate(period = case_when(
      year < 1996  ~ "Before",
      year <= 2004 ~ "During",
      TRUE ~ "After")) %>%
  filter(period != "After",
         season == "Spring") 

mod_did_pre_spring_mod <- lm(sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_spring_mod)

summary(mod_did_pre_spring_mod)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_spring_mod)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.7609 -1.1512 -0.4247  1.1120  5.4117 

Coefficients: (1 not defined because of singularities)
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)         10.8751     1.4165   7.677 3.23e-11 ***
treat                0.8488     0.6619   1.282 0.203388    
periodDuring        -8.9034     1.5841  -5.620 2.62e-07 ***
factor(year)1989    -7.0496     1.6968  -4.155 8.02e-05 ***
factor(year)1990    -8.2451     1.5586  -5.290 1.02e-06 ***
factor(year)1991    -8.3786     1.6501  -5.078 2.39e-06 ***
factor(year)1992    -7.8944     1.6968  -4.653 1.26e-05 ***
factor(year)1993    -9.1700     1.5866  -5.780 1.34e-07 ***
factor(year)1994    -7.5476     1.6760  -4.503 2.22e-05 ***
factor(year)1995    -5.8231     1.6760  -3.474 0.000825 ***
factor(year)1996    -1.3392     2.1251  -0.630 0.530350    
factor(year)1998     2.4109     1.1426   2.110 0.037946 *  
factor(year)1999    -0.6500     1.0169  -0.639 0.524474    
factor(year)2001    -0.9602     1.1700  -0.821 0.414252    
factor(year)2002    -0.1504     0.9313  -0.161 0.872130    
factor(year)2003     0.1996     0.8366   0.239 0.812053    
factor(year)2004         NA         NA      NA       NA    
treat:periodDuring  -0.1313     0.9499  -0.138 0.890401    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.003 on 81 degrees of freedom
Multiple R-squared:  0.3989,    Adjusted R-squared:  0.2801 
F-statistic: 3.359 on 16 and 81 DF,  p-value: 0.0001612

Under this alternative window, the fall treatment effect (treat:periodDuring) is no longer significant (p = 0.291), and the spring effect remains non-significant (p = 0.890). Results are therefore sensitive to how the aquaculture window is defined, which warrants caution in interpretation.

Buffer

Remove observations of transition years between starting and stopping aquaculture.

Code
pre_aqua_fall_buff <- aquaculture %>%
  filter(period != "After",
         season == "Fall",
         year != 2003 & year != 2008) # Remove year aquaculture began and ended

mod_did_pre_fall_buff <- lm(sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_fall_buff)

summary(mod_did_pre_fall_buff)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_fall_buff)

Residuals:
     Min       1Q   Median       3Q      Max 
-14.5942  -1.8385  -0.2952   1.2572  22.7675 

Coefficients: (1 not defined because of singularities)
                   Estimate Std. Error t value Pr(>|t|)   
(Intercept)         1.99967    3.45622   0.579  0.56439   
treat               2.47479    1.86931   1.324  0.18904   
periodDuring        3.99557    3.88835   1.028  0.30703   
factor(year)1989    2.09314    4.43529   0.472  0.63817   
factor(year)1990   -0.73068    4.92739  -0.148  0.88246   
factor(year)1991    1.05524    4.92739   0.214  0.83093   
factor(year)1992   -0.96435    4.33495  -0.222  0.82448   
factor(year)1993   -2.02694    4.12381  -0.492  0.62431   
factor(year)1994    6.14593    4.57215   1.344  0.18242   
factor(year)1995    3.52301    6.91244   0.510  0.61159   
factor(year)1996   -0.07277    5.77564  -0.013  0.98998   
factor(year)1998    7.59200    6.91244   1.098  0.27513   
factor(year)1999    0.60837    4.18095   0.146  0.88465   
factor(year)2002    0.10463    4.15916   0.025  0.97999   
factor(year)2004   -5.67373    2.35203  -2.412  0.01798 * 
factor(year)2005   -0.45396    2.61211  -0.174  0.86244   
factor(year)2006   -3.00164    2.16952  -1.384  0.17008   
factor(year)2007         NA         NA      NA       NA   
treat:periodDuring  7.73287    2.53896   3.046  0.00308 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.986 on 86 degrees of freedom
Multiple R-squared:  0.4463,    Adjusted R-squared:  0.3369 
F-statistic: 4.078 on 17 and 86 DF,  p-value: 6.897e-06
Code
pre_aqua_spring_buff <- aquaculture %>%
  filter(period != "After",
         season == "Spring",
         year != 2003 & year != 2008)

mod_did_pre_spring_buff <- lm(sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_spring_buff)

summary(mod_did_pre_spring_buff)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = pre_aqua_spring_buff)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.7609 -1.0906 -0.4911  1.0705  6.1234 

Coefficients: (1 not defined because of singularities)
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)         10.8751     1.3528   8.039 6.89e-13 ***
treat                0.8353     0.5486   1.523 0.130477    
periodDuring        -8.2235     1.4456  -5.688 9.09e-08 ***
factor(year)1989    -7.0443     1.6156  -4.360 2.75e-05 ***
factor(year)1990    -8.2402     1.4841  -5.552 1.70e-07 ***
factor(year)1991    -8.3709     1.5656  -5.347 4.29e-07 ***
factor(year)1992    -7.8890     1.6156  -4.883 3.23e-06 ***
factor(year)1993    -9.1633     1.5071  -6.080 1.44e-08 ***
factor(year)1994    -7.5476     1.6006  -4.715 6.52e-06 ***
factor(year)1995    -5.8231     1.6006  -3.638 0.000405 ***
factor(year)1996   -10.2426     2.3431  -4.371 2.63e-05 ***
factor(year)1998    -6.4926     1.6006  -4.056 8.87e-05 ***
factor(year)1999    -9.6713     1.6291  -5.937 2.85e-08 ***
factor(year)2001    -9.9226     1.6794  -5.909 3.26e-08 ***
factor(year)2002    -9.1127     1.5371  -5.928 2.96e-08 ***
factor(year)2004    -0.2817     0.7325  -0.385 0.701213    
factor(year)2005    -1.4877     0.6573  -2.263 0.025404 *  
factor(year)2006    -0.8764     0.6220  -1.409 0.161405    
factor(year)2007         NA         NA      NA       NA    
treat:periodDuring  -0.8480     0.7261  -1.168 0.245142    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.913 on 121 degrees of freedom
Multiple R-squared:  0.3828,    Adjusted R-squared:  0.291 
F-statistic: 4.169 on 18 and 121 DF,  p-value: 9.516e-07

Excluding the transition years 2003 and 2008, the buffer specification strengthens the fall treatment effect (treat:periodDuring, p = 0.003), while the spring result remains non-significant (p = 0.245). This suggests the fall effect is robust to the inclusion of transition-year noise.

Before and After

Fall

Code
all_aqua_fall <- aquaculture %>% 
  filter(season == "Fall")

mod_did_all_fall <- lm(sqrt_cpue ~ treat * period, data = all_aqua_fall)

summary(mod_did_all_fall)

Call:
lm(formula = sqrt_cpue ~ treat * period, data = all_aqua_fall)

Residuals:
    Min      1Q  Median      3Q     Max 
-12.574  -3.073  -1.380   2.557  23.395 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)          3.1287     0.9993   3.131 0.001993 ** 
treat                1.1544     1.4989   0.770 0.442086    
periodDuring         0.8038     1.4132   0.569 0.570103    
periodAfter          1.8677     1.2081   1.546 0.123629    
treat:periodDuring   7.4872     2.0868   3.588 0.000416 ***
treat:periodAfter   -0.7597     1.8697  -0.406 0.684925    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.473 on 208 degrees of freedom
Multiple R-squared:  0.2089,    Adjusted R-squared:  0.1899 
F-statistic: 10.99 on 5 and 208 DF,  p-value: 2.12e-09
Code
par(mfrow = c(1, 2))  # 1 row, 2 columns
plot(mod_did_all_fall, which = 1)
plot(mod_did_all_fall, which = 2)

Code
durbinWatsonTest(mod_did_all_fall)
 lag Autocorrelation D-W Statistic p-value
   1      0.01530469      1.964652   0.546
 Alternative hypothesis: rho != 0

Diagnostics: The residuals vs. fitted plot shows heteroscedasticity at higher fitted values, consistent with the extreme aquaculture-period CPUE values. The QQ plot has a heavy right tail from these same observations. The Durbin-Watson test indicates no autocorrelation (DW = 1.96, p = 0.488).

The fall Before and After model shows a significant treatment effect during aquaculture (treat:periodDuring, p < 0.001), consistent with the Before and During results. The post-aquaculture interaction (treat:periodAfter, p = 0.685) is not significant, suggesting that any treatment effect did not persist after operations ended.

Spring

Code
all_aqua_spring <- aquaculture %>% 
  filter(season == "Spring")

mod_did_all_spring <- lm(sqrt_cpue ~ treat * period + factor(year), data = all_aqua_spring)

summary(mod_did_all_spring)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = all_aqua_spring)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.7609 -1.0652 -0.3948  0.7467  6.0714 

Coefficients: (2 not defined because of singularities)
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         10.87506    1.27869   8.505 4.23e-15 ***
treat                0.83532    0.51858   1.611  0.10881    
periodDuring        -8.17150    1.36365  -5.992 9.48e-09 ***
periodAfter         -9.11371    1.38114  -6.599 3.64e-10 ***
factor(year)1989    -7.04426    1.52712  -4.613 7.08e-06 ***
factor(year)1990    -8.24017    1.40282  -5.874 1.75e-08 ***
factor(year)1991    -8.37095    1.47987  -5.657 5.29e-08 ***
factor(year)1992    -7.88904    1.52712  -5.166 5.77e-07 ***
factor(year)1993    -9.16325    1.42453  -6.432 9.07e-10 ***
factor(year)1994    -7.54756    1.51297  -4.989 1.32e-06 ***
factor(year)1995    -5.82314    1.51297  -3.849  0.00016 ***
factor(year)1996   -10.24260    2.21476  -4.625 6.73e-06 ***
factor(year)1998    -6.49257    1.51297  -4.291 2.77e-05 ***
factor(year)1999    -9.67131    1.53985  -6.281 2.06e-09 ***
factor(year)2001    -9.92257    1.58739  -6.251 2.42e-09 ***
factor(year)2002    -9.11274    1.45294  -6.272 2.16e-09 ***
factor(year)2003    -0.04582    0.67481  -0.068  0.94594    
factor(year)2004    -0.27698    0.69232  -0.400  0.68953    
factor(year)2005    -1.48769    0.62133  -2.394  0.01757 *  
factor(year)2006    -0.87121    0.58788  -1.482  0.13993    
factor(year)2007          NA         NA      NA       NA    
factor(year)2008     0.25096    0.77315   0.325  0.74583    
factor(year)2009    -0.76346    0.70680  -1.080  0.28137    
factor(year)2010     0.93905    0.72790   1.290  0.19851    
factor(year)2011    -0.66631    0.96256  -0.692  0.48960    
factor(year)2012     1.07331    0.90417   1.187  0.23661    
factor(year)2013          NA         NA      NA       NA    
treat:periodDuring  -0.95195    0.66347  -1.435  0.15291    
treat:periodAfter   -0.43854    0.72330  -0.606  0.54500    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.808 on 200 degrees of freedom
Multiple R-squared:  0.3365,    Adjusted R-squared:  0.2503 
F-statistic: 3.902 on 26 and 200 DF,  p-value: 1.833e-08
Code
par(mfrow = c(1, 2))
plot(mod_did_all_spring, which = 1)
plot(mod_did_all_spring, which = 2)

Code
durbinWatsonTest(mod_did_all_spring)
 lag Autocorrelation D-W Statistic p-value
   1       0.1460512      1.699108       0
 Alternative hypothesis: rho != 0

Diagnostics: The residuals vs. fitted plot shows roughly constant spread. The QQ plot shows slight right-tail deviation. The Durbin-Watson test detects positive autocorrelation (DW = 1.70, p < 0.001), which may modestly inflate standard error precision; this is noted further in the Critical Evaluation, and does not alter the non-significant results.

Neither the during-aquaculture (treat:periodDuring, p = 0.153) nor post-aquaculture (treat:periodAfter, p = 0.545) interaction terms are significant in spring, consistent with all prior spring results.

Robustness Check

Adjusting the window
Code
all_aqua_fall_mod <- aquaculture %>%
  filter(season == "Fall") %>% 
  mutate(period = case_when(
      year < 1996  ~ "Before",
      year <= 2004 ~ "During",
      TRUE ~ "After"))

mod_did_all_fall_mod <- lm(sqrt_cpue ~ treat * period + factor(year), data = all_aqua_fall_mod)

summary(mod_did_all_fall_mod)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = all_aqua_fall_mod)

Residuals:
    Min      1Q  Median      3Q     Max 
-11.035  -2.801  -1.005   1.681  26.184 

Coefficients: (2 not defined because of singularities)
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)          5.6301     1.1954   4.710 4.81e-06 ***
treat                4.5136     1.0562   4.273 3.06e-05 ***
periodBefore        -3.6305     3.3812  -1.074  0.28433    
periodDuring        -2.3235     2.2118  -1.051  0.29483    
factor(year)1989     2.6870     4.0955   0.656  0.51258    
factor(year)1990    -0.2358     4.5321  -0.052  0.95856    
factor(year)1991     1.5501     4.5321   0.342  0.73271    
factor(year)1992    -0.2220     4.0255  -0.055  0.95607    
factor(year)1993    -1.2022     3.8495  -0.312  0.75517    
factor(year)1994     6.1459     4.1841   1.469  0.14353    
factor(year)1995     3.5230     6.3257   0.557  0.57823    
factor(year)1996    -2.5453     4.3349  -0.587  0.55780    
factor(year)1998     6.2850     5.7857   1.086  0.27873    
factor(year)1999    -1.4756     2.4946  -0.592  0.55486    
factor(year)2002    -1.7851     2.5470  -0.701  0.48424    
factor(year)2003    -0.5290     2.6578  -0.199  0.84245    
factor(year)2004         NA         NA      NA       NA    
factor(year)2005     2.0464     2.3103   0.886  0.37686    
factor(year)2006    -0.3589     1.8996  -0.189  0.85034    
factor(year)2007     3.5680     1.9125   1.866  0.06365 .  
factor(year)2008    -3.4467     1.9340  -1.782  0.07634 .  
factor(year)2009    -5.4904     1.7121  -3.207  0.00158 ** 
factor(year)2010    -2.1425     1.9626  -1.092  0.27636    
factor(year)2011     0.6586     1.8931   0.348  0.72830    
factor(year)2012    -0.9035     2.0390  -0.443  0.65818    
factor(year)2013         NA         NA      NA       NA    
treat:periodBefore  -3.5234     2.4317  -1.449  0.14901    
treat:periodDuring  -0.8733     2.1612  -0.404  0.68661    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.478 on 188 degrees of freedom
Multiple R-squared:  0.2837,    Adjusted R-squared:  0.1885 
F-statistic: 2.979 on 25 and 188 DF,  p-value: 1.291e-05
Code
all_aqua_spring_mod <- aquaculture %>%
  filter(season == "Spring") %>% 
  mutate(period = case_when(
      year < 1996  ~ "Before",
      year <= 2004 ~ "During",
      TRUE ~ "After"))

mod_did_all_spring_mod <- lm(sqrt_cpue ~ treat * period + factor(year), data = all_aqua_spring_mod)

summary(mod_did_all_spring_mod)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = all_aqua_spring_mod)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.7609 -1.0808 -0.4441  0.8936  6.1118 

Coefficients: (2 not defined because of singularities)
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)         1.76135    0.52190   3.375 0.000887 ***
treat              -0.03581    0.35245  -0.102 0.919177    
periodBefore        9.11371    1.38081   6.600 3.61e-10 ***
periodDuring        0.21028    0.82584   0.255 0.799275    
factor(year)1989   -7.04964    1.53136  -4.604 7.38e-06 ***
factor(year)1990   -8.24506    1.40662  -5.862 1.87e-08 ***
factor(year)1991   -8.37863    1.48920  -5.626 6.16e-08 ***
factor(year)1992   -7.89442    1.53136  -5.155 6.07e-07 ***
factor(year)1993   -9.16998    1.43190  -6.404 1.06e-09 ***
factor(year)1994   -7.54756    1.51261  -4.990 1.31e-06 ***
factor(year)1995   -5.82314    1.51261  -3.850 0.000159 ***
factor(year)1996   -1.33917    1.91786  -0.698 0.485823    
factor(year)1998    2.41086    1.03119   2.338 0.020378 *  
factor(year)1999   -0.65001    0.91771  -0.708 0.479586    
factor(year)2001   -0.96020    1.05596  -0.909 0.364279    
factor(year)2002   -0.15038    0.84053  -0.179 0.858191    
factor(year)2003    0.19957    0.75502   0.264 0.791800    
factor(year)2004         NA         NA      NA       NA    
factor(year)2005   -0.58588    0.71254  -0.822 0.411920    
factor(year)2006    0.02656    0.68803   0.039 0.969245    
factor(year)2007    0.90181    0.69643   1.295 0.196850    
factor(year)2008    0.48389    0.74821   0.647 0.518551    
factor(year)2009   -0.54717    0.68327  -0.801 0.424192    
factor(year)2010    1.18949    0.69717   1.706 0.089528 .  
factor(year)2011   -0.66631    0.96233  -0.692 0.489494    
factor(year)2012    1.07331    0.90395   1.187 0.236498    
factor(year)2013         NA         NA      NA       NA    
treat:periodBefore  0.88457    0.69358   1.275 0.203660    
treat:periodDuring  0.75326    0.70877   1.063 0.289165    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.808 on 200 degrees of freedom
Multiple R-squared:  0.3369,    Adjusted R-squared:  0.2507 
F-statistic: 3.908 on 26 and 200 DF,  p-value: 1.766e-08

Under the alternative period window, neither the fall nor spring treatment effects are significant across any period comparison, consistent with the Before and During robustness check.

Buffer
Code
all_aqua_fall_buff <- aquaculture %>%
  filter(period != "After",
         season == "Fall",
         year != 2003 & year != 2008) # Remove year aquaculture began and ended

mod_did_all_fall_buff <- lm(sqrt_cpue ~ treat * period + factor(year), data = all_aqua_fall_buff)

summary(mod_did_all_fall_buff)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = all_aqua_fall_buff)

Residuals:
     Min       1Q   Median       3Q      Max 
-14.5942  -1.8385  -0.2952   1.2572  22.7675 

Coefficients: (1 not defined because of singularities)
                   Estimate Std. Error t value Pr(>|t|)   
(Intercept)         1.99967    3.45622   0.579  0.56439   
treat               2.47479    1.86931   1.324  0.18904   
periodDuring        3.99557    3.88835   1.028  0.30703   
factor(year)1989    2.09314    4.43529   0.472  0.63817   
factor(year)1990   -0.73068    4.92739  -0.148  0.88246   
factor(year)1991    1.05524    4.92739   0.214  0.83093   
factor(year)1992   -0.96435    4.33495  -0.222  0.82448   
factor(year)1993   -2.02694    4.12381  -0.492  0.62431   
factor(year)1994    6.14593    4.57215   1.344  0.18242   
factor(year)1995    3.52301    6.91244   0.510  0.61159   
factor(year)1996   -0.07277    5.77564  -0.013  0.98998   
factor(year)1998    7.59200    6.91244   1.098  0.27513   
factor(year)1999    0.60837    4.18095   0.146  0.88465   
factor(year)2002    0.10463    4.15916   0.025  0.97999   
factor(year)2004   -5.67373    2.35203  -2.412  0.01798 * 
factor(year)2005   -0.45396    2.61211  -0.174  0.86244   
factor(year)2006   -3.00164    2.16952  -1.384  0.17008   
factor(year)2007         NA         NA      NA       NA   
treat:periodDuring  7.73287    2.53896   3.046  0.00308 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.986 on 86 degrees of freedom
Multiple R-squared:  0.4463,    Adjusted R-squared:  0.3369 
F-statistic: 4.078 on 17 and 86 DF,  p-value: 6.897e-06
Code
all_aqua_spring_buff <- aquaculture %>%
  filter(period != "After",
         season == "Spring",
         year != 2003 & year != 2008) # Remove year aquaculture began and ended

mod_did_all_spring_buff <- lm(sqrt_cpue ~ treat * period + factor(year), data = all_aqua_spring_buff)

summary(mod_did_all_spring_buff)

Call:
lm(formula = sqrt_cpue ~ treat * period + factor(year), data = all_aqua_spring_buff)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.7609 -1.0906 -0.4911  1.0705  6.1234 

Coefficients: (1 not defined because of singularities)
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)         10.8751     1.3528   8.039 6.89e-13 ***
treat                0.8353     0.5486   1.523 0.130477    
periodDuring        -8.2235     1.4456  -5.688 9.09e-08 ***
factor(year)1989    -7.0443     1.6156  -4.360 2.75e-05 ***
factor(year)1990    -8.2402     1.4841  -5.552 1.70e-07 ***
factor(year)1991    -8.3709     1.5656  -5.347 4.29e-07 ***
factor(year)1992    -7.8890     1.6156  -4.883 3.23e-06 ***
factor(year)1993    -9.1633     1.5071  -6.080 1.44e-08 ***
factor(year)1994    -7.5476     1.6006  -4.715 6.52e-06 ***
factor(year)1995    -5.8231     1.6006  -3.638 0.000405 ***
factor(year)1996   -10.2426     2.3431  -4.371 2.63e-05 ***
factor(year)1998    -6.4926     1.6006  -4.056 8.87e-05 ***
factor(year)1999    -9.6713     1.6291  -5.937 2.85e-08 ***
factor(year)2001    -9.9226     1.6794  -5.909 3.26e-08 ***
factor(year)2002    -9.1127     1.5371  -5.928 2.96e-08 ***
factor(year)2004    -0.2817     0.7325  -0.385 0.701213    
factor(year)2005    -1.4877     0.6573  -2.263 0.025404 *  
factor(year)2006    -0.8764     0.6220  -1.409 0.161405    
factor(year)2007         NA         NA      NA       NA    
treat:periodDuring  -0.8480     0.7261  -1.168 0.245142    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.913 on 121 degrees of freedom
Multiple R-squared:  0.3828,    Adjusted R-squared:  0.291 
F-statistic: 4.169 on 18 and 121 DF,  p-value: 9.516e-07

Excluding transition years, the fall treatment effect during aquaculture remains significant (treat:periodDuring, p = 0.003), while spring remains non-significant (p = 0.245). The post-aquaculture interaction is non-significant in both seasons, indicating no lasting legacy effect once operations ended.

Rennie et al. 2019 Critical Evaluation

Standard BACI designs test whether a treated site changes more than a control site following an intervention, but they rely on an implicit assumption that the control site provides a valid counterfactual trajectory. If the treated and control lakes were already diverging prior to aquaculture, the BACI interaction term could mistakenly attribute that divergence to the treatment effect.

The results suggest that any treatment effect is both season-specific and temporally limited. Evidence of increased minnow abundance during aquaculture is observed in the fall but not in the spring, and this effect does not persist after aquaculture operations end. This seasonal asymmetry is ecologically plausible and aligns with the broader ecosystem responses documented by Rennie et al. (2019), where increased nutrient inputs during aquaculture altered productivity and food availability, potentially benefiting forage fish during certain time of year.

Addition of Difference-in-Differences

This analysis strengthens the traditional BACI framework by incorporating a Difference-in-Differences perspective and explicitly evaluating the assumptions required for causal interpretation. The parallel trends test makes this assumption explicit and allows it to be evaluated using pre-treatment data. The absence of a statistically significant treatment-by-year interaction suggests that we fail to reject the parallel trends assumption, meaning there is no strong evidence of differential trends prior to aquaculture.

Another important strength of this analysis is the separation of the aquaculture period into distinct phases. Traditional BACI approaches collapse all post-treatment observations into a single “after” category, which can obscure differences between short-term and longer term responses. By estimating separate DiD models for the during-treatment and post-treatment periods, this analysis distinguishes between immediate effects of aquaculture and potential legacy effects after operations cease.

Finally, this analysis added robustness checks which were largely missing from the original analysis.

However, several important limitations remain:

  • The study includes only a single treated lake. With no replication at the treatment level, it is not possible to fully separate treatment effects from lake-specific dynamics. As a result, the findings should be interpreted as evidence consistent with an aquaculture effect rather than definitive causal proof. In addition, the limited number of observations reduces statistical power, making it more difficult to detect smaller or more gradual treatment effects.

  • There are model-based limitations. Diagnostic tests indicate heteroscedasticity and occasional deviations from normality, particularly in fall models driven by extreme CPUE values during the aquaculture period. Evidence of mild autocorrelation in the spring models suggest that standard errors may be somewhat underestimated, which could affect inference, although this does not alter the substantive conclusions given the lack of significant effects in spring.

  • Finally, the robustness checks demonstrate that results are sensitive to modeling choices, including the definition of treatment periods and the inclusion of transition years. While the fall treatment effect remains detectable under some specifications, it weakens or disappears under others, reinforcing the need for cautious interpretation.

Despite these limitations, the combination of visualization, BACI modeling, parallel trends testing, and Difference-in-Differences analysis provides a coherent and transparent evaluation of the aquaculture experiment.

Overall, the results illustrate how combining BACI designs with a DiD framework can strengthen causal interpretation in ecological impact studies. While the analysis is limited by the presence of only a single treatment lake, the parallel trends test and the separation of during- and post-treatment periods provide a more transparent evaluation of how aquaculture activity may influence fish community dynamics.

Conclusion

This analysis provides partial evidence that freshwater aquaculture influenced minnow abundance in the treatment lake, with increases observed during the aquaculture period in fall sampling but not in spring. These effects appear to be short-lived, as there is no strong evidence that difference between the treated and control lakes persist after aquaculture operations end. By extending the BACI framework with a Difference-in-Differences perspective and explicitly evaluating the parallel trends assumption, this study offers a more rigorous and transparent approach to causal inference than a standard BACI analysis alone. The results highlight the importance of testing underlying assumptions and considering temporal structure when interpreting ecological impact studies. At the same time, the findings should be interpreted in the broader context of the ecosystem-level experiment conducted by Rennie et al. (2019). Minnow abundance represents only one component of the lake food web, and observed changes likely reflect underlying shifts in nutrient dynamics and productivity associated with aquaculture activity.

Overall, this analysis illustrates both the potential and the limitations of applying quasi-experimental methods in ecological systems. While the results are consistent with a short-term aquaculture effect on forage fish abundance, the lack of replication and sensitivity to modeling choices limit the strength of causal claims. Future work incorporating additional treated systems or longer time series would improve statistical power and strengthen inference and provide a more complete understanding of how aquaculture influences freshwater ecosystems.