Dollo’s Law on a Statistical Analysis of the Parity Status of Lizards.
Introduction
Several concepts have been stated based around evolution and the resurrection of genetic traits within a species. Dollo’s Law is one of the most recognised, yet least tested biological theories based on evolutionary traits (Kursten, 1953). Specifically, Dollo’s Law states that once a physical trait has been lost as a result of evolution, it is irreversible due to the complexity of the related organ(s)
(Marshall et al. 1994). Furthermore, Dollo’s Law begins to suggest that a complex organ must have a complex genetic makeup and therefore the loss of compound structure will also result in the loss of its genetic information (Gould, 1970).
Generally, viviparity, the act of a live birth, is seen exclusively in mammalian species; however, this reproductive trait is sometimes present in species of reptile, such as lizards (Guillette, 1993; Blackburn, 1982; Blackburn, 1993). Despite lizards having the reputation of being strictly an oviparous, egg-laying, species such as Eulamprus quoyii, Niveoscincus coventryi, and Pseudemoia pagenstecheri are just a few examples of viviparity being expressed in an oviparous-based squamata group (Thomson and Speake 2006).
An analysis on data produced from a phylogeny of lizard species using R is taken out to determine the parity of the existing species. Using a Dollo’s Law approach, a hypothesis based on the parity of the lizards can be determined stating that the loss of the complex evolutionary trait viviparity is irreversible. The prediction of the results is similar to the hypothesis being that once the trait of viviparity is lost in a species, it cannot be regained in future generations.
Method
In order to test the hypothesis, the statistical program R is used to develop a phylogenetic tree. R allows for gathered information to be analysed, compared and interpreted into graphics (Theußl and Zeileis, 2009). Within R, APE, analysis of phylogenetic and evolution, is a package which can be used to provide functions to read and write imported data and use that data to create a phylogenetic tree to allow for comparisons between character states to occur (Paradis et al. 2004).
ACE, statistical ancestral character estimation, is also used to investigate the maximum-likelihood of the character state of the species using the history of the particular trait for this species to create probabilities (Cunningham et al. 1998). However, ACE is proven to have assumptions to phylogeny, including that the tree being used is in fact the true tree with no incorrect data or missing taxa, and all characters are coded correctly (Omland, 1999).
With all data inputted into R using the APE package, a visual plan is created to display a root, or last common ancestor, of a species alongside its ascendants. In this case, the root will be presented with its ancestral history alongside their parity status throughout their evolution as a lizard species. The 86 species within the lizard phylogeny are categorized into two groups, oviparous, coded as 0, or viviparous, coded as 1; therefore, there are two variables in the data, the species and type of parity. ACE estimates the probability of parity type for each node within the phylogeny of the lizards in this evolutionary history tree including the last common ancestor; the colour of parity be displayed as a result.
Results
The results of the ACE analysis developed a phylogenetic tree seen in Figure 1. The figure shows the parity status of each ancestor and each current living species through colour coding; black being viviparous and grey being oviparous. The phylogeny shows that the character state of the last common ancestor of all 86 species was likely to be viviparous with a probability at the root of 85% viviparity and 15% oviparity, as shown by the colour codes in Figure 1. Interpreting these results with the logic of Dollo’s Law, oviparity should not be expressed throughout the evolution of the species; however, the tree gives evidence that viviparity was likely to be lost a total of 6 times in species throughout the tree and re-evolved twice, showing the evolutionary adaptation to be reversed.
The evolution from viviparity to oviparity is displayed throughout the tree and can be seen from ancestors to current species clearly in Figure 1. The standard error for the rate of transition from oviparity to viviparity equals to 0.0097-0.0061 whereas the rate of transition from viviparity to oviparity is 0.0164-0.0052, showing that the transition from viviparity to oviparity occurs at a faster rate of evolution than evolving from oviparity to viviparity.
Figure 1: Ancestral state reconstruction with details of the parity on a sample of 86 lizard species using the APE package in the R software. Viviparous reporduction is coded as black and oviparous reporuction is coded as grey. Transitions are shown throughout the tree with some nodes being coded as their probability being divided between viviparity and oviparty using ACE analysis in maximum liklihood.
Discussion
The analysis shows that the singular transition from viviparity to oviparity occur frequently within the phylogeny, but also occurs in the reverse; Figure 1 gives evidence of viviparity occurring twice after being lost in the clade’s including Saiphos equalis and Lobulia subalpina. As a result of this, the prediction that once viviparity is lost it cannot be regained is disproven and therefore the results do not support the hypothesis. Despite this, there are some elements of Figure 1 that somewhat support the hypothesis and Dollo’s Lawas there are several times viviparity has not evolved once it is lost, for example the clade including Chalcidoseps thwaitesi, Lankascincus fallax and Emoia cyanura.
A study conducted by Lynch and Wagner (2009) showed similar results in the fact that some reversions from oviparity to viviparity may have occurred in specific species after using maximum-liklihood methods. Another similar study taken out by Lee and Shine (1998) gave evidence that after transitioning from viviparity to oviparity the evolution can be reversed in lizard-specific species, noting 49 changes in the squamata data.
Using APE and ACE within R and comparing results to similar studies have provided evidence and concluded that that the complexity of an organ does not prevent its reoccurrence within the evolution of a species and therefore, the logic of Dollo’s Law is disproven as a result.
Appendix
R Code for the Dataset of the Phylogeny of Parity in Lizards.
setwd("G:/Desktop")
# The first command specifically says to set the working directory to the folder in the brackets. This states the folder in which R needs to import the data file from. R names these folders "Directories".
getwd()
# This second command tells R to get the working directory and allows you to check which folder R is going into. It returns to the current active directory in the R Console.
mydata<-read.table("Parity.txt",sep="t",header=TRUE)
# This imports the data from the file in the folder you have just told R to go into. R requires all data to have a name and therefore, the code begins with "mydata". "read.table" tells R that it is a text file. The file name starts and ends within the first set of speech marks in the brackets. The command "sep="t"" tells R that the file is tab-delimited. The last section of the code shows that the imported file contains column headers.
str(mydata)
head(mydata)
names(mydata)
# This section of code allows you to check that the data has been imported successfully. It shows the imported data in the R Console so it can be double checked against the original data. Note that the code is using the name given for the data – "mydata". Each variable is presented with a "$" to ensure that each column is given a unique name when shown in the R Console.
library("ape")
# This imports the phylogeny for the data using a specific programme within R called "ape". The code imports and loads the package and runs the line.
tree<-read.tree("Lizards.tree")
# To import the already-drawn tree into R, the file must be located by using its correct name within the speech marks and brackets. This allows for the tree to be read and shown in R.
par(mar=rep(0,4))
# This line opens a new window which will be used to present the tree. It eliminates the space around the tree in the window to allow for the whole area to be used.
plot(tree,label.offset=4.0)
# The drawn tree will now be shown in the most recent window opened by R. Note that the window may need to be adjusted in size to allow for a clearer picture – labels may be too close together and may need spacing out. The section "label.offset" moves the species names within the tree to the right side of the window; stating "4.0" reduces the values to less than 4 – these can be adjusted to be more or less than 4 as you wish.
mydata2 <- mydata[match(tree$tip.label,mydata$Species),]
# In order to add the data for parity of the lizards for each species this line of code must be used to create a new variable names "mydata2". Note that the "$" sign appears again as R is targeting original tips and species names.
tip_colours<-c("grey90", "black")
palette(tip_colours)
tiplabels(pch=16, col=as.numeric(mydata2$Parity01)+1, cex=1.5)
# To add colour to the tips by category of parity the above section of code can be used. The code above shows that grey shows oviparous and black is used for viviparous. These colours can be adjusted by entering a new colour within the brackets and speech marks to replace the current colours; e.g. tip_colours<-c("pink", "green". The chosen colours come from the colour palette shown in the second line of code.
OV<-mydata$Parity01
# To tell R which column of the data.frame "mydata" will be used for the analysis this line of code must be presented. "OV" is an abbreviated to shorten the categories "oviparous" and "viviparous".
names(OV)<-mydata$Species
# This tells R where the species names can be found within the "mydata" data-frame.
aceOV<-ace(OV,phy=tree,type="discrete",model="ARD")
aceOV
# This section of commands allows for an ancestral state estimation to be taken out where maximum likelihoods are shown in the R Console. The first line specifies that the data for the "OV" is the new variable and the phylogeny (phy=) is the imported "Lizard.tree". The following section tells R that the data must be categorical (type="discrete"), and the evolutionary model "ARD" presents the data as "All Rates Different" which rates the gains and loses as estimates to differentiate between them. The final section of the code allows for you to see the output presented in the R Console. The results of the analysis should be seen in the Console.
nodelabels(pie=aceOV$lik.anc,piecol=c("grey90", "black"),cex=0.5)
# To retrieve the ancestral state reconstruction for each node on the tree and add them to the figure they must be taken from the output presented in the Console – to do this, the section (aceOV$lik.anc) is used. The nodes probabilities are coloured with the same colours used before when showing the different types of parity, with grey being 100% oviparous and black being 100% viviparous. If there is a node where the types of parity are divided, e.g. 30% oviparous and 70% viviparous, then the node on the tree will be divided in colour to that percentage.