Analysis of body size distribution and average size in T. rex, based on the dataset published in: Paul, G.S., Persons, W.S. and Van Raalte, J. 2022. The Tyrant Lizard King, Queen and Emperor: Multiple Lines of Morphological and Stratigraphic Evidence Support Subtle Evolution and Probable Speciation Within the North American Genus Tyrannosaurus. Evolutionary Biology 49 (2): 156–179.

read.csv("rexes_pauletal_22.csv", row.names=1)->rexes
rexes<-rexes[rowSums(is.na(rexes))!=ncol(rexes),]#delete rows with only NAs
nrow(rexes)
## [1] 34

the dataset looks like this:

fl fc hl hc ill ild m2l m2c m4l m4c m4d maxl maxd dl dd
exBHI 3033 Stan 1350 505 NA NA 1540 585 595 280 600 247 NA 740 378 880 151
Z-rex/Samson 1343 560 NA NA NA NA 610 305 635 280 NA 811 434 901 176
RSM P2523.8 Scotty 1333 590 NA NA 1545 515 NA NA NA NA NA NA NA NA NA
FMNH PR2081 Sue 1321 580 390 185 1525 608 584 NA 621 NA 83 NA NA 954 189
BHI 6248 Cope 1300 630 NA NA NA NA NA NA NA NA NA NA NA NA NA
TMT v222 Lee 1295 545 NA NA NA NA NA NA NA NA NA NA NA NA NA
MOR 1128 G-rex 1280 580 NA NA NA NA NA NA NA NA NA NA NA NA NA
USNM 555000 Wankel 1280 520 365 162 1470 513 585 295 605 253 NA 824 408 879 151
CM 9380 1269 534 330 145 1515 530 615 NA 600 NA 87 690 378 850 178
MOR 980 Peck’s Rex/Rigby 1232 483 362 165 1397 483 597 232 NA NA NA 627 277 543 164
RMDRC 2002.MT-001 1220 580 NA NA NA NA NA NA NA NA NA NA NA NA NA
HMN MB.R.91216 Tristan 1220 520 NA NA NA NA NA NA NA NA NA NA NA NA NA
TMP 81.6.1 Black Beauty 1210 460 302 150 NA NA NA NA NA NA NA 667 403 705 131
LL 12823 1200 467 NA NA NA NA NA NA NA NA NA NA NA NA NA
BHI 6242 Henry 1189 512 NA NA NA NA NA NA NA NA NA NA NA NA NA
LACM 150167 Thomas 1181 470 NA NA NA NA NA NA NA NA NA NA NA NA NA
BHI 6232 1180 527 NA NA NA NA NA NA NA NA NA NA NA NA NA
BHI 6435 1180 512 NA NA NA NA NA NA NA NA NA NA NA NA NA
BHI 6436 1170 530 NA NA NA NA NA NA NA NA NA NA NA NA NA
RGM 792.000 Trix 1170 529 NA NA NA NA NA NA NA NA NA NA NA NA NA
MOR 1125 B-rex 1150 515 NA NA NA NA NA NA NA NA NA 610 324 699 129
BHI 6233 1110 515 NA NA NA NA NA NA NA NA NA NA NA NA NA
BHI 6230 Wy-rex 1100 494 330 145 NA NA 600 272 625 238 87 NA NA NA NA
MOR 009 Hager 1100 469 NA NA 1180 407 540 NA 560 NA 67 NA NA NA NA
USNM 6183 990 430 NA NA NA NA NA NA NA NA NA NA NA NA NA
LACM 23845 900 305 NA NA NA NA 465 NA NA NA NA NA NA NA NA
LACM 23844 NA NA NA NA NA NA 575 NA NA NA NA 658 303 883 168
BHI 4100 NA NA NA NA NA NA NA NA NA NA NA NA NA 789 164
BHI 6231 NA NA 360 172 NA NA NA NA NA NA NA NA NA NA NA
MOR 008 NA NA NA NA NA NA NA NA NA NA NA 664 322 836 171
AMNH 5027 NA NA NA NA 1448 470 NA NA NA NA NA 680 345 850 135
NHMUK R 7994 NA NA NA NA NA NA NA NA NA NA NA NA NA 941 182
TCM 2001.90.1 NA NA NA NA 1275 NA NA NA 565 263 NA NA NA NA NA
UCMP 118742 NA NA NA NA NA NA NA NA NA NA NA 754 363 NA NA

