Date Created: 27 November, 2023
Last Modified: 20 August, 2024
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
To obtain the original R code for this analysis, select the “Code” button at the top of the document and click “Download Rmd”. This will download the original code in .rmd format. This format can be opened in programs like RStudio as well as general text editors. To replicate this document, place this code and associated data files (“1343_Appendix 4.xlsx”) in a single folder, open this file in RStudio, and then click the “Knit” button.
1 Loading in Data
Saving Ramanujan’s Approximation of the Perimeter of an Ellipse
ramanujan.approx<-function(x,y) {
majoraxis=x/2;
minoraxis=y/2;
pi*((majoraxis+minoraxis)-
((3*(majoraxis-minoraxis)^2)/
(10*(x+minoraxis)+sqrt(x^2+14*majoraxis*minoraxis+minoraxis^2))))
}
Saving Custom Formula for Regression Statistics
regression.stats<-function(fit){
formula<-fit$call;
log_trans<-dplyr::case_when(substr(colnames(fit$model[1]),1,5)=="log10"~"log10",
substr(colnames(fit$model[1]),1,4)=="log("~"ln",
TRUE~"none");
y<-switch(log_trans,"log10"=10^fit$model[,1],"ln"=exp(fit$model[,1]),"none"=fit$model[,1]);
fitted<-switch(log_trans,"log10"=10^fitted(fit),"ln"=exp(fitted(fit)),"none"=fitted(fit));
abserror<-abs(fitted-y)/fitted;
QMLE<-ifelse(log_trans=="none",
NA,
ifelse(log_trans=="log10",
10^((sigma(fit)^2)/2),
exp((sigma(fit)^2)/2)));
smear<-ifelse(log_trans=="none",
NA,
ifelse(log_trans=="log10",
sum(10^fit$residuals)/nrow(fit$model),
sum(exp(fit$residuals))/nrow(fit$model)));
RE<-ifelse(log_trans=="none",
NA,
mean(y)/mean(fitted));
CF<-ifelse(log_trans=="none",
NA,
(RE+smear+QMLE)/3);
adjPE<-ifelse(log_trans=="none",
NA,
mean(abs((fitted*CF)-y)/(fitted*CF)));
SEE<-ifelse(log_trans=="log10",
10^(2+sigma(fit))-100,
exp(sigma(fit)+4.6052)-100);
summary<-summary(fit);
statistics<-data.frame("N"=nrow(fit$model),
"df"=fit$df.residual,
"r2"=round(summary(fit)$r.squared,4),
"adjr2"=round(summary(fit)$adj.r.squared,4),
"AIC"=round(AIC(fit),0),"BIC"=round(BIC(fit),0),
"logLik"=round(logLik(fit),0),
"PE"=round(mean(abserror)*100,2),QMLE=round(QMLE,3),
smear=round(smear,3),RE=round(RE,3),CF=round(CF,3),
"adjPE"=round(mean(adjPE)*100,2),
"SEE"=round(SEE,2),
row.names=deparse(substitute(fit)));
return(statistics)
}
Loading in Data
data_recon<-read_xlsx("1343_Appendix_4.xlsx") %>%
rename(clade=Clade,order=Order,higher_group="Higher Order Clade",family="Family",
shape=Shape,habitat=Habitus,extinct=Extinct,genus=Genus,species=Species,
specimen=Specimen,
body_mass="Weight (g)",
total_length="Total Length (cm)",
fork_length="Fork Length (cm)",
precaudal_length="Precaudal Length (cm)",
head_length="Head Length (cm)",
body_depth="Body Depth (cm)",
prepectoral_length="Prepectoral Length (cm)",
prepelvic_length="Prepelvic Length",
pec_base="Pectoral Fin Base (cm)",
SVL="Snout-Vent Length (cm)",
preanal_length="Preanal Length (cm)",
peduncle_height="Caudal Peduncle Depth (cm)")%>%
mutate(taxon=paste0(genus,"_",species))
Creating Rhizoprionodon silhouette
rhizo<-data.frame(x=c(0.4007578,0.3946954,0.3887508,0.382929,0.3773131,0.3721988,0.3675113,0.3629002,0.3583384,0.3538188,0.3493424,0.344916,0.3404293,0.3357709,0.3308291,0.3253511,0.3189982,0.3122617,0.3053785,0.2984326,0.2914573,0.2844737,0.2774993,0.2705516,0.2636601,0.2567807,0.2498727,0.2429436,0.2360215,0.2291405,0.2222616,0.2153569,0.2084741,0.2016375,0.1948848,0.1880772,0.1812338,0.1744288,0.1676627,0.1608254,0.1540911,0.1473995,0.1406738,0.1340172,0.1274724,0.1209183,0.1142861,0.1075532,0.10072,0.09381659,0.08693189,0.08011189,0.07337916,0.066796,0.0603155,0.0535914,0.04681221,0.04012917,0.03342231,0.02663037,0.01989815,0.01327379,0.006823727,0.0008294744,0,0.005352874,0.0116654,0.01834354,0.02497352,0.03148309,0.03802411,0.04464998,0.05136349,0.05813275,0.06480448,0.07180219,0.07882237,0.08046313,0.0860565,0.09298445,0.09993063,0.1068777,0.1138192,0.120756,0.1276884,0.1346166,0.1415398,0.1484563,0.1553617,0.162258,0.1692408,0.1762649,0.183284,0.1901262,0.1970588,0.2040668,0.2110424,0.2178543,0.224394,0.2306892,0.2358916,0.2387133,0.2413728,0.2441582,0.2470131,0.2499318,0.2529363,0.2560034,0.2588352,0.2621672,0.2656913,0.2691895,0.2726331,0.2760466,0.2798983,0.2851486,0.2909202,0.2966793,0.2974377,0.2977752,0.2980597,0.2983595,0.2987163,0.2991733,0.2998496,0.3013401,0.3031798,0.304369,0.3049683,0.3083117,0.3142919,0.3213169,0.3283423,0.3353666,0.3423856,0.3493983,0.3564045,0.3634039,0.3703963,0.3773814,0.3843587,0.3913275,0.3982862,0.405233,0.4121648,0.4190758,0.4259554,0.432777,0.439605,0.44649,0.4534098,0.4602782,0.467119,0.4741326,0.4809811,0.4874313,0.493718,0.499973,0.5062312,0.5124573,0.5177527,0.5223012,0.5265004,0.5306674,0.5349406,0.5403294,0.5473082,0.5543216,0.561337,0.5683531,0.5753715,0.5823932,0.5894184,0.5964402,0.6034181,0.6103072,0.616967,0.6232154,0.6291671,0.6352319,0.6417947,0.6487681,0.6552499,0.6588087,0.6618288,0.6668433,0.6723809,0.6784414,0.6844551,0.6909902,0.697909,0.7048814,0.7118569,0.7188161,0.7257901,0.7327971,0.7398162,0.7467872,0.7523764,0.7573401,0.7619737,0.766102,0.7707246,0.7750986,0.779709,0.7845408,0.7896139,0.7951749,0.8012544,0.8075934,0.8141272,0.8208852,0.8266883,0.8284469,0.8287026,0.8273061,0.8255916,0.824009,0.8227464,0.8233034,0.8280211,0.8337875,0.8398104,0.8459381,0.8521208,0.8583221,0.8645029,0.8706353,0.8766755,0.8826232,0.8885799,0.8946842,0.9009177,0.9072566,0.9136827,0.9201044,0.9262665,0.9321909,0.9382273,0.9435401,0.9493351,0.9555131,0.9620498,0.9678954,0.9716326,0.9759521,0.9808132,0.9857814,0.9903338,0.9937468,0.9975843,1,0.9945907,0.9876402,0.9806249,0.9736297,0.9666723,0.9597628,0.9528873,0.946031,0.9391853,0.9323455,0.925508,0.9186626,0.9118087,0.9049476,0.898077,0.8911929,0.8843274,0.8774926,0.8706879,0.8638077,0.8569091,0.8501716,0.8434315,0.8366172,0.8298535,0.8231429,0.8164895,0.8098143,0.8031271,0.7964602,0.7898276,0.7832661,0.7767062,0.7701209,0.7635237,0.7569343,0.7503637,0.7436362,0.7366103,0.7295843,0.7225584,0.7155323,0.7086713,0.7031059,0.6966117,0.6911706,0.6861978,0.6816191,0.6767815,0.6701159,0.6638064,0.6574758,0.650753,0.6437554,0.6367315,0.6297064,0.6226806,0.6156547,0.6086304,0.6016101,0.5945989,0.5876041,0.5806394,0.5737211,0.5668213,0.5599164,0.5530069,0.5460954,0.539195,0.5323047,0.5254344,0.5185569,0.5116648,0.5047543,0.497865,0.4910337,0.4841394,0.4771916,0.4702347,0.4633041,0.4564551,0.4495968,0.4434005,0.4389519,0.4340479,0.4294488,0.4252657,0.42242,0.4212366,0.4202908,0.4193971,0.4184924,0.4175307,0.4164942,0.4153371,0.4137883,0.4112077,0.4073199),
y=c(0.3278792,0.3243291,0.3205844,0.3166521,0.3124316,0.3076504,0.3024168,0.2971157,0.2917721,0.2863928,0.2809775,0.2755212,0.2701146,0.2648557,0.2598637,0.2554783,0.2525117,0.2505284,0.2491256,0.2480705,0.2472294,0.2464598,0.2456105,0.2445679,0.2432036,0.2417769,0.2404955,0.239333,0.2381297,0.2367203,0.235292,0.2339926,0.2325824,0.2309641,0.2290265,0.2272897,0.2256988,0.2239516,0.2220627,0.220459,0.2184564,0.2163149,0.2142838,0.2120662,0.2095113,0.2069803,0.2046627,0.2026577,0.2010268,0.1997225,0.1983231,0.1966367,0.1946309,0.1921823,0.1894819,0.1874507,0.1856063,0.1834446,0.1813549,0.1795576,0.1775492,0.1752104,0.17243,0.1687951,0.1627831,0.1582755,0.1552146,0.1530378,0.1507147,0.1480721,0.145508,0.143172,0.1411018,0.1392206,0.1370943,0.1364945,0.1362103,0.1304006,0.1272447,0.1260762,0.1250204,0.1239706,0.1228843,0.1217682,0.1206261,0.1194578,0.1182601,0.1170249,0.1157293,0.1143879,0.1136473,0.1135211,0.1132539,0.1117557,0.1106748,0.1101752,0.1093583,0.1076638,0.1051033,0.1019925,0.09735957,0.09094869,0.08444597,0.07799575,0.07157596,0.06518496,0.05883386,0.05251301,0.04608548,0.03990091,0.03382267,0.02772949,0.02160533,0.01546515,0.009593715,0.004949856,0.0009464814,0,0.006975124,0.01399291,0.02101316,0.0280327,0.03504963,0.04206063,0.04905319,0.05590182,0.06267992,0.0696009,0.07659,0.08264781,0.08577069,0.08565095,0.0855796,0.08572504,0.08603347,0.08646302,0.08698991,0.08760067,0.08828592,0.08904189,0.08986712,0.09076166,0.09173123,0.09278255,0.09392846,0.09519326,0.09661949,0.09829827,0.09995211,0.1013509,0.1025665,0.1040412,0.1055818,0.1053321,0.103851,0.1010741,0.09793739,0.0947374,0.09154378,0.09166042,0.09624836,0.1016003,0.1072325,0.1128893,0.1184659,0.1226128,0.1233818,0.1238001,0.1241855,0.1245583,0.1248829,0.1251254,0.125216,0.1250079,0.1242168,0.1228476,0.120633,0.1174306,0.1136984,0.1101597,0.1076929,0.1071488,0.109421,0.1154495,0.1216422,0.1265557,0.1308744,0.1344168,0.1380435,0.1405314,0.1417416,0.142606,0.1434455,0.1444102,0.1452456,0.1457588,0.1460627,0.1455665,0.1413847,0.1364138,0.1311345,0.1254529,0.1201673,0.1146694,0.1093687,0.1042683,0.09940931,0.09512769,0.09161121,0.08858448,0.08600548,0.08410858,0.08641954,0.09319907,0.1001984,0.1070805,0.1138941,0.1207391,0.1276489,0.1345353,0.1396749,0.1436834,0.1473005,0.150737,0.1540745,0.1573772,0.1607178,0.1641469,0.1677351,0.1714754,0.1752003,0.1786779,0.1819187,0.1849483,0.1877886,0.1906357,0.1940025,0.1977758,0.201364,0.2059392,0.205114,0.2017685,0.1992707,0.2023425,0.2082863,0.2138143,0.2188862,0.2238539,0.2291945,0.2353298,0.2412048,0.2471672,0.2514645,0.2522377,0.2518744,0.251222,0.250248,0.2489764,0.2475309,0.245996,0.2444142,0.2428078,0.2411917,0.2396098,0.2380638,0.2365506,0.235081,0.2336772,0.2321849,0.2305573,0.2288116,0.2273907,0.2260648,0.2241088,0.2221322,0.2204212,0.2185203,0.2164401,0.2141827,0.2119906,0.2098351,0.2076182,0.2053003,0.2027901,0.2002741,0.1978254,0.195408,0.1929703,0.1904822,0.1889234,0.1888989,0.1888744,0.1888681,0.1888681,0.1892572,0.1934248,0.1960751,0.2005018,0.2054635,0.210788,0.2152836,0.2132566,0.2101671,0.2071225,0.2051481,0.2045656,0.2043968,0.2042932,0.2042496,0.20429,0.2044366,0.2047167,0.2051657,0.2058259,0.2067465,0.2079698,0.2092949,0.210594,0.2118677,0.2131297,0.2144533,0.2158272,0.2172971,0.218733,0.2200978,0.2213665,0.2227444,0.2243822,0.2257254,0.2267697,0.2277532,0.2289027,0.2304566,0.2319635,0.2344573,0.2398777,0.244908,0.2502181,0.25586,0.2622212,0.269145,0.276107,0.2830759,0.2900432,0.2970033,0.3039523,0.310882,0.3177296,0.3242609,0.3298849))
2 Methods
Comparative data in these analyses were drawn from a large sample of extant fishes coming from a wide variety of sources, including fluid-preserved specimens directly measured from the collections of the Cleveland Museum of Natural History (CMNH), Florida Fish and Wildlife Research Institute (FSBC), and the Ohio State University Museum of Biodiversity (OSUM). Other data were collected from the previously published literature, either as reported values or measured from photographs published in those studies. Similarly, for extinct arthrodires a combination of directly observed specimens and the previously published literature was used.
Specific attention is brought to the work of Randall (1997), who made his photographic collection of nearly 10,000 fishes with associated length (http://www.fishbase.org/search.php). Not all 10,000+ fishes in Randall (1997) were able to be measured due to time constraints, but an attempt was made to include…
- A representative collection of fish diversity
- As many large-bodied fish species as possible (as measurements for these taxa tend to be rare)
- As many basal fish lineages as possible within this sample (e.g., chondrichthyans, megalopids, clupeids, etc.), because those taxa are likely to better compare with arthrodires than specialized acanthopterygians
data_recon %>%
filter(length_as=="total length") %>%
mutate(reference_2 = factor(case_when(Reference == "Present Study" ~ "First-hand observation",
Reference %in% c("Randall 1997","Randall 1997, Mihalitsis and Bellwood 2019") ~ "Randall 1997",
.default = "Other prior literature sources (reported or measured from figures)"),
ordered=T,levels=c("First-hand observation","Randall 1997","Other prior literature sources (reported or measured from figures)"))) %>%
group_by(reference_2) %>%
summarise(N=n()) %>%
kable(caption="Sources of data used in this analysis",col.names = c("Source","N")) %>%
kable_styling()
Source | N |
---|---|
First-hand observation | 307 |
Randall 1997 | 519 |
Other prior literature sources (reported or measured from figures) | 1873 |
This results in a total of nearly 2500 distinct observations representing 888 fish taxa. The term “observations” is preferred over specimens here as some studies report measurements of their material as mean proportion values (% total length or standard length) of the entire sample, as is often the case in studies of modern fishes. However, because these values are reported as proportions of total length, rather than measurements, they can still be converted to a form where they can be compared with other fishes.
data_recon %>%
group_by(taxon) %>%
summarise(n=n()) %>%
ungroup() %>%
summarise(taxon=sum(!is.na(taxon)),n=sum(n)) %>%
kable(caption="Total count of observations examined",
col.names=c("Taxa","Observations"),align="c") %>%
kable_styling()
Taxa | Observations |
---|---|
913 | 2722 |
Most of this data was collected alongside a previous study by the author (Engelman 2023), and the reader is encouraged to check the methods of that paper for more details. For more details on how the measurements were collected, see Engelman (2023). Figure 4 of that study in particular provides a graphic showing how several measurements were collected Methods of measuring of SVL require additional clarification and are discussed in the section “Measuring SVL”.
All measurements taken by the author (including those measured from the figures in Randall 1997) were measured relative to the anteroposterior axis of the animal (see Engelman 2023: fig. 4), rather than point to point or over body curvature. However, it is possible some reported measurements in the literature may be distorted if they were taken point to point or measured over curves. Reporting how measurements are taken is typically not done in ichthyological studies. This possible bias is worth noting but cannot be controlled for in the current dataset, though its effects seem to be minor.
Several figures in these supplementary analyses use a silhouette of Rhizoprionodon terraenovae created by Nathan Hermann through PhyloPic (https://www.phylopic.org/images/afa6bf86-bfd1-40a3-a78b-a43e396d77aa/rhizoprionodon-terraenovae). R. terraenovae was chosen as a representative fish because Rhizoprionodon was closest to the mean relative prepectoral length, prepelvic length, and snout-vent length of the entire non-acanthopterygian sample.
Measurement | Variable Name | Definition |
---|---|---|
Total length | total_length | Anteroposterior length from anterior tip of rostrum to posterior tip of caudal fin in natural position (when possible) |
Fork length | fork_length | Length from anterior tip of rostrum to notch in caudal fork between upper and lower caudal fin lobes. Recorded as NA for taxa without a caudal notch. |
Standard length | precaudal_length | Length from anterior tip of rostrum to posterior tip of caudal peduncle For sharks and arthrodires: to caudal peduncle For osteichthyans to end of hypurals (which sometimes extend beyond caudal peduncle) |
Head length | head_length | Length from anterior tip of rostrum to posterior margin of branchial cavity. Head length and internal anatomy are homologous among the groups examined due to the conserved position of the neurocranium and branchial arches (see manuscript) but the definition of external landmarks can vary slightly if a cheek plate or operculum covers the gill arches externally. For sharks: from snout to opening of terminal gill arch For osteichthyans: from snout to posterior end of operculum For arthrodires: from snout to cranio-thoracic joint |
Orbit-opercular Length | ool | Length of the head minus preorbital length |
Body depth | body_depth | Maximum height of trunk |
Fineness ratio (f) | fineness | Standard length divided by body depth |
Prepectoral length | prepectoral_length | Distance from the tip of the snout to the origin of the pelvic fins parallel to the the anteroposterior axis |
Pectoral fin base length | pec_base | Anteroposterior length of pectoral fin base For sharks: length of fleshy pectoral fin base on living animal For arthrodires: Length of pectoral fenestra on anterior ventral lateral plate or external face of scapulocoracoid (if preserved) For osteichthyans: not considered due to differences in fin position (usually obliquely oriented to anteroposterior axis), structure (much narrower base), and function (oscillation rather than fixed fins in most taxa) |
Prepelvic length | prepelvic_length | Distance from the tip of the snout to the origin of the pelvic fins parallel to the the anteroposterior axis |
Snout-vent length (SVL) | SVL | Distance from the tip of the snout to the level of the vent parallel to the anteroposterior axis |
Preanal (fin) length | preanal_length | Distance from the tip of the snout to the anal fin origin parallel to the anteroposterior axis. Notably not length to the vent. |
Caudal peduncle height | peduncle_height | Minimum height of caudal peduncle |
In addition to the various extant fishes considered in this study, representatives of 8 species of the extinct fish order Ichthyodectiformes were included in this analysis. Ichthyodectiforms were considered because they have hyper-elongated bodies with small heads relative to their trunks, representing some of the most extreme head-body proportions seen among any living or extinct non-anguilliform fish. Other extinct elongate-bodied fish groups (e.g., saurichthyids) do not show these kinds of proportions (e.g., Kogan et al. 2015). Ichthyodectiforms were also singled out because following the conclusion of Engelman (2023) some have tried to maintain larger body size estimates for Dunkleosteus terrelli by proposing it may have had Xiphactinus-like head-body proportions (pers. comms. to R. Engelman). Thus, Ichthyodectiforms represent a useful test to see how consistent the proportions under examination are across fishes.
2.1 Measuring SVL
Data in this supplementary information was collected from the literature and preserved specimens when measuring data for prior studies (Engelman 2023). Anatomical observations regarding vent position were made from direct observation of these specimens.
SVL was measured as the distance from the tip of the snout to the level of the vent along the anteroposterior axis of the body. In many photographs (e.g., those of Randall 1997), the vent can be readily identified in lateral view by a distinct notch or puckering on the ventral margin of the animal. In cases where the vent could not be not clearly identified SVL was not recorded.
SVL could only be measured opportunistically in fishes. In specimens measured directly, the original goal was to collect measurements of the mouth and head, and SVL only began to be collected late in the analysis, resulting in many fishes lacking SVL data. Photos were taken in lateral view, but in many cases the vent cannot be located on these photos.
SVL is rarely reported for fishes in the literature. Pre-anal length is often reported, with the implication that anal fin position reflects cloaca position. This does appear to be the case for most actinopterygians, where the vent is immediately anterior to the anal fin origin, but the position of the pelvic and anal fins relative to the vent can vary. In some taxa (e.g., Carangidae, Gobiidae) there is a distinct gap between the vent and the anal fin origin, and in others (Siluriformes, Amia) the vent is halfway between the pelvic and anal fins. To make comparisons more rigorous, only measurable SVL was used rather than treating pre-anal fin length in actinopterygians as SVL.
All SVL data are reported as species averages to allow for a more even representation of taxa relative to sample size. The same is true for prepectoral length and prepelvic length unless noted.
2.2 Vent position in arthrodires
The location of the cloaca in arthrodires can be determined based on preserved visceral organs in several Gogo taxa (Trinajstic et al. 2022). Additionally, the position of the cloaca can be further constrained based on other features like the position of the claspers (which have to be near the vent to function as intromittant organs, as in chondrichthyans), posterior extent of the ventral shield, and the enlargement of the haemal arches denoting the posterior boundary of the visceral cavity (as in other fishes) (Dean 1896, Miles and Westoll 1968, Ahlberg et al. 2009, Trinajstic et al. 2015, Trinajstic et al. 2022, Engelman 2023).
Vent position could be confidently determined in two near-complete arthrodire taxa: Coccosteus cuspidatus and Incisoscutum ritchei. In Coccosteus cuspidatus (ROM VP 52664), the vent is estimated to be located at 48.3% total length based on the position of the claspers. For ROM VP 52664, there are a pair of elements at the posterior end of the ventral shield that look like iliac processes but other colleagues have suggested in conversation they may actually be claspers (S. van Mesdag, pers. comm. October 2023). The author is not completely sure if these elements truly are claspers (as clasper elements versus isolated iliac processes can be very hard to identify in arthrodires; S. van Mesdag, pers. comm. October 2023), but it was decided to use the proportion in ROM VP 52664 as an approximate estimated SVL because other specimens of coccosteid arthrodires show definite claspers located at approximately this position (Trinajstic et al. 2015). Thus, even if these are pelvic remains, the length to these elements approximates SVL.
For Incisoscutum ritchei, vent position was based on the reconstruction in Trinajstic et al. (2013), as determined by the presence of claspers and location of the preserved cloaca in some specimens (Trinajstic et al. 2022). Total length was estimated from precaudal/total length in Coccosteus as described below. This results in an SVL 46.2-50.5% total length, with most specimens of C. cuspidatus suggesting higher values (SVL = 49.6% total length). If a greater caudal fin length length similar to Miles and Westoll (1968)’s reconstruction is used resulting total length is 27.2 cm and the SVL is 46.2% of total body length, suggesting interpretations of caudal fin size have little effect on the resulting proportion.
Vent position in two other specimens, one of Dickosteus threiplandi (NHMUK PV P 49663) and one of Amazichthys trinajsticae (AA.MEM.DS.8) were also considered. However, the former is a highly distorted specimen where the armor is “exploded” and some of the tail may be missing, and in the latter vent position was merely inferred assuming it was located just posterior to the pelvis as in Coccosteus and Incisoscutum. Vent position in these taxa are considered much less rigorous, though are discussed just to examine possible variation within eubrachythoracid arthrodires.
2.3 Data for arthrodires
2.4 Total lengths and body masses for arthrodires in pectoral fin analysis
In addition to taxa for which length could be measured directly (Amazichthys, Coccosteus), several arthrodires had proportions calculated relative to estimated total length. As mentioned above the length of Incisoscutum was calculated from Trinajstic et al. (2013), with caudal fin length approximated based on Coccosteus. Lengths for Dunkleosteus and other arthrodires for which complete body outlines are unknown were taken from the best-fitting model in Engelman 2023 (the one using individual specimens, allowing allometric slopes to vary between chondrichthyans and non-chondrichthyans, and considering body shape and membership in the outlier clades Serranidae or Holocentridae as additional variables, see that study for more details). For arthrodires, this equation takes the form…
\[ \mbox{total length} = 1.015*exp(0.993271*ln(\mbox{orbit-opercular length})+1.881925) \]
Body masses for arthrodires were calculated using the ellipsoid method of Ault and Luo (2013) as modified by and detailed in Engelman (2023). Body masses for Dunkleosteus terrelli taken directly from that study. Juvenile specimens of Dunkleosteus for which body depth and body width were not available had their mass calculated using the axis available and assuming a sub-circular cross-section, given CMNH 7424 and CMNH 6194 show sub-circular cross-sections and CMNH 8982 and CMC VP 8294 have crushed trunk armors suggesting sub-circular proportions. For CMNH 5768, body mass was recalculated given the narrower body depth for this specimen determined in this study (100 cm versus 114 cm). This specimen is probably too wide as mounted, and it is possible the mass for this specimen would be even lower, around 760-795 kg, if a cross-sectional shape similar to CMNH 6090 and CMNH 7054 is assumed (in which the cross-sectional shape of the armor is better preserved and body width is ~80% body depth). However, because these values are within the range of error calculated here (538-1714 kg), this suggests the use of these mass estimates are reasonable for now and do not invalidate the conclusions presented here.
Error bars for length use +/- percent error unless otherwise noted, due to log-transformation resulting in leptokurtically distributed detransformed residuals and thus exaggerated and unrealistically wide confidence intervals relative to the distribution of the data (see Engelman 2023 for more details).
For Coccosteus cuspidatus and Incisoscutum ritchei body masses were recalculated given the reconstruction in Miles and Westoll (1968) was slightly too long in its abdomen and caudal fin and had an unnaturally compressed trunk armor compared to complete fossils.
The weight of Incisoscutum ritchei was estimated using the proportions in Trinajstic et al. 2013, as in Engelman 2023, but a shorter total length was used following the reasoning in “Vent position in arthrodires”.
For Coccosteus cuspidatus (see manuscript), body mass was estimated using the reconstruction of Coccosteus cuspidatus in this study (Figure 7 in main text). This reconstruction was was adjusted from Miles and Westoll (1968) following the proportions of ROM VP 52664. For girth, body height was measured and it was assumed the proportions of the trunk armor followed the proportions in Miles and Westoll (1968: fig. 44). This might produce a slight overestimate of weight, because shearing the armor might make it slightly deeper than in Miles and Westoll (1968), and thus overestimate trunk width. However, the resulting weight differs only slightly from the body mass of 550 g estimated in Engelman (2023) using the reconstruction in Miles and Westoll (1968), and might be expected because of the slightly stockier body in this reconstruction.
2.5 Adjustments
For extinct taxa known from fragmentary remains, occasionally adjustments had to be made in order to use data from crushed or fragmentary specimens. This is particularly the case with obtaining enough information to produce a reliable estimate of body mass, which requires a value for body girth. These decisions are stated here for transparency and replicability.
- Incisoscutum ritchei - The caudal fin is unknown for Incisoscutum, despite the precaudal anatomy being well known. Caudal fin size was previously estimated in Engelman (2023) based the proportion of precaudal to total length in Miles and Westoll (1968)’s Coccosteus reconstruction. However, examination of more complete specimens of Coccosteus suggests this estimate is overly generous due to the unusually large fin in that reconstruction. Caudal fin size here was estimated based on five near-complete specimens of C. cuspidatus (total length ~ 1.23 x precaudal length, see Appendix 8, this paper), which produce total lengths of 25 to 27 cm for Incisoscutum.
- WAM 70.4.864 (Eastmanosteus calliaspis) - Any measurements taken from the reconstruction in Dennis-Bryant (1987: fig. 5) were scaled to match the reported dimensions of the specimen using head shield length (13.37 cm). The reconstruction in Dennis-Bryant (1987) is slightly larger than the reported measurements of the holotype, despite being mostly based on this specimen. The original material could not be examined directly for measurement.
- CMNH 6194 (Dunkleosteus terrelli) - Body mass was calculated assuming a subcircular cross-section with body width approximate equal to body depth (~36.5 cm) Direct observation of this mount shows it had a subcircular cross-section, but exact dimensions could not be measured due to inaccessibility of the specimen during the 2022-2024 renovations of the Cleveland Museum of Natural History.
- CMNH 8982 (Dunkleosteus terrelli) - Body mass was estimated assuming a subcircular cross-section with body width approximately equal to estimated body depth (~33 cm), given other D. terrelli specimens of similar size (CMNH 6194, CMNH 7424) have subcircular cross-sections
- CMC VP8294 (Dunkleosteus terrelli) - Body mass was estimated assuming a subcircular cross-section with body width approximately equal to estimated body depth (~33 cm), given other D. terrelli specimens of similar size (CMNH 6194, CMNH 7424) have subcircular cross-sections
- Amazichthys trinajsticae - Pectoral fin base length in the holotype (AA.MEM.DS.8) was restored after PIMUZ A/I 4773. AA.MEM.DS.8 only preserves a fragment of the scapulocoracoid, but PIMUZ A/I 4773 preserves the entire element, and the two specimens are similar in size (Jobbins et al. 2022). Body mass in this taxon was estimated assuming a cross-sectional length/depth ratio of 1.2, similar to other pelagic pachyosteomorphs (see Engelman 2023).
3 Data distribution
For this section “mean value” means the mean value as a proportion of total length, for easier comparison between taxa/specimens of different sizes.
3.1 By higher-level clade
obs_by_clade<-data_recon %>%
mutate(pec_base2=pec_base/total_length,
ppl=prepectoral_length/total_length,
SVL2=SVL/total_length,
pvl=prepelvic_length/total_length,
clade=ifelse(higher_group=="Acanthopterygii","Acanthopterygii",clade),
clade=ifelse(clade=="Actinopterygii","Non-Acanthopterygian Actinopterygii",clade),
clade=factor(clade,ordered=T,levels=c("Acanthopterygii","Non-Acanthopterygian Actinopterygii","Sarcopterygii","Chondrichthyes","Placodermi"))) %>%
group_by(taxon) %>%
summarise(pec_base=mean(pec_base2,na.rm=T),
n_pec=sum(!is.na(pec_base2)),
n_ppl=sum(!is.na(ppl)),
n_svl=sum(!is.na(SVL2)),
n_pvl=sum(!is.na(pvl)),
ppl=mean(ppl,na.rm=T),
SVL=mean(SVL2,na.rm=T),
pvl=mean(pvl,na.rm=T),
order=unique(order),clade=unique(clade)) %>%
group_by(clade) %>%
summarise(clade=unique(clade),
nspec_pec=sum(!is.na(pec_base)),
n_pec=sum(n_pec),
nspec_ppl=sum(!is.na(ppl)),
n_ppl=sum(n_ppl),
nspec_SVL=sum(!is.na(SVL)),
n_SVL=sum(n_svl),
nspec_pvl=sum(!is.na(pvl)),
n_pvl=sum(n_pvl),
ppl=mean(ppl,na.rm=T),
SVL=mean(SVL,na.rm=T),
pvl=mean(pvl,na.rm=T)) %>%
select(clade,nspec_pec,n_pec,n_ppl,nspec_ppl,ppl,n_SVL,nspec_SVL,SVL,n_pvl,nspec_pvl,pvl)
obs_by_clade %>%
add_row(clade="All Species",
n_pec = sum(obs_by_clade$n_pec),
nspec_pec = sum(obs_by_clade$nspec_pec),
nspec_ppl = sum(obs_by_clade$nspec_ppl),
n_ppl = sum(obs_by_clade$n_ppl),
n_SVL = sum(obs_by_clade$n_SVL),
nspec_SVL = sum(obs_by_clade$nspec_SVL),
n_pvl = sum(obs_by_clade$n_pvl),
nspec_pvl = sum(obs_by_clade$nspec_pvl),
ppl = data_recon %>% group_by(taxon) %>% drop_na(prepectoral_length,total_length) %>% summarise(ppl=mean(prepectoral_length/total_length)) %>% pull() %>% mean(),
SVL = data_recon %>% group_by(taxon) %>% drop_na(SVL,total_length) %>% summarise(ppl=mean(SVL/total_length)) %>% pull() %>% mean(),
pvl = data_recon %>% group_by(taxon) %>% drop_na(prepelvic_length,total_length) %>% summarise(ppl=mean(prepelvic_length/total_length)) %>% pull() %>% mean()) %>%
mutate(across(where(is.numeric), ~na_if(., 0))) %>%
kable(digits=3,col.names=c("Clade",
"N spp.","N observations",
"N spp.","N observations","Mean Value",
"N spp.","N observations","Mean Value",
"N spp.","N observations","Mean Value"),
align=c("l","c","c","c","c","c","c","c","c","c","c","c"),
caption="Distribution of data in this study by higher level clade") %>%
add_header_above(c("Taxonomy"=1,"Pectoral Fin Base Length"=2,"Prepectoral Length"=3,
"Snout-Vent Length"=3,"Prepelvic Length"=3)) %>%
column_spec (c(1,3,6,9,12),border_right = T) %>%
row_spec (6,bold=T) %>%
kable_styling()
Clade | N spp. | N observations | N spp. | N observations | Mean Value | N spp. | N observations | Mean Value | N spp. | N observations | Mean Value |
---|---|---|---|---|---|---|---|---|---|---|---|
Acanthopterygii | – | – | 1137 | 428 | 0.238 | 651 | 251 | 0.489 | 933 | 363 | 0.276 |
Non-Acanthopterygian Actinopterygii | – | – | 527 | 247 | 0.189 | 283 | 131 | 0.521 | 519 | 226 | 0.412 |
Sarcopterygii | – | – | 4 | 3 | 0.221 | 1 | 1 | 0.488 | 4 | 3 | 0.491 |
Chondrichthyes | 108 | 372 | 699 | 178 | 0.207 | 280 | 124 | 0.509 | 676 | 182 | 0.487 |
Placodermi | 17 | 29 | 31 | 22 | 0.193 | 4 | 4 | 0.521 | 13 | 8 | 0.470 |
All Species | 125 | 401 | 2398 | 878 | 0.216 | 1219 | 511 | 0.502 | 2145 | 782 | 0.367 |
3.2 Prepectoral length, SVL, and prepelvic length by order
data_recon %>%
group_by(taxon) %>%
mutate(ppl=prepectoral_length/total_length,
SVL2=SVL/total_length,
pvl=prepelvic_length/total_length) %>%
summarise(n_ppl=sum(!is.na(ppl)),
n_svl=sum(!is.na(SVL2)),
n_pvl=sum(!is.na(pvl)),
ppl=mean(ppl,na.rm=T),
SVL=mean(SVL2,na.rm=T),
pvl=mean(pvl,na.rm=T),
order=unique(order),clade=unique(clade)) %>%
group_by(order) %>%
summarise(order=unique(order),clade=unique(clade),
nspec_ppl=sum(!is.na(ppl)),
n_ppl=sum(n_ppl),
nspec_SVL=sum(!is.na(SVL)),
n_SVL=sum(n_svl),
nspec_pvl=sum(!is.na(pvl)),
n_pvl=sum(n_pvl),
ppl=mean(ppl,na.rm=T),
SVL=mean(SVL,na.rm=T),
pvl=mean(pvl,na.rm=T)) %>%
select(order,clade,nspec_ppl,n_ppl,ppl,nspec_SVL,n_SVL,SVL,nspec_pvl,n_pvl,pvl) %>%
mutate(across(where(is.numeric), ~na_if(., 0))) %>%
kable(digits=3,col.names=c("Order","Clade",
"N spp.","N observations","Mean Value",
"N spp.","N observations","Mean Value",
"N spp.","N observations","Mean Value"),
align=c("l","c","c","c","c","c","c","c","c","c","c"),
caption="Distribution of data for prepectoral length, snout-vent length (SVL), and prepelvic length by order") %>%
add_header_above(c("Taxonomy"=2,"Prepectoral Length"=3,
"Snout-Vent Length"=3,"Prepelvic Length"=3)) %>%
column_spec (c(2,5,8,11),border_right = T) %>%
kable_styling()
Order | Clade | N spp. | N observations | Mean Value | N spp. | N observations | Mean Value | N spp. | N observations | Mean Value |
---|---|---|---|---|---|---|---|---|---|---|
Acanthuriformes | Actinopterygii | 6 | 15 | 0.214 | 6 | 12 | 0.365 | 6 | 13 | 0.237 |
Acipenseriformes | Actinopterygii | 5 | 6 | 0.241 | 2 | 3 | 0.628 | 7 | 12 | 0.521 |
Actinistia | Sarcopterygii | 2 | 3 | 0.250 | 1 | 1 | 0.488 | 2 | 3 | 0.441 |
Albuliformes | Actinopterygii | 3 | 9 | 0.194 | 2 | 4 | 0.604 | 3 | 9 | 0.472 |
Alepocephaliformes | Actinopterygii | 2 | 2 | 0.211 | 1 | 1 | 0.595 | 2 | 5 | 0.480 |
Amiiformes | Actinopterygii | 1 | 6 | 0.219 | 1 | 6 | 0.535 | 1 | 6 | 0.462 |
Anabantiformes | Actinopterygii | 4 | 8 | 0.308 | 1 | 1 | 0.554 | 1 | 1 | 0.381 |
Anguilliformes | Actinopterygii | 6 | 7 | 0.147 | 6 | 34 | 0.445 | – | – | – |
Arthrodira | Placodermi | 22 | 31 | 0.193 | 4 | 4 | 0.521 | 8 | 13 | 0.470 |
Atheriniformes | Actinopterygii | 7 | 16 | 0.193 | 2 | 3 | 0.427 | 7 | 13 | 0.338 |
Aulopiformes | Actinopterygii | 9 | 20 | 0.193 | 3 | 4 | 0.607 | 9 | 19 | 0.321 |
Beloniformes | Actinopterygii | 14 | 28 | 0.218 | 5 | 7 | 0.585 | 13 | 24 | 0.488 |
Beryciformes | Actinopterygii | 3 | 5 | 0.245 | 2 | 3 | 0.427 | 3 | 4 | 0.295 |
Blenniiformes | Actinopterygii | 2 | 12 | 0.181 | 2 | 7 | 0.403 | 2 | 7 | 0.129 |
Callionymiformes | Actinopterygii | 1 | 1 | 0.243 | – | – | – | 1 | 1 | 0.158 |
Carangaria incertae sedis | Actinopterygii | 18 | 51 | 0.249 | 4 | 7 | 0.555 | 14 | 33 | 0.315 |
Carangiformes | Actinopterygii | 60 | 128 | 0.212 | 34 | 66 | 0.433 | 60 | 121 | 0.230 |
Carcharhiniformes | Chondrichthyes | 87 | 372 | 0.204 | 56 | 147 | 0.479 | 86 | 354 | 0.461 |
Centrarchiformes | Actinopterygii | 11 | 23 | 0.233 | 9 | 18 | 0.463 | 11 | 23 | 0.293 |
Characiformes | Actinopterygii | 57 | 120 | 0.189 | 31 | 49 | 0.509 | 54 | 112 | 0.384 |
Chimaeriformes | Chondrichthyes | 6 | 14 | 0.190 | 6 | 8 | 0.442 | 6 | 14 | 0.467 |
Cichliformes | Actinopterygii | 3 | 3 | 0.283 | – | – | – | 3 | 3 | 0.315 |
Clupeiformes | Actinopterygii | 19 | 59 | 0.182 | 11 | 36 | 0.547 | 19 | 56 | 0.403 |
Cypriniformes | Actinopterygii | 23 | 65 | 0.196 | 14 | 24 | 0.568 | 19 | 63 | 0.402 |
Cyprinodontiformes | Actinopterygii | 1 | 7 | 0.206 | 1 | 7 | 0.482 | 1 | 7 | 0.364 |
Dipnoi | Sarcopterygii | 1 | 1 | 0.162 | – | – | – | 1 | 1 | 0.591 |
Echinorhiniformes | Chondrichthyes | 2 | 40 | 0.270 | – | – | – | 2 | 39 | 0.570 |
Elopiformes | Actinopterygii | 4 | 11 | 0.183 | 1 | 1 | 0.675 | 4 | 19 | 0.420 |
Esociformes | Actinopterygii | 5 | 14 | 0.205 | 2 | 5 | 0.653 | 5 | 15 | 0.454 |
Eupercaria incertae sedis | Actinopterygii | 28 | 54 | 0.236 | 14 | 30 | 0.493 | 20 | 44 | 0.270 |
Gadiformes | Actinopterygii | 6 | 7 | 0.190 | 2 | 2 | 0.461 | 4 | 5 | 0.175 |
Galaxiiformes | Actinopterygii | 1 | 1 | 0.166 | 1 | 1 | 0.667 | 1 | 1 | 0.465 |
Gobiiformes | Actinopterygii | 5 | 21 | 0.228 | 4 | 19 | 0.444 | 5 | 11 | 0.240 |
Gonorynchiformes | Actinopterygii | 2 | 6 | 0.181 | – | – | – | 2 | 6 | 0.513 |
Gymnotiformes | Actinopterygii | 3 | 4 | 0.114 | 2 | 2 | 0.070 | – | – | – |
Heterodontiformes | Chondrichthyes | 1 | 1 | 0.207 | – | – | – | 1 | 1 | 0.430 |
Hexanchiformes | Chondrichthyes | 6 | 38 | 0.186 | 6 | 12 | 0.483 | 6 | 36 | 0.434 |
Hiodontiformes | Actinopterygii | – | – | – | – | – | – | – | – | – |
Holocentriformes | Actinopterygii | 14 | 44 | 0.269 | 14 | 31 | 0.564 | 14 | 44 | 0.301 |
Ichthyodectiformes | Actinopterygii | 7 | 7 | 0.137 | – | – | – | 8 | 13 | 0.454 |
Istiophoriformes | Actinopterygii | 10 | 147 | 0.211 | 5 | 102 | 0.468 | 7 | 100 | 0.233 |
Kurtiformes | Actinopterygii | 5 | 9 | 0.278 | 3 | 4 | 0.471 | 4 | 7 | 0.286 |
Labriformes | Actinopterygii | 12 | 37 | 0.245 | 12 | 35 | 0.471 | 12 | 38 | 0.270 |
Lamniformes | Chondrichthyes | 14 | 79 | 0.227 | 8 | 16 | 0.526 | 14 | 69 | 0.506 |
Lampriformes | Actinopterygii | 7 | 8 | 0.196 | 4 | 4 | 0.642 | 4 | 4 | 0.410 |
Lepisosteiformes | Actinopterygii | 1 | 1 | 0.264 | – | – | – | 1 | 1 | 0.516 |
Lutjaniformes | Actinopterygii | 31 | 63 | 0.246 | 24 | 49 | 0.502 | 29 | 63 | 0.280 |
Mugiliformes | Actinopterygii | 3 | 6 | 0.195 | 3 | 4 | 0.514 | 3 | 4 | 0.284 |
Ophidiiformes | Actinopterygii | 2 | 2 | 0.251 | – | – | – | 1 | 1 | 0.128 |
Orectolobiformes | Chondrichthyes | 10 | 20 | 0.176 | 10 | 16 | 0.436 | 10 | 20 | 0.400 |
Osteoglossiformes | Actinopterygii | 10 | 13 | 0.191 | 7 | 8 | 0.591 | 8 | 11 | 0.464 |
Ovalentaria incertae sedis | Actinopterygii | 5 | 9 | 0.222 | 4 | 9 | 0.444 | 5 | 10 | 0.247 |
Pempheriformes | Actinopterygii | 5 | 9 | 0.253 | 1 | 1 | 0.454 | 4 | 6 | 0.279 |
Perciformes | Actinopterygii | 74 | 177 | 0.255 | 54 | 138 | 0.497 | 60 | 153 | 0.276 |
Percopsiformes | Actinopterygii | 1 | 5 | 0.226 | 1 | 4 | 0.486 | 1 | 6 | 0.348 |
Pleuronectiformes | Actinopterygii | 1 | 4 | 0.223 | – | – | – | 1 | 4 | 0.210 |
Pleuronectifromes | Actinopterygii | 1 | 1 | 0.214 | – | – | – | 1 | 1 | 0.162 |
Polypteriformes | Actinopterygii | 4 | 10 | 0.146 | – | – | – | 4 | 7 | 0.613 |
Priacanthiformes | Actinopterygii | 3 | 6 | 0.234 | – | – | – | 1 | 2 | 0.188 |
Rhinopristiformes | Chondrichthyes | 1 | 2 | 0.235 | 3 | 6 | 0.474 | 5 | 8 | 0.413 |
Salmoniformes | Actinopterygii | 12 | 35 | 0.188 | 6 | 18 | 0.648 | 12 | 35 | 0.472 |
Scombriformes | Actinopterygii | 52 | 159 | 0.222 | 22 | 53 | 0.548 | 42 | 122 | 0.249 |
Scorpaeniformes | Actinopterygii | 10 | 21 | 0.248 | 6 | 7 | 0.501 | 8 | 19 | 0.267 |
Siluriformes | Actinopterygii | 56 | 108 | 0.193 | 32 | 75 | 0.458 | 57 | 113 | 0.407 |
Spariformes | Actinopterygii | 19 | 48 | 0.255 | 16 | 32 | 0.482 | 19 | 47 | 0.292 |
Squaliformes | Chondrichthyes | 48 | 128 | 0.217 | 34 | 73 | 0.597 | 48 | 130 | 0.569 |
Squatiniformes | Chondrichthyes | 3 | 5 | 0.150 | 1 | 2 | 0.452 | 4 | 5 | 0.364 |
Stomiiformes | Actinopterygii | 1 | 1 | 0.200 | 1 | 1 | 0.528 | 1 | 1 | 0.456 |
Syngnathiformes | Actinopterygii | 4 | 5 | 0.269 | 1 | 4 | 0.504 | 3 | 4 | 0.465 |
Tetraodontiformes | Actinopterygii | 13 | 16 | 0.258 | 2 | 2 | 0.480 | 1 | 1 | 0.434 |
Trachichthyiformes | Actinopterygii | 1 | 2 | 0.254 | – | – | – | 1 | 2 | 0.285 |
Zeiformes | Actinopterygii | 2 | 2 | 0.240 | 1 | 1 | 0.450 | – | – | – |
3.3 Pectoral fin base data by chondrichthyan family
data_recon %>%
drop_na(pec_base) %>%
filter(clade=="Chondrichthyes") %>%
summarise(.by=taxon,count=n(),order=unique(order),family=unique(family),
pec_base=mean(pec_base/total_length)) %>%
summarise(.by=family,order=unique(order),N=n(),count=sum(count),
pec_mean=mean(pec_base),
pec_range=ifelse(N==1,NA,
paste0("(",round(min(pec_base),3),"–",
round(max(pec_base),3),")"))) %>%
mutate(across(where(is.numeric), ~na_if(., 0))) %>%
arrange(order,family) %>%
kable(col.names=c("Family","Order","N spp.","N specimens",
"Mean Proportional Pectoral Base Length (as fraction of total length)","Range of Species Averages"),
digits=c(1,1,1,1,3,3),align=c("l","c","c","c","c","c"),
caption="Distribution of shark taxa with pectoral fin base measurements by family") %>%
kable_styling()
Family | Order | N spp. | N specimens | Mean Proportional Pectoral Base Length (as fraction of total length) | Range of Species Averages |
---|---|---|---|---|---|
Carcharhinidae | Carcharhiniformes | 35 | 170 | 0.063 | (0.051–0.078) |
Hemigaleidae | Carcharhiniformes | 4 | 19 | 0.046 | (0.041–0.052) |
Pentachidae | Carcharhiniformes | 1 | 3 | 0.063 | – |
Pseudotriakidae | Carcharhiniformes | 2 | 5 | 0.048 | (0.046–0.049) |
Scyliorhinidae | Carcharhiniformes | 5 | 6 | 0.064 | (0.047–0.08) |
Sphyrnidae | Carcharhiniformes | 1 | 2 | 0.052 | – |
Triakidae | Carcharhiniformes | 8 | 24 | 0.052 | (0.04–0.074) |
Heterodontidae | Heterodontiformes | 1 | 1 | 0.110 | – |
Chlamydoselachidae | Hexanchiformes | 1 | 4 | 0.040 | – |
Hexanchidae | Hexanchiformes | 5 | 23 | 0.066 | (0.06–0.082) |
Alopiidae | Lamniformes | 2 | 3 | 0.069 | (0.065–0.073) |
Cetorhinidae | Lamniformes | 1 | 2 | 0.066 | – |
Lamnidae | Lamniformes | 4 | 15 | 0.070 | (0.062–0.075) |
Megachasmatidae | Lamniformes | 1 | 6 | 0.067 | – |
Mitsukurinidae | Lamniformes | 1 | 6 | 0.049 | – |
Odontaspidae | Lamniformes | 3 | 6 | 0.067 | (0.061–0.075) |
Pseudocarchariidae | Lamniformes | 1 | 3 | 0.054 | – |
Ginglymostomatidae | Orectolobiformes | 1 | 2 | 0.060 | – |
Rhincodontidae | Orectolobiformes | 1 | 1 | 0.078 | – |
Centrophoridae | Squaliformes | 3 | 5 | 0.069 | (0.05–0.101) |
Etmopteridae | Squaliformes | 1 | 1 | 0.040 | – |
Somniosidae | Squaliformes | 13 | 37 | 0.065 | (0.052–0.079) |
Squalidae | Squaliformes | 13 | 28 | 0.057 | (0.049–0.071) |
data_recon %>%
filter(clade=="Placodermi") %>%
drop_na(pec_base,total_length) %>%
mutate(length_as=ifelse(length_as=="total length","No","Yes"),
specimen=ifelse(specimen %in% c("Composite tuberculatus","Composite pulchellus",
"Recon (Trinajstic et al. 2013"),
"Reconstruction in Study",specimen),
taxon=str_replace(taxon,"_"," "),
body_mass=body_mass/1000,
specimen=ifelse(specimen=="AA.MEM.DS.8","AA.MEM.DS.8 (with pectoral base from PIMUZ A/I 4773)",specimen)) %>%
select(taxon,specimen,pec_base,total_length,body_mass,length_as,Reference) %>%
arrange(taxon) %>%
kable(digits=c(1,1,1,1,2,1,1),
col.names = c("Taxon","Specimen","Pectoral Fin Base","Total Length","Body Mass","Length Estimated?","Reference"),
caption = "Pectoral fin base size in arthrodires, along with either measured or estimated total length and body mass estimated using the ellipsoid model in Engelman (2023). Linear measurements in cm and body mass in kg.",
align=c("l","c","c","c","c","c","c")) %>%
column_spec (1,italic=T) %>%
kable_styling()
Taxon | Specimen | Pectoral Fin Base | Total Length | Body Mass | Length Estimated? | Reference |
---|---|---|---|---|---|---|
Amazichthys trinajsticae | AA.MEM.DS.8 (with pectoral base from PIMUZ A/I 4773) | 9.8 | 89.7 | 6.29 | No | Jobbins et al. 2022 |
Brachyosteus dietrichi | W.f. 200 | 2.5 | 29.2 | – | Yes | Stensiö 1963: plate 38 |
Camuropiscis concinnus | WAM 70.4.255 | 1.4 | 30.0 | 0.17 | Yes | Dennis and Miles 1979 |
Coccosteus cuspidatus | Recon. (M & W 1968) | 2.6 | 39.4 | 0.55 | No | Miles and Westoll 1968 |
Coccosteus cuspidatus | NMS 1893.107.27 | 2.5 | 29.6 | – | No | Present Study |
Coccosteus cuspidatus | FMNH PF 1673 | 2.8 | 37.1 | – | No | Present Study |
Coccosteus cuspidatus | ROM VP 52664 | 2.7 | 37.5 | 0.65 | No | Present Study |
Dunkleosteus terrelli | CMNH 5768 | 36.2 | 340.7 | 960.40 | Yes | Present Study |
Dunkleosteus terrelli | CMNH 7424 | 14.6 | 188.9 | 106.73 | Yes | Present Study |
Dunkleosteus terrelli | CMNH 6090 | 28.7 | 283.3 | 391.65 | Yes | Present Study |
Dunkleosteus terrelli | CMNH 7054 | 32.0 | 295.5 | 381.41 | Yes | Present Study |
Dunkleosteus terrelli | CMNH 8982 | 12.8 | 154.8 | 25.47 | Yes | Present Study; Carr et al. 2010 |
Dunkleosteus terrelli | CMNH 6194 | 16.2 | 166.3 | 54.65 | Yes | Present Study |
Dunkleosteus terrelli | CMC VP8294 | 14.5 | 157.3 | 38.83 | Yes | Present Study |
Eastmanosteus calliaspis | WAM 70.4.864 | 6.8 | 79.3 | 4.95 | Yes | Dennis-Bryan 1987 |
Enseosteus jaekeli | W.f. 128 | 5.5 | 45.8 | – | Yes | Stensiö 1959: plate 1 |
Harrytoombsia elegans | WAM P50914 | 2.2 | 37.0 | 0.46 | Yes | Miles and Dennis 1979 |
Heintzichthys gouldii | Recon. (Carr 1991) | 15.2 | 140.8 | – | Yes | Carr 1991 |
Incisoscutum ritchei | Recon. (Trinajstic et al. 2013) | 2.1 | 25.4 | 0.17 | No | Trinajstic et al. 2013 |
Incisoscutum ritchei | WAM 86.9.667 | 3.5 | 49.9 | – | Yes | Long 1994 |
Latocamurus coulthardi | WAM 86.9.699 | 1.0 | 24.0 | 0.08 | Yes | Long 1988 |
Mcnamaraspis kaprios | WAM 86.9.676 | 3.0 | 32.6 | 0.31 | Yes | Long 1995 |
Millerosteus minor | Composite of LDUCZ-V998 and NHMUK PV P16795 | 0.7 | 14.9 | – | No | Desmond 1974, Newman pers. comm. |
Millerosteus minor | FMNH PF 1089 | 0.8 | 13.7 | – | No | Present Study |
Millerosteus minor | NHMUK PV P16795 | 0.8 | 17.1 | – | No | M. J. Newman pers. comm. |
Rolfosteus canningensis | WAM P50977 | 1.8 | 29.7 | 0.13 | Yes | Dennis and Miles 1979 |
Torosteus pulchellus | Reconstruction in Study | 1.8 | 36.0 | 0.33 | Yes | Gardiner and Miles 1990 |
Torosteus tuberculatus | Reconstruction in Study | 2.6 | 40.2 | 0.59 | Yes | Gardiner and Miles 1990 |
Tubonasus lennardensis | WAM 70.4.257 | 1.5 | 36.5 | 0.19 | Yes | Dennis and Miles 1979 |
3.4 Fineness ratio by order
data_recon %>%
group_by(taxon) %>%
mutate(fineness=precaudal_length/body_depth) %>%
summarise(n_fineness=sum(!is.na(fineness)),
fineness=mean(fineness,na.rm=T),
order=unique(order),clade=unique(clade)) %>%
group_by(order) %>%
summarise(order=unique(order),clade=unique(clade),
nspec_fineness=sum(!is.na(fineness)),
n_fineness=sum(n_fineness),
fineness=mean(fineness,na.rm=T)) %>%
select(order,clade,nspec_fineness,n_fineness,fineness) %>%
mutate(across(where(is.numeric), ~na_if(., 0))) %>%
kable(digits=3,col.names=c("Order","Clade",
"N spp.","N observations","Mean Value"),
align=c("l","c","c","c","c"),
caption="Distribution of data for fineness ratio by order") %>%
kable_styling()
Order | Clade | N spp. | N observations | Mean Value |
---|---|---|---|---|
Acanthuriformes | Actinopterygii | 6 | 15 | 2.031 |
Acipenseriformes | Actinopterygii | 7 | 10 | 7.412 |
Actinistia | Sarcopterygii | 2 | 3 | 2.932 |
Albuliformes | Actinopterygii | 3 | 9 | 4.315 |
Alepocephaliformes | Actinopterygii | 2 | 5 | 5.312 |
Amiiformes | Actinopterygii | 1 | 11 | 4.793 |
Anabantiformes | Actinopterygii | 2 | 3 | 3.693 |
Anguilliformes | Actinopterygii | 3 | 3 | 11.312 |
Arthrodira | Placodermi | 18 | 26 | 4.441 |
Atheriniformes | Actinopterygii | 7 | 17 | 5.836 |
Aulopiformes | Actinopterygii | 10 | 23 | 6.714 |
Beloniformes | Actinopterygii | 14 | 27 | 8.391 |
Beryciformes | Actinopterygii | 3 | 6 | 2.243 |
Blenniiformes | Actinopterygii | 2 | 12 | 3.256 |
Callionymiformes | Actinopterygii | 1 | 1 | 4.848 |
Carangaria incertae sedis | Actinopterygii | 18 | 55 | 6.103 |
Carangiformes | Actinopterygii | 61 | 133 | 3.313 |
Carcharhiniformes | Chondrichthyes | 79 | 248 | 6.881 |
Centrarchiformes | Actinopterygii | 11 | 52 | 2.634 |
Characiformes | Actinopterygii | 54 | 114 | 2.894 |
Chimaeriformes | Chondrichthyes | 5 | 11 | 4.620 |
Cichliformes | Actinopterygii | 3 | 3 | 2.815 |
Clupeiformes | Actinopterygii | 19 | 61 | 4.212 |
Cypriniformes | Actinopterygii | 23 | 67 | 3.663 |
Cyprinodontiformes | Actinopterygii | 1 | 7 | 4.957 |
Dipnoi | Sarcopterygii | 1 | 1 | 5.411 |
Echinorhiniformes | Chondrichthyes | 2 | 6 | 6.869 |
Elopiformes | Actinopterygii | 4 | 19 | 4.456 |
Esociformes | Actinopterygii | 5 | 24 | 5.945 |
Eupercaria incertae sedis | Actinopterygii | 28 | 53 | 3.412 |
Gadiformes | Actinopterygii | 5 | 6 | 5.762 |
Galaxiiformes | Actinopterygii | 1 | 1 | 5.465 |
Gobiiformes | Actinopterygii | 6 | 23 | 4.877 |
Gonorynchiformes | Actinopterygii | 2 | 6 | 6.705 |
Gymnotiformes | Actinopterygii | – | – | – |
Heterodontiformes | Chondrichthyes | 1 | 1 | 5.089 |
Hexanchiformes | Chondrichthyes | 6 | 29 | 6.266 |
Hiodontiformes | Actinopterygii | 1 | 5 | 3.283 |
Holocentriformes | Actinopterygii | 14 | 44 | 2.696 |
Ichthyodectiformes | Actinopterygii | 8 | 11 | 5.474 |
Istiophoriformes | Actinopterygii | 10 | 119 | 5.720 |
Kurtiformes | Actinopterygii | 5 | 9 | 2.948 |
Labriformes | Actinopterygii | 12 | 39 | 3.388 |
Lamniformes | Chondrichthyes | 13 | 45 | 5.039 |
Lampriformes | Actinopterygii | 6 | 9 | 4.517 |
Lepisosteiformes | Actinopterygii | 3 | 6 | 8.868 |
Lutjaniformes | Actinopterygii | 31 | 66 | 2.705 |
Mugiliformes | Actinopterygii | 3 | 6 | 3.798 |
Ophidiiformes | Actinopterygii | – | – | – |
Orectolobiformes | Chondrichthyes | 8 | 13 | 7.666 |
Osteoglossiformes | Actinopterygii | 8 | 11 | 4.312 |
Ovalentaria incertae sedis | Actinopterygii | 6 | 11 | 2.624 |
Pempheriformes | Actinopterygii | 6 | 10 | 3.192 |
Perciformes | Actinopterygii | 76 | 205 | 3.189 |
Percopsiformes | Actinopterygii | 1 | 8 | 4.773 |
Pleuronectiformes | Actinopterygii | 1 | 4 | 2.250 |
Pleuronectifromes | Actinopterygii | – | – | – |
Polypteriformes | Actinopterygii | 4 | 10 | 8.216 |
Priacanthiformes | Actinopterygii | 3 | 6 | 2.416 |
Rhinopristiformes | Chondrichthyes | 1 | 3 | 5.658 |
Salmoniformes | Actinopterygii | 12 | 35 | 4.470 |
Scombriformes | Actinopterygii | 54 | 209 | 4.437 |
Scorpaeniformes | Actinopterygii | 10 | 19 | 2.749 |
Siluriformes | Actinopterygii | 56 | 112 | 5.006 |
Spariformes | Actinopterygii | 19 | 49 | 2.571 |
Squaliformes | Chondrichthyes | 47 | 116 | 6.403 |
Squatiniformes | Chondrichthyes | – | – | – |
Stomiiformes | Actinopterygii | 1 | 1 | 5.811 |
Syngnathiformes | Actinopterygii | 4 | 5 | 9.218 |
Tetraodontiformes | Actinopterygii | 11 | 13 | 3.145 |
Trachichthyiformes | Actinopterygii | 1 | 2 | 2.487 |
Zeiformes | Actinopterygii | 2 | 2 | 2.224 |
3.5 Caudal peduncle height by order
data_recon %>%
group_by(taxon) %>%
mutate(caudal_peduncle=peduncle_height/total_length) %>%
summarise(n_cpl=sum(!is.na(caudal_peduncle)),
cpl=mean(caudal_peduncle,na.rm=T),
order=unique(order),clade=unique(clade)) %>%
group_by(order) %>%
summarise(order=unique(order),clade=unique(clade),
nspec_cpl=sum(!is.na(cpl)),
n_cpl=sum(n_cpl),
cpl=mean(cpl,na.rm=T)) %>%
select(order,clade,nspec_cpl,n_cpl,cpl) %>%
mutate(across(where(is.numeric), ~na_if(., 0))) %>%
kable(digits=3,col.names=c("Order","Clade",
"N spp.","N observations","Mean Value"),
align=c("l","c","c","c","c"),
caption="Distribution of data for caudal peduncle height by order") %>%
kable_styling()
Order | Clade | N spp. | N observations | Mean Value |
---|---|---|---|---|
Acanthuriformes | Actinopterygii | 6 | 14 | 0.067 |
Acipenseriformes | Actinopterygii | 7 | 12 | 0.027 |
Actinistia | Sarcopterygii | 2 | 3 | 0.088 |
Albuliformes | Actinopterygii | 3 | 9 | 0.061 |
Alepocephaliformes | Actinopterygii | 2 | 5 | 0.074 |
Amiiformes | Actinopterygii | 1 | 11 | 0.108 |
Anabantiformes | Actinopterygii | 1 | 1 | 0.115 |
Anguilliformes | Actinopterygii | 2 | 2 | 0.042 |
Arthrodira | Placodermi | 4 | 4 | 0.072 |
Atheriniformes | Actinopterygii | 7 | 17 | 0.065 |
Aulopiformes | Actinopterygii | 9 | 22 | 0.056 |
Beloniformes | Actinopterygii | 14 | 25 | 0.043 |
Beryciformes | Actinopterygii | 3 | 6 | 0.090 |
Blenniiformes | Actinopterygii | 2 | 12 | 0.084 |
Callionymiformes | Actinopterygii | 1 | 1 | 0.066 |
Carangaria incertae sedis | Actinopterygii | 17 | 48 | 0.066 |
Carangiformes | Actinopterygii | 58 | 129 | 0.039 |
Carcharhiniformes | Chondrichthyes | 72 | 171 | 0.036 |
Centrarchiformes | Actinopterygii | 11 | 52 | 0.095 |
Characiformes | Actinopterygii | 56 | 116 | 0.087 |
Chimaeriformes | Chondrichthyes | 3 | 4 | 0.018 |
Cichliformes | Actinopterygii | 3 | 3 | 0.099 |
Clupeiformes | Actinopterygii | 19 | 60 | 0.072 |
Cypriniformes | Actinopterygii | 20 | 64 | 0.097 |
Cyprinodontiformes | Actinopterygii | 1 | 7 | 0.094 |
Dipnoi | Sarcopterygii | 1 | 1 | 0.145 |
Echinorhiniformes | Chondrichthyes | 2 | 4 | 0.066 |
Elopiformes | Actinopterygii | 4 | 18 | 0.075 |
Esociformes | Actinopterygii | 5 | 24 | 0.066 |
Eupercaria incertae sedis | Actinopterygii | 26 | 52 | 0.083 |
Gadiformes | Actinopterygii | 4 | 5 | 0.040 |
Galaxiiformes | Actinopterygii | – | – | – |
Gobiiformes | Actinopterygii | 6 | 23 | 0.098 |
Gonorynchiformes | Actinopterygii | 2 | 6 | 0.057 |
Gymnotiformes | Actinopterygii | – | – | – |
Heterodontiformes | Chondrichthyes | 1 | 1 | 0.039 |
Hexanchiformes | Chondrichthyes | 6 | 17 | 0.041 |
Hiodontiformes | Actinopterygii | 1 | 5 | 0.085 |
Holocentriformes | Actinopterygii | 14 | 44 | 0.072 |
Ichthyodectiformes | Actinopterygii | 7 | 7 | 0.055 |
Istiophoriformes | Actinopterygii | 10 | 168 | 0.033 |
Kurtiformes | Actinopterygii | 5 | 9 | 0.119 |
Labriformes | Actinopterygii | 12 | 39 | 0.118 |
Lamniformes | Chondrichthyes | 12 | 38 | 0.043 |
Lampriformes | Actinopterygii | 4 | 6 | 0.060 |
Lepisosteiformes | Actinopterygii | 3 | 6 | 0.052 |
Lutjaniformes | Actinopterygii | 31 | 65 | 0.094 |
Mugiliformes | Actinopterygii | 3 | 6 | 0.094 |
Ophidiiformes | Actinopterygii | – | – | – |
Orectolobiformes | Chondrichthyes | 7 | 11 | 0.034 |
Osteoglossiformes | Actinopterygii | 8 | 11 | 0.062 |
Ovalentaria incertae sedis | Actinopterygii | 6 | 11 | 0.113 |
Pempheriformes | Actinopterygii | 6 | 10 | 0.084 |
Perciformes | Actinopterygii | 75 | 203 | 0.094 |
Percopsiformes | Actinopterygii | 1 | 8 | 0.061 |
Pleuronectiformes | Actinopterygii | 1 | 4 | 0.091 |
Pleuronectifromes | Actinopterygii | 1 | 1 | 0.106 |
Polypteriformes | Actinopterygii | 4 | 7 | 0.053 |
Priacanthiformes | Actinopterygii | 3 | 6 | 0.071 |
Rhinopristiformes | Chondrichthyes | 2 | 4 | 0.017 |
Salmoniformes | Actinopterygii | 11 | 28 | 0.081 |
Scombriformes | Actinopterygii | 49 | 165 | 0.039 |
Scorpaeniformes | Actinopterygii | 7 | 15 | 0.092 |
Siluriformes | Actinopterygii | 51 | 100 | 0.076 |
Spariformes | Actinopterygii | 19 | 48 | 0.090 |
Squaliformes | Chondrichthyes | 38 | 84 | 0.031 |
Squatiniformes | Chondrichthyes | 3 | 3 | 0.023 |
Stomiiformes | Actinopterygii | 1 | 1 | 0.056 |
Syngnathiformes | Actinopterygii | 3 | 7 | 0.059 |
Tetraodontiformes | Actinopterygii | 9 | 10 | 0.060 |
Trachichthyiformes | Actinopterygii | 1 | 2 | 0.101 |
Zeiformes | Actinopterygii | 2 | 2 | 0.047 |
4 Analyses
4.1 Fineness Ratio
fineness<-data_recon %>%
drop_na(precaudal_length,body_depth) %>%
mutate(fineness=precaudal_length/body_depth,
order2=ifelse(clade=="Placodermi","Other Arthrodira",order))%>%
mutate(order2=ifelse(genus=="Dunkleosteus","*Dunkleosteus*",order2),
order2=ifelse(genus=="Coccosteus","*Coccosteus*",order2),
order2=ifelse(genus=="Incisoscutum","*Incisoscutum*",order2),
order2=ifelse(genus=="Amazichthys","*Amazichthys*",order2),
order2=ifelse(family=="Camuropiscidae","Camuropiscidae",order2),
order2=ifelse(order %in% c("Scombriformes","Lampriformes",
"Lamniformes","Centrarchiformes",
"Carangiformes",
"Carangaria incertae sedis","Perciformes",
"Eupercaria incertae sedis",
"Istiophoriformes","Characiformes"),family,order2)) %>%
mutate(order2=ifelse(family=="Centrarchidae" & genus!="Micropterus","Other Centrarchidae",order2),
order2=ifelse(genus %in% c("Thunnus",
"Allothunnus",
"Auxis",
"Euthynnus",
"Katsuwonus",
"Sarda","Orcynopsis","Cybiosarda","Gymnosarda"),
"Thunnini + Sardini",order2),
order2=ifelse(genus=="Gasterochisma","*Gasterochisma*",order2)) %>%
mutate(order2=ifelse(genus=="Micropterus","*Micropterus*",order2),
order2=ifelse(order2=="Scombridae","Other Scombridae",order2)) %>%
mutate(higher_group=factor(higher_group,levels=c("Petromyzontiformes","Arthrodira","Chondrichthyes","Sarcopterygii","Basal Actinopterygii","Basal Teleostei","Otocephala","Stem Euteleostei","Acanthopterygii")))%>%
arrange(higher_group,order,family,taxon)%>%
select(taxon,fineness,order2,everything())
level_info <- fineness %>%
add_row(higher_group="Arthrodira",order="Arthrodira",
family="Dunkleosteidae",genus="Dunkleosteus",
order2="*Dunkleosteus* (upper PE)") %>%
mutate(higher_group=factor(higher_group,levels=c("Petromyzontiformes","Arthrodira","Chondrichthyes","Sarcopterygii","Basal Actinopterygii","Basal Teleostei","Otocephala","Stem Euteleostei","Acanthopterygii")))%>%
arrange(higher_group,order,family,genus) %>%
pull(order2) %>%
unique()
fineness_2<-bind_rows(fineness %>%
filter(clade == "Placodermi") %>%
drop_na(fineness),
fineness %>%
filter(genus == "Dunkleosteus") %>%
mutate(precaudal_length=precaudal_length*1.1240,
order2="*Dunkleosteus* (upper PE)") %>%
mutate(fineness=precaudal_length/body_depth) %>%
drop_na(fineness),
fineness %>%
filter(genus!="Placodermi"|is.na(order2)) %>%
group_by(taxon) %>%
drop_na(fineness) %>%
summarize(across(where(is.numeric),mean),
higher_group=unique(higher_group),order2=unique(order2),
order=unique(order),
taxon=unique(taxon),genus=unique(genus),species=unique(species),
clade=unique(clade,na.rm=F),shape=unique(shape))) %>%
mutate(order2=factor(order2,ordered=T,levels=rev(level_info)))
fineness_2 %>%
ggplot(aes(y=order2,x=fineness))+
annotate("rect", xmin=3, xmax=7, ymin=-Inf, ymax=Inf, alpha=0.15) +
geom_vline(xintercept=c(3,7),linetype="dashed")+
geom_vline(xintercept=4.6)+
geom_point(aes(y=order2,x=fineness),color=NA) +
geom_vline(data=. %>% filter(clade!="Placodermi"),aes(xintercept=mean(fineness)),color="red") +
geom_violin(data=. %>% filter(clade!="Placodermi"),scale="width",aes(fill=clade),show.legend = F)+
geom_boxplot(data=. %>% filter(clade!="Placodermi"),width=0.3)+
geom_star(data= . %>% filter(order2=="*Dunkleosteus* (upper PE)"|
Reference=="Miles and Westoll 1968"),
alpha=0.5,fill="white",size=1.5) +
geom_star(data= . %>% filter(clade=="Placodermi",
Reference!="Miles and Westoll 1968",
order2!="*Dunkleosteus* (upper PE)"),
fill="white",size=1.5) +
labs(y=element_blank(),x="Fineness Ratio (*f*)")+
theme(axis.text.y = element_markdown(),
axis.title.x = element_markdown())
Figure 4.1: Fineness ratios in eugnathostomes, showing the distinctly below-average fineness ratios for arthrodires compared to other clades. “Other Arthrodires” mostly represent taxa with estimated lengths via OOL, whereas Coccosteus, Incisoscutum, and Amazichthys are based on relatively complete material. Data are reported as individual observations for arthrodires and species averages for all other taxa to display individual variation within Arthrodira. Shaded area represent “typical” fineness ratios for fishes according to Alexander (1967), representing an f of 3.5 to 7, with the black line representing hypothetical ideal hydrodynamic f of 4.6. Red line represents the mean fineness ratio among all species. Faded stars represent the outdated reconstruction of Miles and Westoll (1968) or showing the hypothetical position of a longer Dunkleosteus at the upper end of the confidence intervals of Engelman (2023).
Eubrachythoracid arthrodires generally have relatively low fineness ratios within the range of variation seen in fishes, especially if not counting discoid taxa. The only eubrachythoracid arthrodires to reliably have above average fineness ratios are the camuropiscids, which are highly tubular species with pointed rostra (Dennis and Miles 1979) that have been considered tachynektonic swimmers (Trinajstic et al. 2022).
One of the few other arthrodires that shows a fineness ratio close to the average for fishes is Torosteus pulchellus. However the holotype of T. pulchellus is very small in size and may represent a juvenile of T. tuberculatus, similar to what has happened with Gogopiscis and Compagopiscis (Trinajstic and Hazelton 2007), in which case it might be expected to have a shallower trunk (see Trinajstic and Hazelton 2007 and main manuscript).
For Coccosteus the specimen ROM VP 52667, which is considered the most reliably measured specimen here, has a fineness ratio of 3.62. However even the famous Miles and Westoll (1968) reconstruction only has an f around 4, despite having a torso that is much too long relative to the head and body armor (see main manuscript), indicating the low fineness ratio here is unlikely to be the result of incorrect reconstruction.
For Incisoscutum the reconstruction in Trinajstic (2013) has a fineness ratio of ~3.9. , The proportions of this reconstruction agree very well with actual specimens of Incisoscutum like NHMUK PV P 50934, suggesting this value is reasonable. However, the figure in Trinajstic (2013) has its head raised and thus extending anteroposteriorly slightly. Rotating the head back into a neutral position would produce a fineness ratio of about 3.8. The holotype of Incisoscutum (“Gogosteus”) sarahae (the other data point for Incisoscutum) has an unusually high fineness ratio of 4.94. The author has been unable to determine why this is, but suspects this is due to measurement error.
Dunkleosteus has a very low fineness ratio among fishes, even lower than other arthrodires due to its deep trunk. Larger individuals have fineness ratios close to 3.5, whereas juveniles have narrower trunks and slightly higher fineness ratios. Even if taking the extreme upper bounds of the range of possible body lengths (based on %PE) reported by Engelman (2023), the fineness ratio is still below average. The three specimens approaching the ideal value of 4.6 in the above graph are all juvenile specimens with narrower trunks. The values calculated for Dunkleosteus are not out of the question for fusiform fishes, being comparable to serranids and Latimeria, slightly lower than bramids (e.g., Taractes), and somewhat similar to (if a bit lower than) thunnins. Some of this may be because the arthrodire body plan is short and stocky in general and thus Dunkleosteus represents a more extreme version of this, this can be seen in how taxa like lamnids and thunnins show a similar pattern of having low fineness ratios relative to their non-thunniform relatives, despite the precise f values in both groups being different. Another possibility may be this is affected by the shorter snouts of arthrodires relative to other eugnathostomes (Engelman 2023). Preorbital length does affect fineness ratio, and the short, blunt snouts of arthrodires would be expected to negatively influence fineness ratio towards lower values.
rbind(fineness_2 %>%
drop_na(body_depth,precaudal_length) %>%
filter(clade=="Chondrichthyes",
!(order %in% c("Chimaeriformes","Rhinopristiformes"))) %>%
mutate(f=precaudal_length/body_depth) %>%
summarise(f=mean(f),clade=unique(clade),.by=taxon) %>%
summarise(mean=mean(f),median=median(f),min=min(f),max=max(f),n=n()),
fineness_2 %>%
filter(order=="Lamniformes") %>%
drop_na(body_depth,precaudal_length) %>%
mutate(f=precaudal_length/body_depth) %>%
summarise(f=mean(f),clade=unique(clade),.by=taxon) %>%
summarise(mean=mean(f),median=median(f),min=min(f),max=max(f),n=n()),
fineness_2 %>%
filter(order=="Carcharhiniformes") %>%
drop_na(body_depth,precaudal_length) %>%
mutate(f=precaudal_length/body_depth) %>%
summarise(f=mean(f),clade=unique(clade),.by=taxon) %>%
summarise(mean=mean(f),median=median(f),min=min(f),max=max(f),n=n()),
fineness_2 %>%
drop_na(body_depth,precaudal_length) %>%
mutate(f=precaudal_length/body_depth) %>%
summarise(f=mean(f),clade=unique(clade),.by=taxon) %>%
summarise(mean=mean(f),median=median(f),min=min(f),max=max(f),n=n()),
fineness_2 %>%
filter(shape=="fusiform") %>%
drop_na(body_depth,precaudal_length) %>%
mutate(f=precaudal_length/body_depth) %>%
summarise(f=mean(f),clade=unique(clade),.by=taxon) %>%
summarise(mean=mean(f),median=median(f),min=min(f),max=max(f),n=n()),
fineness_2 %>%
filter(order2=="Other Scombridae") %>%
drop_na(body_depth,precaudal_length) %>%
mutate(f=precaudal_length/body_depth) %>%
summarise(f=mean(f),clade=unique(clade),.by=taxon) %>%
summarise(mean=mean(f),median=median(f),min=min(f),max=max(f),n=n()),
fineness_2 %>%
filter(order2 %in% c("Thunnini + Sardini","Gasterochisma")) %>%
drop_na(body_depth,precaudal_length) %>%
mutate(f=precaudal_length/body_depth) %>%
summarise(f=mean(f),clade=unique(clade),.by=taxon) %>%
summarise(mean=mean(f),median=median(f),min=min(f),max=max(f),n=n()),
fineness_2 %>%
drop_na(body_depth,precaudal_length) %>%
filter(clade=="Placodermi",family!="Camuropiscidae") %>%
mutate(f=precaudal_length/body_depth) %>%
summarise(f=mean(f),clade=unique(clade),.by=taxon) %>%
summarise(mean=mean(f),median=median(f),min=min(f),max=max(f),n=n()),
fineness_2 %>%
drop_na(body_depth,precaudal_length) %>%
filter(family=="Camuropiscidae") %>%
mutate(f=precaudal_length/body_depth) %>%
summarise(f=mean(f),clade=unique(clade),.by=taxon) %>%
summarise(mean=mean(f),median=median(f),min=min(f),max=max(f),n=n())
) %>%
add_column(name=c("Elasmobranchs","Lamnidae","Carcharhiniformes","All Fishes","All Fusiform Fishes","Other Scombridae","Thunnini, Sardini, and Gasterochisma","Non-Camuropiscid Arthrodires","Camuropiscidae")) %>%
column_to_rownames("name") %>%
kable(digits=2,align="c",caption="Summary statistics for fineness ratio (<i>f</i>) for various groups of interest, as species averages",
col.names = c("Mean","Median","Min","Max","N")) %>%
kable_styling()
Mean | Median | Min | Max | N | |
---|---|---|---|---|---|
Elasmobranchs | 6.49 | 6.19 | 3.46 | 14.76 | 156 |
Lamnidae | 4.93 | 4.93 | 3.84 | 6.50 | 13 |
Carcharhiniformes | 6.78 | 6.37 | 4.31 | 12.42 | 79 |
All Fishes | 4.49 | 3.95 | 1.33 | 18.07 | 853 |
All Fusiform Fishes | 4.18 | 3.85 | 1.74 | 9.73 | 615 |
Other Scombridae | 4.89 | 4.67 | 3.42 | 6.65 | 13 |
Thunnini, Sardini, and Gasterochisma | 3.73 | 3.86 | 2.92 | 4.45 | 19 |
Non-Camuropiscid Arthrodires | 3.79 | 3.83 | 3.13 | 4.54 | 14 |
Camuropiscidae | 6.78 | 6.77 | 5.54 | 8.05 | 4 |
4.2 Head-body proportions in Ichthyodectiformes
rbind(
data_recon %>%
drop_na(total_length,head_length) %>%
filter(order=="Ichthyodectiformes") %>%
group_by(taxon) %>%
summarise(head_length=mean(head_length/total_length)) %>%
ungroup() %>%
summarise_at(vars(head_length),
list(min=min, Q1=~quantile(., probs = 0.025),
mean=mean,median=median, Q3=~quantile(., probs = 0.975),
max=max,n=length,sd=sd)),
data_recon %>%
drop_na(total_length,head_length) %>%
filter(shape!="anguilliform",
length_as=="total length",
clade!="Placodermi",
order!="Ichthyodectiformes") %>%
group_by(taxon) %>%
summarise(head_length=mean(head_length/total_length)) %>%
ungroup() %>%
summarise_at(vars(head_length),
list(min=min, Q1=~quantile(., probs = 0.025),
mean=mean,median=median, Q3=~quantile(., probs = 0.975),
max=max,n=length,sd=sd)),
data_recon %>%
drop_na(total_length,head_length) %>%
filter(shape=="anguilliform",
length_as=="total length") %>%
group_by(taxon) %>%
summarise(head_length=mean(head_length/total_length)) %>%
ungroup() %>%
summarise_at(vars(head_length),
list(min=min, Q1=~quantile(., probs = 0.025),
mean=mean,median=median, Q3=~quantile(., probs = 0.975),
max=max,n=length,sd=sd)),
data_recon %>%
drop_na(total_length,head_length) %>%
filter(clade=="Placodermi",
length_as=="total length") %>%
group_by(taxon) %>%
summarise(head_length=mean(head_length/total_length)) %>%
ungroup() %>%
summarise_at(vars(head_length),
list(min=min, Q1=~quantile(., probs = 0.025),
mean=mean,median=median, Q3=~quantile(., probs = 0.975),
max=max,n=length,sd=sd)),
data_recon %>%
drop_na(total_length,head_length) %>%
filter(clade=="Placodermi") %>%
group_by(taxon) %>%
summarise(head_length=mean(head_length/total_length)) %>%
ungroup() %>%
summarise_at(vars(head_length),
list(min=min, Q1=~quantile(., probs = 0.025),
mean=mean,median=median, Q3=~quantile(., probs = 0.975),
max=max,n=length,sd=sd))
) %>%
add_column(Sample=c("Ichthyodectiformes","Extant non-anguilliform fishes","Anguilliform fishes","Arthrodira","Arthrodira (including estimated lengths)")) %>%
mutate(n=as.numeric(n),percentile=paste0("(",round(Q1,3),"–",round(Q3,3),")"),
confint=paste0("(",round(mean-1.96*(sd/sqrt(n)),3),"–",round(mean+1.96*(sd/sqrt(n)),3),")")) %>%
select(Sample,n,min,mean,median,max,sd,percentile,confint) %>%
kable(digits=c(1,1,3,3,3,3,4,1,1),align=c("l","c","c","c","c","c","c","c","c"),
col.names = c("Sample","N","Minimum","Mean","Median","Maximum","Standard Dev.","95% Quantile","95% Confidence Interval"),
caption="Comparison of head-total length proportions in Ichthyodectiformes compared to other fishes") %>%
kable_styling()
Sample | N | Minimum | Mean | Median | Maximum | Standard Dev. | 95% Quantile | 95% Confidence Interval |
---|---|---|---|---|---|---|---|---|
Ichthyodectiformes | 8 | 0.138 | 0.147 | 0.145 | 0.167 | 0.0089 | (0.138–0.164) | (0.141–0.153) |
Extant non-anguilliform fishes | 853 | 0.123 | 0.230 | 0.226 | 0.383 | 0.0398 | (0.158–0.312) | (0.227–0.232) |
Anguilliform fishes | 25 | 0.044 | 0.143 | 0.139 | 0.274 | 0.0485 | (0.053–0.227) | (0.124–0.162) |
Arthrodira | 9 | 0.151 | 0.198 | 0.199 | 0.242 | 0.0319 | (0.153–0.24) | (0.177–0.219) |
Arthrodira (including estimated lengths) | 24 | 0.151 | 0.189 | 0.181 | 0.247 | 0.0265 | (0.156–0.244) | (0.178–0.2) |
Unsurprisingly, ichthyodectiforms have a relatively small head among fishes. What is perhaps more surprising is how extreme their proportions are, being outside the 95% quantile of all examined living fishes and their heads proportionally smaller than even most taxa with elongate trunks (e.g., Amazichthys, Scomberomorus, Coryphaena) with the exception of Cheirocentrus, Alepisaurus, Icosteus, and Scomberoides lysan.
However, Ichthyodectiformes are also consistent in their extreme head-trunk proportions. There is little variation in head-trunk proportions within the group and little evidence of allometry. This suggests Ichthyodectiformes have circumvented the otherwise fairly restrictive constraints on head-trunk proportions in fishes but their proportions subsequently stabilized around a new local optimum. The hyper-elongate bodies of Ichthyodectiformes should be regarded an apomorphy that characterizes the clade (or a node within the clade, like Ichthyodectoidei), similar to what has been proposed for Lampriformes (Engelman 2023). Such extreme proportions should be considered unique to Ichthyodectiformes and are unlikely to be present in other fishes unless strong evidence for a hyper-elongate trunk in those taxa is present.
Arthrodires generally do not show the extreme trunk elongation seen in ichthyodectiforms (which are significantly more elongate-bodied than even Amazichthys), suggesting such proportions are unlikely to be present in Dunkleosteus. A Xiphactinus-like body plan for Dunkleosteus would also require violating relationships that are otherwise consistent within Arthrodira. These include pelvic girdle position, the correlation of the end of the ventral shield with the location of the pelvic girdle and vent/end of the visceral cavity, and the scaling of ventral shield size relative to total length (see manuscript). There is no evidence that Dunkleosteus was an exception in these regards, and indeed CMC VP8294 suggests an arrangement similar to other arthrodires. Ichthyodectiformes notably do not differ from other fishes in the position of their pelvic fin and vent relative to total length (see below), suggesting even though they have a hyper-elongate trunk their body plan still follows some of the general proportional patterns in fishes.
This is to be expected. Even highly constrained morphological or allometric relationships occasionally show outliers, which are expected to be phylogenetically clustered around nodes where novel mutations have allowed circumvention of pre-existing morphological or developmental constraints (Werdelin 1987, Schwenk 1995, Wagner and Schwenk 2000). Other proportions in ichthyodectiformes (such as prepelvic length, see below) are consistent with other fishes. The consistency in anteroposterior head dimensions, pectoral/pelvic fin positions, and ventral shield length in arthrodires (including Dunkleosteus) suggest that Dunkleosteus did not exhibit a hyper-elongate body plan.
Thus, the hyper-elongate bodies of ichthyodectiforms do not invalidate conclusions of a shorter, stockier body plan for Dunkleosteus (as some have proposed in the wake of Engelman 2023), and treating the clearly autapomorphic proportions of one fish group as a suitable analogue for reconstructing the proportions other fishes in the absence of additional morphological evidence suggesting they are reasonable analogues is not tenable.
4.3 Snout-Vent Length (SVL)
4.3.1 Histogram of SVL Proportions
p1_svl <- ggplot(rhizo, aes(x, y)) +
geom_polygon(fill = "darkgrey",color="black", alpha = 0.5) +
geom_line(data=data.frame(x=c(1,1),y=c(0.2471672000,-0.03)))+
geom_line(data=data.frame(x=c(0,0),y=c(0.1627831000,-0.03)))+
geom_line(data=data.frame(x=c(0,0.502,0.502),
y=c(0.055,0.055,0.12)),
linewidth=1.5,color="steelblue")+
coord_cartesian(ylim=c(0,0.33))+
annotate("text",label="snout-vent length",x=0.502,y=0.035,hjust=0.5)+
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank(),
axis.line.y = element_blank(),
axis.line.x = element_blank())+
theme_void()
p2_svl <- data_recon %>%
drop_na(SVL,total_length) %>%
summarise(.by=taxon,genus=unique(genus),SVL=mean(SVL),total_length=mean(total_length),
shape=unique(shape),clade=unique(clade)) %>%
ggplot(.,aes(SVL/total_length)) +
geom_text(data=. %>% filter(genus %in% c("Electrophorus","Lophotis")) %>%
group_by(genus) %>% summarise(genus=unique(genus),SVL=mean(SVL),
total_length=mean(total_length)),
aes(label=genus,x=SVL/total_length),y=c(3,2),fontface=3,angle=90,hjust="left")+
geom_vline(xintercept = 0) +
geom_vline(xintercept = 1) +
geom_histogram(aes(fill=clade),binwidth=0.01)+
geom_vline(aes(xintercept = mean(SVL/total_length)),linetype="dashed") +
coord_cartesian(xlim=c(0,1))+
labs(x="Snout-Vent Length/Total Length",y="# of Species",fill="Clade")+
theme(legend.position=c(0.8,0.75))
p1_svl / p2_svl + plot_layout(heights = 1:2) & theme(plot.margin = margin(0, 20, 0, 0))
Figure 4.2: Histogram of SVL as a percentage of total length across gnathostome taxa
Based on this, snout-vent length is approximately 50-60% of total length in most fishes. The two arthrodires considered, Coccosteus and Incisoscutum, have proportional SVLs close to the mean for all examined fishes.
A third specimen with preserved claspers, referred to Dickosteus threiplandi (NHMUK PV P 49663) has an estimated SVL of 55% preserved length. However, this specimen is highly distorted as preserved and may be missing some of the tail. Thus, this proportion may be an overestimate, especially given Dickosteus is considered a close relative of Coccosteus (both in Coccosteidae).
Assuming the vent of Amazichthys trinajsticae (AA.MEM.DS.8) was located near the posterior level of the pelvic girdle, this would mean its SVL represents ~55% of total length. This resembles what is seen in some other pelagic fishes (Scombridae, Lamnidae), where the abdomen is shortened and the vent ends up at a slightly more posterior position.
Arthrodires seem to show similar vent positions and patterns of variation in this feature to eugnathostomes. The inferred more posterior vent of Amazichthys does not invalidate , because it would actually imply smaller lengths. Assuming SVL/total length proportions similar to Amazichthys would result in lengths of only ~3 m for CMNH 5768 and 3.6 m for the largest individuals of Dunkleosteus, which are clearly unreasonable given the extreme tapering it would require of the caudal peduncle relative to trunk height (see Engelman 2023 for more discussion on why shorter lengths are unlikely). SVL in Dunkleosteus would have to be significantly smaller relative to total length for larger size estimates than presented here to be justified.
summary(lm(log(SVL)~log(total_length),
data_recon %>%
drop_na(SVL,total_length) %>%
group_by(taxon) %>%
summarise(across(where(is.numeric),mean))))
##
## Call:
## lm(formula = log(SVL) ~ log(total_length), data = data_recon %>%
## drop_na(SVL, total_length) %>% group_by(taxon) %>% summarise(across(where(is.numeric),
## mean)))
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.01602 -0.08774 0.00941 0.10568 0.59587
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.765596 0.035626 -21.49 <2e-16 ***
## log(total_length) 1.017057 0.009579 106.18 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1983 on 509 degrees of freedom
## Multiple R-squared: 0.9568, Adjusted R-squared: 0.9567
## F-statistic: 1.127e+04 on 1 and 509 DF, p-value: < 2.2e-16
The allometry regression shows SVL is nearly isometric relative to total length.
4.3.2 Comparing chondrichthyans and osteichthyans
Given this data spans a very broad selection of fishes, it is necessary to demonstrate this proportion is consistent across fishes and does not show differences associated with clade-specific body plans.
4.3.2.1 Box-and-Whisker Plot
data_recon %>%
drop_na(SVL) %>%
summarise(SVL=mean(SVL),total_length=mean(total_length),shape=unique(shape),
clade=unique(clade),habitat=unique(habitat),.by=taxon) %>%
ggplot(.,aes(x=SVL/total_length,y=clade)) +
geom_vline(data=. %>% group_by(clade) %>%
summarise(proportion=mean(SVL/total_length),habitat=unique(shape)),
aes(xintercept=proportion,color=clade),show.legend=F)+
geom_point(data=. %>% filter(clade=="Sarcopterygii"),shape=21,aes(fill=clade),
size=3,show.legend=F)+
geom_point(data=. %>% filter(clade=="Placodermi"),shape=21,aes(fill=clade),
size=3,show.legend=F)+
geom_violin(data=. %>% filter(!clade %in% c("Sarcopterygii","Placodermi")),
aes(fill=clade),scale="width",show.legend=F)+
geom_boxplot(data=. %>% filter(!clade %in% c("Sarcopterygii","Placodermi")),
width=0.25)+
coord_cartesian(xlim=c(0,1))+
labs(x="Snout-Vent Length/Total Length",y="Body Shape",fill="Body Shape")
## `summarise()` has grouped output by 'clade'. You can override using the
## `.groups` argument.
Figure 4.3: Box-and-Whisker plot of SVL/total length in gnathostomes by higher level clade
4.3.2.2 Mann-Whitney U Test between Chondrichthyans and Osteichthyans
Note: a two-sample Wilcoxon Rank Sum test is the same thing as a Mann-Whitney U test.
wilcox.test(
data_recon %>% filter(clade=="Chondrichthyes") %>%
drop_na(SVL) %>%
mutate(proportion=SVL/total_length) %>%
group_by(taxon) %>%
summarise(proportion=mean(proportion)) %>%
pull(proportion),
data_recon %>% filter(clade %in% c("Sarcopterygii","Actinopterygii")) %>%
drop_na(SVL) %>%
mutate(proportion=SVL/total_length) %>%
group_by(taxon) %>%
summarise(proportion=mean(proportion)) %>%
pull(proportion))
##
## Wilcoxon rank sum test with continuity correction
##
## data: data_recon %>% filter(clade == "Chondrichthyes") %>% drop_na(SVL) %>% mutate(proportion = SVL/total_length) %>% group_by(taxon) %>% summarise(proportion = mean(proportion)) %>% pull(proportion) and data_recon %>% filter(clade %in% c("Sarcopterygii", "Actinopterygii")) %>% drop_na(SVL) %>% mutate(proportion = SVL/total_length) %>% group_by(taxon) %>% summarise(proportion = mean(proportion)) %>% pull(proportion)
## W = 24522, p-value = 0.5538
## alternative hypothesis: true location shift is not equal to 0
Based on the Mann-Whitney U test, there is no significant difference in vent position relative to total length in chondrichthyans and osteichthyans. Sample sizes are too small to directly compare arthrodires to these other groups, but based on the available data they resemble both of these groups in vent position. Vent position in general seems to be consistent across gnathostomes.
Some sarcopterygians have a more posterior position of the pelvic fins suggesting the vent may more posteriorly positioned in these forms (e.g., Osteolepiformes). However, this appears to be a derived condition given the vent in coelacanths is in a similar position to chondrichthyans and actinopterygians (Lund and Lund 1984, Millot et al. 1978, Saruwatari et al. 2019).
4.3.2.3 Position of Vent Relative to Pelvic and Anal Fins
level_info <- data_recon %>%
mutate(higher_group=factor(higher_group,ordered=T,levels=c("Arthrodira","Chondrichthyes",
"Sarcopterygii","Basal Actinopterygii","Basal Teleostei",
"Otocephala","Stem Euteleostei","Acanthopterygii"))) %>%
drop_na(higher_group,order) %>%
arrange(higher_group, order) %>%
pull(order) %>%
unique()
data_recon %>%
drop_na(prepelvic_length,SVL,preanal_length) %>%
group_by(taxon) %>%
summarise(across(where(is.numeric),mean),
order=unique(order),
higher_group=unique(higher_group)) %>%
mutate(venter=preanal_length-prepelvic_length,
order2=factor(order,levels=rev(level_info))) %>%
ggplot(.,aes(x=((SVL-prepelvic_length)/venter),y=order2)) +
labs(x="Position of Vent as a Percent of Prepelvic-Preanal Space",
y="Order") +
geom_vline(aes(xintercept=0)) +
scale_x_continuous(labels = scales::percent)+
geom_vline(aes(xintercept=1)) +
geom_violin(aes(fill=higher_group),scale="width",show.legend=F) +
geom_boxplot(width=0.3)
Figure 4.4: Position of the vent relative to the pelvic and anal fin origins. Data are reported as length from pelvic origin to vent as a proportion of prepelvic-preanal space.
The vent is clearly much closer to the pelvic fin base in arthrodires and chondrichthyans and much closer to the anal fin in teleosts. Some groups like Siluriformes actually show an intermediate vent position, whereas in many acanthopterygians because the pelvic fins are so anterior there can still be a substantial space between the vent and anal fins, despite this value as a percent of prepelvic-preanal length being similar to other teleosts. Because vent position is so consistent among gnathostomes, this suggests actually represents a shift of the fin bases relative to a conserved vent, rather than an actual change in vent position.
The data points with vent position greater than 100% prepelvic-preanal length are cases where snout-vent length was not reported directly and had to be calculated as the sum of reported prepelvic length + pelvic origin-to-vent length. Prepelvic length may have been measured point-to-point (oblique to the anteroposterior axis) and thus summing these values is a slight overapproximation of SVL.
4.3.3 Testing for differences based on body shape
Note, Electrophorus and Lophotis spp. are not included in this analysis because they represent significant outliers.
data_recon %>%
drop_na(SVL) %>%
filter(!genus %in% c("Electrophorus","Lophotis")) %>%
group_by(taxon) %>%
summarise(SVL=mean(SVL),total_length=mean(total_length),shape=unique(shape),clade=unique(clade),habitat=unique(habitat)) %>%
ggplot(.,aes(x=SVL/total_length,y=shape)) +
geom_vline(data=. %>% group_by(shape) %>%
summarise(proportion=mean(SVL/total_length),habitat=unique(shape)),
aes(xintercept=proportion,color=shape),show.legend=F)+
geom_violin(aes(fill=shape),scale="width",show.legend=F)+
geom_boxplot(width=0.25)+
coord_cartesian(xlim=c(0,1))+
labs(x="Snout-Vent Length/Total Length",y="Body Shape",fill="Body Shape")+
theme(legend.position=c(0.15,0.75))
Figure 4.5: Box-and-whisker plot of SVL as a proportion of total length in extant fishes
Based on this, there appears to be relatively little variation in vent position based on body shape. Even anguilliform taxa generally have anuses located close to the midpoint of the body. Macruriform taxa are an exception, primarily because the extremely elongate caudal fin in these species results in a greater total length relative to SVL. The caudal fin of macruriform taxa does not appear to be constrained by the same factors that restrict proportional relationships in other fishes (see Engelman 2023).
4.3.4 Box and Whisker Plot by Habitus
data_recon %>%
drop_na(SVL,total_length,habitat) %>%
summarise(.by=taxon,
SVL=mean(SVL),total_length=mean(total_length),shape=unique(shape),
clade=unique(clade),habitat=unique(habitat)) %>%
ggplot(.,aes(x=SVL/total_length,y=habitat)) +
geom_vline(data=. %>%
summarise(.by=habitat,
proportion=mean(SVL/total_length)),
aes(xintercept=proportion,color=habitat),show.legend=F)+
geom_violin(aes(fill=habitat),scale="width",show.legend=F)+
geom_boxplot(width=0.25)+
coord_cartesian(xlim=c(0,1))+
labs(x="Snout-Vent Length/Total Length",y="Habitus",fill="Habitus")
Figure 4.6: Box-and-whisker plot of SVL as a proportion of total length in extant fishes, grouped by life habits
Based on these results benthic taxa seem to have a more anterior vent relative to total length, whereas pelagic forms have a more posterior vent relative to total length. The more anterior position in benthic taxa seems to be driven by the elongate caudal fins in many forms (e.g., Stegostoma tigrinum). By contrast, the longer SVL relative to body length in pelagic forms may be related to them more attenuated abdomen of these taxa.
data_recon %>%
group_by(taxon) %>%
drop_na(precaudal_length,SVL) %>%
summarise(SVL=mean(SVL),precaudal_length=mean(precaudal_length),shape=unique(shape),
clade=unique(clade),habitat=unique(habitat)) %>%
ggplot(.,aes(x=SVL/precaudal_length,y=habitat)) +
geom_vline(data=. %>% group_by(habitat) %>%
summarise(proportion=mean(SVL/precaudal_length),habitat=unique(habitat)),
aes(xintercept=proportion,color=habitat),show.legend=F)+
geom_violin(aes(fill=habitat))+
geom_boxplot(width=0.25)+
coord_cartesian(xlim=c(0,1))+
labs(x="Snout-Vent Length/Precaudal Length",y="Habitus",fill="Habitus")+
theme(legend.position=c(0.15,0.75))
Figure 4.7: Box-and-whisker plot of SVL as a proportion of precaudal length in extant fishes,grouped by life habits
However, even when considering SVL as a proportion of precaudal length pelagic taxa still have more posteriorly placed vents and benthic taxa have more anteriorly placed ones. I.e., benthic taxa seem to have slightly longer abdomens, and pelagic taxa have slightly shorter ones.
More data are needed, but the present dataset implies Dunkleosteus could potentially have a more posteriorly positioned vent relative to total length than Coccosteus and Incisoscutum, given the shorter abdomens seen in many pelagic fishes.
4.3.5 Approximate vent position in Ichthyodectiformes
data_recon %>%
filter(order=="Ichthyodectiformes") %>%
mutate(ratio1=preanal_length/total_length,
ratio2=(((prepelvic_length+preanal_length)/2)/total_length)) %>%
group_by(taxon) %>%
summarise(ratio1=mean(ratio1),ratio2=mean(ratio2)) %>%
ungroup() %>%
summarise(ratio1=mean(ratio1),ratio2=mean(ratio2),N=n()) %>%
kable(caption="Approximate location of the vent in Ichthyodectiformes as a percentage of total length",
digits=3,align="c",col.names = c("Assuming vent is located at anal fin base", "Assuming vent is intermediate between pelvic and anal fin origins","N Species")) %>%
kable_styling()
Assuming vent is located at anal fin base | Assuming vent is intermediate between pelvic and anal fin origins | N Species |
---|---|---|
0.595 | 0.524 | 8 |
Assuming the vent is between the pelvic and anal fins, as is the case in most fishes, or close to the base of the anal fin, as in most actinopterygians, proportional SVL in Ichthyodectiformes is similar to other fishes, and is particularly similar to the anus position in other pelagic species.
4.4 Pre-Pectoral Length
# separating y-axis into clades of interest
prepec1<-data_recon %>%
drop_na(prepectoral_length,total_length,clade,higher_group) %>%
mutate(clade=as.character(clade),
higher_group=ifelse(genus=="Dunkleosteus","Dunkleosteus",higher_group),
higher_group=ifelse(genus=="Eastmanosteus","Eastmanosteus",higher_group),
higher_group=ifelse(higher_group=="Arthrodira" &
length_as == "estimated t.l." & genus !="Dunkleosteus",
"Arthrodira (est. lengths)",higher_group),
higher_group=ifelse(higher_group=="Arthrodira",
"Arthrodira (known lengths)",higher_group),
higher_group=ifelse(genus=="Alopias","Alopias",higher_group),
higher_group=ifelse(order=="Chimaeriformes","Holocephali",higher_group),
higher_group=ifelse(higher_group=="Chondrichthyes",
"Other Elasmobranchii",higher_group),
higher_group=ifelse(order=="Ichthyodectiformes",
"Ichthyodectiformes",higher_group),
higher_group=ifelse(shape=="anguilliform","Anguilliform Taxa",higher_group),
clade=ifelse(shape=="anguilliform",NA,clade),
higher_group=factor(higher_group,ordered=T,
levels=c("Dunkleosteus","Eastmanosteus",
"Arthrodira (known lengths)",
"Arthrodira (est. lengths)",
"Other Elasmobranchii", "Holocephali",
"Alopias","Sarcopterygii","Basal Actinopterygii",
"Ichthyodectiformes", "Basal Teleostei",
"Otocephala", "Stem Euteleostei",
"Acanthopterygii","Anguilliform Taxa")))
# summarising values for non-placoderms
prepec_2<-bind_rows(prepec1 %>%
filter(clade == "Placodermi"),
prepec1 %>%
filter(clade!="Placodermi"|is.na(clade)) %>%
group_by(taxon) %>%
summarize(across(where(is.numeric),mean),
higher_group=unique(higher_group),
taxon=unique(taxon),genus=unique(genus),species=unique(species),
clade=unique(clade,na.rm=F),shape=unique(shape)))
# plotting graph
p1_pec <- ggplot(rhizo, aes(x, y)) +
geom_polygon(fill = "darkgrey",color="black", alpha = 0.5) +
geom_line(data=data.frame(x=c(1,1),y=c(0.2471672000,-0.03)))+
geom_line(data=data.frame(x=c(0,0),y=c(0.1627831000,-0.03)))+
geom_line(data=data.frame(x=c(0,0.225,0.225),
y=c(0.055,0.055,0.105)),
linewidth=1.5,color="steelblue")+
coord_cartesian(ylim=c(0,0.33))+
annotate("text",label="pre-pectoral length",x=0.225,y=0.035,hjust=1)+
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank(),
axis.line.y = element_blank(),
axis.line.x = element_blank())+
theme_void()
p2_pec <- prepec_2 %>%
ggplot(aes(x=prepectoral_length/total_length,y=higher_group)) +
coord_cartesian(xlim=c(0,1))+
scale_y_discrete(limits=rev)+
scale_x_continuous(labels = scales::percent)+
labs(x="Pre-Pectoral Length (as percent of total length)",y="Clade")+
geom_vline(data=. %>% filter(genus=="Dunkleosteus"),
aes(xintercept=mean(prepectoral_length/total_length)),
color="#00B0F6",linetype="dashed")+
geom_vline(aes(xintercept=mean(prepectoral_length/total_length)),
linetype="dashed")+
geom_vline(xintercept = 0) +
geom_vline(xintercept = 1) +
geom_violin(aes(fill=clade),show.legend = F,scale="width")+
geom_violin(data=.%>%filter(genus=="Dunkleosteus"),fill="#00B0F6",
show.legend = F,scale="width")+
geom_boxplot(width=0.3)+
geom_star(data=. %>% filter(genus=="Eastmanosteus"),
fill="white",color="black",size=2.5)+
theme(axis.text.y = element_text(face=c(rep("plain",8),"italic",
rep("plain",4),"italic","italic")))
p1_pec / p2_pec + plot_layout(heights = 1:2) & theme(plot.margin = margin(0, 20, 0, 0))
Figure 4.8: Box-and-whisker plot of prepectoral length as a percentage of total length in gnathostomes, showing how Dunkleosteus has a relatively anterior pectoral fin girdle relative to the total lengths predicted in Engelman (2023). Data for non-placoderms reported as species averages where placoderms are reported in terms of individual specimens to better show the consistency in these proportions between specimens.
Dunkleosteus has one of the most anteriorly positioned pectoral fins in any examined fish, living or extinct. The more anterior pectoral fin position in Dunkleosteus relative to other arthrodires is evident based on trunk armor morphology (see manuscript), but this condition extends to fishes in general. This cannot be due to the length estimates calculated by Engelman (2023), as longer body lengths for D. terrelli make this proportion more extreme, potentially to the point of being biomechanically unreasonable.
Other arthrodires resemble broader patterns among eugnathostomes in relative pectoral fin position. These proportions are consistent regardless of whether total lengths are directly measured or estimated via OOL. One exception is the dunkleosteoid Eastmanosteus calliaspis, which shows values similar to D. terrelli, and also shows a more anterior pectoral fenestra than any other eubrachythoracid examined except D. terrelli (see manuscript). This indicates a relatively anterior position of the pectoral fin may be an apomorphy of dunkleosteoids. Some aspinothoracidans may show a similar condition (Brachyosteus, Enseosteus), though this is not universal among members of this group (it is absent in Amazichthys or Heintzichthys), and the condition is not quite as extreme as in Dunkleosteus.
data_recon %>%
mutate(group=case_when(order == "Carangiformes" ~ "Carangiformes",
genus == "Dunkleosteus" ~ "*Dunkleosteus*",
genus == "Incisoscutum" ~ "*Incisoscutum*",
family == "Coccosteidae" ~ "Coccosteidae",
order == "Clupeiformes" & family!="Cheirocentridae" ~ "Other Clupeiformes",
family == "Megalopidae" ~ "Megalopidae",
genus == "Amazichthys" ~ "*Amazichthys*",
family == "Salmonidae" ~ "Salmonidae",
family == "Cheirocentridae" ~ "Cheirocentridae",
family == "Lamnidae" ~ "Lamnidae",
family == "Carcharhinidae" ~ "Carcharhinidae",
family == "Squalidae" ~ "Squalidae",
family == "Lampridae" ~ "Lampridae",
order == "Istiophoriformes" ~ "Istiophoriformes",
order == "Ichthyodectiformes" ~ "Ichthyodectiformes",
family == "Sphyraenidae" ~ "Sphyraenidae",
family == "Scombridae" ~ "Scombridae",
genus == "Eastmanosteus" ~ "*Eastmanosteus*")) %>%
drop_na(group,prepectoral_length,total_length) %>%
mutate(ppl = 100*(prepectoral_length/total_length)) %>%
group_by(taxon) %>%
summarise(higher_group=unique(higher_group),mean1=mean(ppl),max=max(ppl),min=min(ppl),n=n(),group=unique(group),clade=unique(clade)) %>%
group_by(group) %>%
summarise(higher_group=unique(higher_group),clade=unique(clade),
mean2=mean(mean1),min1=min(mean1),max1=max(mean1),
sd=sd(mean1),min2=min(min),max2=max(max),Nspec=sum(n),n=n())%>%
mutate(higher_group=factor(higher_group,ordered=T,levels=c("Arthrodira",
"Basal Actinopterygii",
"Basal Teleostei",
"Otocephala",
"Stem Euteleostei",
"Acanthopterygii",
"Chondrichthyes")),
min1=ifelse(n==1,NA,min1),
max1=ifelse(n==1,NA,max1)) %>%
arrange(higher_group,group) %>%
select(-higher_group) %>%
kable(col.names=c("Taxon","Clade","Mean","Minimum","Maximum","St. Dev",
"Min. Obs.","Max. Obs.",
"Observations","Species"),
digits=1, align=c("l","c","c","c","c","c","c","c","c","c"),
caption="Pre-pectoral length in <i>Dunkleosteus</i> as a percent of total length in select nektonic (mostly pelagic) fish clades. Note how <i>Dunkleosteus</i> shows a pre-pectoral length comparable to or shorter than the highly elongate Cheirocentridae and Ichthyodectiformes even when using the lengths estimated by Engelman (2023). Data are presented as averages of species averages to avoid bias from any one taxon. Data are described as 'observations' rather than specimens as some data points are species averages reported in literature. 'Min Obs.' and 'Max Obs' represent the minimum and maximum pre-averaged observation for each group.") %>%
add_header_above(c(" "=2,"Percent Pre-Pectoral Length"=4,"Data Extrema"=2,"Sample Size"=2))%>%
row_spec(2,bold=T)%>%
kable_styling()
Taxon | Clade | Mean | Minimum | Maximum | St. Dev | Min. Obs. | Max. Obs. | Observations | Species |
---|---|---|---|---|---|---|---|---|---|
Amazichthys | Placodermi | 23.1 | – | – | – | 23.1 | 23.1 | 1 | 1 |
Dunkleosteus | Placodermi | 13.1 | – | – | – | 11.2 | 14.6 | 5 | 1 |
Eastmanosteus | Placodermi | 13.3 | – | – | – | 13.3 | 13.3 | 1 | 1 |
Incisoscutum | Placodermi | 21.1 | – | – | – | 19.3 | 22.8 | 2 | 1 |
Coccosteidae | Placodermi | 20.8 | 18.6 | 23.7 | 2.7 | 15.4 | 23.7 | 7 | 3 |
Ichthyodectiformes | Actinopterygii | 13.7 | 12.1 | 15.8 | 1.4 | 12.1 | 15.8 | 7 | 7 |
Megalopidae | Actinopterygii | 18.5 | 17.6 | 19.4 | 1.3 | 15.5 | 22.7 | 6 | 2 |
Cheirocentridae | Actinopterygii | 14.5 | 14.3 | 14.8 | 0.3 | 12.3 | 17.7 | 8 | 2 |
Other Clupeiformes | Actinopterygii | 18.6 | 15.8 | 21.8 | 1.9 | 14.8 | 24.1 | 51 | 17 |
Lampridae | Actinopterygii | 28.3 | 27.3 | 28.8 | 0.7 | 27.3 | 28.8 | 4 | 4 |
Salmonidae | Actinopterygii | 18.8 | 15.3 | 22.3 | 2.3 | 13.6 | 25.7 | 35 | 12 |
Carangiformes | Actinopterygii | 21.2 | 14.6 | 27.6 | 3.1 | 14.1 | 28.5 | 128 | 60 |
Istiophoriformes | Actinopterygii | 21.1 | 18.7 | 22.7 | 1.4 | 12.8 | 24.5 | 147 | 10 |
Scombridae | Actinopterygii | 23.0 | 15.1 | 29.4 | 3.8 | 15.1 | 32.5 | 106 | 33 |
Sphyraenidae | Actinopterygii | 25.4 | 23.3 | 28.2 | 1.6 | 21.9 | 28.2 | 40 | 13 |
Carcharhinidae | Chondrichthyes | 22.1 | 18.1 | 24.6 | 1.4 | 16.8 | 28.2 | 234 | 41 |
Lamnidae | Chondrichthyes | 26.2 | 24.8 | 27.8 | 1.3 | 20.1 | 30.2 | 31 | 4 |
Squalidae | Chondrichthyes | 21.8 | 18.0 | 24.8 | 1.7 | 15.0 | 24.8 | 37 | 15 |
The pectoral fin origin of Ichthyodectiformes is more anterior than most extant fishes, but this is due to hyper-elongation of the trunk relative to a conserved pectoral girdle morphology rather than an unusual morphology of the pectoral girdle and trunk armor allowing a more anteroventral position of the pectoral fin as in Dunkleosteus.
p1_pec_xip <- ggplot(rhizo, aes(x, y)) +
geom_polygon(fill = "darkgrey",color="black", alpha = 0.5) +
geom_line(data=data.frame(x=c(1,1),y=c(0.2471672000,-0.03)))+
geom_line(data=data.frame(x=c(0,0),y=c(0.1627831000,-0.03)))+
geom_line(data=data.frame(x=c(0,0.225,0.225),
y=c(0.055,0.055,0.105)),
linewidth=1.5,color="steelblue")+
coord_cartesian(ylim=c(0,0.33),xlim=c(0,.35))+
annotate("text",label="pre-pectoral length",x=0.225,y=0.045,hjust=1)+
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank(),
axis.line.y = element_blank(),
axis.line.x = element_blank())+
theme_void()
p2_pec_xip <- prepec_2 %>%
mutate(total_length=ifelse(genus=="Dunkleosteus",
head_length * (data_recon %>% filter(order=="Ichthyodectiformes") %>%
group_by(taxon) %>%
summarise(head_length=mean(head_length),
total_length=mean(total_length)) %>%
mutate(head_trunk_ratio=total_length/head_length) %>%
pull(head_trunk_ratio) %>% mean()),
total_length)) %>%
ggplot(aes(x=prepectoral_length/total_length,y=higher_group)) +
scale_y_discrete(limits=rev)+
scale_x_continuous(labels = scales::percent)+
coord_cartesian(xlim=c(0,.35))+
geom_vline(xintercept=0)+
labs(x="Percent Pre-Pectoral Length",y="Clade")+
geom_vline(data=. %>% filter(genus=="Dunkleosteus"),
aes(xintercept=mean(prepectoral_length/total_length)),
linetype="dashed")+
geom_violin(aes(fill=clade),show.legend = F,scale="width")+
geom_boxplot(width=0.3)+
geom_star(data=. %>% filter(genus=="Eastmanosteus"),fill="white",color="black",size=2.5)+
theme(axis.text.y = element_text(face=c(rep("plain",8),"italic",
rep("plain",4),"italic","italic")))
p1_pec_xip / p2_pec_xip + plot_layout(heights = 1.15:2) & theme(plot.margin = margin(0, 20, 0, 0))
Figure 4.9: Pre-pectoral length in Dunkleosteus assuming head-trunk proportions similar to Ichthyodectiformes, showing how this results in a more anterior position of the pectoral fin than almost any other non-anguilliform fish. Data for non-placoderms reported as species averages where placoderms are reported in terms of individual specimens to better show the consistency in these proportions between specimens.
If artificially manipulating Dunkleosteus to have head-trunk proportions similar to Ichthyodectiformes (which have a head around 1/7 total length), this results in Dunkleosteus having a pectoral fin significantly more anterior than almost any other fish (only 11% total length), to the point of being an unusual outlier. This seems unlikely, because if the pectoral fin is positioned too far anteriorly it might be expected to have negative biomechanical consequences like destabilizing the animal during swimming (see manuscript).
data_recon %>%
filter(genus=="Dunkleosteus") %>%
add_row(specimen="CMNH 5936",head_length=72.4,total_length=409) %>%
mutate(total_length2=
head_length * (data_recon %>% filter(order=="Ichthyodectiformes") %>%
group_by(taxon) %>%
summarise(head_length=mean(head_length),
total_length=mean(total_length)) %>%
mutate(head_trunk_ratio=total_length/head_length) %>%
pull(head_trunk_ratio) %>% mean())) %>%
select(specimen, head_length, total_length, total_length2) %>%
mutate(head_length=ifelse(head_length==72.4,"~72.4",
sprintf("%.1f", round(head_length,1)))) %>%
arrange(total_length) %>%
kable(digits=1,align=c("l","c","c","c"),
col.names = c("Specimen","Head Length","Total Length (using OOL)", "Total Length (assuming ichthyodectiform-like proportions)"),
caption="Total lengths for specimens of <i>Dunkleosteus terrelli</i> assuming similar head-trunk proportions to Ichthyodectiformes (e.g., <i>Xiphactinus</i>). Head size in CMNH 5936 based on scaling from the oral region of the infragnathal and allometric patterns within <i>D. terrelli</i> (see Engelman 2023)") %>%
kable_styling
Specimen | Head Length | Total Length (using OOL) | Total Length (assuming ichthyodectiform-like proportions) |
---|---|---|---|
CMNH 8982 | 28.8 | 154.8 | 196.7 |
CMC VP8294 | 23.6 | 157.3 | 161.1 |
CMNH 6194 | 29.0 | 166.3 | 198.0 |
CMNH 7424 | 34.0 | 188.9 | 232.1 |
CMNH 6090 | 51.0 | 283.3 | 348.2 |
CMNH 7054 | 53.6 | 295.5 | 366.0 |
CMNH 5768 | 61.3 | 340.7 | 418.5 |
CMNH 5936 | ~72.4 | 409.0 | 494.2 |
Additionally, even assuming ichthyodectiform-like proportions in Dunkleosteus terrelli it is not possible to produce lengths greater than 5 m for the largest known individuals.
4.4.1 Predicting in Dunkleosteus terrelli
4.4.1.1 Setting up Regressions
Without Log-Transformation
fit.pectoral<-lm(total_length~prepectoral_length,
data=data_recon %>%
filter(length_as!="estimated t.l."))
summary(fit.pectoral)
##
## Call:
## lm(formula = total_length ~ prepectoral_length, data = data_recon %>%
## filter(length_as != "estimated t.l."))
##
## Residuals:
## Min 1Q Median 3Q Max
## -143.39 -6.48 -2.16 3.82 368.34
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.75489 0.59261 6.336 2.81e-10 ***
## prepectoral_length 4.35435 0.02299 189.368 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 21.79 on 2376 degrees of freedom
## (321 observations deleted due to missingness)
## Multiple R-squared: 0.9379, Adjusted R-squared: 0.9378
## F-statistic: 3.586e+04 on 1 and 2376 DF, p-value: < 2.2e-16
With Log-Transformation
fit.pectoral_2<-lm(log(total_length)~log(prepectoral_length),
data=data_recon %>%
filter(length_as!="estimated t.l."))
summary(fit.pectoral_2)
##
## Call:
## lm(formula = log(total_length) ~ log(prepectoral_length), data = data_recon %>%
## filter(length_as != "estimated t.l."))
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.48477 -0.13078 -0.00965 0.11106 1.64119
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.613595 0.009533 169.3 <2e-16 ***
## log(prepectoral_length) 0.966160 0.003753 257.4 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1897 on 2376 degrees of freedom
## (321 observations deleted due to missingness)
## Multiple R-squared: 0.9654, Adjusted R-squared: 0.9654
## F-statistic: 6.627e+04 on 1 and 2376 DF, p-value: < 2.2e-16
4.4.1.2 Estimating
data_recon %>% filter(genus=="Dunkleosteus") %>%
drop_na(prepectoral_length) %>%
arrange(prepectoral_length) %>%
rename(OOL_length=total_length) %>%
augment(fit.pectoral,newdata=.,interval="prediction") %>%
rename_at(vars(starts_with('.')), funs(paste0("pectoral1",.)))%>%
augment(fit.pectoral_2,newdata=.,interval="prediction") %>%
mutate(across(.fitted:.upper,~exp(.)*regression.stats(fit.pectoral_2)$CF))%>%
rename_at(vars(starts_with('.')), funs(paste0("pectoral2",.)))%>%
mutate(OOL.pe=paste0("(",round(minlength,1),"–",round(maxlength,1),")"),
pectoral1.range=paste0("(",round(pectoral1.lower,1),"–",round(pectoral1.upper,1),")"),
pectoral2.range=paste0("(",round(pectoral2.lower,1),"–",round(pectoral2.upper,1),")"))%>%
select(specimen,prepectoral_length,OOL_length,OOL.pe,
pectoral1.fitted,pectoral1.range,
pectoral2.fitted,pectoral2.range) %>%
kable(digits=1,col.names=c("Specimen","Prepectoral Length",
"Est.","+/- %PE","Est.","95% P.I.",
"Est.","95% P.I."),
align=c("l","c","c","c","c","c","c","c")) %>%
add_header_above(c(" "=2,"Orbit-Opercular Length"=2,"Prepectoral Length, non-log-transformed"=2,
"Prepectoral Length, log-transformed"=2)) %>%
kable_styling()
Specimen | Prepectoral Length | Est. | +/- %PE | Est. | 95% P.I. | Est. | 95% P.I. |
---|---|---|---|---|---|---|---|
CMC VP8294 | 19.9 | 157.3 | (137.8–176.9) | 90.4 | (47.6–133.1) | 92.0 | (63.4–133.4) |
CMNH 7424 | 21.1 | 188.9 | (165.5–212.4) | 95.8 | (53–138.5) | 97.5 | (67.2–141.5) |
CMNH 6090 | 37.7 | 283.3 | (248.2–318.4) | 167.8 | (125.1–210.6) | 170.5 | (117.5–247.4) |
CMNH 7054 | 43.1 | 295.5 | (258.9–332.2) | 191.5 | (148.8–234.3) | 194.2 | (133.9–281.8) |
CMNH 5768 | 46.5 | 340.7 | (298.4–382.9) | 206.4 | (163.6–249.2) | 209.1 | (144.1–303.4) |
Prepectoral length produces lengths that are somewhat in the range of OOL, but much shorter. This is to be expected given the extreme anterior position of the scapulocoracoid in Dunkleosteus. However, it is important to note that even the 95% prediction intervals for prepectoral length, which are expected to be much wider than the intervals based on +/- PE, still do not allow for greater lengths and longer trunks for D. terrelli.
fit.pectoral_3<-lm(log(total_length)~log(prepectoral_length),
data_recon %>%
filter(length_as=="total length",higher_group!="Acanthopterygii" &
!(order %in% c("Gadiformes","Aulopiformes"))))
data_recon %>% filter(genus=="Dunkleosteus") %>%
drop_na(prepectoral_length) %>%
arrange(prepectoral_length) %>%
rename(OOL_length=total_length) %>%
augment(fit.pectoral_3,newdata=.,interval="prediction") %>%
mutate(across(.fitted:.upper,~exp(.)*regression.stats(fit.pectoral_3)$CF))%>%
rename_at(vars(starts_with('.')), funs(paste0("pectoral2",.)))%>%
mutate(OOL.pe=paste0("(",round(minlength,1),"–",round(maxlength,1),")"),
pectoral2.range=paste0("(",round(pectoral2.lower,1),"–",round(pectoral2.upper,1),")"))%>%
select(specimen,prepectoral_length,OOL_length,OOL.pe,
pectoral2.fitted,pectoral2.range) %>%
kable(digits=1,col.names=c("Specimen","Prepectoral Length",
"Est.","+/- %PE",
"Est.","95% P.I."),
align=c("l","c","c","c","c","c","c","c")) %>%
add_header_above(c(" "=2,"Orbit-Opercular Length"=2,
"Prepectoral Length, log-transformed"=2)) %>%
kable_styling()
Specimen | Prepectoral Length | Est. | +/- %PE | Est. | 95% P.I. |
---|---|---|---|---|---|
CMC VP8294 | 19.9 | 157.3 | (137.8–176.9) | 97.6 | (68.7–138.7) |
CMNH 7424 | 21.1 | 188.9 | (165.5–212.4) | 103.4 | (72.7–146.9) |
CMNH 6090 | 37.7 | 283.3 | (248.2–318.4) | 178.3 | (125.5–253.4) |
CMNH 7054 | 43.1 | 295.5 | (258.9–332.2) | 202.5 | (142.5–287.8) |
CMNH 5768 | 46.5 | 340.7 | (298.4–382.9) | 217.6 | (153.1–309.3) |
Similar results occur even if restricting comparisons to taxa without anteriorly positioned pelves (non-acanthopterygians).
4.5 Pre-Pelvic Length
p1_pelv <- ggplot(rhizo, aes(x, y)) +
geom_polygon(fill = "darkgrey",color="black", alpha = 0.5) +
geom_line(data=data.frame(x=c(1,1),y=c(0.2471672000,-0.03)))+
geom_line(data=data.frame(x=c(0,0),y=c(0.1627831000,-0.03)))+
geom_line(data=data.frame(x=c(0,0.454,0.454),
y=c(0.055,0.055,0.105)),
linewidth=1.5,color="steelblue")+
coord_cartesian(ylim=c(0,0.33))+
annotate("text",label="pre-pelvic length",x=0.454,y=0.035,hjust=0.5)+
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank(),
axis.line.y = element_blank(),
axis.line.x = element_blank())+
theme_void()
p2_pelv <- data_recon %>%
mutate(clade=ifelse(higher_group == "Acanthopterygii","Acanthopterygii",clade),
clade=ifelse(order %in% c("Gadiformes","Aulopiformes"),"Gadiformes, Aulopiformes",clade),
clade=ifelse(clade=="Actinopterygii","Other Actinopterygii",clade),
clade=factor(clade,ordered=T,levels=c("Acanthopterygii","Gadiformes, Aulopiformes","Other Actinopterygii","Chondrichthyes","Placodermi","Sarcopterygii"))) %>%
drop_na(prepelvic_length,total_length) %>%
group_by(taxon) %>%
summarise(genus=unique(genus),prepelvic_length=mean(prepelvic_length),
total_length=mean(total_length),
shape=unique(shape),clade=unique(clade)) %>%
ggplot(.,aes(prepelvic_length/total_length)) +
geom_vline(xintercept = 0) +
geom_vline(xintercept = 1) +
geom_histogram(aes(fill=clade),binwidth=0.01)+
scale_fill_manual(values=c("darkgrey",hue_pal()(5)))+
geom_vline(data = . %>%
filter (!clade %in% c("Acanthopterygii","Gadiformes","Aulopiformes")),
aes(xintercept = mean(prepelvic_length/total_length)),linetype="dashed") +
coord_cartesian(xlim=c(0,1))+
labs(x="Pre-Pelvic Length/Total Length",y="# of Species",fill="Clade")+
theme(legend.position=c(0.775,0.75))
p1_pelv / p2_pelv + plot_layout(heights = 1:2) & theme(plot.margin = margin(0, 20, 0, 0))
Figure 4.10: Histogram of pre-pelvic length in fishes, using species averages. Dashed line represents mean value for all non-acanthopterygian taxa (excluding Gadiformes and Aulopiformes). All data are in species averages except for Dunkleosteus, to show that individual variation does not change interpretations of pelvic fin location.
Overall, pre-pelvic length as a proportion of total length is relatively consistent across non-acanthopterygian fishes. On average, pre-pelvic length is around 45% of total length in non-acanthopterygian fishes, with almost all taxa falling between 35% and 55% total length.
Outliers do exist within this relationship, but for the most part these are restricted to certain phylogenetic nodes within the sample. A more posterior pelvic fin position (~60% TL) is seen in Polypteriformes and deep-sea Squaliformes (Centrophoridae, Dalatiidae, Etmopteridae, Oxynotidae, Somniosidae), the latter of which form a monophyletic clade (Straube et al. 2015) characterized by an extreme posterior position of the pelvic fins. Large Carcharhiniformes and Lamniformes also have slightly more posteriorly positioned pelvic fins than other sharks (~50% TL), which may be due to the larger livers of these taxa (Gleiss et al. 2017) and the shorter abdomens of pelagic Lamniformes (Sternes and Shimada 2020). Pre-pelvic length is a smaller proportion of body length in A more anterior position of the pelvic fins is present in benthic sharks with elongate abdomens (e.g., Hemiscyllidae; Sternes and Shimada 2020) and some characids.
# separating y-axis into clades of interest
pelvprecaudal_1<-
data_recon %>%
mutate(prepelvic_length=ifelse(specimen %in% "CMC VP8294", 70.77,prepelvic_length),
prepelvic_length=ifelse(specimen %in% "CMNH 7424", 70.15,prepelvic_length),
prepelvic_length=ifelse(specimen %in% "CMNH 6090", 121.77,prepelvic_length),
prepelvic_length=ifelse(specimen %in% "CMNH 7054", 126.06,prepelvic_length),
prepelvic_length=ifelse(specimen %in% "CMNH 5768", 137.71,prepelvic_length)) %>%
filter(length_as=="total length"|genus=="Dunkleosteus") %>%
mutate(pvl1 = prepelvic_length/total_length,
pvl2 = prepelvic_length/precaudal_length,
higher_group=ifelse(order %in% c("Aulopiformes","Gadiformes"),"Aulopiformes, Gadiformes",higher_group),
higher_group=ifelse(family %in% c("Dalatiidae","Etmopteridae","Oxynotidae","Somniosidae","Centrophoridae"),"Deep Sea Squaliformes",higher_group),
higher_group=ifelse(order == "Chimaeriformes","Holocephali",higher_group),
higher_group=ifelse(order == "Beloniformes","Beloniformes",higher_group),
higher_group=ifelse(genus == "Alopias","*Alopias*",higher_group),
higher_group=ifelse(order == "Ichthyodectiformes","Ichthyodectiformes",higher_group),
higher_group=ifelse(higher_group=="Chondrichthyes","Other Elasmobranchii",higher_group),
higher_group=ifelse(genus=="Dunkleosteus","*Dunkleosteus* (est.)",higher_group))
# summarising values for non-Dunkleosteus taxa (total length)
pelvprecaudal_2<-bind_rows(pelvprecaudal_1 %>%
filter(genus == "Dunkleosteus") %>%
drop_na(pvl1),
pelvprecaudal_1 %>%
filter(genus!="Dunkleosteus"|is.na(higher_group)) %>%
group_by(taxon) %>%
drop_na(pvl1) %>%
summarize(across(where(is.numeric),mean),
higher_group=unique(higher_group),
taxon=unique(taxon),genus=unique(genus),species=unique(species),
clade=unique(clade,na.rm=F),shape=unique(shape))) %>%
mutate(higher_group=factor(higher_group,ordered = T, levels = c("*Dunkleosteus* (est.)",
"Arthrodira","Other Elasmobranchii","*Alopias*",
"Deep Sea Squaliformes","Holocephali","Sarcopterygii",
"Basal Actinopterygii","Ichthyodectiformes",
"Basal Teleostei","Otocephala","Stem Euteleostei",
"Aulopiformes, Gadiformes",
"Beloniformes","Acanthopterygii")))
pelvprecaudal_3<-bind_rows(pelvprecaudal_1 %>%
filter(genus == "Dunkleosteus") %>%
drop_na(pvl2),
pelvprecaudal_1 %>%
filter(genus!="Dunkleosteus"|is.na(higher_group)) %>%
group_by(taxon) %>%
drop_na(pvl2) %>%
summarize(across(where(is.numeric),mean),
higher_group=unique(higher_group),
taxon=unique(taxon),genus=unique(genus),species=unique(species),
clade=unique(clade,na.rm=F),shape=unique(shape))) %>%
mutate(higher_group=factor(higher_group,ordered = T, levels = c("*Dunkleosteus* (est.)",
"Arthrodira","Other Elasmobranchii","*Alopias*",
"Deep Sea Squaliformes","Holocephali","Sarcopterygii",
"Basal Actinopterygii","Ichthyodectiformes",
"Basal Teleostei","Otocephala","Stem Euteleostei",
"Aulopiformes, Gadiformes",
"Beloniformes","Acanthopterygii")))
grid.arrange(nrow=1,
pelvprecaudal_2 %>%
ggplot(aes(x=pvl1,y=higher_group,fill=clade)) +
labs(x="Pre-Pelvic Length",y="Clade")+
ggtitle("As a Proportion of Total Length")+
geom_vline(xintercept = 0) +
geom_vline(xintercept = 1) +
geom_vline(data=.%>%filter(!(order %in% c("Aulopiformes","Gadiformes","Beloniformes")|
genus %in% "Dunkleosteus"|
higher_group=="Acanthopterygii")),
aes(xintercept=mean(pvl1)),linetype="dashed")+
scale_y_discrete(limits=rev)+
geom_violin(scale="width",show.legend=F)+
geom_boxplot(width=0.3,fill="white")+
theme(axis.text.y = element_markdown())+
coord_cartesian(xlim=c(0,1))
,
pelvprecaudal_3 %>%
ggplot(aes(x=pvl2,y=higher_group,fill=clade)) +
geom_vline(xintercept = 0) +
geom_vline(xintercept = 1) +
labs(x="Pre-Pelvic Length",y="Clade")+
ggtitle("As a Proportion of Precaudal Length")+
scale_y_discrete(limits=rev)+
geom_vline(data=.%>%filter(!(order %in% c("Aulopiformes","Gadiformes","Beloniformes")|
genus %in% "Dunkleosteus"|
higher_group=="Acanthopterygii")),
aes(xintercept=mean(pvl2)),linetype="dashed")+
geom_violin(scale="width",show.legend=F)+
geom_boxplot(width=0.3,fill="white")+
theme(axis.text.y = element_markdown())+
coord_cartesian(xlim=c(0,1))
)
Figure 4.11: Pre-pelvic length in fishes as a proportion of total length (left) and precaudal length (right). Dashed line represents the mean proportion for all non-acanthopterygian, gadiform, aulopiform fishes in which this value could be measured.
There is a slight tendency for the pelvic girdle to be increasingly anterior in position as one gets closer to Acanthopterygii, but extreme anterior positions of the pelvis (< 30% total length) are restricted to certain neoteleost groups (Acanthopterygii, Gadiformes, and some Aulopiformes among the taxa examined here). Most acanthopterygians show much more anteriorly positioned pelvic girdles than any non-acanthopterygian, except for Beloniformes which show a secondary reversion to a non-acanthopterygian-like condition. Stem teleost lineages generally show a slightly more anterior pelvis position relative to precaudal length, but this may be confounded by the fact that precaudal length (= standard length) in actinopterygians is typically measured to the end of the hypurals (Hubbs and Lagler 2004), which typically means some of the base of the caudal fin is counted as part of precaudal length.
The hyper-elongated Ichthyodectiformes show a similar position of the pelvic fins relative to total length and precaudal length as other closely related fishes (stem-teleosts; see discussion in Cavin et al. 2013). This suggests that pelvic fin position is a relatively consistent proportion of body length in non-acanthopterygian fishes regardless of the degree of body elongation.
Pre-pelvic lengths in arthrodires known from complete remains are close to the average for all non-acanthopterygian fishes, and are particularly similar to the proportions seen in typical extant elasmobranchs. This suggests arthrodires show a similar relationship between pelvic girdle position and total length as these fishes. Because the pelvic girdle of arthrodires is either immediately posterior to or otherwise close to the end of the ventral armor (see manuscript), including in Dunkleosteus, this suggests the lengths for Dunkleosteus terrelli predicted by Engelman (2023) are accurate.
4.5.1 Examples of pre-pelvic Length in extreme body shapes
data_recon %>%
filter(family %in% c("Cheirocentridae","Lampridae","Serrasalmidae")|
order %in% c("Ichthyodectiformes")) %>%
mutate(group = case_when(order == "Ichthyodectiformes" ~ "Ichthyodectiformes",
family == "Lampridae" ~ "Lampridae",
family == "Cheirocentridae" ~ "Cheirocentridae",
family == "Serrasalmidae" ~ "Serrasalmidae")) %>%
drop_na(prepelvic_length,total_length) %>%
summarise(.by=taxon,order=unique(order),group=unique(group),n=n(),
pvl=mean(prepelvic_length/total_length)) %>%
summarise(.by=group,n1=sum(n),n2=n(),mean_pvl=mean(pvl),
range=paste0("(",round(min(pvl),3),"–",round(max(pvl),3),")")) %>%
arrange(group) %>%
kable(digits=c(1,1,1,3,1),align=c("l","c","c","c","c"),
col.names = c("Group","N. Obs.","N. Species","Mean","Range"),
caption = "Mean prepelvic length (as a proportion of total length) for the four clades mentioned in the manuscript") %>%
add_header_above(c(" "=3,"Prepelvic Length"=2)) %>%
kable_styling()
Group | N. Obs. | N. Species | Mean | Range |
---|---|---|---|---|
Cheirocentridae | 5 | 2 | 0.421 | (0.417–0.425) |
Ichthyodectiformes | 13 | 8 | 0.454 | (0.379–0.552) |
Lampridae | 4 | 4 | 0.410 | (0.399–0.424) |
Serrasalmidae | 32 | 15 | 0.391 | (0.316–0.428) |
4.5.2 Predicting in Dunkleosteus terrelli
4.5.2.1 Setting up Regressions
Without log-transformation
fit.pelvic<-lm(total_length~prepelvic_length * I(higher_group == "Acanthopterygii"|order %in% c("Gadiformes","Aulopiformes")),
data=data_recon %>%
filter(length_as!="estimated t.l."))
summary(fit.pelvic)
##
## Call:
## lm(formula = total_length ~ prepelvic_length * I(higher_group ==
## "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes")),
## data = data_recon %>% filter(length_as != "estimated t.l."))
##
## Residuals:
## Min 1Q Median 3Q Max
## -126.548 -4.368 -0.667 3.800 120.090
##
## Coefficients:
## Estimate
## (Intercept) 6.780137
## prepelvic_length 1.887185
## I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE -9.539332
## prepelvic_length:I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE 2.222744
## Std. Error
## (Intercept) 0.592050
## prepelvic_length 0.009392
## I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE 0.932003
## prepelvic_length:I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE 0.038090
## t value
## (Intercept) 11.45
## prepelvic_length 200.93
## I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE -10.23
## prepelvic_length:I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE 58.36
## Pr(>|t|)
## (Intercept) <2e-16
## prepelvic_length <2e-16
## I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE <2e-16
## prepelvic_length:I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE <2e-16
##
## (Intercept) ***
## prepelvic_length ***
## I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE ***
## prepelvic_length:I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.39 on 2140 degrees of freedom
## (555 observations deleted due to missingness)
## Multiple R-squared: 0.9624, Adjusted R-squared: 0.9623
## F-statistic: 1.825e+04 on 3 and 2140 DF, p-value: < 2.2e-16
With log-transformation
fit.pelvic_2<-lm(log(total_length)~log(prepelvic_length) * I(higher_group == "Acanthopterygii"|order %in% c("Gadiformes","Aulopiformes")),
data=data_recon %>%
filter(length_as!="estimated t.l."))
summary(fit.pelvic_2)
##
## Call:
## lm(formula = log(total_length) ~ log(prepelvic_length) * I(higher_group ==
## "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes")),
## data = data_recon %>% filter(length_as != "estimated t.l."))
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.78669 -0.09250 -0.00226 0.09262 1.01086
##
## Coefficients:
## Estimate
## (Intercept) 1.083699
## log(prepelvic_length) 0.907811
## I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE 0.247450
## log(prepelvic_length):I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE 0.091373
## Std. Error
## (Intercept) 0.014970
## log(prepelvic_length) 0.004442
## I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE 0.021593
## log(prepelvic_length):I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE 0.007795
## t value
## (Intercept) 72.39
## log(prepelvic_length) 204.39
## I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE 11.46
## log(prepelvic_length):I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE 11.72
## Pr(>|t|)
## (Intercept) <2e-16
## log(prepelvic_length) <2e-16
## I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE <2e-16
## log(prepelvic_length):I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE <2e-16
##
## (Intercept) ***
## log(prepelvic_length) ***
## I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE ***
## log(prepelvic_length):I(higher_group == "Acanthopterygii" | order %in% c("Gadiformes", "Aulopiformes"))TRUE ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1722 on 2140 degrees of freedom
## (555 observations deleted due to missingness)
## Multiple R-squared: 0.9697, Adjusted R-squared: 0.9697
## F-statistic: 2.285e+04 on 3 and 2140 DF, p-value: < 2.2e-16
Membership in the clades Acanthopterygii, Gadiformes, or Aulopiformes was treated as additional variable because these taxa show a significantly more anterior position of the pelvis than other fishes, which if not controlled for as an additional variable might bias the regression.
rbind(
"Log-transformed, with factor" = regression.stats(fit.pelvic_2),
"Log-transformed, without factor" = regression.stats(lm(log(total_length)~log(prepelvic_length),data_recon)))
As can be seen by the above data, including this factor massively decreases prediction error, and not including it is likely to bias body lengths in favor of shorter estimates due to the condition in Acanthopterygii and similar fishes.
4.5.2.2 Estimating
data_recon %>% filter(genus=="Dunkleosteus") %>%
mutate(prepelvic_length=case_when(specimen == "CMC VP8294" ~ 70.77,
specimen == "CMNH 7424" ~ 70.15,
specimen == "CMNH 6090" ~ 121.77,
specimen == "CMNH 7054" ~ 126.06,
specimen == "CMNH 5768" ~ 137.71,)) %>%
drop_na(prepelvic_length) %>%
arrange(prepelvic_length) %>%
rename(OOL_length=total_length) %>%
augment(fit.pelvic,newdata=.,interval="prediction") %>%
rename_at(vars(starts_with('.')), funs(paste0("pelvic1",.)))%>%
augment(fit.pelvic_2,newdata=.,interval="prediction") %>%
mutate(across(.fitted:.upper,~exp(.)*regression.stats(fit.pelvic_2)$CF))%>%
rename_at(vars(starts_with('.')), funs(paste0("pelvic2",.)))%>%
mutate(OOL.pe=paste0("(",round(minlength,1),"–",round(maxlength,1),")"),
pelvic1.range=paste0("(",round(pelvic1.lower,1),"–",round(pelvic1.upper,1),")"),
pelvic2.range=paste0("(",round(pelvic2.lower,1),"–",round(pelvic2.upper,1),")"))%>%
select(specimen,prepelvic_length,OOL_length,OOL.pe,
pelvic1.fitted,pelvic1.range,
pelvic2.fitted,pelvic2.range) %>%
kable(digits=1,col.names=c("Specimen","Prepelvic Length (snout to end of armor)",
"Est.","+/- %PE","Est.","95% P.I.",
"Est.","95% P.I."),
caption="Rough estimates of total length in <i>Dunkleosteus terrelli</i> using prepelvic length, approximated as the length from the tip of the snout to the end of the armor in an anteroposterior line.",
align=c("l","c","c","c","c","c","c","c")) %>%
add_header_above(c(" "=2,"Orbit-Opercular Length"=2,"Prepelvic Length, non-log-transformed"=2,
"Prepelvic Length, log-transformed"=2)) %>%
kable_styling()
Specimen | Prepelvic Length (snout to end of armor) | Est. | +/- %PE | Est. | 95% P.I. | Est. | 95% P.I. |
---|---|---|---|---|---|---|---|
CMNH 7424 | 70.2 | 188.9 | (165.5–212.4) | 139.2 | (109–169.4) | 142.6 | (101.7–200) |
CMC VP8294 | 70.8 | 157.3 | (137.8–176.9) | 140.3 | (110.1–170.5) | 143.8 | (102.6–201.6) |
CMNH 6090 | 121.8 | 283.3 | (248.2–318.4) | 236.6 | (206.4–266.8) | 235.3 | (167.8–330) |
CMNH 7054 | 126.1 | 295.5 | (258.9–332.2) | 244.7 | (214.4–274.9) | 242.8 | (173.2–340.5) |
CMNH 5768 | 137.7 | 340.7 | (298.4–382.9) | 266.7 | (236.4–296.9) | 263.1 | (187.6–369) |
As with prepectoral length, though lengths based on OOL are on the very high end of the prediction interval. Again, even though the 95% prediction intervals are wider than intervals based on +/- PE, approximate pelvic girdle position favors shorter lengths for Dunkleosteus terrelli
Nevertheless, because pelvic girdle position shows phylogenetic signal throughout Actinopterygii and prepelvic length can only be approximated in D. terrelli, these lengths are considered less reliable than the ones based on OOL (not least because they would result in an animal with a tail too short to function).
4.6 Pectoral Fin Base
4.6.1 Allometric scaling relationship in sharks
Against total length
data_recon %>%
filter(clade=="Chondrichthyes") %$%
lm(log10(pec_base) ~ log10(total_length)) %>%
summary()
##
## Call:
## lm(formula = log10(pec_base) ~ log10(total_length))
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.220971 -0.042388 -0.001782 0.048422 0.292911
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.45285 0.02674 -54.33 <2e-16 ***
## log10(total_length) 1.11138 0.01346 82.54 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.07608 on 370 degrees of freedom
## (368 observations deleted due to missingness)
## Multiple R-squared: 0.9485, Adjusted R-squared: 0.9484
## F-statistic: 6813 on 1 and 370 DF, p-value: < 2.2e-16
The slope for the log-transformed relationship in nektonic sharks is close to 1, suggesting pectoral fin base size scales isometrically with total length in sharks.
Against body mass
data_recon %>%
filter(clade=="Chondrichthyes") %$%
lm(log10(pec_base) ~ log10(body_mass)) %>%
summary()
##
## Call:
## lm(formula = log10(pec_base) ~ log10(body_mass))
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.176465 -0.050785 -0.003237 0.042143 0.238536
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.490619 0.015023 -32.66 <2e-16 ***
## log10(body_mass) 0.340303 0.004069 83.63 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.07363 on 357 degrees of freedom
## (381 observations deleted due to missingness)
## Multiple R-squared: 0.9514, Adjusted R-squared: 0.9513
## F-statistic: 6994 on 1 and 357 DF, p-value: < 2.2e-16
The slope when regressing log10 pectoral fin base length against log10 body mass is close to 0.33, indicating pectoral fin base size scales with geometric similarity to body mass in sharks. This is generally because sharks show relatively little allometric change in body shape.
4.6.2 Comparing arthrodires and sharks
pec_base_1<-data_recon%>%
drop_na(pec_base,clade,total_length) %>%
ggplot(aes(total_length,pec_base))+
geom_star(data=. %>% filter(!(clade=="Placodermi"&genus!="Dunkleosteus")),
aes(fill=order,starshape=clade),show.legend=F)+
geom_smooth(data=. %>% filter(!(clade=="Placodermi"&genus!="Dunkleosteus")),
formula=y~x,
aes(color=clade),method="lm",alpha=0.2,show.legend=F)+
geom_errorbarh(data=.%>% filter(clade=="Placodermi") %>% drop_na(minlength),
aes(xmin=minlength,xmax=maxlength),
height=0.75)+
geom_star(data=. %>% filter(genus=="Dunkleosteus"),
aes(fill=order,starshape=clade),show.legend=F,size=2)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as == "total length"),
color="white",fill="black",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="estimated t.l."),
color="black",fill="gray45",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
ggtitle("A")+
scale_fill_manual(values=c("white",hue_pal()(6)))+
scale_starshape_manual(values=c(15,1))+
scale_color_manual(values=c("black","dark grey","red"))+
theme_classic()+
labs(x="Total Length (cm)",y="Pectoral Base Length (cm)")
pec_base_2 <- data_recon %>%
drop_na(pec_base,clade,body_mass) %>%
ggplot(aes(body_mass,pec_base))+
geom_star(aes(fill=order,starshape=order))+
geom_smooth(data=. %>% filter(!(clade=="Placodermi"&genus!="Dunkleosteus")),
formula=y~x,
aes(color=clade),method="lm",alpha=0.2,show.legend=F)+
geom_smooth(data=. %>% filter(!(clade=="Placodermi"&genus!="Dunkleosteus")),
formula=y~x,
color=NA,method="lm",se=F)+
geom_errorbarh(data=.%>% filter(clade=="Placodermi") %>% drop_na(minmass),
aes(xmin=minmass,xmax=maxmass),
height=.02)+
geom_star(data=.%>%filter(clade=="Placodermi"),
color="white",fill="white",aes(starshape=order),size=2.5,
starstroke=0.4,show.legend = F)+
geom_star(data=.%>%filter(genus=="Dunkleosteus"),
color="black",fill="white",aes(starshape=order),size=2,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="total length"),
color="black",fill="black",aes(starshape=order),size=2,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="estimated t.l."),
color="black",fill="gray45",aes(starshape=order),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi"&genus!="Dunkleosteus"),
color="black",fill=NA,aes(starshape=order),size=2,
starstroke=0.33,show.legend = F)+
ggtitle("B")+
scale_x_continuous(trans="log10",
breaks = scales::trans_breaks("log10", function(x) 10^x,n=5),
labels = scales::trans_format("log10", scales::math_format(10^.x)))+
scale_y_continuous(trans="log10")+
scale_color_manual(values=c("black","dark grey"))+
scale_fill_manual(values=c("black",hue_pal()(6)))+
scale_starshape_manual(values=c(1,15,15,15,15,15,15))+
labs(x=bquote("Log"[10]~"Body Mass (g)"),y=bquote("Log"[10]~"Pectoral Base Length (cm)"),
fill="Order",color="Order",starshape="Order")+
theme_classic()+
theme(legend.position=c(0.85,0.3))
grid.arrange(nrow=1,pec_base_1,pec_base_2)
Figure 4.12: Pectoral fin base length scaled against total length (A) and body mass (B) in arthrodires and elasmobranchs. For arthrodires, white stars represent Dunkleosteus, black stars represent arthrodires known from complete body fossils, and gray stars represent arthrodires for which body length was estimated from the OOL equation in Engelman (2023). The black line represents the allometric relationship for elasmobranchs whereas the gray represents the scaling relationship for sharks. Colors in the legend for elasmobranch clades in this figure are followed in the figures below.
pec_base_figure1<-data_recon %>%
drop_na(pec_base,clade,total_length) %>%
filter(!(clade=="Placodermi"&genus!="Dunkleosteus"))%>%
ggplot(aes(total_length,pec_base))+
geom_star(data=. %>% filter(!(clade=="Placodermi"&genus!="Dunkleosteus")),
aes(fill=order,starshape=clade),show.legend=F)+
geom_smooth(formula=y~x,
aes(color=clade),method="lm",alpha=0.2,show.legend=F)+
geom_errorbarh(data=.%>% filter(clade=="Placodermi") %>% drop_na(minlength),
aes(xmin=minlength,xmax=maxlength),
height=0.75)+
ggtitle("A")+
geom_star(data=. %>% filter(genus=="Dunkleosteus"),
aes(fill=order,starshape=clade),show.legend=F,size=2.5)+
geom_star(data=.%>%filter(clade=="Placodermi"&genus!="Dunkleosteus"),
color="white",fill="white",aes(starshape=clade),size=3,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="total length"),
color="black",fill="black",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="estimated t.l."),
color="black",fill="gray45",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi"&genus!="Dunkleosteus"),
color="black",fill=NA,aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
scale_fill_manual(values=c("white",hue_pal()(6)))+
scale_starshape_manual(values=c(15,1))+
scale_color_manual(values=c("black","dark grey","red"))+
labs(x="Total Length (cm)",
y="Pectoral Base Length (cm)") +
coord_cartesian(xlim=c(-1,700),ylim=c(-1,50)) +
theme_classic()
pec_base_figure2 <- data_recon %>%
drop_na(pec_base,clade,body_mass) %>%
filter(!(clade=="Placodermi"&genus!="Dunkleosteus"))%>%
ggplot(aes(body_mass,pec_base))+
geom_smooth(formula=y~x,aes(color=clade),method="lm",se=F,show.legend=T)+
geom_star(aes(starshape=clade),fill="white")+
geom_star(aes(fill=order,starshape=clade),show.legend = F)+
geom_smooth(formula=y~x,
aes(color=clade),method="lm",alpha=0.2,show.legend=F)+
geom_errorbarh(data=.%>% filter(clade=="Placodermi") %>% drop_na(minmass),
aes(xmin=minmass,xmax=maxmass),
height=.02)+
geom_star(data=.%>%filter(clade=="Placodermi"),
color="white",fill="white",aes(starshape=clade),size=3,
starstroke=0.4,show.legend = F)+
geom_star(data=.%>%filter(genus=="Dunkleosteus"),
color="black",fill="white",aes(starshape=clade),size=2.5,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="total length"),
color="black",fill="black",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="estimated t.l."),
color="black",fill="black",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F,alpha=0.7)+
geom_star(data=.%>%filter(clade=="Placodermi"&genus!="Dunkleosteus"),
color="black",fill=NA,aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
ggtitle("B")+
scale_x_continuous(trans="log10",
breaks = scales::trans_breaks("log10", function(x) 10^x,n=5),
labels = scales::trans_format("log10", scales::math_format(10^.x)))+
scale_y_continuous(trans="log10")+
scale_color_manual(values=c("black","dark grey"),
labels=c("Elasmobranchii","*Dunkleosteus*"))+
scale_fill_manual(guide="none",values=c("white",hue_pal()(6)))+
scale_starshape_manual(values=c(15,1),
labels=c("Elasmobranchii","*Dunkleosteus*"))+
labs(x=bquote("Log"[10]~"Body Mass (g)"),y=bquote("Log"[10]~"Pectoral Base Length (cm)"),
fill="Clade",color="Clade",starshape="Clade")+
coord_cartesian(xlim=c(36,2270000),ylim=c(1,50))+
theme_classic()+
theme(legend.position=c(0.75,0.2),
legend.text = element_markdown())+
guides(shape=(guide_legend(override.aes=list(fill = c("white")))))
pectoral_base_2<-grid.arrange(nrow=1,pec_base_figure1,pec_base_figure2)
Figure 4.13: Pectoral fin base length scaled against total length (A) and body mass (B) showing scaling patterns in Dunkleosteus (white stars, gray line) versus elasmobranchs (circles, black line). The outlier point Rhincodon is not shown to make it easier to interpret points in the rest of the graph. This figure is identical to Figure 20 of the main manuscript.
# These x,y coordinates are supposed to be the coordinates ggplot would normally plot if excluding the outlier Rhincodon
ggsave(filename="Reconstruction of Dunkleosteus Figure 20 (Pectoral Base).tiff",
pectoral_base_2,
device="tiff",width=175,height=100,
dpi=600,units="mm",compression="lzw")
When comparing pectoral fin base size in arthrodires and nektonic sharks, Dunkleosteus has a much larger pectoral fin base than extant sharks and shows clear positive allometry. However, when comparing against body mass, pectoral fin base size scales along roughly the same line as sharks (possibly a little larger, but not much) and scales with geometric similarity. This is probably because Dunkleosteus shows positive allometry in fineness ratio, and thus positive allometry in body mass at larger body lengths.
When adding additional arthrodires to the analysis, these taxa show similar pectoral fin bases to extant sharks when graphed against untransformed total length or log10-transformed body mass. The only exceptions are the pachyosteomorphs Amazichthys and Eastmanosteus, which have larger pectoral fins base closer in size to juvenile Dunkleosteus. However, arthrodires showing similar pectoral fin base sizes to modern sharks may be an artifact of the relationship between pectoral fin base length and total length not being log-transformed. When the same data are log-transformed (i.e., changed to an allometric scale), they show a relatively consistent, positively allometric relationship between pectoral fin base length and total length (see figure 4.15, below).
grid.arrange(nrow=1,
data_recon %>%
drop_na(pec_base,body_mass,clade,order) %>%
ggplot(aes(body_mass,pec_base))+
geom_errorbarh(data=.%>% filter(clade=="Placodermi") %>% drop_na(minmass),
aes(xmin=minmass,xmax=maxmass),
height=0.75)+
geom_star(aes(fill=order,starshape=clade),show.legend=F)+
ggtitle(label="A")+
geom_star(data=.%>%filter(genus=="Dunkleosteus"),
color="black",fill="white",aes(starshape=clade),size=2.5,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi"&genus!="Dunkleosteus"),
color="white",fill="white",aes(starshape=clade),size=3,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="total length"),
color="black",fill="black",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="estimated t.l."),
color="black",fill="gray45",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi"&genus!="Dunkleosteus"),
color="black",fill=NA,aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
scale_x_continuous(trans="log10",
breaks = scales::trans_breaks("log10", function(x) 10^x,n=5),
labels = scales::trans_format("log10", scales::math_format(10^.x)))+
scale_color_manual(values=c("black","dark grey"))+
scale_fill_manual(guide="none",values=c("white",hue_pal()(6)))+
scale_starshape_manual(values=c(15,1))+
labs(x="Body Mass (g)",y="Pectoral Base Length (cm)",
fill="Clade",color="Clade",starshape="Clade")+
theme_classic()+
theme(legend.position=c(0.75,0.2))+
guides(shape=(guide_legend(override.aes=list(fill = c("white"))))),
data_recon %>%
drop_na(pec_base,body_mass,clade,order) %>%
ggplot(aes(body_mass^(1/3),pec_base))+
geom_smooth(formula=y~x,aes(color=clade),method="lm",alpha=0.2,show.legend=F)+
geom_smooth(formula=y~x,color=NA,method="lm",se=F)+
geom_errorbarh(data=.%>% filter(clade=="Placodermi") %>% drop_na(minmass),
aes(xmin=minmass^(1/3),xmax=maxmass^(1/3)),
height=0.75)+
geom_star(aes(fill=order,starshape=clade))+
geom_star(data=.%>%filter(genus=="Dunkleosteus"),
color="black",fill="white",aes(starshape=clade),size=2.5,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi"&genus!="Dunkleosteus"),
color="white",fill="white",aes(starshape=clade),size=3,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="total length"),
color="black",fill="black",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="estimated t.l."),
color="black",fill="gray45",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi"&genus!="Dunkleosteus"),
color="black",fill=NA,aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
ggtitle(label="B")+
scale_color_manual(values=c("black","dark grey"))+
scale_fill_manual(guide="none",values=c("white",hue_pal()(6)))+
scale_starshape_manual(values=c(15,1))+
labs(x=bquote("Body Mass (g)"^"1/3"),y="Pectoral Base Length (cm)",
fill="Clade",color="Clade",starshape="Clade")+
theme_classic()+
theme(legend.position=c(0.75,0.2))+
guides(shape=(guide_legend(override.aes=list(fill = c("white")))))
)
Figure 4.14: Pectoral fin base length scaled against untransformed body mass (A) and body mass raised to the 1/3 power (B). A shows how the two measurements do not scale linearly, because the graph regresses a linear measurement (pectoral fin base length) against a volumetric one (body mass). The scale-location graph of the residuals of an untransformed linear regression model showed significant heteroskedasticity, suggesting log-transformation was necessary. By taking the cubic root of body mass, B converts body mass into a form that can be more directly compared to a linear measurement.
Pectoral fin base length and body mass in Figure 4.12b had to be log transformed, because it involves regressing a linear measurement against a volumetric one (Figure 4.13a). However, if plotting pectoral fin base length against the cubic root of body mass (Figure 4.13b), which essentially transforms the volumetric body mass into a form that can be directly compared against a linear measurement, a similar relationship is found to Figure 4.12b.
data_recon %>%
drop_na(pec_base,clade,total_length) %>%
ggplot(aes(total_length,pec_base))+
geom_star(data=. %>% filter(!(clade=="Placodermi"&genus!="Dunkleosteus")),
aes(fill=order,starshape=clade),show.legend=F)+
geom_smooth(formula=y~x,
aes(color=clade),method="lm",alpha=0.2,show.legend=F)+
geom_errorbarh(data=.%>% filter(clade=="Placodermi") %>% drop_na(minlength),
aes(xmin=minlength,xmax=maxlength),
height=0.02)+
geom_star(data=. %>% filter(genus=="Dunkleosteus"),
aes(fill=order,starshape=clade),show.legend=F,size=2.5)+
geom_star(data=.%>%filter(clade=="Placodermi"&genus!="Dunkleosteus"),
color="white",fill="white",aes(starshape=clade),size=3,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="total length"),
color="black",fill="black",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi" & genus!="Dunkleosteus" &
length_as=="estimated t.l."),
color="black",fill="gray45",aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
geom_star(data=.%>%filter(clade=="Placodermi"&genus!="Dunkleosteus"),
color="black",fill=NA,aes(starshape=clade),size=2.5,
starstroke=0.33,show.legend = F)+
scale_x_continuous(trans="log10")+
scale_y_continuous(trans="log10")+
scale_fill_manual(values=c("white",hue_pal()(6)))+
scale_starshape_manual(values=c(15,1))+
scale_color_manual(values=c("black","dark grey","red"))+
theme_classic()+
labs(x=bquote("Log"[10]~"Total Length (cm)"),
y=bquote("Log"[10]~"Pectoral Base Length (cm)"))
Figure 4.15: Plot of log10-transformed pectoral fin base length plotted against log10 total length. Black line represents allometric relationship for extant Chondrichthyes and gray line for Eubrachythoraci. White stars represent Dunkleosteus, black stars represent arthrodires known from complete remains, and gray stars represent taxa with total length estimated via OOL.
When scaling log10 pectoral fin base length against log10 total length, arthrodires generally have proportionally larger pectoral fin bases than extant nektonic chondrichthyans. This relationship is generally obscured in the prior figure because the data was not log-transformed, making proportional relationships more difficult to discern at smaller sizes. This is rather surprising given coccosteomorphs are generally considered to be less nektonic than carcharhinids, hexanchiids, etc., and non-pachyosteomorph arthrodires are often considered to have small fin bases.
Within Arthrodira there is some variation in pectoral fin base size. Smaller pectoral fin bases are seen in Millerosteus and camuropiscids, whereas larger ones are seen in pachyosteomorphs. It is possible the large fin base of Dunkleosteus is related to the general enlargement of the pectoral fenestra in pachyosteomorph arthrodires (Stensiö 1959, Miles 1969, Carr 1995), as the aspinothoracidans Amazichthys, Brachyosteus, Enseosteus, and Heintzichthys and the geologically older dunkleosteoid Eastmanosteus calliaspis also have relatively large pectoral fin bases for their size. However, it is also possible this is a broader pattern due to allometry. Including data from additional pachyosteomorphs might provide a better understanding of pectoral fin scaling in arthrodires, but a more extensive examination of pectoral fin base evolution across eubrachythoracid arthrodires is beyond the scope of this study.
data_recon %>%
drop_na(pec_base) %>%
filter(!(clade=="Placodermi"&genus!="Dunkleosteus")) %>%
mutate(clade=ifelse(genus=="Dunkleosteus","Dunkleosteus",clade)) %$%
lm(log10(pec_base)~log10(body_mass)*clade,.) %>%
summary()
##
## Call:
## lm(formula = log10(pec_base) ~ log10(body_mass) * clade, data = .)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.176465 -0.050255 -0.002545 0.041159 0.238536
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.490619 0.014986 -32.738 <2e-16 ***
## log10(body_mass) 0.340303 0.004059 83.834 <2e-16 ***
## cladeDunkleosteus 0.230618 0.260401 0.886 0.376
## log10(body_mass):cladeDunkleosteus -0.034505 0.050539 -0.683 0.495
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.07345 on 362 degrees of freedom
## (13 observations deleted due to missingness)
## Multiple R-squared: 0.954, Adjusted R-squared: 0.9536
## F-statistic: 2501 on 3 and 362 DF, p-value: < 2.2e-16
When comparing allometric regression equations between pectoral fin base size and body mass in Dunkleosteus and elasmobranchs (not considering other arthrodires), the two show non-significant differences in slope and intercept.
4.7 Setting up Pectoral and Pelvic Origin Figure
p1_pec_a <- ggplot(rhizo, aes(x, y)) +
geom_polygon(fill = "darkgrey",color="black", alpha = 0.5) +
geom_line(data=data.frame(x=c(1,1),y=c(0.2471672000,-0.03)))+
geom_line(data=data.frame(x=c(0,0),y=c(0.1627831000,-0.03)))+
geom_line(data=data.frame(x=c(0,0.225,0.225),
y=c(0.055,0.055,0.105)),
linewidth=1.25,color="steelblue")+
coord_cartesian(ylim=c(0,0.33))+
annotate("text",label="pre-pectoral length",x=0.257,y=0.03,hjust=1,size=3.163138)+
annotate(geom="text",label="N Species",x=.99,y=0.01,hjust=1,size=3.25)+
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank(),
axis.line.y = element_blank(),
axis.line.x = element_blank())+
theme_void()
p1_pelv_a <- ggplot(rhizo, aes(x, y)) +
geom_polygon(fill = "darkgrey",color="black", alpha = 0.5) +
geom_line(data=data.frame(x=c(1,1),y=c(0.2471672000,-0.03)))+
geom_line(data=data.frame(x=c(0,0),y=c(0.1627831000,-0.03)))+
geom_line(data=data.frame(x=c(0,0.454,0.454),
y=c(0.055,0.055,0.105)),
linewidth=1.25,color="steelblue")+
coord_cartesian(ylim=c(0,0.33))+
annotate("text",label="pre-pelvic length",x=0.454,y=0.03,hjust=0.5,size=3.163138)+
annotate(geom="text",label="N Species",x=.99,y=0.01,hjust=1,size=3.25)+
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank(),
axis.line.y = element_blank(),
axis.line.x = element_blank())+
theme_void()
p2_pec_a <- prepec_2 %>%
mutate(higher_group=ifelse(higher_group=="Dunkleosteus","Dunkleosteus*",as.character(higher_group)),
higher_group=ifelse(higher_group=="Arthrodira (known lengths)","Arthrodira (known)*",higher_group),
higher_group=ifelse(higher_group=="Arthrodira (est. lengths)","Arthrodira (est.)*",higher_group)) %>%
mutate(higher_group=factor(higher_group,ordered=T,
levels=c("Dunkleosteus*","Eastmanosteus",
"Arthrodira (known)*",
"Arthrodira (est.)*",
"Other Elasmobranchii", "Holocephali",
"Alopias","Sarcopterygii","Basal Actinopterygii",
"Ichthyodectiformes", "Basal Teleostei",
"Otocephala", "Stem Euteleostei",
"Acanthopterygii","Anguilliform Taxa"))) %>%
ggplot(aes(x=prepectoral_length/total_length,y=higher_group)) +
coord_cartesian(xlim=c(0,1))+
scale_x_continuous(labels = scales::percent)+
scale_y_discrete(limits=rev)+
labs(x="Pre-Pectoral Length (as percent of total length)",y="Clade")+
geom_vline(data=. %>% filter(genus=="Dunkleosteus"),
aes(xintercept=mean(prepectoral_length/total_length)),
color="#00B0F6",linetype="dashed")+
geom_vline(aes(xintercept=mean(prepectoral_length/total_length)),
linetype="dashed")+
geom_vline(xintercept = 0) +
geom_vline(xintercept = 1) +
geom_violin(aes(fill=clade),show.legend = F,scale="width")+
geom_violin(data=.%>%filter(genus=="Dunkleosteus"),fill="#00B0F6",
show.legend = F,scale="width")+
geom_boxplot(width=0.3)+
geom_star(data=. %>% filter(genus=="Eastmanosteus"),
fill="white",color="black",size=2.5)+
theme(axis.text.y = element_text(face=c(rep("plain",8),"italic",
rep("plain",4),"italic","italic")))
p2_pelv_a_1<-
data_recon %>%
mutate(prepelvic_length=ifelse(specimen %in% "CMC VP8294", 70.77,prepelvic_length),
prepelvic_length=ifelse(specimen %in% "CMNH 7424", 70.15,prepelvic_length),
prepelvic_length=ifelse(specimen %in% "CMNH 6090", 121.77,prepelvic_length),
prepelvic_length=ifelse(specimen %in% "CMNH 7054", 126.06,prepelvic_length),
prepelvic_length=ifelse(specimen %in% "CMNH 5768", 137.71,prepelvic_length)) %>%
filter(length_as=="total length"|genus=="Dunkleosteus") %>%
mutate(higher_group=ifelse(order %in% c("Aulopiformes","Gadiformes"),"Aulopiformes, Gadiformes",higher_group),
higher_group=ifelse(family %in% c("Dalatiidae","Etmopteridae","Oxynotidae","Somniosidae","Centrophoridae"),"Deep Sea Squaliformes",higher_group),
higher_group=ifelse(order == "Chimaeriformes","Holocephali",higher_group),
higher_group=ifelse(higher_group == "Acanthopterygii","Other Acanthopterygii",
higher_group),
higher_group=ifelse(order == "Beloniformes","Beloniformes",higher_group),
higher_group=ifelse(genus == "Alopias","*Alopias*",higher_group),
higher_group=ifelse(order == "Ichthyodectiformes","Ichthyodectiformes",higher_group),
higher_group=ifelse(higher_group=="Chondrichthyes","Other Elasmobranchii",higher_group),
higher_group=ifelse(genus=="Dunkleosteus","*Dunkleosteus* (est.)*",higher_group))
# summarising values for non-Dunkleosteus taxa (total length)
p2_pelv_a_2<-bind_rows(p2_pelv_a_1 %>%
filter(genus == "Dunkleosteus") %>%
drop_na(prepelvic_length,total_length),
p2_pelv_a_1 %>%
filter(genus!="Dunkleosteus"|is.na(higher_group)) %>%
group_by(taxon) %>%
drop_na(prepelvic_length,total_length) %>%
summarize(across(where(is.numeric),mean),
higher_group=unique(higher_group),
taxon=unique(taxon),genus=unique(genus),
species=unique(species),
clade=unique(clade,na.rm=F),
shape=unique(shape))) %>%
mutate(higher_group=factor(higher_group,ordered = T,
levels = c("*Dunkleosteus* (est.)*","Arthrodira",
"Other Elasmobranchii","*Alopias*",
"Deep Sea Squaliformes","Holocephali",
"Sarcopterygii", "Basal Actinopterygii", "Ichthyodectiformes", "Basal Teleostei", "Otocephala", "Stem Euteleostei", "Aulopiformes, Gadiformes", "Beloniformes", "Other Acanthopterygii")))
p2_pelv_a<-p2_pelv_a_2%>%
ggplot(aes(x=prepelvic_length/total_length,y=higher_group,fill=clade)) +
labs(x="Pre-Pelvic Length (as percent of total length)",y="Clade")+
geom_vline(xintercept = 0) +
geom_vline(xintercept = 1) +
geom_vline(data=.%>%filter(!(order %in% c("Aulopiformes","Gadiformes","Beloniformes")|
genus %in% c("Dunkleosteus")|
higher_group=="Other Acanthopterygii")),
aes(xintercept=mean(prepelvic_length/total_length)),linetype="dashed")+
scale_x_continuous(labels = scales::percent)+
scale_y_discrete(limits=rev)+
geom_violin(scale="width",show.legend=F)+
geom_violin(data=. %>% filter(genus=="Dunkleosteus"),
scale="width",fill="#00B0F6",show.legend=F)+
geom_boxplot(width=0.3,fill="white")+
geom_text(data=. %>%
summarise(.by=taxon,prepelvic_length=mean(prepelvic_length),higher_group=unique(higher_group),
clade=unique(clade))%>%
summarise(.by=higher_group,N=n(),clade=unique(clade)),
aes(y=higher_group,label=N),x=.99,hjust=1,size=3.25)+
theme(axis.title.y=element_blank(),
axis.text.y = element_markdown())
pec_pelv_figure<-wrap_plots(p1_pec_a / p2_pec_a +
theme(axis.title.y=element_blank())+
geom_text(data=. %>%
summarise(.by=taxon,ppl=mean(prepectoral_length),higher_group=unique(higher_group),
clade=unique(clade))%>%
summarise(.by=higher_group,N=n(),clade=unique(clade)),
aes(y=higher_group,label=N),x=.99,hjust=1,size=3.25)+
plot_layout(heights = 1:2) & theme(plot.margin = margin(0, 20, 0, 0)),
(p1_pelv_a / p2_pelv_a +
plot_layout(heights = 1:2) & theme(plot.margin = margin(0, 20, 0, 0))),ncol=1)
ggsave(filename="Reconstruction of Dunkleosteus Figure 11 (Pectoral-Pelvic Proportions).tiff",
plot=pec_pelv_figure,device="tiff",
width=175,height=220,units="mm",dpi=600,compression="lzw")
4.8 Caudal Peduncle
4.8.1 Peduncle height in Amazichthys
grid.arrange(nrow=1,
data_recon%>%
filter(family %in% c("Scombridae","Lamnidae","Megalopidae","Sphyraenidae")|order %in% c("Carangiformes","Istiophoriformes")|genus=="Amazichthys") %>%
filter(!genus %in% c("Mitsukurina","Carcharhias","Odontaspis")) %>%
drop_na(peduncle_height,body_depth) %>%
mutate(order=case_when(genus=="Amazichthys" ~ "Amazichthys",
order == "Lamniformes" ~ "Lamnidae",
order == "Scombriformes" ~ "Scombridae",
family == "Megalopidae" ~ "Megalopidae",
order == "Carangaria incertae sedis" ~ "Sphyraenidae",
order == "Istiophoriformes" ~ "Istiophoriformes",
family %in% c("Carangidae","Coryphaenidae") ~ "Carangidae + Coryphaenidae",
family %in% c("Rachycentridae","Echeneidae") ~ "Echeneidae + Rachycentridae")) %>%
ggplot(aes(x=peduncle_height/body_depth,y=order))+
ggtitle("As percentage of body depth")+
scale_y_discrete(limits=rev) +
scale_x_continuous(labels = scales::percent) +
geom_vline(data=. %>% filter(genus=="Amazichthys"),
aes(xintercept=peduncle_height/body_depth),
color="darkgrey") +
labs(y=element_blank(),x="Peduncle Height as % of Body Depth") +
geom_violin(data =. %>% filter(genus!="Amazichthys"), aes(fill=order),scale="width")+
geom_boxplot(data = . %>% filter(genus!="Amazichthys"), width=0.3)+
geom_star(data = . %>% filter(genus=="Amazichthys"),fill="black",size=3) +
theme(legend.position="NA",
axis.text.y = element_text(face=c(rep("plain",7),"italic"))),
data_recon%>%
filter(family %in% c("Scombridae","Lamnidae","Megalopidae","Sphyraenidae")|order %in% c("Carangiformes","Istiophoriformes")|genus=="Amazichthys") %>%
filter(!genus %in% c("Mitsukurina","Carcharhias","Odontaspis")) %>%
drop_na(peduncle_height,precaudal_length) %>%
mutate(order=case_when(genus=="Amazichthys" ~ "Amazichthys",
order == "Lamniformes" ~ "Lamnidae",
order == "Scombriformes" ~ "Scombridae",
order == "Elopiformes" ~ "Megalopidae",
order == "Carangaria incertae sedis" ~ "Sphyraenidae",
order == "Istiophoriformes" ~ "Istiophoriformes",
family %in% c("Carangidae","Coryphaenidae") ~ "Carangidae + Coryphaenidae",
family %in% c("Rachycentridae","Echeneidae") ~ "Echeneidae + Rachycentridae")) %>%
ggplot(aes(x=peduncle_height/precaudal_length,y=order))+
ggtitle("As percentage of precaudal length")+
scale_y_discrete(limits=rev) +
scale_x_continuous(labels = scales::percent) +
geom_vline(data=. %>% filter(genus=="Amazichthys"),
aes(xintercept=peduncle_height/precaudal_length),
color="darkgrey") +
labs(y=element_blank(),x="Peduncle Height as % of Precaudal Length") +
geom_violin(data =. %>% filter(genus!="Amazichthys"), aes(fill=order),scale="width")+
geom_boxplot(data = . %>% filter(genus!="Amazichthys"), width=0.3)+
geom_star(data = . %>% filter(genus=="Amazichthys"),fill="black",size=3) +
theme(legend.position="NA",
axis.text.y = element_text(face=c(rep("plain",7),"italic")))
)
Figure 4.16: Caudal peduncle height in Amazichthys trinajsticae compared to select tachynektonic fish groups, measured as a proportion of body depth (left) and precaudal length (right). Caudal peduncle height in Amazichthys measured from photographs of specimen AA.MEM.DS.8 in Jobbins et al. 2022.
It is possible the peduncle as preserved in Amazichthys is too deep and has been altered by taphonomic deformation. The reconstruction in Engelman (2023) provides an alternative measurement of peduncle height in this taxon, because the peduncle was reconstructed to be slightly narrower than preserved assuming some taphonomic deformation. This reconstruction was made directly from the proportions of the holotype with oversight from the lead author of the paper describing Amazichthys (M. Jobbins pers. comm., September 2022), so its proportions are relatively reliable.
grid.arrange(nrow=1,
data_recon%>%
filter(family %in% c("Scombridae","Lamnidae","Megalopidae","Sphyraenidae")|order %in% c("Carangiformes","Istiophoriformes")|genus=="Amazichthys") %>%
mutate(peduncle_height=ifelse(genus=="Amazichthys",6.679,peduncle_height)) %>%
filter(!genus %in% c("Mitsukurina","Carcharhias","Odontaspis")) %>%
drop_na(peduncle_height,body_depth) %>%
mutate(order=case_when(genus=="Amazichthys" ~ "Amazichthys",
order == "Lamniformes" ~ "Lamnidae",
order == "Scombriformes" ~ "Scombridae",
family == "Megalopidae" ~ "Megalopidae",
order == "Carangaria incertae sedis" ~ "Sphyraenidae",
order == "Istiophoriformes" ~ "Istiophoriformes",
family %in% c("Carangidae","Coryphaenidae") ~ "Carangidae + Coryphaenidae",
family %in% c("Rachycentridae","Echeneidae") ~ "Echeneidae + Rachycentridae")) %>%
ggplot(aes(x=peduncle_height/body_depth,y=order))+
ggtitle("As percentage of body depth")+
scale_y_discrete(limits=rev) +
scale_x_continuous(labels = scales::percent) +
geom_vline(data=. %>% filter(genus=="Amazichthys"),
aes(xintercept=peduncle_height/body_depth),
color="darkgrey") +
labs(y=element_blank(),x="Peduncle Height as % of Body Depth") +
geom_violin(data =. %>% filter(genus!="Amazichthys"), aes(fill=order),scale="width")+
geom_boxplot(data = . %>% filter(genus!="Amazichthys"), width=0.3)+
geom_star(data = . %>% filter(genus=="Amazichthys"),fill="black",size=3) +
theme(legend.position="NA",
axis.text.y = element_text(face=c(rep("plain",7),"italic"))),
data_recon%>%
filter(family %in% c("Scombridae","Lamnidae","Megalopidae","Sphyraenidae")|order %in% c("Carangiformes","Istiophoriformes")|genus=="Amazichthys") %>%
mutate(peduncle_height=ifelse(genus=="Amazichthys",6.679,peduncle_height)) %>%
filter(!genus %in% c("Mitsukurina","Carcharhias","Odontaspis")) %>%
drop_na(peduncle_height,precaudal_length) %>%
mutate(order=case_when(genus=="Amazichthys" ~ "Amazichthys",
order == "Lamniformes" ~ "Lamnidae",
order == "Scombriformes" ~ "Scombridae",
order == "Elopiformes" ~ "Megalopidae",
order == "Carangaria incertae sedis" ~ "Sphyraenidae",
order == "Istiophoriformes" ~ "Istiophoriformes",
family %in% c("Carangidae","Coryphaenidae") ~ "Carangidae + Coryphaenidae",
family %in% c("Rachycentridae","Echeneidae") ~ "Echeneidae + Rachycentridae")) %>%
ggplot(aes(x=peduncle_height/precaudal_length,y=order))+
ggtitle("As percentage of precaudal length")+
scale_y_discrete(limits=rev) +
scale_x_continuous(labels = scales::percent) +
geom_vline(data=. %>% filter(genus=="Amazichthys"),
aes(xintercept=peduncle_height/precaudal_length),
color="darkgrey") +
labs(y=element_blank(),x="Peduncle Height as % of Precaudal Length") +
geom_violin(data =. %>% filter(genus!="Amazichthys"), aes(fill=order),scale="width")+
geom_boxplot(data = . %>% filter(genus!="Amazichthys"), width=0.3)+
geom_star(data = . %>% filter(genus=="Amazichthys"),fill="black",size=3) +
theme(legend.position="NA",
axis.text.y = element_text(face=c(rep("plain",7),"italic")))
)
Figure 4.17: Caudal peduncle height in Amazichthys trinajsticae using the peduncle height in the reconstruction of Engelman (2023).
However, this has little effect on how unusually deep the peduncle of Amazichthys trinajsticae is relative to either precaudal length or body depth. It is almost impossible for Amazichthys to have a narrow lamnid/scombrid/istiophoriform-like peduncle, because this would require the peduncle to nearly double in height (go from ~8 cm to ~3.5 cm) due to decay, crushing, and taphonomic distortion, something that would be very difficult to achieve if the peduncle were originally narrow. This is even more so given both AA.MEM.DS.8 and PIMUZ A/I 4773 seem to show relatively deep peduncles (Jobbins et al. 2022: fig. 2).
4.8.2 Estimating peduncle height in Dunkleosteus
4.8.2.1 Estimating peduncle height using pelagic fishes
peduncle_height_1 <- data_recon %>%
filter(family %in% c("Scombridae","Lamnidae","Cetorhinidae","Megachasmidae","Megalopidae","Sphyraenidae")|
order %in% c("Carangiformes","Istiophoriformes")|
genus=="Amazichthys") %$%
lm(log(peduncle_height)~log(body_depth)*log(precaudal_length),.)
summary(peduncle_height_1)
##
## Call:
## lm(formula = log(peduncle_height) ~ log(body_depth) * log(precaudal_length),
## data = .)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.94597 -0.23568 0.00498 0.19010 1.00082
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.750252 0.324060 -8.487 4.51e-16 ***
## log(body_depth) -0.081094 0.135864 -0.597 0.551
## log(precaudal_length) 0.952152 0.082407 11.554 < 2e-16 ***
## log(body_depth):log(precaudal_length) 0.001895 0.027264 0.069 0.945
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3222 on 389 degrees of freedom
## (136 observations deleted due to missingness)
## Multiple R-squared: 0.8579, Adjusted R-squared: 0.8568
## F-statistic: 782.6 on 3 and 389 DF, p-value: < 2.2e-16
data_recon %>%
filter(genus %in% c("Dunkleosteus","Coccosteus","Incisoscutum","Amazichthys")) %>%
filter(!is.na(peduncle_height)|genus=="Dunkleosteus") %>%
arrange(genus)%>%
drop_na(precaudal_length,body_depth) %>%
augment(peduncle_height_1,
newdata=.,
interval="predict") %>%
mutate(across(.fitted:.upper,~exp(.)*regression.stats(peduncle_height_1)$CF),
taxon=str_replace(taxon,"_"," ")) %>%
select(taxon,specimen,body_depth,precaudal_length,peduncle_height,.fitted,.lower,.upper)%>%
kable(digits=c(1,1,1,1,2,2,2,2),
align=c("l","c","c","c","c","c","c","c"),
col.names=c("Taxon","Specimen","Body Depth","Precaudal Length",
"Actual Peduncle Depth",
"Fitted","Lower","Upper"),
caption="Predicting the height of the caudal peduncle in <i>Dunkleosteus</i> using a model containing only large-bodied, pelagic fishes. All measurements in cm.") %>%
column_spec(1,italic=T) %>%
kable_styling()
Taxon | Specimen | Body Depth | Precaudal Length | Actual Peduncle Depth | Fitted | Lower | Upper |
---|---|---|---|---|---|---|---|
Amazichthys trinajsticae | AA.MEM.DS.8 | 18.0 | 69.6 | 8.00 | 3.10 | 1.64 | 5.85 |
Coccosteus cuspidatus | Recon. (M & W 1968) | 6.8 | 26.9 | 2.82 | 1.34 | 0.71 | 2.53 |
Dunkleosteus terrelli | CMNH 5768 | 100.0 | 265.9 | – | 9.90 | 5.20 | 18.84 |
Dunkleosteus terrelli | CMNH 7424 | 38.2 | 147.2 | – | 6.01 | 3.19 | 11.34 |
Dunkleosteus terrelli | CMNH 6090 | 75.6 | 221.0 | – | 8.45 | 4.46 | 16.02 |
Dunkleosteus terrelli | CMNH 7054 | 72.5 | 230.6 | – | 8.83 | 4.66 | 16.73 |
Dunkleosteus terrelli | CMNH 6194 | 36.5 | 129.5 | – | 5.33 | 2.83 | 10.07 |
Dunkleosteus terrelli | CMC VP8294 | 33.0 | 122.6 | – | 5.09 | 2.70 | 9.62 |
Incisoscutum ritchei | Recon. (Trinajstic et al. 2013) | 5.3 | 20.7 | 1.94 | 1.06 | 0.56 | 2.01 |
Estimating the peduncle height using only large-bodied pelagic fishes produces a relatively narrow peduncle. However, this estimate potentially uses circular logic to estimate the peduncle height of Dunkleosteus by assuming this taxon is pelagic, as well as insensitive to clade-specific differences in peduncle height between arthrodires and other fishes (as seen in it underestimating peduncle height in all arthrodires where peduncle height can be approximated). Therefore, a broader approach using data from a wider variety of fishes was used.
4.8.2.2 Estimating peduncle height using all fishes
This model seeks to estimate the caudal peduncle depth of Dunkleosteus terrelli using all fishes, not just pelagic ones.
peduncle_height_2 <- data_recon %>%
drop_na(peduncle_height,body_depth,precaudal_length) %$%
lm(log(peduncle_height)~log(body_depth)*log(precaudal_length),.)
summary(peduncle_height_2)
##
## Call:
## lm(formula = log(peduncle_height) ~ log(body_depth) * log(precaudal_length),
## data = .)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.42466 -0.17506 0.04972 0.23949 1.47377
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.225664 0.049001 -25.013 < 2e-16 ***
## log(body_depth) 0.603490 0.025882 23.317 < 2e-16 ***
## log(precaudal_length) 0.283442 0.023038 12.303 < 2e-16 ***
## log(body_depth):log(precaudal_length) -0.021561 0.005683 -3.794 0.000153 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3613 on 1965 degrees of freedom
## Multiple R-squared: 0.8141, Adjusted R-squared: 0.8138
## F-statistic: 2869 on 3 and 1965 DF, p-value: < 2.2e-16
Based on this, caudal peduncle height in fishes has a significant correlation with trunk height (body_depth
), precaudal length, as well as fineness ratio (the interaction between body_depth
and precaudal_length
).
data_recon %>%
filter(genus %in% c("Amazichthys","Dunkleosteus","Coccosteus","Incisoscutum")) %>%
filter(!is.na(peduncle_height)|genus=="Dunkleosteus") %>%
arrange(genus)%>%
drop_na(precaudal_length,body_depth) %>%
augment(peduncle_height_2,
newdata=.,
interval="predict") %>%
mutate(across(.fitted:.upper,~exp(.)*regression.stats(peduncle_height_2)$CF),
taxon=str_replace(taxon,"_"," ")) %>%
select(taxon,specimen,body_depth,precaudal_length,peduncle_height,.fitted,.lower,.upper)%>%
kable(digits=c(1,1,1,1,2,2,2,2),
align=c("l","c","c","c","c","c","c","c"),
col.names=c("Taxon","Specimen","Body Depth","Precaudal Length",
"Actual Peduncle Depth",
"Fitted","Lower","Upper"),
caption="Predicting the height of the caudal peduncle in <i>Dunkleosteus</i> using a model containing all fishes and no life habits data. All measurements in cm.") %>%
column_spec(1,italic=T) %>%
kable_styling()
Taxon | Specimen | Body Depth | Precaudal Length | Actual Peduncle Depth | Fitted | Lower | Upper |
---|---|---|---|---|---|---|---|
Amazichthys trinajsticae | AA.MEM.DS.8 | 18.0 | 69.6 | 8.00 | 4.58 | 2.26 | 9.31 |
Coccosteus cuspidatus | Recon. (M & W 1968) | 6.8 | 26.9 | 2.82 | 2.21 | 1.09 | 4.49 |
Dunkleosteus terrelli | CMNH 5768 | 100.0 | 265.9 | – | 14.12 | 6.92 | 28.78 |
Dunkleosteus terrelli | CMNH 7424 | 38.2 | 147.2 | – | 7.86 | 3.87 | 15.98 |
Dunkleosteus terrelli | CMNH 6090 | 75.6 | 221.0 | – | 11.91 | 5.85 | 24.25 |
Dunkleosteus terrelli | CMNH 7054 | 72.5 | 230.6 | – | 11.76 | 5.78 | 23.95 |
Dunkleosteus terrelli | CMNH 6194 | 36.5 | 129.5 | – | 7.48 | 3.68 | 15.21 |
Dunkleosteus terrelli | CMC VP8294 | 33.0 | 122.6 | – | 7.03 | 3.46 | 14.30 |
Incisoscutum ritchei | Recon. (Trinajstic et al. 2013) | 5.3 | 20.7 | 1.94 | 1.81 | 0.89 | 3.68 |
peduncle_height_3 <- data_recon %>%
drop_na(peduncle_height,body_depth,precaudal_length) %$%
lm(log(peduncle_height)~log(body_depth)*log(precaudal_length)+habitat,.)
summary(peduncle_height_3)
##
## Call:
## lm(formula = log(peduncle_height) ~ log(body_depth) * log(precaudal_length) +
## habitat, data = .)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.50435 -0.16265 0.05342 0.21090 1.53215
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.284086 0.051110 -25.124 < 2e-16 ***
## log(body_depth) 0.520267 0.026557 19.591 < 2e-16 ***
## log(precaudal_length) 0.318867 0.021929 14.541 < 2e-16 ***
## habitatdemersal 0.075302 0.030487 2.470 0.0136 *
## habitatneritic -0.132858 0.033209 -4.001 6.55e-05 ***
## habitatpelagic -0.258872 0.035271 -7.339 3.13e-13 ***
## log(body_depth):log(precaudal_length) -0.002201 0.005724 -0.384 0.7007
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3414 on 1957 degrees of freedom
## (5 observations deleted due to missingness)
## Multiple R-squared: 0.8345, Adjusted R-squared: 0.834
## F-statistic: 1645 on 6 and 1957 DF, p-value: < 2.2e-16
Adding in life habits as an additional explanatory variable seems to have a significant correlative effect.
data_recon %>%
filter(genus %in% c("Dunkleosteus","Coccosteus","Incisoscutum","Amazichthys")) %>%
filter(!is.na(peduncle_height)|genus=="Dunkleosteus") %>%
arrange(genus)%>%
drop_na(precaudal_length,body_depth) %>%
augment(peduncle_height_3,
newdata=.,
interval="predict") %>%
mutate(across(.fitted:.upper,~exp(.)*regression.stats(peduncle_height_3)$CF),
taxon=str_replace(taxon,"_"," ")) %>%
select(taxon,specimen,body_depth,precaudal_length,peduncle_height,.fitted,.lower,.upper)%>%
kable(digits=c(1,1,1,1,2,2,2,2),
align=c("l","c","c","c","c","c","c","c"),
col.names=c("Taxon","Specimen","Body Depth","Precaudal Length",
"Actual Peduncle Depth",
"Fitted","Lower","Upper"),
caption="Predicting the height of the caudal peduncle in <i>Dunkleosteus</i> using a model containing all fishes and allowing covariance with life habits. All measurements in cm.") %>%
column_spec(1,italic=T) %>%
kable_styling()
Taxon | Specimen | Body Depth | Precaudal Length | Actual Peduncle Depth | Fitted | Lower | Upper |
---|---|---|---|---|---|---|---|
Amazichthys trinajsticae | AA.MEM.DS.8 | 18.0 | 69.6 | 8.00 | 3.84 | 1.97 | 7.51 |
Coccosteus cuspidatus | Recon. (M & W 1968) | 6.8 | 26.9 | 2.82 | 2.42 | 1.24 | 4.72 |
Dunkleosteus terrelli | CMNH 5768 | 100.0 | 265.9 | – | 13.96 | 7.12 | 27.35 |
Dunkleosteus terrelli | CMNH 7424 | 38.2 | 147.2 | – | 7.12 | 3.64 | 13.93 |
Dunkleosteus terrelli | CMNH 6090 | 75.6 | 221.0 | – | 11.43 | 5.84 | 22.39 |
Dunkleosteus terrelli | CMNH 7054 | 72.5 | 230.6 | – | 11.34 | 5.79 | 22.20 |
Dunkleosteus terrelli | CMNH 6194 | 36.5 | 129.5 | – | 6.69 | 3.42 | 13.08 |
Dunkleosteus terrelli | CMC VP8294 | 33.0 | 122.6 | – | 6.24 | 3.19 | 12.21 |
Incisoscutum ritchei | Recon. (Trinajstic et al. 2013) | 5.3 | 20.7 | 1.94 | 1.96 | 1.00 | 3.82 |
However, using this equation to estimate peduncle height in Dunkleosteus has little effect on caudal peduncle height predictions.
rbind(
"Large-bodied pelagic fishes only"=regression.stats(peduncle_height_1),
"All fishes, no habitat"=regression.stats(peduncle_height_2),
"All fishes, with habitat"=regression.stats(peduncle_height_3)
)
Error rates in these models are okay, but not particularly great.
The predicted caudal peduncle height of Coccosteus and Incisoscutum is relatively close to the actual values. However the caudal peduncle of Amazichthys is significantly deeper than expected based on these models. Some of this is because while peduncle height is correlated with precaudal length, body depth, and life habits in fishes, there are other, clade-specific differences that influence caudal peduncle height as well. For example, all carangids have very narrow peduncles, regardless of whether they are pelagic taxa or occupy coastal or more reefal environments. Similarly, despite being closely related and having similar habits, rachycentrids have much deeper peduncles than carangids. Unfortunately, there are too few arthrodires for which the caudal peduncle height can be approximated to include taxonomic group as a variable in these models to expect this to improve model prediction. There is also a concern that these models might be biased towards tachynektonic pelagic fishes (and thus narrower peduncles) at larger sizes, simply because most large-bodied extant fishes are tachynektonic. These uncertainties are why the methods used here were not applied to the reconstruction of Dunkleosteus terrelli.
The peduncle height used for the present reconstruction of Dunkleosteus terrelli (~ 22 cm in CMNH 5768) is within the range of variation allowed by these models. It was calculated assuming shape change due to pelagic habits result in a similar disparity in relative peduncle depth between this taxon and demersal arthrodires (Coccosteus, Incisoscutum) as exists between analogous pelagic and demersal sharks. This is a coarse approximation, and is acknowledged as such. In spite of this, the model presented in this section suggests this estimate may be overly conservative and the peduncle may actually be too deep, predicting a peduncle height of ~15 cm. If the present model is accurate, its prediction would suggest the potential thunniform shape suggested elsewhere in this paper may be correct. However, this is said with the caveat that the model is insensitive to the possibility that arthrodires have proportionally deeper peduncles than other fishes, and accounting for this may result in a slightly deeper peduncle.
5 Other Data
5.1 Vertebral Count and Size in Dunkleosteus
Another feature supporting a smaller size for Dunkleosteus is the relative size of the vertebral column. Neural arches from the anterior axial skeleton are known in D. terrelli (CMNH 50322), but these elements are small relative to the size of the skull and thoracic shield (Johanson et al. 2019: fig. 1.2). This would result in an unusually small vertebral column with a slender notochord if assuming a shark-like body plan as in traditional reconstructions, which seems unlikely for an actively swimming nektonic organism. However, the size of the vertebrae make considerably more sense for a grouper or tuna-like body plan with a wider and deeper head and trunk relative to total length.
Extrapolating the size of the neural arches in CMNH 50322 to total length, and considering that vertebral elements in arthrodires tend to be narrower in the posterior (caudal and post-anal) regions of the axial skeleton (Miles and Westoll 1968), results in an estimated post-thoracic neural arch count of 104 elements (Figure 14 in main text)1. This is comparable to post-thoracic vertebral counts in Coccosteus cuspidatus (75–107, Miles and Westoll 1968: tab. I)
Anterior to the posterior margin of the thoracic shield, the neural arches are partially incorporated into the synarcual by fusion (Johanson et al. 2019). 16 partially fused neural arches are preserved in CMNH 50322, though more may have been present anteriorly and not preserved. This is not counting the “true” synarcual, which is composed of ~14 fully fused, undifferentiated vertebral elements based on the number of visible spinal nerve foramina (Johanson et al. 2013). This would result in a total count of ~124 vertebrae in Dunkleosteus terrelli.
This vertebral count is within the range of variation for sharks, though slightly below average (Springer and Garrick, 1964). It is comparable to taxa like Squalus (96-118), Cetorhinus (110), Mitsukurina (122) and Squatina (121-141), though lower than typical vertebral counts for Carcharias (156-170), Lamnidae (150-197) and Carcharhinidae (110-252) (ibid). This may be because sharks have a significant number of vertebrae anterior to the pectoral girdle above the branchial chamber, whereas in arthrodires these vertebrae are absent due to the posterior extension of the neurocranium and skull (Carr et al. 2009). For example Lamna nasus, a fairly short-bodied shark, there are 18 vertebrae in this region (ZMA.PISC.116165; Kamminga et al. 2017)
These vertebral accounts are approximate, but show the number of vertebrae required for the shorter, stockier Dunkleosteus depicted here better agree with vertebral counts in other arthrodires and sharks.
1 - Neural arch count is used given the haemal arches at the base of the caudal fin in arthrodires may be fusions of two vertebral elements (Miles and Westoll 1968: p. 449).
5.2 Scaling Pelvic Girdle Size in Eastmanosteus calliaspis
Dennis-Bryant (1987) reported a partial pelvic girdle for the specimen NHMUK PV P50877 (see also Trinajstic et al., 2015). This girdle measures 6.04 cm in greatest height (measured parallel to the iliac process, see Dennis-Bryant, 1987: fig. 30a-b). Specimens of Dunkleosteus terrelli were measured the same way, making these measurements comparable between specimens. NHMUK PV P50877 has an OOL of 8.66 cm (Dennis-Bryant 1987: fig. 11), though the angle the specimen was photographed at introduces some uncertainty. Using the OOL equation of Engelman 2023 (the one using individual specimens, body shape, and controlling for the effects of Serranidae, Holocentridae, and Chondrichthyes, see section 10.7.3. in that study’s supplementary information), this produces a total length of 56.88 cm. This results in a pelvic girdle with a height 10.6% estimated total length.
Alternatively, the nuchal plate of NHMUK PV P50877 is 82.1% the length of this plate in the holotype (WAM 70.4.864; Dennis-Bryant 1987: tab. 1). Nuchal length scales isometrically in other arthrodires (Trinajstic and McNamara 1999). Scaling the estimated total length of the holotype reported in Engelman (2023: 79.3 cm) to the size of NHMUK PV P50877 produces an estimated length of 65.1 cm and a relative pelvis height of 9.3% total length.
Regardless of how the size of the pelvis in NHMUK PV P50877 is estimated, it is at least twice the relative size of this element in Dunkleosteus terrelli, and probably around 2.5 times the size of the pelvis in this taxon.
Even if the estimated size of the pelvis in Eastmanosteus is slight overestimated, the height of the pelvis of Incisoscutum in the reconstruction of Trinajstic (2013) is 8.5% the total length of the animal. In Coccosteus the pelvis is 7.5% total length using the reconstruction in Miles and Westoll (1968); this reconstruction was used as total pelvis height was not measurable in any of the preserved specimens available. This would suggest the pelvis in Dunkleosteus is proportionally smaller than these other arthrodires, roughly 15–40% smaller in linear dimensions. In Amazichthys trinajsticae the pelvis is only about 5% total length (Jobbins et al. 2022: fig. 2a-b), closer to but slightly smaller than the relative size seen in Dunkleosteus.
6 References
6.1 Literature References
Ahlberg, P., Trinajstic, K., Johanson, Z., Long, J. 2009. Pelvic claspers confirm chondrichthyan-like internal fertilization in arthrodires. Nature, 460:888-889. https://doi.org/10.1038/nature08176
Ault, J.S., and Luo, J. 2013. A reliable game fish weight estimation model for Atlantic tarpon (Megalops atlanticus). Fisheries Research, 139:110–117. https://doi.org/https://doi.org/10.1016/j.fishres.2012.10.004
Carr, R.K. 1995. Placoderm diversity and evolution. Bulletin du Muséum National d’Histoire Naturelle, 4:85–125.
Carr, R.K., Johanson, Z., and Ritchie, A. 2009. The phyllolepid placoderm Cowralepis mclachlani: Insights into the evolution of feeding mechanisms in jawed vertebrates. Journal of Morphology, 270:775–804. https://doi.org/10.1002/jmor.10719
Cavin, L., Forey, P.L., and Giersch, S. 2013. Osteology of Eubiodectes libanicus (Pictet & Humbert, 1866) and some other ichthyodectiformes (Teleostei): phylogenetic implications. Journal of Systematic Palaeontology, 11:115–177. https://doi.org/10.1080/14772019.2012.691559
Dean, B. 1896. On the vertebral column, fins, and ventral armoring of Dinichthys. Proceedings of the New York Academy of Sciences, 15:157-188.
Dennis-Bryan, K. 1987. A new species of eastmanosteid arthrodire (Pisces: Placodermi) from Gogo, Western Australia. Zoological Journal of the Linnean Society, 90:1–64. https://doi.org/10.1111/j.1096-3642.1987.tb01347.x
Dennis, K., and Miles, R.S. 1979. Eubrachythoracid arthrodires with tubular rostral plates from Gogo, Western Australia. Zoological Journal of the Linnean Society, 67:297–328. https://doi.org/10.1111/j.1096-3642.1979.tb01118.x
Engelman, R.K. 2023. A Devonian fish tale: A new method of body length estimation suggests much smaller sizes for Dunkleosteus terrelli (Placodermi: Arthrodira). Diversity, 15:318. https://doi.org/10.3390/d15030318
Gleiss, A.C., Potvin, J., and Goldbogen, J.A. 2017. Physical trade-offs shape the evolution of buoyancy control in sharks. Proceedings of the Royal Society B: Biological Sciences, 284:20171345. https://doi.org/10.1098/rspb.2017.1345
Hubbs, C., Lagler, K., and Smith, G. 2004. Fishes of the Great Lakes Region, Revised Edition, Revised edition. University of Michigan Press, Ann Arbor.https://doi.org/10.3998/mpub.17658
Jobbins, M., Rücklin, M., Ferrón, H.G., and Klug, C. 2022. A new selenosteid placoderm from the Late Devonian of the eastern Anti-Atlas (Morocco) with preserved body outline and its ecomorphology. Frontiers in Ecology and Evolution, 10:969158. https://doi.org/10.3389/fevo.2022.969158
Johanson, Z., Trinajstic, K., Carr, R., and Ritchie, A. 2013. Evolution and development of the synarcual in early vertebrates. Zoomorphology, 132:95–110. https://doi.org/10.1007/s00435-012-0169-9
Johanson, Z., Trinajstic, K., Cumbaa, S., and Ryan, M.J. 2019. Fusion in the vertebral column of the pachyosteomorph arthrodire Dunkleosteus terrelli (‘Placodermi’). Palaeontologia Electronica, 22.2.20A:1–13. https://doi.org/10.26879/872
Kamminga, P., De Bruin, P.W., Geleijns, J., and Brazeau, M.D. 2017. X-ray computed tomography library of shark anatomy and lower jaw surface models. Scientific Data, 4:170047. https://doi.org/10.1038/sdata.2017.47
Kogan, I., S. Pacholak, M. Licht, J. W. Schneider, C. Brucker, and S. Brandt. 2015. The invisible fish: hydrodynamic constraints for predator-prey interaction in fossil fish Saurichthys compared to recent actinopterygians. Biology Open 4:1715-1726. https://doi.org/10.1242/bio.014720
Lund, R., and Lund, W. 1984. New genera and species of coelacanths from the Bear Gulch limestone (lower Carboniferous) of Montana, U.S.A. Geobios 17:237-244. https://doi.org/10.1016/S0016-6995(84)80145-X
Miles, R.S. 1969. Features of Placoderm Diversification and the Evolution of the Arthrodire Feeding Mechanism. Transactions of the Royal Society of Edinburgh, 68:123–170. https://doi.org/10.1017/S0080456800014629
Miles, R.S., Westoll, T.S. 1968. The Placoderm Fish Coccosteus cuspidatus Miller ex Agassiz from the Middle Old Red Sandstone of Scotland. Part I. Descriptive Morphology. Transactions of the Royal Society of Edinburgh, 67:373-476. https://doi.org/10.1017/S0080456800024078
Millot, J., Anthony, J., and Robineau ,D. 1978. Anatomie de Latimeria Chalumnae, Tome III: Appareil Digestif, Appareil Respiratoire, Appareil Urogenital Glandes Endocrines, Appareil Circulatoire Téguments, Ecailles, Conclusions Générale. CNRS, Paris.
Randall, J.E. 1997. Randall’s tank photos. Collection of 10,000 large-format photos (slides) of dead fishes. Accessed June 29, 2022. www.fishbase.org (see species pages for more details)
Saruwatari, T., Iwata, M., Yabumoto, Y., Hukom, F.D., Peristiwady, T., and Abe, Y. 2019. A detailed morphological measurement of the seventh specimen of the Indonesian coelacanth, Latimeria menadoensis, with a compilation of current morphological data of the species. Bulletin of the Kitakyushu Museum of Natural History and Human History, Series A (Natural History): 17:67-80. https://doi.org/10.34522/kmnh.17.0_67
Schwenk, K. 1995. A utilitarian approach to evolutionary constraint. Zoology, 98:251–262.
Springer, V.G., and Garrick, J.A.F. 1964. A survey of vertebral numbers in sharks. Proceedings of the United States National Museum, 116:73–96. https://10.5479/si.00963801.116-3496.73
Straube, N., Li, C., Claes, J.M., Corrigan, S., and Naylor, G.J.P. 2015. Molecular phylogeny of Squaliformes and first occurrence of bioluminescence in sharks. BMC Evolutionary Biology, 15:162. https://doi.org/10.1186/s12862-015-0446-6
Stensiö, E.A. 1959. On the pectoral fin and shoulder girdle of the arthrodires. Kungligar Svenska Vetenskapakadamiens Handlingar, 8:1–229.
Sternes, P.C., and Shimada, K. 2020. Body forms in sharks (Chondrichthyes: Elasmobranchii) and their functional, ecological, and evolutionary implications. Zoology, 140:125799. https://doi.org/10.1016/j.zool.2020.125799
Trinajstic, K., and McNamara, K.J. 1999. Heterochrony in the Late Devonian arthrodiran fishes Compagopiscis and Incisoscutum. Records of the Western Australian Museum, 57:77–91.
Trinajstic, K., and Hazelton, M. 2007. Ontogeny, phenotypic variation and phylogenetic implications of arthrodires from the Gogo Formation, Western Australia. Journal of Vertebrate Paleontology, 27:571–583. https://doi.org/10.1671/0272-4634(2007)27[571:OPVAPI]2.0.CO;2
Trinajstic, K., Boisvert, C., Long, J., Maksimenko, A., and Johanson, Z. 2015. Pelvic and reproductive structures in placoderms (stem gnathostomes). Biological Reviews, 90:467-501. https://doi.org/10.1111/brv.12118
Trinajstic, K., Long, J.A., Sanchez, S., Boisvert, C.A., Snitting, D., Tafforeau, P., Dupret, V., Clement, A.M., Currie, P.D., Roelofs, B., Bevitt, J.J., Lee, M.S.Y., and Ahlberg, P.E. 2022. Exceptional preservation of organs in Devonian placoderms from the Gogo lagerstätte. Science, 377:1311-1314, https://doi.org/10.1126/science.abf3289
Trinajstic, K., Sanchez, S., Dupret, V., Tafforeau, P., Long, J., Young, G., Senden, T., Boisvert, C., Power, N., and Ahlberg, P.E. 2013. Fossil musculature of the most primitive jawed vertebrates. Science, 341:160-4. https://doi.org/10.1126/science.1237275
Wagner, G.P., and Schwenk, K. 2000. Evolutionarily Stable Configurations: Functional Integration and the Evolution of Phenotypic Stability. In Hecht, M.K., Macintyre, R.J., Clegg, M.T. (eds.) Evolutionary Biology. Springer, Boston. https://doi.org/10.1007/978-1-4615-4185-1_4
Werdelin, L. 1987. Jaw geometry and molar morphology in marsupial carnivores; analysis of a constraint and its macroevolutionary consequences. Paleobiology, 13:342–350. https://doi.org/10.1017/S0094837300008915
6.2 R Packages
Auguie B (2017). gridExtra: Miscellaneous Functions for “Grid” Graphics. R package version 2.3, https://CRAN.R-project.org/package=gridExtra.
Bache S, Wickham H (2022). magrittr: A Forward-Pipe Operator for R. R package version 2.0.3, https://CRAN.R-project.org/package=magrittr.
Pedersen T (2024). patchwork: The Composer of Plots. R package version 1.2.0, https://CRAN.R-project.org/package=patchwork.
R Core Team (2023). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/.
Robinson D, Hayes A, Couch S (2023). broom: Convert Statistical Objects into Tidy Tibbles. R package version 1.0.5, https://CRAN.R-project.org/package=broom.
Wickham H, Bryan J (2023). readxl: Read Excel Files. R package version 1.4.3, https://CRAN.R-project.org/package=readxl.
Wickham H, Seidel D (2022). scales: Scale Functions for Visualization. R package version 1.2.1, https://CRAN.R-project.org/package=scales.
Wickham H, Averick M, Bryan J, Chang W, McGowan LD, François R, Grolemund G, Hayes A, Henry L, Hester J, Kuhn M, Pedersen TL, Miller E, Bache SM, Müller K, Ooms J, Robinson D, Seidel DP, Spinu V, Takahashi K, Vaughan D, Wilke C, Woo K, Yutani H (2019). “Welcome to the tidyverse.” Journal of Open Source Software, 4(43), 1686. https://doi.org/10.21105/joss.01686.
Wilke C, Wiernik B (2022). ggtext: Improved Text Rendering Support for ‘ggplot2’. R package version 0.1.2, https://CRAN.R-project.org/package=ggtext.
Xu S (2022). ggstar: Multiple Geometric Shape Point Layer for ‘ggplot2’. R package version 1.0.4, https://CRAN.R-project.org/package=ggstar.
Zhu H (2021). kableExtra: Construct Complex Table with ‘kable’ and Pipe Syntax. R package version 1.3.4, https://CRAN.R-project.org/package=kableExtra.
7 Session Information
## R version 4.3.1 (2023-06-16 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19045)
##
##
## Locale:
## LC_COLLATE=English_United States.utf8
## LC_CTYPE=English_United States.utf8
## LC_MONETARY=English_United States.utf8
## LC_NUMERIC=C
## LC_TIME=English_United States.utf8
##
## time zone: America/New_York
## tzcode source: internal
##
## Package version:
## askpass_1.2.0 backports_1.4.1 base64enc_0.1.3
## bit_4.0.5 bit64_4.0.5 blob_1.2.4
## bookdown_0.36 broom_1.0.5 bslib_0.5.1
## cachem_1.0.8 callr_3.7.3 cellranger_1.1.0
## cli_3.6.1 clipr_0.8.0 colorspace_2.1-0
## commonmark_1.9.0 compiler_4.3.1 conflicted_1.2.0
## cpp11_0.4.6 crayon_1.5.2 curl_5.1.0
## data.table_1.14.8 DBI_1.1.3 dbplyr_2.4.0
## digest_0.6.33 dplyr_1.1.3 dtplyr_1.3.1
## ellipsis_0.3.2 evaluate_0.23 fansi_1.0.5
## farver_2.1.1 fastmap_1.1.1 fontawesome_0.5.2
## forcats_1.0.0 fs_1.6.3 gargle_1.5.2
## generics_0.1.3 ggplot2_3.4.4 ggstar_1.0.4
## ggtext_0.1.2 glue_1.6.2 googledrive_2.1.1
## googlesheets4_1.1.1 graphics_4.3.1 grDevices_4.3.1
## grid_4.3.1 gridExtra_2.3 gridtext_0.1.5
## gtable_0.3.4 haven_2.5.3 highr_0.10
## hms_1.1.3 htmltools_0.5.6.1 httr_1.4.7
## ids_1.0.1 isoband_0.2.7 jpeg_0.1.10
## jquerylib_0.1.4 jsonlite_1.8.7 kableExtra_1.3.4
## knitr_1.44 labeling_0.4.3 lattice_0.21-8
## lifecycle_1.0.3 lubridate_1.9.3 magrittr_2.0.3
## markdown_1.11 MASS_7.3.60 Matrix_1.5-4.1
## memoise_2.0.1 methods_4.3.1 mgcv_1.8-42
## mime_0.12 modelr_0.1.11 munsell_0.5.0
## nlme_3.1-162 openssl_2.1.1 patchwork_1.2.0
## pillar_1.9.0 pkgconfig_2.0.3 png_0.1.8
## prettyunits_1.2.0 processx_3.8.2 progress_1.2.2
## ps_1.7.5 purrr_1.0.2 R6_2.5.1
## ragg_1.2.6 rappdirs_0.3.3 RColorBrewer_1.1.3
## Rcpp_1.0.11 readr_2.1.4 readxl_1.4.3
## rematch_2.0.0 rematch2_2.1.2 reprex_2.0.2
## rlang_1.1.1 rmarkdown_2.25 rmdformats_1.0.4
## rstudioapi_0.15.0 rvest_1.0.3 sass_0.4.7
## scales_1.2.1 selectr_0.4.2 splines_4.3.1
## stats_4.3.1 stringi_1.7.12 stringr_1.5.0
## svglite_2.1.2 sys_3.4.2 systemfonts_1.0.5
## textshaping_0.3.7 tibble_3.2.1 tidyr_1.3.0
## tidyselect_1.2.0 tidyverse_2.0.0 timechange_0.2.0
## tinytex_0.48 tools_4.3.1 tzdb_0.4.0
## utf8_1.2.4 utils_4.3.1 uuid_1.1.1
## vctrs_0.6.4 viridisLite_0.4.2 vroom_1.6.4
## webshot_0.5.5 withr_2.5.2 xfun_0.40
## xml2_1.3.5 yaml_2.3.7