Re: Trouble with Adam and Eve

From: tikeda@sprintmail.com
Date: Thu Apr 25 2002 - 16:09:26 EDT

  • Next message: Jonathan Clarke: "Re: Epicurean philosophy"

    Walt writes:
    >I understand that, but it is exactly what I meant, Glenn. I should have
    >more clearly said the direct male descendants (Y-chromosome only). I
    >have heard the argument that sooner or later all but one MUST die out. I
    >can buy it only if there is some reason why that one is very much better
    >than all the others. The argument that 99,999 out of 100,000 must
    >automatically die out (the male chain only) and at the same time say
    >that the 1 remaining produces a lineage of 1,000,000,00 men certainly
    >has to look a bit fishy. I know zip about genetic details but I usually
    >am fair at logic, math and probabilities.

    Think about it from the 'other' side: What are the odds that any family
    line will continuously produce an unbroken line of daughters or sons
    through hundreds of generations? Pretty slim odds, in practice.

    >One cannot argue with the data, so it must have happened. Why it
    >happened, seems to require more that a simple example of how one
    >randomly selected line can die out. I can generate examples where each
    >line should increase without limit, unless some competition exists with
    >limited resources ---- then it is easy.

    Even without selection you will find that a single male (Y-chromosomal)
    or single female (mitochondrial) line will eventually "win the lottery"
    (assuming a finite population). An 'Eve'/'Adam' is simply that woman/
    man whose descendents produced the last, unbroken string of daughters/
    sons. I suppose one could say that the 'limited resource' in this
    simluation is the maximum number of females permitted within the
    population in a single generation.

    Here's a simplistic model for the mitochondrial "Eve" lottery:
    1) Start with a population that has exactly 100 females.
    2) To each generation, exactly 100 daughters are born.
    3) Assume that the sex of any child born is randomly choosen (1:1 M:F)
    4) Randomly order the potential mothers from each generation and
        allow each mother in the sequence one birth, until 100 daughters
        are born (You might have to run through the list more than once
        to achieve this).
    5) Each daughter born is given the ID of her mother.
    6) Run the simulation until each daughter born in a generation
        carries the same ID.

    In this simulation it takes about 350 generations on average
    to produce an 'Eve'. This means that one of the females
    in the original population of 100 gave birth to a _continuous_
    line of daughters that spanned 350 generations (Note that ninety-
    nine of other females didn't).

    A BASIC program that runs this simulation...

    Sub Generations_To_Eve()
    Rem *** Written 25-Apr-2002 by T. Ikeda
    Rem *** Warning: Not extensively tested for coding errors.
    Rem ***
    Rem *** Crude simulation of the reproductive 'lottery' that
    Rem *** eventually generates an 'Eve'. An 'Eve' is the
    Rem *** last common female ancestor for a population.
    Rem ***
    Rem *** This simulation starts with a population of 'MaxFemales'
    Rem *** and permits them to reproduce in a randomly ordered
    Rem *** fashion until 100 'MaxFemale' daughters are produced.
    Rem *** (Conditions are set such that each female will have at
    Rem *** least one child and, on average, should be able
    Rem *** to have approximately two children. The ratio of M/F
    Rem *** offspring is set to 1).
    Rem *** Another round of reproduction is then run for the
    Rem *** daughters in subsequent generations until a generation
    Rem *** is reached in which all females have the same ancestral
    Rem *** mother (an 'Eve').
    Rem ***
    Rem *** Smaller generations produce 'Eves' in fewer generations.

    Rem *** Main program *************************
    Rem *** Set number of females/generation in population
    Const MaxFemales As Integer = 100

    Rem *** Arrays to hold mother IDs of females in population
    Dim MotherArray(1 To MaxFemales) As Integer
    Dim DaughterArray(1 To MaxFemales) As Integer

    Rem *** Counters
    Dim NumGenerations As Long
    Dim NumDaughters As Integer

    Rem *** Indexes
    Dim i As Integer 'a counter
    Dim TempInteger As Integer
    Dim RandomIndex As Integer 'another index counter

    Rem *** Variable to hold loop exit condition
    Dim All_Mothers_The_Same As Boolean

    Rem *** Initialize MotherArray array
    Rem *** Each position in the array corresponds to a single mother
    Rem *** or daughter. Each number in a position represents the ID of
    Rem *** an individual's "founding" mother (The mother of the first
    Rem *** generation).
    For i = 1 To MaxFemales
          MotherArray(i) = i
    Next i

    Rem *** Initialize additional run variables
    All_Mothers_The_Same = False
    NumGenerations = 0

    Do
         NumGenerations = NumGenerations + 1
         Rem *** Randomize the mothers in current generation...
         For i = 1 To MaxFemales
             RandomIndex = Int(MaxFemales * Rnd + 1)
             TempInteger = MotherArray(i)
             MotherArray(i) = MotherArray(RandomIndex)
             MotherArray(RandomIndex) = TempInteger
         Next i

         Rem *** Reproduce until MaxFemales daughters are born
         Rem *** Initialize index counters for 'reproduction' phase
         i = 1
         NumDaughters = 0

         Do
             Rem *** Each pass within the loop corresponds to
             Rem *** a single birth to a mother. 50/50 chance
             Rem *** of daughter in each birth.
             If Rnd > 0.5 Then
                 NumDaughters = NumDaughters + 1
                 Rem *** Assign mother's ID to each daughter
                 DaughterArray(NumDaughters) = MotherArray(i)
             End If

             Rem *** Select next mother to reproduce...
             If i = MaxFemales Then
                 i = 1
             Else
                 i = i + 1
             End If
         Loop Until NumDaughters = MaxFemales

         Rem *** Test to see if all daughters had the same _original_ mother.
         All_Mothers_The_Same = True
         For i = 1 To (MaxFemales - 1)
             If DaughterArray(i) <> DaughterArray(i + 1) Then
                 All_Mothers_The_Same = False
             End If
         Next i

         Rem *** All daughters become mothers in the next generation.
         For i = 1 To MaxFemales
             MotherArray(i) = DaughterArray(i)
         Next i
    Rem *** Run another generation unless all the daughters have the same
    Rem *** progenitor...
    Loop Until All_Mothers_The_Same = True

    Rem *** Output the number of generations needed to make an 'Eve'
    Debug.Print "Generations to 'Eve' = " & NumGenerations

    End Sub

    Walt

    --------------------------------------------------------------------
    mail2web - Check your email from the web at
    http://mail2web.com/ .



    This archive was generated by hypermail 2b29 : Thu Apr 25 2002 - 17:15:44 EDT