First, we analyze the known femur length data

For our simplest approach, we can just take the mean of all the available femur lengths and circumferences:

mean(rexes$fl, na.rm=T)
## [1] 1202.808
mean(rexes$fc, na.rm=T)
## [1] 513.9231

As we can see, our resulting average femur length is about 1203 (n=26) and femur circumference averages 514 (n=26).

If we are interested in the uncertainty that comes with those mean estimates, we can calculate the confidence interval (I am using the 90% interval here because I’m primarily interested in one-tailed comparisons, i.e. “bigger than” or “smaller than”):

t.test(rexes$fl, conf.level=0.9)
## 
## 	One Sample t-test
## 
## data:  rexes$fl
## t = 57.812, df = 25, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 90 percent confidence interval:
##  1167.269 1238.346
## sample estimates:
## mean of x 
##  1202.808

However, the data appear to be bordering significant non-normality non-normal (possibly because the best-preserved skeletons also tend to be the largest ones, and are hence overrepresented in datasets)

hist(rexes$fl)

plot of chunk unnamed-chunk-5

shapiro.test(rexes$fl)
## 
## 	Shapiro-Wilk normality test
## 
## data:  rexes$fl
## W = 0.92654, p-value = 0.06414

Hence, the t. test-confidence interval (which assumes normality) may be biased. While I cannot accurately account for the underlying bias (that might be the reason for the skew in the data, but might equally apply to other large theropods we might want to compare T. rex to), we can account for the lack of normality by calculating our confidence interval using a bootstrap.

source("confints.R")#load functions from script
set.seed(42)
bootCI(rexes$fl[!is.na(rexes$fl)], mean)
##       5%      95% 
## 1167.931 1235.194

As you can see in the histogram above, there are also two femora in the sample (in rows 25 and 26) that are 90 and 99 cm long respectively, which might be from subadults. We can exclude those from the analysis if we want:

mean(rexes$fl[-c(25,26)], na.rm=T)
## [1] 1224.292
bootCI(rexes$fl[1:24], mean)
##       5%      95% 
## 1197.331 1250.629

Doing the same for femur circumference

mean(rexes$fc[-c(25,26)], na.rm=T)
## [1] 526.125
bootCI(rexes$fc[1:24], mean)
##       5%      95% 
## 513.2021 540.3979

These of course are only for the specimens with known femora. We can attempt to verify these findings by estimating femur sizes for the specimens in the dataset that do not have femora (n=8).

Adding non-femur data

For that, we fit predictive models for data with known femur lengths:

lm(fl~maxl,data=rexes[1:26,])->lm.max.rexes#maxilla length
lm(fl~dl,data=rexes[1:26,])->lm.dent.rexes#dentary length
lm(fl~hl,data=rexes[1:26,])->lm.hum.rexes#humerus length
lm(fl~m4l,data=rexes[1:26,])->lm.m4.rexes#metatarsal 4

Now we can make predictions for specimens without femora, but with preserved humeri, maxillae, dentaries or fourth metatarsals

preds<-matrix(NA,nrow=8, ncol=4)
predict(lm.max.rexes, rexes[27:34,])->preds[,1]
predict(lm.dent.rexes, rexes[27:34,])->preds[,2]
predict(lm.hum.rexes, rexes[27:34,])->preds[,3]
predict(lm.m4.rexes, rexes[27:34,])->preds[,4]
rownames(preds)<-rownames(rexes)[27:34]

The resulting estimates look like this:

