11 8 May 2027

11.1 Dispersal evolution in beetle experiments

Just read the papers from Brett’s and TEX’s labs. As Jen said, their “no evolution” treatment was spatial shuffling, so didn’t maintain the original genetic composition.

They both found increased mean and increased variance with evolution. Both found increased dispersal ability at the edge of the evolving populations; the flour beetle experiment also found a reduction in low-density growth rate.

The effects on dispersal are explained as spatial sorting; the growth rate effects are hypothesized to represent “gene surfing”, whereby deleterious alleles exposed by founder effects at the leading edge are carried forward by the fact that next generation’s leading edge is primarily founded by this generation’s leading edge.

The flour beetle experiment found that the among-replicate variance in cumulative spread grew faster than linearly. This is consistent with among-replicate differences in mean speeds (which would generate a quadratic growth in variance through time). This pattern was found in both treatments, suggesting that it’s not just a consequence of founder effects at the leading edge. Perhaps it represents founder effects in the initial establishment from the stock population (each replicate was founded by 20 individuals). The bean beetle experiment doesn’t show this graph but found strong support for a random effect for replicate speed in their model for cumulative spread.

So a couple of things to do (both for Ler and the evolution experiments):

  • Plot mean and variance of cumulative spread against time
  • Fit the bean beetle model (as a first approximation to be quick I can treat rep as a fixed effect).

11.2 Ler cumulative spread

To facilitate the above analyses, I have modified the script for popLer to make categorical versions of Generation and Replicate (Gen and Rep, respectively), and put the guts of last time’s data manipulation into a munge script, which creates LerC_spread containing cumulative and per-generation spread for the C treatment replicates.

Let’s calculate the means and variances of cumulative spread:

cum_spread_stats <- group_by(LerC_spread, Gap, Gen, Generation) %>%
  summarise(mean_spread = mean(Furthest),
            var_spread = var(Furthest),
            CV_spread = sqrt(var_spread)/mean_spread
  )

And now plot the results:

ggplot(aes(x = Generation, y = mean_spread, color = Gap), data = cum_spread_stats) +
  geom_point() + geom_smooth(method = "lm")

ggplot(aes(x = Generation, y = var_spread, color = Gap), data = cum_spread_stats) +
  geom_point() + geom_line()

ggplot(aes(x = Generation, y = CV_spread, color = Gap), data = cum_spread_stats) +
  geom_point() + geom_line()
Warning: Removed 1 rows containing missing values (geom_point).
Warning: Removed 1 rows containing missing values (geom_path).

The linear approximation to mean spread is pretty good, although we see a dip in generation 6, as expected from the reduced seed production, and even without gen 6, the continuous runways seem to be decelerating. The ranking between landscapes makes sense. The variances are rather more over the map, although we don’t have confidence intervals on them. But exept for 1-pot gaps, we can squint and imagine that the variances are linear in time. Note, however, that with only 6 generations we’re not going to easily detect nonlinearities. I don’t know that the CVs tell us much.

Probably the best way to get CIs is to bootstrap replicates.

Let’s try fitting a model. We’ll need to add a lag of cumulative spread.

LerC_spread <- mutate(LerC_spread, 
                      Furthestm1 = lag(Furthest, default = 0))
m1 <- lm(Furthest ~ Generation + Rep + Generation:Rep + Furthestm1, 
         data = filter(LerC_spread, Gap == "0p"))
summary(m1)

Call:
lm(formula = Furthest ~ Generation + Rep + Generation:Rep + Furthestm1, 
    data = filter(LerC_spread, Gap == "0p"))

Residuals:
     Min       1Q   Median       3Q      Max 
