15 24 May 2027
15.1 Reboot Ler spread rates
(Rerun of analyses from 5 and 8 May)
Look at trends by rep:
ggplot(LerC_spread, aes(x = Generation, y = speed, color = Rep)) +
geom_point(position = "jitter") +
geom_smooth(method = "lm", se = FALSE) +
facet_wrap(~Gap)
ggplot(LerC_spread, aes(x = Generation, y = speed)) +
geom_point(position = "jitter") +
geom_smooth() +
facet_wrap(~Gap)
ggplot(LerC_spread, aes(x = Generation, y = speed)) +
geom_point(position = "jitter") +
geom_smooth(method = "gam", method.args = list(k = 4)) +
facet_wrap(~Gap)
summary(lm(speed ~ Generation, data = filter(LerC_spread, Gap == "0p")))
Call:
lm(formula = speed ~ Generation, data = filter(LerC_spread, Gap ==
"0p"))
Residuals:
Min 1Q Median 3Q Max
-2.4705 -1.3090 0.0295 1.1224 3.5295
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.2933 0.4609 7.145 1.67e-09 ***
Generation -0.2743 0.1183 -2.318 0.024 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.566 on 58 degrees of freedom
Multiple R-squared: 0.08476, Adjusted R-squared: 0.06898
F-statistic: 5.371 on 1 and 58 DF, p-value: 0.02402
library(mgcv)
summary(gam(speed ~ s(Generation, k = 4), data = filter(LerC_spread, Gap == "0p")))
Family: gaussian
Link function: identity
Formula:
speed ~ s(Generation, k = 4)
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.3333 0.1828 12.77 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(Generation) 2.223 2.597 7.506 0.000784 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
R-sq.(adj) = 0.239 Deviance explained = 26.7%
GCV = 2.1184 Scale est. = 2.0046 n = 60
plot(gam(speed ~ s(Generation, k = 4), data = filter(LerC_spread, Gap == "0p")))
anova(gam(speed ~ s(Generation, k = 4), data = filter(LerC_spread, Gap == "0p")),
gam(speed ~ Generation, data = filter(LerC_spread, Gap == "0p")),
test = "Chisq")
Analysis of Deviance Table
Model 1: speed ~ s(Generation, k = 4)
Model 2: speed ~ Generation
Resid. Df Resid. Dev Df Deviance Pr(>Chi)
1 56.403 113.82
2 58.000 142.17 -1.5975 -28.351 0.0004792 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
This replicates the prior analysis exactly.
Now look at the autocorrelation and interaction analysis from 8 May:
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.9660 -0.6326 -0.5617 0.2950 3.4950
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.660e-01 8.802e-01 -0.416 0.6804
Gen3 7.092e-02 7.694e-01 0.092 0.9271
Gen4 1.404e+00 7.694e-01 1.825 0.0776 .
Gen5 2.837e-01 8.417e-01 0.337 0.7384
Gen6 7.092e-02 7.694e-01 0.092 0.9271
Rep2 9.277e-01 1.038e+00 0.894 0.3782
Rep3 9.277e-01 1.038e+00 0.894 0.3782
Rep4 1.855e+00 1.073e+00 1.728 0.0939 .
Rep5 9.277e-01 1.038e+00 0.894 0.3782
Rep6 9.277e-01 1.038e+00 0.894 0.3782
Rep7 8.000e-01 1.025e+00 0.780 0.4412
Rep9 9.277e-01 1.038e+00 0.894 0.3782
Rep10 -8.426e-16 1.025e+00 0.000 1.0000
speed_m1 -1.596e-01 1.983e-01 -0.805 0.4272
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.621 on 31 degrees of freedom
(9 observations deleted due to missingness)
Multiple R-squared: 0.2256, Adjusted R-squared: -0.0991
F-statistic: 0.6948 on 13 and 31 DF, p-value: 0.7534
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 12.533 4 1.1918 0.3339
Rep 10.906 8 0.5186 0.8332
speed_m1 1.702 1 0.6475 0.4272
Residuals 81.498 31
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.
And fortunately, nothing has changed from the prior analysis.
15.1.1 Ler Cumulative spread
And finally double check the cumulative spread plots:
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).
This looks just like the previous results—repeating my previous summary,
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.
It really does seem relevant to do the bootstrapping, to see whether the (rather nonsystematic) patterns in the cumulative variance vs. time are real.
15.2 Reboot spread analysis of evolution experiments
(From 10 May)
Let’s calculate the means and variances of cumulative spread:
cum_spread_stats <- group_by(RIL_spread, Treatment, 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 = Treatment), data = cum_spread_stats) +
geom_point() + geom_line() + facet_wrap(~ Gap)
ggplot(aes(x = Generation, y = var_spread, color = Treatment), data = cum_spread_stats) +
geom_point() + geom_line() + facet_wrap(~ Gap)
ggplot(aes(x = Generation, y = CV_spread, color = Treatment), data = cum_spread_stats) +
geom_point() + geom_line() + facet_wrap(~ Gap)
Warning: Removed 1 rows containing missing values (geom_point).
The patterns in the mean are probably not overly distinguishable from linear, although I’d want to see CIs.
Let’s look at per-generation spread.
speed_stats <- group_by(RIL_spread, Treatment, Gap, Gen, Generation) %>%
summarise(mean_spread = mean(speed),
var_spread = var(speed),
CV_spread = sqrt(var_spread)/mean_spread
)
And now plot the results:
ggplot(aes(x = Generation, y = mean_spread, color = Treatment), data = speed_stats) +
geom_point() + geom_line() + facet_wrap(~ Gap)
ggplot(aes(x = Generation, y = var_spread, color = Treatment), data = speed_stats) +
geom_point() + geom_line() + facet_wrap(~ Gap)
ggplot(aes(x = Generation, y = CV_spread, color = Treatment), data = speed_stats) +
geom_point() + geom_line() + facet_wrap(~ Gap)
Warning: Removed 5 rows containing missing values (geom_point).
These plots look pretty similar (though not identical) to the second pass in the original analysis (after I dropped the problematic rep).
In 0p and 1p, the treatments look very similar. But I bet there will be differences in the autocorrelation structure. Let’s fit some models.
m1_0NO <- lm(speed ~ Gen + Rep + speed_m1, data = filter(RIL_spread, Gap == "0p", Treatment == "NO"))
summary(m1_0NO)
Call:
lm(formula = speed ~ Gen + Rep + speed_m1, data = filter(RIL_spread,
Gap == "0p", Treatment == "NO"))
Residuals:
Min 1Q Median 3Q Max
-1.67770 -0.77997 -0.03829 0.87593 1.87512
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.47770 0.62701 3.952 0.000359 ***
Gen3 -0.17399 0.50495 -0.345 0.732474
Gen4 -0.44960 0.49971 -0.900 0.374424
Gen5 0.10000 0.49871 0.201 0.842237
Gen6 1.15121 0.50767 2.268 0.029631 *
Rep2 -0.14960 0.70599 -0.212 0.833417
Rep3 0.95282 0.73925 1.289 0.205887
Rep4 0.10081 0.70812 0.142 0.887615
Rep5 1.00161 0.71655 1.398 0.170964
Rep6 -0.04879 0.71164 -0.069 0.945728
Rep7 0.55121 0.71164 0.775 0.443804
Rep8 1.05201 0.72281 1.455 0.154458
Rep9 1.50242 0.73039 2.057 0.047199 *
Rep10 1.55282 0.73925 2.101 0.042955 *
speed_m1 -0.25201 0.15821 -1.593 0.120183
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.115 on 35 degrees of freedom
(10 observations deleted due to missingness)
Multiple R-squared: 0.4056, Adjusted R-squared: 0.1678
F-statistic: 1.706 on 14 and 35 DF, p-value: 0.09938
car::Anova(m1_0NO)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
Gen 14.656 4 2.9464 0.03367 *
Rep 16.263 9 1.4531 0.20406
speed_m1 3.155 1 2.5372 0.12018
Residuals 43.525 35
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
m1_0YES <- lm(speed ~ Gen + Rep + speed_m1, data = filter(RIL_spread, Gap == "0p", Treatment == "YES"))
summary(m1_0YES)
Call:
lm(formula = speed ~ Gen + Rep + speed_m1, data = filter(RIL_spread,
Gap == "0p", Treatment == "YES"))
Residuals:
Min 1Q Median 3Q Max
-2.9829 -1.0494 -0.1159 1.3510 2.8446
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.883e+00 1.038e+00 3.743 0.000742 ***
Gen3 1.160e+00 8.272e-01 1.403 0.170584
Gen4 6.541e-01 8.501e-01 0.769 0.447472
Gen5 1.988e+00 8.278e-01 2.401 0.022530 *
Gen6 3.329e-01 8.875e-01 0.375 0.710116
Rep2 -8.888e-01 1.110e+00 -0.801 0.429366
Rep4 -6.665e-01 1.114e+00 -0.598 0.553872
Rep5 -8.885e-02 1.110e+00 -0.080 0.936718
Rep6 -1.777e-01 1.111e+00 -0.160 0.874011
Rep7 -5.554e-01 1.117e+00 -0.497 0.622542
Rep8 -1.089e+00 1.110e+00 -0.981 0.334217
Rep9 1.566e-15 1.110e+00 0.000 1.000000
Rep10 -1.554e-01 1.117e+00 -0.139 0.890260
speed_m1 -4.442e-01 1.610e-01 -2.759 0.009630 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.754 on 31 degrees of freedom
(9 observations deleted due to missingness)
Multiple R-squared: 0.4034, Adjusted R-squared: 0.1532
F-statistic: 1.612 on 13 and 31 DF, p-value: 0.135
car::Anova(m1_0YES)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
Gen 21.292 4 1.7295 0.16864
Rep 6.668 8 0.2708 0.97078
speed_m1 23.436 1 7.6148 0.00963 **
Residuals 95.408 31
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
This is getting different. Let’s try some models with continuous Generation:
m1_0NO <- lm(speed ~ poly(Generation, 2) + Rep + speed_m1,
data = filter(RIL_spread, Gap == "0p", Treatment == "NO"))
summary(m1_0NO)
Call:
lm(formula = speed ~ poly(Generation, 2) + Rep + speed_m1, data = filter(RIL_spread,
Gap == "0p", Treatment == "NO"))
Residuals:
Min 1Q Median 3Q Max
-1.73288 -0.79389 -0.01207 0.84396 1.91342
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.71691 0.55729 4.875 2.07e-05 ***
poly(Generation, 2)1 0.30080 1.89328 0.159 0.8746
poly(Generation, 2)2 4.51283 1.78375 2.530 0.0158 *
Rep2 -0.15343 0.69108 -0.222 0.8255
Rep3 0.92600 0.72207 1.282 0.2077
Rep4 0.09314 0.69306 0.134 0.8938
Rep5 0.98628 0.70091 1.407 0.1677
Rep6 -0.06029 0.69634 -0.087 0.9315
Rep7 0.53971 0.69634 0.775 0.4432
Rep8 1.03286 0.70675 1.461 0.1523
Rep9 1.47943 0.71381 2.073 0.0452 *
Rep10 1.52600 0.72207 2.113 0.0414 *
speed_m1 -0.23286 0.15103 -1.542 0.1316
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.092 on 37 degrees of freedom
(10 observations deleted due to missingness)
Multiple R-squared: 0.3978, Adjusted R-squared: 0.2025
F-statistic: 2.037 on 12 and 37 DF, p-value: 0.0486
car::Anova(m1_0NO)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
poly(Generation, 2) 14.088 2 5.9110 0.00592 **
Rep 15.973 9 1.4893 0.18820
speed_m1 2.833 1 2.3772 0.13163
Residuals 44.093 37
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
m1_0YES <- lm(speed ~ poly(Generation, 2) + Rep + speed_m1,
data = filter(RIL_spread, Gap == "0p", Treatment == "YES"))
summary(m1_0YES)
Call:
lm(formula = speed ~ poly(Generation, 2) + Rep + speed_m1, data = filter(RIL_spread,
Gap == "0p", Treatment == "YES"))
Residuals:
Min 1Q Median 3Q Max
-2.8015 -1.1626 -0.3335 1.1958 2.9824
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.591e+00 9.727e-01 4.720 4.2e-05 ***
poly(Generation, 2)1 5.606e+00 3.155e+00 1.777 0.08480 .
poly(Generation, 2)2 -4.831e+00 2.924e+00 -1.652 0.10799
Rep2 -9.053e-01 1.129e+00 -0.802 0.42827
Rep4 -7.159e-01 1.132e+00 -0.632 0.53153
Rep5 -1.053e-01 1.129e+00 -0.093 0.92623
Rep6 -2.106e-01 1.130e+00 -0.186 0.85329
Rep7 -6.212e-01 1.135e+00 -0.547 0.58790
Rep8 -1.105e+00 1.129e+00 -0.979 0.33459
Rep9 8.513e-16 1.128e+00 0.000 1.00000
Rep10 -2.212e-01 1.135e+00 -0.195 0.84668
speed_m1 -5.266e-01 1.566e-01 -3.363 0.00196 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.784 on 33 degrees of freedom
(9 observations deleted due to missingness)
Multiple R-squared: 0.3432, Adjusted R-squared: 0.1242
F-statistic: 1.567 on 11 and 33 DF, p-value: 0.1549
car::Anova(m1_0YES)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
poly(Generation, 2) 11.668 2 1.8329 0.175855
Rep 6.826 8 0.2681 0.971930
speed_m1 35.996 1 11.3097 0.001965 **
Residuals 105.032 33
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
m1_0YES <- lm(speed ~ Generation + Rep + speed_m1,
data = filter(RIL_spread, Gap == "0p", Treatment == "YES"))
summary(m1_0YES)
Call:
lm(formula = speed ~ Generation + Rep + speed_m1, data = filter(RIL_spread,
Gap == "0p", Treatment == "YES"))
Residuals:
Min 1Q Median 3Q Max
-2.3642 -1.2625 -0.3097 1.4350 3.2240
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.297e+00 1.159e+00 3.708 0.00074 ***
Generation 1.923e-01 2.037e-01 0.944 0.35188
Rep2 -9.097e-01 1.157e+00 -0.786 0.43718
Rep4 -7.292e-01 1.161e+00 -0.628 0.53400
Rep5 -1.097e-01 1.157e+00 -0.095 0.92500
Rep6 -2.195e-01 1.158e+00 -0.189 0.85085
Rep7 -6.390e-01 1.164e+00 -0.549 0.58654
Rep8 -1.110e+00 1.157e+00 -0.959 0.34430
Rep9 1.824e-16 1.157e+00 0.000 1.00000
Rep10 -2.390e-01 1.164e+00 -0.205 0.83852
speed_m1 -5.487e-01 1.599e-01 -3.431 0.00159 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.829 on 34 degrees of freedom
(9 observations deleted due to missingness)
Multiple R-squared: 0.2889, Adjusted R-squared: 0.07969
F-statistic: 1.381 on 10 and 34 DF, p-value: 0.2305
car::Anova(m1_0YES)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
Generation 2.980 1 0.8909 0.351884
Rep 6.878 8 0.2570 0.975431
speed_m1 39.380 1 11.7738 0.001595 **
Residuals 113.720 34
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
So we get that the evolution treatment has negative autocorrelation but no time effect, whereas the no-evolution treatment has a quadratic time effect but no autocorrelation.
Let’s look at the rest of the landscapes.
m2_0NO <- lm(speed ~ poly(Generation, 2) + Rep + speed_m1,
data = filter(RIL_spread, Gap == "1p", Treatment == "NO"))
summary(m2_0NO)
Call:
lm(formula = speed ~ poly(Generation, 2) + Rep + speed_m1, data = filter(RIL_spread,
Gap == "1p", Treatment == "NO"))
Residuals:
Min 1Q Median 3Q Max
-2.71489 -0.58274 0.01871 0.55243 2.84783
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.267502 0.575288 2.203 0.03388 *
poly(Generation, 2)1 5.782657 2.092024 2.764 0.00884 **
poly(Generation, 2)2 0.001457 2.059857 0.001 0.99944
Rep2 0.686016 0.773317 0.887 0.38075
Rep3 1.229024 0.785643 1.564 0.12625
Rep4 0.143008 0.765825 0.187 0.85289
Rep5 0.143008 0.765825 0.187 0.85289
Rep6 -0.256992 0.765825 -0.336 0.73909
Rep7 1.229024 0.785643 1.564 0.12625
Rep8 1.086016 0.773317 1.404 0.16855
Rep9 0.686016 0.773317 0.887 0.38075
Rep10 -1.086016 0.773317 -1.404 0.16855
speed_m1 -0.357520 0.154986 -2.307 0.02677 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.207 on 37 degrees of freedom
(10 observations deleted due to missingness)
Multiple R-squared: 0.4012, Adjusted R-squared: 0.207
F-statistic: 2.066 on 12 and 37 DF, p-value: 0.0454
car::Anova(m2_0NO)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
poly(Generation, 2) 18.403 2 6.3170 0.004363 **
Rep 20.014 9 1.5267 0.174941
speed_m1 7.751 1 5.3213 0.026767 *
Residuals 53.895 37
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
m2_0YES <- lm(speed ~ poly(Generation, 2) + Rep + speed_m1,
data = filter(RIL_spread, Gap == "1p", Treatment == "YES"))
summary(m2_0YES)
Call:
lm(formula = speed ~ poly(Generation, 2) + Rep + speed_m1, data = filter(RIL_spread,
Gap == "1p", Treatment == "YES"))
Residuals:
Min 1Q Median 3Q Max
-2.7791 -0.9350 -0.1574 0.8140 3.1582
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.99237 0.69218 1.434 0.1601
poly(Generation, 2)1 -1.26659 2.60077 -0.487 0.6291
poly(Generation, 2)2 2.01957 2.48615 0.812 0.4218
Rep2 1.42446 0.97112 1.467 0.1509
Rep3 0.54964 0.95827 0.574 0.5697
Rep4 0.07482 0.95049 0.079 0.9377
Rep5 0.14964 0.95827 0.156 0.8768
Rep6 1.34964 0.95827 1.408 0.1674
Rep7 1.64891 1.03772 1.589 0.1206
Rep8 2.37409 1.01111 2.348 0.0243 *
Rep9 0.87482 0.95049 0.920 0.3633
Rep10 0.54964 0.95827 0.574 0.5697
speed_m1 -0.18705 0.17598 -1.063 0.2947
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.499 on 37 degrees of freedom
(10 observations deleted due to missingness)
Multiple R-squared: 0.2339, Adjusted R-squared: -0.01459
F-statistic: 0.9413 on 12 and 37 DF, p-value: 0.5184
car::Anova(m2_0YES)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
poly(Generation, 2) 1.487 2 0.3311 0.7202
Rep 22.920 9 1.1338 0.3646
speed_m1 2.537 1 1.1297 0.2947
Residuals 83.108 37
m2_0NO <- lm(speed ~ poly(Generation, 2) + Rep + speed_m1,
data = filter(RIL_spread, Gap == "2p", Treatment == "NO"))
summary(m2_0NO)
Call:
lm(formula = speed ~ poly(Generation, 2) + Rep + speed_m1, data = filter(RIL_spread,
Gap == "2p", Treatment == "NO"))
Residuals:
Min 1Q Median 3Q Max
-2.3582 -0.9472 -0.0689 0.4769 4.5809
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.9925 0.7068 1.404 0.1686
poly(Generation, 2)1 -6.3086 2.6583 -2.373 0.0229 *
poly(Generation, 2)2 4.4654 2.6698 1.673 0.1029
Rep2 -0.6000 0.9690 -0.619 0.5396
Rep3 1.5067 1.0179 1.480 0.1473
Rep4 1.4045 0.9910 1.417 0.1648
Rep5 -0.6000 0.9690 -0.619 0.5396
Rep6 0.1022 0.9745 0.105 0.9170
Rep7 0.7022 0.9745 0.721 0.4757
Rep8 0.8045 0.9910 0.812 0.4221
Rep9 0.8045 0.9910 0.812 0.4221
Rep10 -0.6000 0.9690 -0.619 0.5396
speed_m1 -0.1704 0.1731 -0.984 0.3314
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.532 on 37 degrees of freedom
(10 observations deleted due to missingness)
Multiple R-squared: 0.3146, Adjusted R-squared: 0.09233
F-statistic: 1.415 on 12 and 37 DF, p-value: 0.2027
car::Anova(m2_0NO)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
poly(Generation, 2) 13.360 2 2.8457 0.07086 .
Rep 24.258 9 1.1483 0.35548
speed_m1 2.274 1 0.9687 0.33139
Residuals 86.852 37
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
m2_0YES <- lm(speed ~ poly(Generation, 2) + Rep + speed_m1,
data = filter(RIL_spread, Gap == "2p", Treatment == "YES"))
summary(m2_0YES)
Call:
lm(formula = speed ~ poly(Generation, 2) + Rep + speed_m1, data = filter(RIL_spread,
Gap == "2p", Treatment == "YES"))
Residuals:
Min 1Q Median 3Q Max
-2.7756 -1.6122 -0.0111 1.1509 4.0250
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.145e+00 9.297e-01 1.231 0.2268
poly(Generation, 2)1 2.677e+00 3.742e+00 0.716 0.4793
poly(Generation, 2)2 -9.610e+00 3.614e+00 -2.660 0.0120 *
Rep2 5.398e-16 1.266e+00 0.000 1.0000
Rep3 8.006e-01 1.270e+00 0.630 0.5329
Rep4 -8.006e-01 1.270e+00 -0.630 0.5329
Rep5 8.006e-01 1.270e+00 0.630 0.5329
Rep7 -8.006e-01 1.270e+00 -0.630 0.5329
Rep8 1.601e+00 1.282e+00 1.249 0.2206
Rep9 -5.473e-16 1.266e+00 0.000 1.0000
Rep10 8.006e-01 1.270e+00 0.630 0.5329
speed_m1 -3.343e-01 1.678e-01 -1.992 0.0547 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.002 on 33 degrees of freedom
(9 observations deleted due to missingness)
Multiple R-squared: 0.3065, Adjusted R-squared: 0.07535
F-statistic: 1.326 on 11 and 33 DF, p-value: 0.2543
car::Anova(m2_0YES)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
poly(Generation, 2) 38.775 2 4.8352 0.01440 *
Rep 23.282 8 0.7258 0.66772
speed_m1 15.911 1 3.9683 0.05469 .
Residuals 132.317 33
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
m2_0NO <- lm(speed ~ poly(Generation, 2) + Rep + speed_m1,
data = filter(RIL_spread, Gap == "3p", Treatment == "NO"))
summary(m2_0NO)
Call:
lm(formula = speed ~ poly(Generation, 2) + Rep + speed_m1, data = filter(RIL_spread,
Gap == "3p", Treatment == "NO"))
Residuals:
Min 1Q Median 3Q Max
-1.9572 -0.6343 -0.1966 0.2101 3.2495
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 9.520e-01 6.044e-01 1.575 0.124
poly(Generation, 2)1 -1.301e+00 2.274e+00 -0.572 0.571
poly(Generation, 2)2 2.980e+00 2.165e+00 1.376 0.177
Rep2 1.606e-01 8.432e-01 0.190 0.850
Rep3 -8.000e-01 8.297e-01 -0.964 0.341
Rep4 -8.000e-01 8.297e-01 -0.964 0.341
Rep5 -8.000e-01 8.297e-01 -0.964 0.341
Rep6 9.606e-01 8.432e-01 1.139 0.262
Rep7 -8.000e-01 8.297e-01 -0.964 0.341
Rep8 1.606e-01 8.432e-01 0.190 0.850
Rep9 -1.216e-16 8.297e-01 0.000 1.000
Rep10 -6.394e-01 8.432e-01 -0.758 0.453
speed_m1 -2.008e-01 1.879e-01 -1.068 0.292
Residual standard error: 1.312 on 37 degrees of freedom
(10 observations deleted due to missingness)
Multiple R-squared: 0.2462, Adjusted R-squared: 0.001712
F-statistic: 1.007 on 12 and 37 DF, p-value: 0.4621
car::Anova(m2_0NO)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
poly(Generation, 2) 3.518 2 1.0221 0.3698
Rep 15.658 9 1.0109 0.4491
speed_m1 1.964 1 1.1411 0.2923
Residuals 63.682 37
m2_0YES <- lm(speed ~ poly(Generation, 2) + Rep + speed_m1,
data = filter(RIL_spread, Gap == "3p", Treatment == "YES"))
summary(m2_0YES)
Call:
lm(formula = speed ~ poly(Generation, 2) + Rep + speed_m1, data = filter(RIL_spread,
Gap == "3p", Treatment == "YES"))
Residuals:
Min 1Q Median 3Q Max
-3.2641 -1.1870 -0.2878 1.0908 5.1321
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.744e+00 9.449e-01 3.962 0.000443 ***
poly(Generation, 2)1 4.688e+00 3.527e+00 1.329 0.194157
poly(Generation, 2)2 -4.498e+00 3.219e+00 -1.398 0.172836
Rep2 -1.944e+00 1.251e+00 -1.554 0.131072
Rep3 -1.372e+00 1.235e+00 -1.111 0.275663
Rep4 -1.373e-15 1.229e+00 0.000 1.000000
Rep7 -5.718e-01 1.235e+00 -0.463 0.646748
Rep8 -1.372e+00 1.235e+00 -1.111 0.275663
Rep9 -2.744e+00 1.251e+00 -2.193 0.036444 *
Rep10 -2.744e+00 1.251e+00 -2.193 0.036444 *
speed_m1 -7.147e-01 1.447e-01 -4.940 3e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.944 on 29 degrees of freedom
(8 observations deleted due to missingness)
Multiple R-squared: 0.503, Adjusted R-squared: 0.3316
F-statistic: 2.935 on 10 and 29 DF, p-value: 0.01141
car::Anova(m2_0YES)
Anova Table (Type II tests)
Response: speed
Sum Sq Df F value Pr(>F)
poly(Generation, 2) 8.499 2 1.1251 0.3384
Rep 39.412 7 1.4906 0.2097
speed_m1 92.175 1 24.4029 2.998e-05 ***
Residuals 109.539 29
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
For evolution YES, we have:
- Autocorrelation in gaps 0, 2, 3
- Gen effects in gap 2
For evolution NO, we have:
- Autocorrelation in gaps 1
- Gen effects in gaps 0, 1
Well, so what? This will require a bit of puzzling.
One thing to notice: the per-generation variance in spread is, on average, higher in the evolution treatment across all landscapes. However, this translates to a higher variance in cumulative variance only in landscapes 1p and 3p (and I’m guessing the CI on 3p is large). 1p is the landscape with no significant autocorrelation in the evolution treatment. However, 3p has a large negative AC.
15.3 Modeling
OK, here’s the part I’ve been dreading: reconstructing the models from almost 2 years ago…
Well, the first thing I found noodling around is some models of Ler DD fecundity in LerSims
. But then I got distracted thinking about sources of stochasticity. First, we actually have estimates of demographic stochasticity in the RIL density experiments, as siliques are counted on multiple plants per pot. See fecundity_variability
. I can’t remember whether any of the silique counts in the populations actually account for them by individual—I suspect not.
Second, there are two aspects of “environmental stochasticity.” The first is location of the pot within the greenhouse, which could affect both temperature/light and exposure to pests. In this case, we would expect nearby pots to have similar residuals. We don’t have a map of where pots were, but we do know that pots in the same runway were close to one another—thus we’d expect, within a given generation, less variability among pots in a runway than overall across all runways.
However, another source is inconsistency in the watering treatment, which affects both the total number of seeds released per silique (effective fecundity) as well as the dispersal kernel (in addition to creating heterogeneous disperpersal, this will create extra variabiity in the number of seeds staying in the home pot, which is our measure of fecundity in many cases). This could easily vary from pot to pot within a runway.