The follow analyses are based on the extensive data set in the paper by Regis & Meik (2017). I deleted extra lines at the top, saved data file as tab-delimited text, then simplified column names, and deleted quotation marks. Note that mass is in g, length in mm.
turtleData <- read.table("/Users/kts/Dropbox/AKTUELLE-PROJEKTE/Messel Bridger/Literature/Regis_Meik 2017 Suppl/Full Data.txt", sep = "\t", header = TRUE, fill = TRUE)
colnames(turtleData)
## [1] "Carapace.data.used.for.phylogenetic.analysis"
## [2] "Mass.data.used.for.phylogenetic.analysis"
## [3] "Max.mass.used"
## [4] "Max.SCL.used"
## [5] "Captive"
## [6] "Combined.populations"
## [7] "Genus"
## [8] "Species"
## [9] "Common.Name"
## [10] "Family"
## [11] "M_Mass_Gram"
## [12] "F_Mass_Gram"
## [13] "N"
## [14] "Locality"
## [15] "M_SCL_mm"
## [16] "F_SCL_mm"
## [17] "M_Max_Mass_Gram"
## [18] "F_Max_Mass_Gram"
## [19] "Pop_Max_Mass_Gram"
## [20] "M_Max_SCL_mm"
## [21] "F_Max_SCL_mm"
## [22] "Pop_Max_SCL_mm"
turtleData <- split(turtleData, f = as.factor(turtleData$Family))
taxa <- c("Geoemydidae", "Dermatemydidae", "Trionychidae", "Podocnemididae")
We use this clade for Palaeoemys / Francellia.
mass <- rbind(turtleData$Geoemydidae$M_Mass_Gram, turtleData$Geoemydidae$F_Mass_Gram)
length <- rbind(turtleData$Geoemydidae$M_SCL_mm, turtleData$Geoemydidae$F_SCL_mm)
data <- matrix(data = c(mass, length), ncol = 2)
data <- as.data.frame(data)
colnames(data) <- c("Mass", "Length")
Geoemydidae <- glm(log(data$Mass) ~ log(data$Length))
Geoemydidae
##
## Call: glm(formula = log(data$Mass) ~ log(data$Length))
##
## Coefficients:
## (Intercept) log(data$Length)
## -5.299 2.363
##
## Degrees of Freedom: 77 Total (i.e. Null); 76 Residual
## (150 observations deleted due to missingness)
## Null Deviance: 73.58
## Residual Deviance: 22.04 AIC: 128.8
Palaeoemys_SCL <- c(170,
180,
200,
212,
220,
226,
233,
235,
240,
244,
244,
251,
258,
261,
280,
287,
150,
154)
Palaeoemys_mass_Kg <- exp(Geoemydidae$coefficients[1] +
Geoemydidae$coefficients[2] * log(Palaeoemys_SCL)) / 1000
Palaeoemys_mass_Kg
## [1] 0.9336349 1.0686750 1.3708497 1.5732518 1.7171893 1.8299387 1.9667353
## [8] 2.0068679 2.1092518 2.1932819 2.1932819 2.3449115 2.5024180 2.5717344
## [15] 3.0363503 3.2188214 0.6945556 0.7391280
On the basis of ecological similarity, we use Dermatemydidae instead of Carettochelyidae for Allaeochelys, as the latter family has only a few observations, and no combined observations of length and mass. This workaround is itself not ideal, as for Dermatemys mawi there are only two complete cases. Nevertheless, independent values of mass or length are not very inconsistent with those two cases.
mass <- rbind(turtleData$Dermatemydidae$M_Mass_Gram, turtleData$Dermatemydidae$F_Mass_Gram)
length <- rbind(turtleData$Dermatemydidae$M_SCL_mm, turtleData$Dermatemydidae$F_SCL_mm)
data <- matrix(data = c(mass, length), ncol = 2)
data <- as.data.frame(data)
colnames(data) <- c("Mass", "Length")
Dermatemydidae <- glm(log(data$Mass) ~ log(data$Length))
Dermatemydidae
##
## Call: glm(formula = log(data$Mass) ~ log(data$Length))
##
## Coefficients:
## (Intercept) log(data$Length)
## 4.6993 0.6864
##
## Degrees of Freedom: 1 Total (i.e. Null); 0 Residual
## (8 observations deleted due to missingness)
## Null Deviance: 0.002908
## Residual Deviance: 1.262e-29 AIC: -122.8
Allaeochelys_SCL <- c(150,
159,
161,
163,
169,
170,
179,
180,
180,
185,
188,
195,
195,
198,
203,
205)
Allaeochelys_mass_Kg <- exp(Dermatemydidae$coefficients[1] +
Dermatemydidae$coefficients[2] * log(Allaeochelys_SCL)) / 1000
Allaeochelys_mass_Kg
## [1] 3.423677 3.563378 3.594083 3.624668 3.715725 3.730802 3.865269 3.880077
## [9] 3.880077 3.953736 3.997631 4.099209 4.099209 4.142391 4.213908 4.242359
The results are square in the middle of the order of magnitude 1-10 kg, suggesting that bias in the estimate will not affect our classification given our ontology.
We use this clade for Palaeoamyda. The greatest concern is that SCL is measured with respect to the leathery carapace in the extant clade, whereas in the fossil all we have is the bony skeleton. To account for this unknown error, we take extreme values of the leathery portion: 0% and 30% of the bony carapace and make calculations accordingly.
mass <- rbind(turtleData$Trionychidae$M_Mass_Gram, turtleData$Trionychidae$F_Mass_Gram)
length <- rbind(turtleData$Trionychidae$M_SCL_mm, turtleData$Trionychidae$F_SCL_mm)
data <- matrix(data = c(mass, length), ncol = 2)
data <- as.data.frame(data)
colnames(data) <- c("Mass", "Length")
Trionychidae <- glm(log(data$Mass) ~ log(data$Length))
Trionychidae
##
## Call: glm(formula = log(data$Mass) ~ log(data$Length))
##
## Coefficients:
## (Intercept) log(data$Length)
## 2.809 1.123
##
## Degrees of Freedom: 13 Total (i.e. Null); 12 Residual
## (52 observations deleted due to missingness)
## Null Deviance: 7.256
## Residual Deviance: 3.575 AIC: 26.62
Palaeoamyda_SCL <- c(184,
210,
219,
250)
Palaeoamyda_mass_Kg <- exp(Trionychidae$coefficients[1] +
Trionychidae$coefficients[2] * log(Palaeoamyda_SCL)) / 1000
Palaeoamyda_mass_Kg
## [1] 5.791211 6.717724 7.041833 8.170422
Palaeoamyda_SCL30 <- 1.30 * Palaeoamyda_SCL
Palaeoamyda_mass_Kg30 <- exp(Trionychidae$coefficients[1] +
Trionychidae$coefficients[2] * log(Palaeoamyda_SCL30)) / 1000
Palaeoamyda_mass_Kg30
## [1] 7.775167 9.019085 9.454228 10.969449
Even for the largest specimen given the largest size estimate, mass was only 11.0 kg. The average even of our four specimens is <10 kg. Thus, error in the estimate will not likely affect our classification given our ontology.
We use this clade for Neochelys.
mass <- rbind(turtleData$Podocnemididae$M_Mass_Gram, turtleData$Podocnemididae$F_Mass_Gram)
length <- rbind(turtleData$Podocnemididae$M_SCL_mm, turtleData$Podocnemididae$F_SCL_mm)
data <- matrix(data = c(mass, length), ncol = 2)
data <- as.data.frame(data)
colnames(data) <- c("Mass", "Length")
Podocnemididae <- glm(log(data$Mass) ~ log(data$Length))
Podocnemididae
##
## Call: glm(formula = log(data$Mass) ~ log(data$Length))
##
## Coefficients:
## (Intercept) log(data$Length)
## -8.652 2.930
##
## Degrees of Freedom: 15 Total (i.e. Null); 14 Residual
## (28 observations deleted due to missingness)
## Null Deviance: 7.551
## Residual Deviance: 0.3597 AIC: -9.314
Neochelys_SCL <- c(145,
164,
232)
Neochelys_mass_Kg <- exp(Podocnemididae$coefficients[1] +
Podocnemididae$coefficients[2] * log(Neochelys_SCL)) / 1000
Neochelys_mass_Kg
## [1] 0.3762192 0.5396693 1.4911529
We use this clade for Echmatemys and Clemmys.
geoemydids_SCL <- c(335, # Echmatemys wyomingensis
420, # Echmatemys haydeni
380) # Echmatemys septaria
geoemydids_mass_Kg <- exp(Geoemydidae$coefficients[1] +
Geoemydidae$coefficients[2] * log(geoemydids_SCL)) / 1000
geoemydids_mass_Kg
## [1] 4.639072 7.916434 6.248876
We use this clade for Baptemys and Anosteira (see also above).
dermatemydids_SCL <- c(430, # Baptemys wyomingensis
250) # Anosteira radulina
dermatemydids_mass_Kg <- exp(Dermatemydidae$coefficients[1] +
Dermatemydidae$coefficients[2] * log(dermatemydids_SCL)) / 1000
dermatemydids_mass_Kg
## [1] 7.053792 4.861419
We use this clade for Hadrianus.
mass <- rbind(turtleData$Testudinidae$M_Mass_Gram, turtleData$Testudinidae$F_Mass_Gram)
length <- rbind(turtleData$Testudinidae$M_SCL_mm, turtleData$Testudinidae$F_SCL_mm)
data <- matrix(data = c(mass, length), ncol = 2)
data <- as.data.frame(data)
colnames(data) <- c("Mass", "Length")
Testudinidae <- glm(log(data$Mass) ~ log(data$Length))
Testudinidae
##
## Call: glm(formula = log(data$Mass) ~ log(data$Length))
##
## Coefficients:
## (Intercept) log(data$Length)
## -7.997 2.885
##
## Degrees of Freedom: 97 Total (i.e. Null); 96 Residual
## (216 observations deleted due to missingness)
## Null Deviance: 119
## Residual Deviance: 5.188 AIC: -3.87
Hadrianus_SCL <- c(590) # Hadrianus corsoni
Hadrianus_mass_Kg <- exp(Testudinidae$coefficients[1] +
Testudinidae$coefficients[2] * log(Hadrianus_SCL)) / 1000
Hadrianus_mass_Kg
## (Intercept)
## 33.17129
We use this clade for “Trionyx”, Amyda, Platypeltis and Aspiderites. Palaeoamyda. The greatest concern is that SCL is measured with respect to the leathery carapace in the extant clade, whereas in the fossil all we have is the bony skeleton. To account for this unknown error, we take extreme values of the leathery portion: 0% and 30% of the bony carapace and make calculations accordingly.
trionychids_SCL <- c(431, # Trionyx aequa
425, # "Amyda salebrosa" (nomen dubium)
286, # Platypeltis heteroglypta
420, # Trionyx guttatus
450, # Trionyx ellipticus
383) # Trionyx ellipticus
trionychids_mass_Kg <- exp(Trionychidae$coefficients[1] +
Trionychidae$coefficients[2] * log(trionychids_SCL)) / 1000
trionychids_mass_Kg
## [1] 15.060463 14.825252 9.502714 14.629554 15.807931 13.190483
trionychids_SCL30 <- 1.30 * trionychids_SCL
trionychids_mass_Kg30 <- exp(Trionychidae$coefficients[1] +
Trionychidae$coefficients[2] * log(trionychids_SCL30)) / 1000
trionychids_mass_Kg30
## [1] 20.21988 19.90409 12.75816 19.64135 21.22342 17.70928
Regardless of the model, all taxa except Platypeltis lie between 10-100 kg.
We use this clade for Xenochelys and Baltemys.
mass <- rbind(turtleData$Kinosternidae$M_Mass_Gram, turtleData$Kinosternidae$F_Mass_Gram)
length <- rbind(turtleData$Kinosternidae$M_SCL_mm, turtleData$Kinosternidae$F_SCL_mm)
data <- matrix(data = c(mass, length), ncol = 2)
data <- as.data.frame(data)
colnames(data) <- c("Mass", "Length")
Kinosternidae <- glm(log(data$Mass) ~ log(data$Length))
Kinosternidae
##
## Call: glm(formula = log(data$Mass) ~ log(data$Length))
##
## Coefficients:
## (Intercept) log(data$Length)
## -7.450 2.715
##
## Degrees of Freedom: 29 Total (i.e. Null); 28 Residual
## (102 observations deleted due to missingness)
## Null Deviance: 8.698
## Residual Deviance: 0.7524 AIC: -19.43
kinosternids_SCL <- c(127) # Baltemys staurogastros
kinosternids_mass_Kg <- exp(Kinosternidae$coefficients[1] +
Kinosternidae$coefficients[2] * log(kinosternids_SCL)) / 1000
kinosternids_mass_Kg
## (Intercept)
## 0.3002042