-2.08017 -0.73937  0.03383  0.78409  2.54087 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)      -0.26479    1.38823  -0.191 0.849720    
Generation        2.22470    0.58884   3.778 0.000528 ***
Rep2              0.42109    1.81056   0.233 0.817308    
Rep3              1.70697    1.81500   0.940 0.352762    
Rep4             -0.36309    1.82680  -0.199 0.843484    
Rep5              1.94739    1.80616   1.078 0.287571    
Rep6              0.91400    1.80930   0.505 0.616284    
Rep7              0.73685    1.80286   0.409 0.684987    
Rep8             -1.47533    1.86173  -0.792 0.432890    
Rep9              1.19824    1.80269   0.665 0.510156    
Rep10             0.63691    1.82680   0.349 0.729229    
Furthestm1        0.02636    0.21151   0.125 0.901446    
Generation:Rep2   0.15787    0.47548   0.332 0.741652    
Generation:Rep3  -0.81727    0.47167  -1.733 0.091045 .  
Generation:Rep4   1.08491    0.51942   2.089 0.043312 *  
Generation:Rep5   0.51499    0.51405   1.002 0.322606    
Generation:Rep6  -0.58945    0.47054  -1.253 0.217770    
Generation:Rep7  -0.25940    0.46323  -0.560 0.578691    
Generation:Rep8   1.45031    0.54307   2.671 0.010986 *  
Generation:Rep9  -0.20452    0.46429  -0.440 0.662009    
Generation:Rep10  0.65634    0.51942   1.264 0.213878    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.369 on 39 degrees of freedom
Multiple R-squared:  0.9503,    Adjusted R-squared:  0.9248 
F-statistic: 37.25 on 20 and 39 DF,  p-value: < 2.2e-16
car::Anova(m1)
Anova Table (Type II tests)

Response: Furthest
               Sum Sq Df F value  Pr(>F)  
Generation      5.178  1  2.7619 0.10455  
Rep            32.986  9  1.9550 0.07214 .
Furthestm1      0.029  1  0.0155 0.90145  
Generation:Rep 35.750  9  2.1188 0.05125 .
Residuals      73.114 39                  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

This is a little curious– I wasn’t expecting the reps to have different speeds, except as a side effect of autocorrelation. Let’s try a few other models:

m2 <- lm(Furthest ~ Generation + Rep + Generation:Rep, 
         data = filter(LerC_spread, Gap == "0p"))
m3 <- lm(Furthest ~ Generation + Furthestm1, data = filter(LerC_spread, Gap == "0p"))
anova(m1, m2, m3)
Analysis of Variance Table

Model 1: Furthest ~ Generation + Rep + Generation:Rep + Furthestm1
Model 2: Furthest ~ Generation + Rep + Generation:Rep
Model 3: Furthest ~ Generation + Furthestm1
  Res.Df     RSS  Df Sum of Sq      F  Pr(>F)  
1     39  73.114                               
2     40  73.143  -1    -0.029 0.0155 0.90145  
3     57 141.849 -17   -68.707 2.1558 0.02383 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hmm, they really do seem to have different slopes. But we have not yet accounted for time-varying speeds. I don’t see how to do that in this context; let’s look at per-generation speeds instead:

m11 <- lm(speed ~ Gen + Rep, data = filter(LerC_spread, Gap == "0p"))
summary(m11)

Call:
lm(formula = speed ~ Gen + Rep, data = filter(LerC_spread, Gap == 
    "0p"))

Residuals:
    Min      1Q  Median      3Q     Max 
-3.0333 -0.7083 -0.0500  0.8667  2.5333 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)  
(Intercept)  1.733e+00  6.973e-01   2.486   0.0167 *
Gen2         1.400e+00  6.237e-01   2.245   0.0298 *
Gen3         1.300e+00  6.237e-01   2.084   0.0428 *
Gen4         7.000e-01  6.237e-01   1.122   0.2677  
Gen5         4.000e-01  6.237e-01   0.641   0.5246  
Gen6        -1.200e+00  6.237e-01  -1.924   0.0607 .
Rep2         7.525e-16  8.052e-01   0.000   1.0000  
Rep3        -6.667e-01  8.052e-01  -0.828   0.4121  
Rep4         1.000e+00  8.052e-01   1.242   0.2207  
Rep5         6.667e-01  8.052e-01   0.828   0.4121  
Rep6        -5.000e-01  8.052e-01  -0.621   0.5378  
Rep7        -3.333e-01  8.052e-01  -0.414   0.6809  
Rep8         1.167e+00  8.052e-01   1.449   0.1543  
Rep9        -1.667e-01  8.052e-01  -0.207   0.8370  
Rep10        5.000e-01  8.052e-01   0.621   0.5378  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.395 on 45 degrees of freedom
Multiple R-squared:  0.4365,    Adjusted R-squared:  0.2612 
F-statistic:  2.49 on 14 and 45 DF,  p-value: 0.01046
car::Anova(m11)
Anova Table (Type II tests)

