Chapter 9 Varying population maturation period

9.1 Overview

How robust are our digital directed evolution results at different maturation periods? Adjusting the length of population maturation periods shifts the balance of individual-level and population-level selection pressure. Shorter maturation periods have shorter stints where organisms compete within a population between population-level selection events; whereas, longer maturation periods have longer stints where organisms are competing for space within a population before a population-level selection event occurs.

Naively, we might maximize selection pressure on population-level functions by minimizing maturation periods; however, maturation periods of organism-level evolution are important for accumulating genetic variation in a population. We could maximize genetic divergence among populations in a metapopulation by using long maturation periods; however, if population-level selection events are too infrequent, there may not be sufficient selection pressure to maintain population-level functions if they are not also sufficiently beneficial at the individual-level. We expect there to be an ideal maturation period length that will vary depending on the particular organisms and functions being evolved.

We ran a supplemental experiment to evaluate the robustness of our results at a range of maturation period lengths. For each of elite selection, lexicase selection, non-dominated elite selection, and no selection (control), we ran 50 replicates of digital directed evolution with the following maturation period lengths (given in updates): 20, 50, 100, 200 (the default used in our main experiments), 500, and 1,000. For each condition, we held the total number of updates constant (400,000 total updates); that is, we ran fewer overall cycles of directed evolution at larger maturation periods (e.g., 400 cycles for 1,000 update maturation periods), and a greater number of cycles at smaller maturation periods (e.g., 20,000 cycles for 20 update maturation periods). We used a more limited set of selection schemes for this supplemental experiment due to constraints on computing resources.

9.2 Analysis dependencies

Load all required R libraries

## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor

These analyses were knit with the following environment:

##                _                           
## platform       x86_64-pc-linux-gnu         
## arch           x86_64                      
## os             linux-gnu                   
## system         x86_64, linux-gnu           
## status                                     
## major          4                           
## minor          2.1                         
## year           2022                        
## month          06                          
## day            23                          
## svn rev        82513                       
## language       R                           
## version.string R version 4.2.1 (2022-06-23)
## nickname       Funny-Looking Kid

9.3 Setup

Experiment summary data

Miscellaneous setup

9.4 Average number of organisms

Average number of organisms per world at the end of a run.

## Saving 7 x 5 in image
## [1] "20 elite 36.375"
## [1] "20 lex 32.5677083333333"
## [1] "20 nde 26.9739583333333"
## [1] "20 none 36.7239583333333"
## [1] "20 overall 34.5104166666667"
## [1] "50 elite 296.651041666667"
## [1] "50 lex 248.755208333333"
## [1] "50 nde 194.041666666667"
## [1] "50 none 295.171875"
## [1] "50 overall 276.234375"
## [1] "100 elite 948.760416666667"
## [1] "100 lex 902.833333333333"
## [1] "100 nde 898.255208333333"
## [1] "100 none 943.932291666667"
## [1] "100 overall 936.401041666667"
## [1] "200 elite 990.40625"
## [1] "200 lex 986.90625"
## [1] "200 nde 985.4375"
## [1] "200 none 992.286458333333"
## [1] "200 overall 989.020833333333"
## [1] "500 elite 990.322916666667"
## [1] "500 lex 988.875"
## [1] "500 nde 988.739583333333"
## [1] "500 none 993.416666666667"
## [1] "500 overall 990.192708333333"
## [1] "1000 elite 992.03125"
## [1] "1000 lex 990.921875"
## [1] "1000 nde 990.942708333333"
## [1] "1000 none 994.28125"
## [1] "1000 overall 992.28125"
## [1] "2000 elite 993.057291666667"
## [1] "2000 lex 992.255208333333"
## [1] "2000 nde 993.359375"
## [1] "2000 none 994.682291666667"
## [1] "2000 overall 994.026041666667"

9.6 Total generations

## [1] 57167.48
## [1] "20 elite 43147.1739335885"
## [1] "20 lex 40326.621331729"
## [1] "20 nde 34664.8985648439"
## [1] "20 none 42241.9147759426"
## [1] "20 overall 41329.1233619219"
## [1] "50 elite 55827.8934160416"
## [1] "50 lex 54050.7090498438"
## [1] "50 nde 52988.0677242188"
## [1] "50 none 53201.380141823"
## [1] "50 overall 53516.4253886458"
## [1] "100 elite 57213.4452847916"
## [1] "100 lex 55465.8904301564"
## [1] "100 nde 57919.3779984376"
## [1] "100 none 56054.7031978124"
## [1] "100 overall 56331.6952407812"
## [1] "200 elite 58024.9361635417"
## [1] "200 lex 56247.7024005208"
## [1] "200 nde 56511.7579942709"
## [1] "200 none 57294.2312760416"
## [1] "200 overall 57207.1385562501"
## [1] "500 elite 57585.15895625"
## [1] "500 lex 56747.8336604167"
## [1] "500 nde 57295.9740817708"
## [1] "500 none 58521.2714651041"
## [1] "500 overall 57697.65558125"
## [1] "1000 elite 58524.5463697916"
## [1] "1000 lex 58071.5926197917"
## [1] "1000 nde 58689.3264583334"
## [1] "1000 none 59456.0870677083"
## [1] "1000 overall 58907.1638229166"
## [1] "2000 elite 59469.05634375"
## [1] "2000 lex 59366.437359375"
## [1] "2000 nde 61755.465796875"
## [1] "2000 none 60074.0713125"
## [1] "2000 overall 60021.520203125"

