Previous   Next

Upward Evolution and Harmful Mutations

An objection that is frequently voiced by Creationists against evolution, is that mutations that are an improvement are so rare in comparison to harmfull ones, that the latter would destroy the genome long before the former could be found. This statement is in fact untrue, and purely a result from the lack of understanding of the mathematics describing population dynamics.

The program below gives a very simple example, where a population if individuals of various fitness (defined as the relative survival probability of their offspring to adulthood) is subject to (overwhelmingly deleterious) mutation. As the simulation shows, even in the complete absence of upward mutation, this does not threaten the survival of the population.

Quasi Species

What happens instead is that a stable distribution of fitnesses results, where the larger mortality of the less fit individuals is completely compensated by the new appearance of such individuals through harmfull mutations amongst the offspring of the completely healthy ones (the wild type). Such a stable distribution is know as a quasi-species.

Perturbations of the distribution of a quasi-species will quickly recover, as long as you don't completely eliminate the wild type. This is true at any mutation rate below 100% (since the latter would indeed destroy the wild type completely). The only effect of larger mutation rate is that the distribution of the quasi-species acquires a much longer tail of 'challenged' individuals. But due to selection pressure such mutated versions can only maintain themselves with respect to the wild type as long as the wild-type will replenish their selection losses. They can thus never outcompete the wild type, since in the limit that the wild type is nearly extinct, such replenishment stops, and the wild type that is left will have the clear advantage.

Upward Evolution

As soon as some of the mutations increase fitness, no matter how little, and no matter how infrequently, the distribution of the quasi-species is no longe stable, but starts to evolve towards greater fitness. For very large bias in favor of harmful mutations, only very small numbers of improved mutants will be born. But once they are born, they will reprioduce slightly faster than the wild type. So no matter how small their initial presence, sooner or later they catch up with the wild type and take over the population. They will then start to create their own improved mutations, for the next step upward on the evolutional ladder. Slowly, but surely, evolution will cranck up the fitness.

Since the grows of the fraction of improved mutants w.r.t. the wild type is exponential, the time it takes to overcome their small initial presence due to their low occurrence frequency is only weakly dependent on the frequency of upward mutations (as a logarithm). Initially you see a pause, during the time the improved mutants that formed initially need to amplify their presence to significance. Once this happens, there will be a steady growth of fitness (upward evolution), because improved mutants of the mutants are already created while the first-generation mutants are still catching up with the wild type, and such higher-order mutants outgrow even their ancestor mutants.

You are encouraged to play with the parameters, to empirically determine how evolution is affected, but can never be stopped, by unfavorale mutation rate or bias.

/* Program to calculate development of a population of organisms, subject */
/* to mutation (advantageous and deleterious) and selection.              */

#define MAX_GENERATION 100000
#define MUTATION_RATE  0.01             /* fraction of mutated offspring */
#define MUTATION_BIAS  1000000          /* nr of bad vs good mutations   */
#define MAXFIT  2000                    /* nr of different fitnesses     */
#define FITGAIN 1                       /* fitness gain good mutation    */
#define FITLOSS 10                      /* fitness loss bad mutation     */

double ParentFreq[MAXFIT], NewGen[MAXFIT];

    int i, j, k;
    double Total, Spread;

    ParentFreq[1000] = 1.; /* founder of fitness = 1000 (= 100%) */

    for(k=0; k<=MAX_GENERATION; k++)
        /* calculate next generation from current one */

        /* Healthy offspring */
        for(i=0; i<MAXFIT; i++)
            NewGen[i] = (1-MUTATION_RATE) * ParentFreq[i];
        /* Deleterious mutations, reduce fitness by FITLOSS points */
        for(i=0; i<MAXFIT-10; i++)
            NewGen[i] += MUTATION_RATE*ParentFreq[i+FITLOSS];
        /* Upward mutation, 1:MUTATION_BIAS raises fitness FITGAIN points */
        for(i=1; i<MAXFIT; i++)
            NewGen[i] += (MUTATION_RATE/MUTATION_BIAS) * ParentFreq[i-1];
        /* Selection for fitness, each point gives 0.1% survival */
        for(i=0; i<MAXFIT; i++) NewGen[i] *= i/1000.;
        /* count total population */
        Total = 0.;
        for(i=0; i<MAXFIT; i++) Total += NewGen[i];
        /* and normalize to 1, simulating mortality due to over-population */
        for(i=0; i<MAXFIT; i++) ParentFreq[i] = NewGen[i] * (1./Total);

        /* once every so many generations, print the distribution */
        if(k%1000 == 0)
        {   /* first some statistics */
            Total = Spread = 0.;
            for(i=0; i<MAXFIT; i++)
            {   Total += ParentFreq[i] * i;
                Spread += ParentFreq[i] * i * i;
            Spread = sqrt(Spread - Total*Total);
            printf("%7d. average fitness = %8.3f +/- %8.3f\n",
                                                  k, Total, Spread);
          /* uncomment for print of complete distribution 
            for(i=0; i<MAXFIT; i++) if(ParentFreq[i] > 0.01)
                printf("    %4d. %6.3f%%\n", i, 100.*ParentFreq[i]);
    for(i=0; i<MAXFIT; i++) if(ParentFreq[i] > 0.01)
                printf("    %4d. %6.2f%%\n", i, 100.*ParentFreq[i]);