Response: speed
          Sum Sq Df F value   Pr(>F)   
Gen       46.133  5  4.7433 0.001451 **
Rep       21.667  9  1.2376 0.297021   
Residuals 87.533 45                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Well this is confusing! If the per-generation speeds don’t differ among reps, how can the slopes of cumulative spread do so? Let’s look at some plots:

ggplot(aes(x = Generation, y = Furthest, color = Rep), 
       data = filter(LerC_spread, Gap == "0p")) +
  geom_point() + geom_smooth(method = "lm")

ggplot(aes(x = Generation, y = speed, color = Rep), 
       data = filter(LerC_spread, Gap == "0p")) +
  geom_line()

Let’s look for autocorrelation in speed.

m12 <- lm(speed ~ Gen + Rep + speed_m1, data = filter(LerC_spread, Gap == "0p"))
summary(m12)

Call:
lm(formula = speed ~ Gen + Rep + speed_m1, data = filter(LerC_spread, 
    Gap == "0p"))

Residuals:
    Min      1Q  Median      3Q     Max 
-2.9931 -0.5869 -0.0863  0.7257  2.5069 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   3.6162     0.7801   4.635  4.8e-05 ***
Gen3          0.3577     0.6601   0.542 0.591277    
Gen4         -0.2750     0.6549  -0.420 0.677148    
Gen5         -0.7711     0.6313  -1.222 0.230033    
Gen6         -2.4692     0.6246  -3.953 0.000357 ***
Rep2          0.2654     0.8793   0.302 0.764579    
Rep3         -0.7962     0.8839  -0.901 0.373882    
Rep4          1.5962     0.8839   1.806 0.079554 .  
Rep5          0.7270     0.8930   0.814 0.421127    
Rep6         -0.7308     0.8810  -0.829 0.412469    
Rep7         -0.2654     0.8793  -0.302 0.764579    
Rep8          1.7923     0.8992   1.993 0.054082 .  
Rep9         -0.4000     0.8787  -0.455 0.651778    
Rep10         0.8616     0.8879   0.970 0.338540    
speed_m1     -0.3270     0.1591  -2.055 0.047378 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.389 on 35 degrees of freedom
  (10 observations deleted due to missingness)
Multiple R-squared:  0.5314,    Adjusted R-squared:  0.3439 
F-statistic: 2.835 on 14 and 35 DF,  p-value: 0.006219
car::Anova(m12)
Anova Table (Type II tests)

Response: speed
          Sum Sq Df F value    Pr(>F)    
Gen       47.871  4  6.1995 0.0007015 ***
Rep       32.146  9  1.8502 0.0935244 .  
speed_m1   8.154  1  4.2240 0.0473783 *  
Residuals 67.566 35                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Aha! there is negative autocorrelation in speed (evidently it was obscured by the time-dependent patterns in the univariate analysis I did last week). A potential explanation for this could be partial “pushing” by older pots, so that a replicate that gets extra far this generation has less pushing next generation. Alternatively, it could reflect a correlation between distance spread and the number of plants in the furthest pot.

Let’s do one more analysis with a quadratic of time, so we can interact it with Rep:

m13 <- lm(speed ~ poly(Generation, 2) * Rep + speed_m1, 
          data = filter(LerC_spread, Gap == "0p"))
summary(m13)

Call:
lm(formula = speed ~ poly(Generation, 2) * Rep + speed_m1, data = filter(LerC_spread, 
    Gap == "0p"))

Residuals:
     Min       1Q   Median       3Q      Max 
-2.14668 -0.47051  0.02562  0.52439  2.46495 

Coefficients:
                             Estimate Std. Error t value Pr(>|t|)   