9.7 Performance

9.7.2 Best-population task coverage

## [1] "elite"
## 
##  Kruskal-Wallis rank sum test
## 
## data:  max_trait_coverage by U_PER_E
## Kruskal-Wallis chi-squared = 79.646, df = 6, p-value = 4.228e-15
## 
## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  sel_summary_data$max_trait_coverage and sel_summary_data$U_PER_E 
## 
##      20      50      100     200     500     1000   
## 50   0.00055 -       -       -       -       -      
## 100  1.00000 0.05140 -       -       -       -      
## 200  0.00218 4.0e-08 0.00091 -       -       -      
## 500  0.00132 4.5e-10 0.00144 1.00000 -       -      
## 1000 0.31170 8.8e-08 0.11754 1.00000 1.00000 -      
## 2000 0.79464 2.0e-07 0.31733 0.38852 0.87304 1.00000
## 
## P value adjustment method: bonferroni 
## [1] "lex"
## 
##  Kruskal-Wallis rank sum test
## 
## data:  max_trait_coverage by U_PER_E
## Kruskal-Wallis chi-squared = 231.66, df = 6, p-value < 2.2e-16
## 
## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  sel_summary_data$max_trait_coverage and sel_summary_data$U_PER_E 
## 
##      20      50      100     200     500     1000   
## 50   1.00000 -       -       -       -       -      
## 100  4.2e-11 3.8e-10 -       -       -       -      
## 200  < 2e-16 < 2e-16 1.5e-08 -       -       -      
## 500  < 2e-16 4.1e-16 4.3e-07 1.00000 -       -      
## 1000 < 2e-16 3.8e-16 5.3e-06 0.91939 1.00000 -      
## 2000 2.3e-16 1.6e-15 0.07905 2.3e-05 0.00081 0.01194
## 
## P value adjustment method: bonferroni 
## [1] "nde"
## 
##  Kruskal-Wallis rank sum test
## 
## data:  max_trait_coverage by U_PER_E
## Kruskal-Wallis chi-squared = 39.526, df = 6, p-value = 5.644e-07
## 
## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  sel_summary_data$max_trait_coverage and sel_summary_data$U_PER_E 
## 
##      20      50      100     200     500     1000   
## 50   0.37356 -       -       -       -       -      
## 100  1.00000 0.00021 -       -       -       -      
## 200  1.00000 0.00023 1.00000 -       -       -      
## 500  1.00000 0.00280 1.00000 1.00000 -       -      
## 1000 1.00000 0.00471 1.00000 1.00000 1.00000 -      
## 2000 0.47187 9.1e-07 1.00000 1.00000 0.91202 0.05453
## 
## P value adjustment method: bonferroni 
## [1] "none"
## 
##  Kruskal-Wallis rank sum test
## 
## data:  max_trait_coverage by U_PER_E
## Kruskal-Wallis chi-squared = 326.54, df = 6, p-value < 2.2e-16
## 
## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  sel_summary_data$max_trait_coverage and sel_summary_data$U_PER_E 
## 
##      20      50      100     200     500     1000  
## 50   0.9092  -       -       -       -       -     
## 100  < 2e-16 < 2e-16 -       -       -       -     
## 200  < 2e-16 < 2e-16 3.3e-15 -       -       -     
## 500  < 2e-16 < 2e-16 < 2e-16 1.6e-12 -       -     
## 1000 < 2e-16 < 2e-16 < 2e-16 3.7e-16 4.5e-06 -     
## 2000 < 2e-16 < 2e-16 < 2e-16 < 2e-16 1.2e-13 0.0013
## 
## P value adjustment method: bonferroni

9.8 Population-level Task Profile Diversity

9.9 Selection

9.11 Discussion

Lengthening maturation period improves task coverage in the no selection control: there is more genetic variation that can build up between selection bottlenecks, which allows more population-level tasks to evolve by chance. Performance was surprisingly stable in elite and non-dominated elite selection. However, lengthening maturation period harms lexicase selection’s performance on metapopulation coverage. Overall, this experiment indicates that different selection schemes may respond differently to adjustments to the balance between individual-level and population-level selection, warranting further exploration in future work.