Messel turtle mass calculations

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")

Geoemydidae

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

Dermatemydidae

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.

Trionychidae

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.

Podocnemididae

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

Bridger turtle mass calculations

Geoemydidae

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

Dermatemydidae

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

Testudinidae

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

Trionychidae

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.

Kinosternidae

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