(Intercept)                 3.054e+00  9.512e-01   3.211   0.0046 **
poly(Generation, 2)1        1.990e+00  7.837e+00   0.254   0.8023   
poly(Generation, 2)2       -2.395e+00  7.431e+00  -0.322   0.7507   
Rep2                        4.945e-01  1.154e+00   0.429   0.6730   
Rep3                        1.295e-01  1.159e+00   0.112   0.9122   
Rep4                        2.280e+00  1.154e+00   1.976   0.0629 . 
Rep5                        6.689e-01  1.166e+00   0.574   0.5730   
Rep6                       -6.265e-01  1.150e+00  -0.545   0.5922   
Rep7                        1.540e-02  1.160e+00   0.013   0.9895   
Rep8                        1.467e+00  1.155e+00   1.270   0.2194   
Rep9                       -9.598e-01  1.150e+00  -0.835   0.4142   
Rep10                       8.141e-01  1.148e+00   0.709   0.4869   
speed_m1                   -4.215e-01  1.982e-01  -2.126   0.0468 * 
poly(Generation, 2)1:Rep2  -1.014e+01  1.115e+01  -0.910   0.3745   
poly(Generation, 2)2:Rep2  -5.019e+00  1.087e+01  -0.462   0.6495   
poly(Generation, 2)1:Rep3  -1.910e+01  1.109e+01  -1.722   0.1012   
poly(Generation, 2)2:Rep3   7.551e+00  1.057e+01   0.714   0.4838   
poly(Generation, 2)1:Rep4  -1.356e+01  1.122e+01  -1.208   0.2417   
poly(Generation, 2)2:Rep4   3.330e+00  1.155e+01   0.288   0.7762   
poly(Generation, 2)1:Rep5  -3.324e+00  1.110e+01  -0.299   0.7678   
poly(Generation, 2)2:Rep5  -8.064e+00  1.046e+01  -0.771   0.4502   
poly(Generation, 2)1:Rep6  -3.761e+00  1.109e+01  -0.339   0.7382   
poly(Generation, 2)2:Rep6   5.375e-14  1.044e+01   0.000   1.0000   
poly(Generation, 2)1:Rep7  -1.072e+01  1.111e+01  -0.965   0.3467   
poly(Generation, 2)2:Rep7  -3.057e+00  1.080e+01  -0.283   0.7801   
poly(Generation, 2)1:Rep8   5.176e+00  1.121e+01   0.462   0.6496   
poly(Generation, 2)2:Rep8  -7.049e+00  1.053e+01  -0.669   0.5114   
poly(Generation, 2)1:Rep9   2.805e+00  1.108e+01   0.253   0.8028   
poly(Generation, 2)2:Rep9  -1.315e+01  1.057e+01  -1.244   0.2287   
poly(Generation, 2)1:Rep10 -6.363e+00  1.115e+01  -0.571   0.5750   
poly(Generation, 2)2:Rep10 -1.054e+01  1.087e+01  -0.970   0.3444   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.43 on 19 degrees of freedom
  (10 observations deleted due to missingness)
Multiple R-squared:  0.7304,    Adjusted R-squared:  0.3048 
F-statistic: 1.716 on 30 and 19 DF,  p-value: 0.1102
car::Anova(m13)
Anova Table (Type II tests)

Response: speed
                        Sum Sq Df F value    Pr(>F)    
poly(Generation, 2)     46.959  2 11.4785 0.0005389 ***
Rep                     32.487  9  1.7646 0.1422649    
speed_m1                 9.249  1  4.5217 0.0467938 *  
poly(Generation, 2):Rep 29.613 18  0.8043 0.6761230    
Residuals               38.865 19                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Drop the interaction:

m14 <- lm(speed ~ poly(Generation, 2) + Rep + speed_m1, 
          data = filter(LerC_spread, Gap == "0p"))
summary(m14)

Call:
lm(formula = speed ~ poly(Generation, 2) + Rep + speed_m1, data = filter(LerC_spread, 
    Gap == "0p"))

Residuals:
     Min       1Q   Median       3Q      Max 