LACM 23844 1227.626 1299.736 NA NA
BHI 4100 NA 1264.772 NA NA
BHI 6231 NA NA 1255.062 NA
MOR 008 1231.603 1282.254 NA NA
AMNH 5027 1242.209 1287.461 NA NA
NHMUK R 7994 NA 1321.309 NA NA
TCM 2001.90.1 NA NA NA 1170.634
UCMP 118742 1291.261 NA NA NA

So we now have at least one estimate of femur length for each of these specimens without femora. For simplicity, we will simply take the mean for each row, i.e. for all available estimates per specimen.

apply(preds,1,mean, na.rm=T)->predm#calculate means
c(rexes$fl[1:26],predm)->r_fl#combine all (measured and estimated) femur lengths

the histogram for the resulting dataset (n=34) looks like this:

hist(r_fl)

plot of chunk unnamed-chunk-13

shapiro.test(r_fl)#testing normality
## 
## 	Shapiro-Wilk normality test
## 
## data:  r_fl
## W = 0.90668, p-value = 0.006918

(and again the data are non-normal, this time significantly)

Finally, we can analyze the resulting dataset:

mean(r_fl[-c(25,26)])#mean femur length (without the two potential subadults)
## [1] 1233.484
bootCI(r_fl[-c(25,26)], mean)#bootstrap confidence interval
##       5%      95% 
## 1212.604 1253.002

Based on the interval, it appears we can be fairly confident in our result (within the limits of fossil record incompleteness and biases, of course), at least within a couple of centimetres (average femur length likely 123±2 cm).

We can also repeat the same analysis with femur circumference. However, since the predictive equations for this metric tend to lack statistical significance (p>0.05), the resulting figures are only a rough indication (and I will not be using them in the size estimate below, only to demonstrate that the resulting femur circumference ends up similar to what we get when ignoring these specimens).

#fit predictive models for data with known femur circumferences
lm(fc~maxl,data=rexes[1:26,])->lm.max.rexes
lm(fc~dl,data=rexes[1:26,])->lm.dent.rexes
lm(fc~hl,data=rexes[1:26,])->lm.hum.rexes
lm(fc~m4l,data=rexes[1:26,])->lm.m4.rexes
#make predictions from models
preds<-matrix(NA,nrow=8, ncol=4)
predict(lm.max.rexes, rexes[27:34,])->preds[,1]
predict(lm.dent.rexes, rexes[27:34,])->preds[,2]
predict(lm.hum.rexes, rexes[27:34,])->preds[,3]
predict(lm.m4.rexes, rexes[27:34,])->preds[,4]

#calculate means for each specimen
apply(preds,1,mean, na.rm=T)->predm
#combine data
c(rexes$fc[1:26],predm)->r_fc
#femur circumference estimates:
mean(r_fc[-c(25,26)])#without…
## [1] 523.9586
mean(r_fc)#…and with potential subadults
## [1] 514.7551

Size estimates So as we just estimated, the mean femur length for 32 adult T. rex specimens based on Paul’s dataset is approx. 1233 mm, and the mean femur circumference is (at most) approx. 526 mm.

We can now try to estimate body size based on those metrics by comparing them to the respective measurements in sue (FMNH PR 2081), the most complete known specimen:

mean(r_fl[-c(25,26)])/1321*12.3#estimated TL (in m) for average-length of 32 adult T. rex specimens, based on Sue
## [1] 11.48513
(mean(r_fl[-c(25,26)])/1321)^3*8.4#mass based on Hartman’s GDI, scaling from femur length
## [1] 6.838662
(mean(r_fc[1:24])/580)^3*8.4#estimated mass (in tons) based on Hartman’s Sue GDI, scaling from femur circumference
## [1] 6.269922

Both mass and length estimates are based on the skeletal reconstruction by Scott Hartman, and his volumetric mass estimate based thereon (https://www.skeletaldrawing.com/home/mass-estimates-north-vs-south-redux772013).

So the average length for T. rex was likely around 11.5 m, and such an individual would have massed 6.3 to 6.8 t. Note that the estimate from femur circumference might be too conservative, as Sue is a “robust” specimen with a proportionately thick femur. The real value would likely fall somewhere between the two mass estimates.