-2.89320 -0.68615 -0.06304  0.68486  2.49198 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)            2.9649     0.7018   4.225  0.00015 ***
poly(Generation, 2)1  -4.2553     2.4272  -1.753  0.08786 .  
poly(Generation, 2)2  -5.5072     2.3684  -2.325  0.02565 *  
Rep2                   0.2662     0.8609   0.309  0.75893    
Rep3                  -0.7985     0.8653  -0.923  0.36206    
Rep4                   1.5985     0.8653   1.847  0.07269 .  
Rep5                   0.7309     0.8738   0.836  0.40831    
Rep6                  -0.7323     0.8626  -0.849  0.40133    
Rep7                  -0.2662     0.8609  -0.309  0.75893    
Rep8                   1.7970     0.8797   2.043  0.04824 *  
Rep9                  -0.4000     0.8604  -0.465  0.64473    
Rep10                  0.8647     0.8690   0.995  0.32619    
speed_m1              -0.3309     0.1526  -2.169  0.03660 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.36 on 37 degrees of freedom
  (10 observations deleted due to missingness)
Multiple R-squared:  0.5251,    Adjusted R-squared:  0.371 
F-statistic: 3.409 on 12 and 37 DF,  p-value: 0.002013
car::Anova(m14)
Anova Table (Type II tests)

Response: speed
                    Sum Sq Df F value    Pr(>F)    
poly(Generation, 2) 46.959  2 12.6865 6.372e-05 ***
Rep                 32.487  9  1.9504   0.07456 .  
speed_m1             8.705  1  4.7036   0.03660 *  
Residuals           68.478 37                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

So, in conclusion: weak evidence for among-Rep differences in means, but strong evidence for negative autocorrelation. Note that this autocorrelation should act to slow the rate at which the variance in cumulative spread increases with time.

Let’s check out the other landscapes:

m24 <- lm(speed ~ Gen + Rep + speed_m1, 
          data = filter(LerC_spread, Gap == "1p"))
m34 <- lm(speed ~ Gen + Rep + speed_m1, 
          data = filter(LerC_spread, Gap == "2p"))
m44 <- lm(speed ~ Gen + Rep + speed_m1, 
          data = filter(LerC_spread, Gap == "3p"))
summary(m24)

Call:
lm(formula = speed ~ Gen + Rep + speed_m1, data = filter(LerC_spread, 
    Gap == "1p"))

Residuals:
    Min      1Q  Median      3Q     Max 
-1.9393 -1.0203 -0.2807  0.7435  3.0813 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)  
(Intercept)  1.939e+00  8.046e-01   2.410   0.0213 *
Gen3        -6.966e-01  6.728e-01  -1.035   0.3076  
Gen4        -6.345e-01  6.671e-01  -0.951   0.3481  
Gen5        -2.000e-01  6.664e-01  -0.300   0.7658  
Gen6        -1.131e+00  6.692e-01  -1.690   0.0999 .
Rep2         1.379e-01  9.504e-01   0.145   0.8855  
Rep3        -1.100e-15  9.424e-01   0.000   1.0000  
Rep4        -1.008e-15  9.424e-01   0.000   1.0000  
Rep5         9.379e-01  9.504e-01   0.987   0.3305  
Rep6         4.000e-01  9.424e-01   0.424   0.6738  
Rep7        -3.310e-01  9.444e-01  -0.351   0.7280  
Rep8         4.690e-01  9.444e-01   0.497   0.6226  
Rep9         4.000e-01  9.424e-01   0.424   0.6738  
Rep10        1.007e+00  9.604e-01   1.048   0.3017  
speed_m1    -1.724e-01  1.543e-01  -1.117   0.2715  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.49 on 35 degrees of freedom
  (10 observations deleted due to missingness)
Multiple R-squared:  0.1932,    Adjusted R-squared:  -0.1295 
F-statistic: 0.5988 on 14 and 35 DF,  p-value: 0.8474
summary(m34)

Call:
lm(formula = speed ~ Gen + Rep + speed_m1, data = filter(LerC_spread, 
    Gap == "2p"))

Residuals:
    Min      1Q  Median      3Q     Max 
-2.9139 -0.8927 -0.3292  0.9515  3.3861 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)  
(Intercept)  2.206e+00  8.573e-01   2.573   0.0145 *
Gen3        -3.000e-01  7.061e-01  -0.425   0.6736  
Gen4        -5.386e-02  7.076e-01  -0.076   0.9398  
Gen5         3.010e-16  7.061e-01   0.000   1.0000  
Gen6        -6.000e-01  7.061e-01  -0.850   0.4013  
Rep2         1.077e-01  1.003e+00   0.107   0.9151  
Rep3        -1.200e+00  9.986e-01  -1.202   0.2376  
Rep4        -1.200e+00  9.986e-01  -1.202   0.2376  
Rep5        -1.308e+00  1.003e+00  -1.304   0.2007  
Rep6        -1.308e+00  1.003e+00  -1.304   0.2007  
Rep7         7.077e-01  1.003e+00   0.706   0.4850  
Rep8        -1.200e+00  9.986e-01  -1.202   0.2376  
Rep9        -2.015e+00  1.015e+00  -1.985   0.0550 .
Rep10       -4.923e-01  1.003e+00  -0.491   0.6266  
speed_m1    -1.795e-01  1.524e-01  -1.178   0.2469  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.579 on 35 degrees of freedom
  (10 observations deleted due to missingness)
Multiple R-squared:  0.2666,    Adjusted R-squared:  -0.02679 
F-statistic: 0.9087 on 14 and 35 DF,  p-value: 0.558
summary(m44)

Call:
lm(formula = speed ~ Gen + Rep + speed_m1, data = filter(LerC_spread, 
    Gap == "3p"))

Residuals:
    Min      1Q  Median      3Q     Max 
-1.8047 -0.8358 -0.5528  0.2732  3.5512 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.150e-03  8.867e-01  -0.004    0.997
Gen3        -2.961e-01  7.572e-01  -0.391    0.698
Gen4         8.520e-01  7.464e-01   1.141    0.261
Gen5        -1.921e-01  7.991e-01  -0.240    0.811
Gen6        -3.480e-01  7.464e-01  -0.466    0.644
Rep2         9.039e-01  1.061e+00   0.852    0.400
Rep3         9.039e-01  1.061e+00   0.852    0.400
Rep4         1.808e+00  1.091e+00   1.657    0.106
Rep5         9.039e-01  1.061e+00   0.852    0.400
Rep6         9.039e-01  1.061e+00   0.852    0.400
Rep7         8.000e-01  1.050e+00   0.762    0.451
Rep8         9.039e-01  1.061e+00   0.852    0.400
Rep9         9.039e-01  1.061e+00   0.852    0.400
Rep10       -7.436e-17  1.050e+00   0.000    1.000
speed_m1    -1.299e-01  1.842e-01  -0.705    0.485

Residual standard error: 1.661 on 35 degrees of freedom
  (10 observations deleted due to missingness)
Multiple R-squared:  0.1824,    Adjusted R-squared:  -0.1447 
F-statistic: 0.5575 on 14 and 35 DF,  p-value: 0.879
car::Anova(m24)
Anova Table (Type II tests)

Response: speed
          Sum Sq Df F value Pr(>F)
Gen        7.794  4  0.8776 0.4873
Rep        7.984  9  0.3996 0.9268
speed_m1   2.772  1  1.2485 0.2715
Residuals 77.708 35               
car::Anova(m34)
Anova Table (Type II tests)

Response: speed
          Sum Sq Df F value Pr(>F)
Gen        2.708  4  0.2715 0.8943
Rep       28.733  9  1.2805 0.2819
speed_m1   3.458  1  1.3869 0.2469
Residuals 87.262 35               
car::Anova(m44)
Anova Table (Type II tests)

Response: speed
          Sum Sq Df F value Pr(>F)
Gen        9.585  4  0.8687 0.4924
Rep       10.624  9  0.4279 0.9109
speed_m1   1.372  1  0.4974 0.4853
Residuals 96.548 35               

Nothing to see here, folks!

The pattern of autocorrelation should, I think, fall into the category of something that we want the model to reproduce.