Latest Entries »

Remember last time when I mentioned some prey being atrociously crushed by predators doing what they need to do in order to survive (feed on the prey)? I said many times that it was quite oversimplified and generalist, so here is a bit of more interesting bits.

Last time I assumed that every prey that was “edible” was essentially doomed and eaten/chewed/swallowed/sucked/peeled or whichever ending you deem appropriate. Now it does not take a genius to realise that it’s not because something is edible that it will be eaten, as many parents (or aunts and uncles trying to feed a representative of the next generation) will remember. Inasmuch as prey presence is required, the behaviour of the predator comes into play as well. One could see the resource use/energy gain (let’s call it “E”) as a function of the attack rate (“a”) and a measure of prey density (“P”) that has already been turned into an energy equivalent. That attack rate can represent a large variety of things such as the capacity for the predator to mechanically process the prey, the frequency of feeding events, etc… a basically represents the proportion of the energy that can be gathered from a prey that is actually turned into energy in the predator. Obviously, E=a∙P is not a representation of what occurs in most natural settings (Though… “Postgraduate productivity” = “Postgraduate attack rate”∙“Free food density” ), many other factors come into play, that will induce some behavioural response from the predator to the environment. To make it simple: is it worth it? In fact the Energy gained will be reduced by the energy spent to capture and process/digest the prey, which one can call handling cost (“h”). So for a feeding event to be worth it, one needs to make sure the handling cost still allows some energy intake. On the other hand, if the handling cost is null (h=0), then only the attack rate limits the energy gain.

In that last case, E = a∙P. Otherwise, the energy gain E is only a fraction of what can be acquired, which rises with an increased attack rate and diminishes with a high handling time. Hence it can be approximated that E =a∙P1+h∙a∙P. In that equation, the higher the cost to handle/digest the prey (h), the lower the neat energy gain (E). If all or almost all the energy that can be gained is gained (h close to 0) then the denominator is close to one and E ≅ a∙P

Now, you will ask me: “What’s the point of all this gibberish?” I cannot blame you, it will take some time but we will be getting there. Time to do some plots!

We will be looking at what happens at only one point in time, without any dynamics from the prey population. So let’s set the energy equivalent prey density P to any value you want and get also numbers that make some sense for a and h. (especially for a. If you set a>1 you then would induce that the predator gets more energy from the prey than the energy that can be gathered from the prey). We can make the assumption that h represents the “handling time” in minutes (so here for h=0.1 it represents 6 seconds)

P<-50

a<-0.3

h<-0.1

Now with a few values set, what happens to E =a∙P1+h∙a∙P when “a” varies from a low 0.001 (nearly no energy gained from that prey) to 1 (all of the energy is gained)?

Look and see: just cut and paste this in R:

curve(expr=(x*P)/(1+h*x*P),from=0.001,to=1,xlab=”Attack rate (a)”,ylab=”Energy gain”)

Logically, as a diminishes, the energy gain becomes almost null and vice-versa. The same can be done with a varying h from a low score (if h represents time, then, a low h means nearly no time needed, e.g. a baleen whale sieving through a mass of krill) to a high one (e.g. a complicated recipe)

curve(expr=(a*P)/(1+a*x*P),from=0.001,to=1,xlab=”handling time (h)”,ylab=”Energy gain”)

Those two parameters “a” and “h” might be influenced by the properties of the prey. In a population of fish for example, animals may have a higher attack rate for small representatives of a bivalve and a smaller one once the bivalves become larger and a large part of the energy gained has been spent while crushing the shell. Hence the fish would mostly feed on the smallest bivalves because that’s when they get more energy, but at some point, once all the small bivalves are eaten, only the big ones remain. It is also possible that after they reach a size, bivalves do provide a better energy intake in regards to what is required to process them. So instead of saying “energy gain”, imagine that E in the equation becomes “R”, the per capita resource use. It might be easier to use a custom-made function to get values for it:

R<-function(x,P=50,h=0.1){(x*P)/(1+h*x*P)}

xvec<-seq(0.001,1,by=0.0001)

yvec<-R(xvec)

plot(x=xvec,y=yvec,xlab=”Attack rate (a)”,ylab=”Resource use”,type=”l”)

Now let’s imagine that in our population the attack rate in fact ranges from 0.1 in individual A to 0.9 in individual B. There are two ways to calculate the average resource use for both individuals: calculate the mean of the resource use or calculate the mean value of the variable considered in individual specimens and extrapolate the resource use for this virtual mean (I mean, “average”) individual.

Here are two individuals A and B

lines(x=c(0.1,0.9),y=c(R(0.1),R(0.9)),lty=2);points(x=c(0.1,0.9),y=c(R(0.1),R(0.9)),pch=16,cex=2)

text(c(“A”,”B”),x=c(0.1,0.9),y=c(R(0.1),R(0.9)),pos=3);lines(x=c(0.1,0.1),y=c(-1,R(0.1)),lty=2)

lines(x=c(0.9,0.9),y=c(-1,R(0.9)),lty=2)

and if you calculate the resource use based on the average of the measured element, like attack rate here:

xVI<-mean(c(0.1,0.9));yVI<-R(xVI);lines(x=c(xVI,xVI,-0.04),y=c(-1,yVI,yVI),lty=3)

points(x=xVI,y=yVI,pch=15,cex=1.5)

text(x=c(xVI,xVI,0),y=c(0.25,0,yVI)+0.1,adj=0,c(“Virtual individual:”,

“mean attack rate of A and B”,”Calculated average ecology”))

But if one calculates the average resource use of real individuals:

xRI<-mean(c(0.1,0.9));yRI<-mean(c(R(0.1),R(0.9)));lines(x=c(xRI,-0.04),y=rep(yRI,2),lty=3)

points(x=xRI,y=yRI,pch=17,cex=1.5);text(x=0,y=yRI+0.1,”Realised average ecology”,adj=0)

This may not seem too dramatic for you but imagine that instead of A, we have A’ with only a quarter of A’s attack rate:

x11(mar=c(3,3,0,0),mgp=c(1.6,0.8,0),bty=”l”)

plot(x=xvec,y=yvec,xlab=”Attack rate (a)”,ylab=”Resource use”,type=”l”)

lines(x=c(0.025,0.9),y=c(R(0.025),R(0.9)),lty=2);points(x=c(0.025,0.9),y=c(R(0.025),R(0.9)),pch=16,cex=2)

text(c(“A’”,”B”),x=c(0.025,0.9),y=c(R(0.025),R(0.9)),pos=3);lines(x=c(0.025,0.025),y=c(-1,R(0.025)),lty=2)

lines(x=c(0.9,0.9),y=c(-1,R(0.9)),lty=2)

#Virtual individual

xVI<-mean(c(0.025,0.9));yVI<-R(xVI);lines(x=c(xVI,xVI,-0.04),y=c(-1,yVI,yVI),lty=3);points(x=xVI,y=yVI,pch=15,cex=1.5)

text(x=c(xVI,xVI,0),y=c(0.25,0,yVI)+0.1,adj=0,c(“Virtual individual:”,”mean attack rate of A and B”,”Calculated average ecology”))

#Realised mean resource use

xRI<-mean(c(0.025,0.9));yRI<-mean(c(R(0.025),R(0.9)));lines(x=c(xRI,-0.04),y=rep(yRI,2),lty=3)

points(x=xRI,y=yRI,pch=17,cex=1.5);text(x=0,y=yRI+0.1,”Realised average ecology”,adj=0)

The thing is, we rarely get natural populations behaving nicely in a “typical” way, nicely covering the range of measurable values in a uniform or gaussian way. Things will be clearer with an example comparing two populations: one rather uniform, one which happens to have a bimodal distribution when it comes to the attack rate. To redraw the graphs, the code is at the bottom of the page, but just look at them first. The density of the populations is quite different, the mean attack rate, on the other hand is not so different between the two populations (in my random sample: a̅Pop1=0.501 and a̅Pop2=0.508) and the calculated mean resource use/ecological signal is similar (R̅calc_Pop1=7.148 and R̅calc_Pop2=7.175). But the actual average resource use is quite different between the two populations (R̅real_Pop1=6.366 and R̅real_Pop2=5.713).

And things get even worse if you consider the bimodal population as two separate populations (which it might well be: two populations of the same species of bird in different forests, for example, one in a park where it has access to “soft” seeds and bread crumbs brought by humans (Population “a”), the other one in a forest with limited tampering by hominoids (Population “b”),). The resource use expresses the predation on “hard to crack naturally dispersed seeds”. Clearly the population “a” would have a low attack rate for those, while population b has little else to feed on). The real resource use for the separate populations is dramatically different: R̅real_Popa=3.225 and R̅real_Popb=8.201.

The effective selective pressure on the seeds is then very different in different environments, with diverging evolutionary consequences. Now let us imagine that we do not have geographically separated populations of birds but temporally separated populations of fishes potentially preying on bivalves and other exoskeletonized organisms. I suppose you get it now: when one wishes to consider the selective pressure that a species or a group of organisms had on the evolution of its ecosystem, one should not look at the potential average pressure for an average individual (or only as a rather general indication) but at the average pressure of all individuals within naturally occurring ensembles.

Well, here’s the code for the graphs:

Pop1<-runif(n=100,min=0,max=1);Popa<-rnorm(n=50,mean=0.1,sd=0.05);Popb<-rnorm(n=50,mean=0.9,sd=0.05)

Pop2<-c(Popa,Popb)

Lay<-matrix(c(rep(1,2),rep(2,2),rep(c(3,3,4,4),4)),nrow=5,byrow=T)

dev.new(height=8,width=16);par(mar=c(3,3,0,0),mgp=c(1.6,0.8,0),bty=”l”);layout(Lay)

plot(density(Pop1,from=0,to=1,bw=0.1),main=NA,xlim=c(0,1));plot(density(Pop2,from=0,to=1,bw=0.1),main=NA,xlim=c(0,1))

yPop1<-R(Pop1);yPop2<-R(Pop2)

#First population

plot(x=Pop1,y=yPop1,xlab=”Attack rate (a)”,ylab=”Resource use”,type=”p”,pch=16,cex=0.5,ylim=c(0,9),xlim=c(0,1))

title(main=”Uniform population”,line=-1)

xmPop1<-mean(Pop1);ymPop1<-R(xmPop1);lines(x=c(xmPop1,xmPop1,-0.04),y=c(-1,ymPop1,ymPop1),lty=3)

points(x=xmPop1,y=ymPop1,pch=16,cex=1.5)

text(x=c(xmPop1,xmPop1,0)+0.05,y=c(0.25,0,ymPop1)+0.2,adj=0,

c(“Virtual individual:”,”mean attack rate of uniform population”,”Calculated average ecology”))

#Realised mean resource use

yRPop1<-mean(yPop1);lines(x=c(xmPop1,-0.04),y=rep(yRPop1,2),lty=3)

points(x=xmPop1,y=yRPop1,pch=17,cex=1.5)

text(x=0,y=yRPop1+0.12,”Realised average ecology”,adj=0)

#Next population

plot(x=Pop2,y=yPop2,xlab=”Attack rate (a)”,ylab=”Resource use”,type=”p”,pch=15,cex=0.5,ylim=c(0,9),xlim=c(0,1))

title(main=”Bimodal population”,line=-1)

xmPop2<-mean(Pop2);ymPop2<-R(xmPop2);lines(x=c(xmPop2,xmPop2,-0.04),y=c(-1,ymPop2,ymPop2),lty=3)

points(x=xmPop2,y=ymPop2,pch=15,cex=1.5)

text(x=c(xmPop2,xmPop2,0)+0.05,y=c(0.25,0,ymPop2)+0.2,adj=0,

c(“Virtual individual:”,”mean attack rate of bimodal population”,”Calculated average ecology”))

#Realised mean resource use

yRPop2<-mean(yPop2);lines(x=c(xmPop2,-0.04),y=rep(yRPop2,2),lty=3)

points(x=xmPop2,y=yRPop2,pch=17,cex=1.5)

text(x=0,y=yRPop2+0.2,”Realised average ecology”,adj=0)

yRPopa<-mean(R(Popa));yRPopb<-mean(R(Popb));xmPopa<-mean(Popa);xmPopb<-mean(Popb)

lines(x=c(xmPopa,-0.04),y=rep(yRPopa,2),lty=3)

points(x=xmPopa,y=yRPopa,pch=17,cex=1.5)

text(x=0,y=yRPopa+0.2,”Realised average ecology in population a”,adj=0)

lines(x=c(xmPopb,-0.04),y=rep(yRPopb,2),lty=3)

points(x=xmPopb,y=yRPopb,pch=17,cex=1.5)

text(x=0,y=yRPopb+0.2,”Realised average ecology in population b”,adj=0)

Did I tell you about the Mesozoic Marine Revolution? Don’t bother answering as I will mention it anyways. A rough, sketchy, approximate definition can be found here. With some more words, the MMR would be a global scale escalation event which encompasses the antagonistic evolutionary innovations from the Mesozoic to the Cenozoic. Though the work of Vermeij (1977) focused on gastropods, their predators and co-occurring grazers, now MMR has had its use expanded to include all escalation events from the Triassic to the late Cretaceous and beyond. As with many revolutions, a new model/society emerges or settles. Here what emerged and settled are novel ecological niches for which new Mesozoic predators and consumers seem to be adapted, niches still occupied today by related or morphologically similar animals. E.g.: the giant filter-feeders, today’s baleen sharks (Rhincodontidae), megamouth sharks (Megachasmidae), basking sharks (Cetorhinidae), manta rays (Mobulidae) and baleen whales (Mysticeti), were from the middle-Jurassic represented by the Pachycormid bony fishes until their extinction at the Cretaceous-Paleogene boundary (Friedman et al. 2010; Marx & Uhen 2010).

Apparently an underexploited niche in the Mesozoic was that of consumers of armoured invertebrates (protected by shells or exoskeletons). Increased predation apparently induced an adaptive response in shelled organisms. Defences such as motility in crinoids (Baumiller et al. 2010), the different versions of the alivincular ligament in bivalves (Hautmann 2004) along with an increase in mobility or infaunalisation (McRoberts 2001; Aberhan, Kiessling & Fürsich 2006) are some examples, like increased body size in gastropods (Finnegan et al. 2011), etc, etc… (see Vermeij 2008 for more innovations). More shell-crushing habits are observed (well hypothesised more like) in arthropods at least from the Cretaceous (Dietl & Vega 2008), in a variety of ways (See the review and study by Schweitzer & Feldmann 2010). Let’s make it shorter: a new model of marine ecologies settled, and exoskeletonised organisms had a pretty rough time, kind of a 150 million-years long hangover.

How does that “Antagonistic Evolution” (to make it more symbolic, call it “Evilution”) work? Well, let’s take a simple example of predator-prey relationship and imagine that the species “Praedatoris ultima” feeds on “Victimus succulens”. Which kind of organisms they are does not really matter. Now imagine we can measure something that is used as a defense by the prey V.succulens, like shell thickness for an exoskeletonized animal, or the depth to which an animal burrows, etc… the distribution of the defensive trait can be represented like that:

Prey1<-rnorm(mean=2*pi,sd=1,n=1000)

par(bty=”n”,bg=”darkgreen”,col.main=”seashell1″,col.axis=”seashell1″,col.lab=”seashell1″,col.sub=”seashell1″,fg=”seashell1″)

plot(density(Prey1,bw=0.25),xlim=c(1,11),ylim=c(-0.01,0.7),type=”h”,col=”coral1″,main=”distribution of a trait in the population”)

Here the bandwidth for the density has been set to 0.25, but you can have your fun using different ones (e.g. plot(density(Prey1,bw=0.1)) or plot(density(Prey1,bw=0.5)))

Oh, yeah, I almost forgot: this is also the opportunity to go around the basics of R plotting for densities and polygons, also.

Now that we have the prey and an idea of its defensive capabilities, we also need to know which ones will be fed on. What we will do is add a population of the P.ultima on the graph representing the capability for individual predators to feed on V.succulens. For the moment the density has little importance, the range matters. Below this range, the prey is too small, or anything else, to be preyed upon: the predator does not notice it or just would not get any energy out of it, so why bother (assuming the predator is not a human on a diet, in which case, eating food without or with limited calories intake is quite convenient, I recommend cauliflower, leeks, and all other such greenery)? On the other hand/end, the prey is too thick or deeply buried to be processed. So let’s generate a population of predators and its ability to feed on V.succulens:

Pred1<-rnorm(mean=pi,sd=1,n=300)

plot(x=0,y=0,xlim=c(1,10),ylim=c(0,650),type=”n”,main=”Generation 1″, xlab=”trait value”,ylab=”individuals”)

polygon(x=density(Prey1,bw=0.25)$x,y=density(Prey1,bw=0.25)$y*length(Prey1),col=”coral1″,border=NA)

polygon(x=rep(c(min(Pred1),max(Pred1)),each=2),y=c(50,100,100,50),col=”salmon4″,border=NA)

 

What the code does is first to generate a distribution, as we have done before. Next we plot nothing in a space that can contain the next plotted objects. The first “polygon” call plots the previous graph with a twist: rather than density, we have the actual numbers of individuals (a bit laterally expanded as the function makes it look all smooth and pretty). Next polygon is simply a band representing the range of prey-processing capability of P.ultima. Some of the V.succulens fall within this range and will be eaten without mercy nor remorse, and no I don’t feel bad about it, those are virtual organisms.

To start, we will assume (very big assumption here, like assuming politicians work for the people) that any V.succulens that falls within this range is eaten. So what is left of them is as follows:

polygon(x=c(min(density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$x[which(density(Prey1)$x>=max(Pred1))]),density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$x[which(density(Prey1)$x>=max(Pred1))]),y=c(0,density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$y[which(density(Prey1)$x>=max(Pred1))]*length(Prey1)),col=”turquoise”,border=NA)

 

Note it is called generation 1 because we will see the effect of predation over several “generations”.

Now we will consider the next generation. Some biological aspects could be considered like: other mortality rates, reproductive strategies, migration, environmental factors influencing the growth of V.succulens but to make it simple: the next generation will be of a similar size (N=1000, be it because there are a few new animals and all others have survived or, they all died and 1000 have been born, or any other phenomenon ending up with a population of N=1000). The interesting, selective part comes now: the mean value for this new generation will not be the same as for the first one, assuming that the trait is inheritable (e.g. animals that can burrow deep will have descendants that can burrow deep; plants hard to chew will have similarly tough offspring, etc…), the variety of genetic (and environmental) factors influencing this is bewildering (at least). The new generation’s average value for the trait we will make the average value of the survivors. The standard deviation is another interesting question: will the new generation be as variable as the first one or does the loss of genetic diversity (animals with the genetic framework for low x scores not reproducing) end up in a more restricted range of potential phenotypes (the result of the expression of the genotype, of the gene-code basically)? Here we will go for a restricted phenotypic range as a result of loss of genetic diversity.

Prey2<-rnorm(mean=mean(Prey1[which(Prey1>=max(Pred1))]),sd=sd(Prey1[which(Prey1>=max(Pred1))]),n=1000)

And you can see the result of that selection:

par(mfrow=c(2,1),bty=”l”)

par(bty=”n”,bg=”darkgreen”,col.main=”seashell1″,col.axis=”seashell1″,col.lab=”seashell1″,col.sub=”seashell1″,fg=”seashell1″)

plot(x=0,y=0,xlim=c(1,10),ylim=c(0,650),type=”n”,  main=”Generation 1″, xlab=”trait value”,ylab=”individuals”)

polygon(x=density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$x,y=density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$y*length(Prey1),col=”coral1″,border=NA)

polygon(x=rep(c(min(Pred1),max(Pred1)),each=2),y=c(50,100,100,50),col=”salmon4″,border=NA)

polygon(x=c(min(density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$x[which(density(Prey1)$x>=max(Pred1))]),  density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$x[which(density(Prey1)$x>=max(Pred1))]),  y=c(0,density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$y[which(density(Prey1)$x>=max(Pred1))]*length(Prey1)),col=”turquoise”,border=NA)

plot(x=0,y=0,xlim=c(1,10),ylim=c(0,650),type=”n”,

  main=”Generation 2″, xlab=”trait value”,ylab=”individuals”)

polygon(x=density(Prey2,bw=0.25,from=min(Prey2),to=max(Prey2))$x,y=density(Prey2,bw=0.25,from=min(Prey2),to=max(Prey2))$y*length(Prey2),col=”coral2″,border=NA)

polygon(x=rep(c(min(Pred1),max(Pred1)),each=2),y=c(50,100,100,50),col=”salmon4″,border=NA)

Generation 2 is less variable than generation 1, but still some of the V.succulens fall within the “edible” range. Now we can have our fun repeating it over several generations:

I included the code towards the end of the page. Another fun thing to do is also to change some of the values. You can for example change the values for P.ultima’s dietary breadth (here Pred1<-rnorm(mean=1.5*pi,sd=0.5,n=300)):

Or change the values of the variability of V.succulens’s generations, here I set them all to 1, which you can interpret as “no loss of phenotypic variability associated to the loss of genetic variability” or “phenotypic variability is the same from one generation to the next as an effect of mutation/new genetic material brought by migrants, etc…”

So as you can see, there is always a shift towards one extremity as the V.succulens specialises against predation by P.ultima. Consider this trait as shell thickness, depth of infaunal organisms and you get the classic MMR in a nutshell. But what if a V.succulens falling within the “edible range” was only eaten if it has the bad chance to meet a P.ultima capable of eating it and in the mood to, in extenso if predation is a function of several factors in the predator’s population? You can imagine a broad range of other potential scenario, but to make it short, what has been described here is an extreme in which a predator feeds in a much specialised way. If the same predator were to have a different behaviour, like, say, feeding on V.succulens only occasionally, the overall result would be different. Moreover, we did not look at the other dynamics in the sample, such as the changes in the population of the predator, other causes of death in the victim, etc… But then we would need to go into more esoteric programming and modelling. The best I can do is to recommend you look into the sections regarding co-evolution in reference books regarding evolution. This example, as I said is simple, simplistic, over-simplified, but does its work nonetheless.

The important bit for the future is: if a predator gnaws at one part of the population, the traits characteristic of the remainder of this population are proportionally more represented in the next generation. So, survivors with a thicker shell would lead to an overall thicker-shelled next generation, survivors with better burrowing or swimming capabilities would produce offspring with more efficient escape strategies (as to what regards this kind of predation).Next step is to actually look at real data regarding the diet of fishes. I am writing this up at the moment, but as soon as the paper is out, I will provide an outline of the results, what it means and where pycnodonts fit in this model.

R code to have some fun over 6 generations of victims. Feel free to modify values for the means and standard deviations and see what effect it has on several generations:

Prey1<-rnorm(mean=2*pi,sd=1,n=1000)

Pred1<-rnorm(mean=pi,sd=1,n=300)

Prey2<-rnorm(mean=mean(Prey1[which(Prey1>=max(Pred1))]),sd=sd(Prey1[which(Prey1>=max(Pred1))]),n=1000)

Prey3<-rnorm(mean=mean(Prey2[which(Prey2>=max(Pred1))]),sd=sd(Prey2[which(Prey2>=max(Pred1))]),n=1000)

Prey4<-rnorm(mean=mean(Prey3[which(Prey3>=max(Pred1))]),sd=sd(Prey2[which(Prey3>=max(Pred1))]),n=1000)

Prey5<-rnorm(mean=mean(Prey4[which(Prey4>=max(Pred1))]),sd=sd(Prey4[which(Prey4>=max(Pred1))]),n=1000)

Prey6<-rnorm(mean=mean(Prey5[which(Prey5>=max(Pred1))]),sd=sd(Prey5[which(Prey5>=max(Pred1))]),n=1000)

par(mfrow=c(3,2),bty=”l”)

par(bty=”n”,bg=”darkgreen”,col.main=”seashell1″,col.axis=”seashell1″,col.lab=”seashell1″,col.sub=”seashell1″,fg=”seashell1″)

plot(x=0,y=0,xlim=c(1,10),ylim=c(0,650),type=”n”,

  main=”Generation 1″, xlab=”trait value”,ylab=”individuals”)

polygon(x=density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$x,y=density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$y*length(Prey1),col=”coral1″,border=NA)

polygon(x=rep(c(min(Pred1),max(Pred1)),each=2),y=c(50,100,100,50),col=”salmon4″,border=NA)

polygon(x=c(min(density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$x[which(density(Prey1)$x>=max(Pred1))]),

  density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$x[which(density(Prey1)$x>=max(Pred1))]),

  y=c(0,density(Prey1,bw=0.25,from=min(Prey1),to=max(Prey1))$y[which(density(Prey1)$x>=max(Pred1))]*length(Prey1)),col=”turquoise”,border=NA)

plot(x=0,y=0,xlim=c(1,10),ylim=c(0,650),type=”n”,

  main=”Generation 2″, xlab=”trait value”,ylab=”individuals”)

polygon(x=density(Prey2,bw=0.25,from=min(Prey2),to=max(Prey2))$x,y=density(Prey2,bw=0.25,from=min(Prey2),to=max(Prey2))$y*length(Prey2),col=”coral2″,border=NA)

polygon(x=rep(c(min(Pred1),max(Pred1)),each=2),y=c(50,100,100,50),col=”salmon4″,border=NA)

polygon(x=c(min(density(Prey2,bw=0.25,from=min(Prey2),to=max(Prey2))$x[which(density(Prey2)$x>=max(Pred1))]),

  density(Prey2,bw=0.25,from=min(Prey2),to=max(Prey2))$x[which(density(Prey2)$x>=max(Pred1))]),

  y=c(0,density(Prey2,bw=0.25,from=min(Prey2),to=max(Prey2))$y[which(density(Prey2)$x>=max(Pred1))]*length(Prey2)),col=”turquoise”,border=NA)

plot(x=0,y=0,xlim=c(1,10),ylim=c(0,750),type=”n”,

  main=”Generation 3″, xlab=”trait value”,ylab=”individuals”)

polygon(x=density(Prey3,bw=0.25,from=min(Prey3),to=max(Prey3))$x,y=density(Prey3,bw=0.25,from=min(Prey3),to=max(Prey3))$y*length(Prey3),col=”coral3″,border=NA)

polygon(x=rep(c(min(Pred1),max(Pred1)),each=2),y=c(50,100,100,50),col=”salmon4″,border=NA)

polygon(x=c(min(density(Prey3,bw=0.25,from=min(Prey3),to=max(Prey3))$x[which(density(Prey3)$x>=max(Pred1))]),

  density(Prey3,bw=0.25,from=min(Prey3),to=max(Prey3))$x[which(density(Prey3)$x>=max(Pred1))]),

  y=c(0,density(Prey3,bw=0.25,from=min(Prey3),to=max(Prey3))$y[which(density(Prey3)$x>=max(Pred1))]*length(Prey3)),col=”turquoise”,border=NA)

plot(x=0,y=0,xlim=c(1,10),ylim=c(0,750),type=”n”,

  main=”Generation 4″, xlab=”trait value”,ylab=”individuals”)

polygon(x=density(Prey4,bw=0.25,from=min(Prey4),to=max(Prey4))$x,y=density(Prey4,bw=0.25,from=min(Prey4),to=max(Prey4))$y*length(Prey4),col=”coral3″,border=NA)

polygon(x=rep(c(min(Pred1),max(Pred1)),each=2),y=c(50,100,100,50),col=”salmon4″,border=NA)

polygon(x=c(min(density(Prey4,bw=0.25,from=min(Prey4),to=max(Prey4))$x[which(density(Prey4)$x>=max(Pred1))]),

  density(Prey4,bw=0.25,from=min(Prey4),to=max(Prey4))$x[which(density(Prey4)$x>=max(Pred1))]),

  y=c(0,density(Prey4,bw=0.25,from=min(Prey4),to=max(Prey4))$y[which(density(Prey4)$x>=max(Pred1))]*length(Prey4)),col=”turquoise”,border=NA)

plot(x=0,y=0,xlim=c(1,10),ylim=c(0,750),type=”n”,

  main=”Generation 5″, xlab=”trait value”,ylab=”individuals”)

polygon(x=density(Prey5,bw=0.25,from=min(Prey5),to=max(Prey5))$x,y=density(Prey5,bw=0.25,from=min(Prey5),to=max(Prey5))$y*length(Prey5),col=”coral3″,border=NA)

polygon(x=rep(c(min(Pred1),max(Pred1)),each=2),y=c(50,100,100,50),col=”salmon4″,border=NA)

polygon(x=c(min(density(Prey5,bw=0.25,from=min(Prey5),to=max(Prey5))$x[which(density(Prey5)$x>=max(Pred1))]),

  density(Prey5,bw=0.25,from=min(Prey5),to=max(Prey5))$x[which(density(Prey5)$x>=max(Pred1))]),

  y=c(0,density(Prey5,bw=0.25,from=min(Prey5),to=max(Prey5))$y[which(density(Prey5)$x>=max(Pred1))]*length(Prey5)),col=”turquoise”,border=NA)

plot(x=0,y=0,xlim=c(1,10),ylim=c(0,750),type=”n”,

  main=”Generation 6″, xlab=”trait value”,ylab=”individuals”)

polygon(x=density(Prey6,bw=0.25,from=min(Prey6),to=max(Prey6))$x,y=density(Prey6,bw=0.25,from=min(Prey6),to=max(Prey6))$y*length(Prey6),col=”coral3″,border=NA)

polygon(x=rep(c(min(Pred1),max(Pred1)),each=2),y=c(50,100,100,50),col=”salmon4″,border=NA)

polygon(x=c(min(density(Prey6,bw=0.25,from=min(Prey6),to=max(Prey6))$x[which(density(Prey6)$x>=max(Pred1))]),

  density(Prey6,bw=0.25,from=min(Prey6),to=max(Prey6))$x[which(density(Prey6)$x>=max(Pred1))]),

  y=c(0,density(Prey6,bw=0.25,from=min(Prey6),to=max(Prey6))$y[which(density(Prey6)$x>=max(Pred1))]*length(Prey6)),col=”turquoise”,border=NA)

Aberhan, M., Kiessling, W. & Fürsich, F. (2006) Testing the role of biological interactions in the evolution of mid-Mesozoic marine benthic ecosystems. Paleobiology, 32, 259-277.

Baumiller, T.K., Salamon, M.A., Gorzelak, P., Mooi, R., Messing, C.G. & Gahn, F.J. (2010) Post-Paleozoic crinoid radiation in response to benthic predation preceded the Mesozoic marine revolution. Proc Natl Acad Sci U S A, 107, 5893-5896.

Dietl, G.P. & Vega, F.J. (2008) Specialized shell-breaking crab claws in Cretaceous seas. Biol Lett, 4, 290-293.

Finnegan, S., McClain, C., Kosnik, M. & Payne, J. (2011) Escargots through time: an energetic comparison of marine gatropod assemblages before and after the Mesozoic Marine Revolution. Paleobiology, 37, 252-269.

Friedman, M., Shimada, K., Martin, L.D., Everhart, M.J., Liston, J., Maltese, A. & Triebold, M. (2010) 100-million-year dynasty of giant planktivorous bony fishes in the Mesozoic seas. Science, 327, 990-993.

Hautmann, M. (2004) Early Mesozoic evolution of alivincular bivalve ligaments and its implications for the timing of the ‘Mesozoic marine revolution’. Lethaia, 37, 165-172.

Marx, F.G. & Uhen, M.D. (2010) Climate, critters, and cetaceans: Cenozoic drivers of the evolution of modern whales. Science, 327, 993-996.

McRoberts, C. (2001) Triassic bivalves and the initial marine Mesozoic revolution: a role for predators? Geology, 29, 359-362.

Schweitzer, C.E. & Feldmann, R.M. (2010) The Decapoda (Crustacea) as Predators on Mollusca through Geologic Time. Palaios, 25, 167-182.

Vermeij, G.J. (1977) The Mesozoic Marine Revolution. Evidence from snails, predators and grazers. Paleobiology, 3, 245-258.

Vermeij, G.J. (2008) Escalation and its role in Jurassic biotic history. Palaeogeography, Palaeoclimatology, Palaeoecology, 263, 3-8.

And here are the acknowledgements from my Ph.D thesis. Surely many of you are not mentioned in the text, or just vaguely. Well, sorry. I could not make it any longer as I had to keep the number of pages to 221 (which with the title page made 222, printed 3 times).

Anyways, after a long silent period, I will get back to real life  (a bit) and geek life (mostly). So there may actually be stuff posted on this blog again.

Getting to the end of a Ph.D is not a personal achievement, many people provide help or support and I doubt I shall be able to acknowledge them as is really befitting. As a foreword: I may forget to mention some people, there are so many to thank, for every little helps, but know your contribution was appreciated.

I think I should start with the people I am closest to first. I mean, I will do it in a geographical manner: many thanks to my office mates Amy, Emily “deep breath”, Jen, Nyree and Oliver for coping with my mood while I was writing-up. Next along the corridor are many colleague scientists, post-grads who helped in a variety of ways, and notably I should thank those who started the Ph.D adventure when I did: Mohib, Sam, Jennifer, for their support, and especially Alison for her feedback and contribution to my skills in English (There is still room for improvement, I admit it).

Now we are reaching the other hand of the corridor and the office of Prof. Mark Purnell, whom I must thank more than many others. My supervisors Professors Mark Purnell and Paul Hart gave me a chance to carry on in the world of science when I had almost given up on the idea. Their help and feedback has always been welcome and appreciated. I hope they will consider that this work is worthy of a little space on their bookshelves, and I don’t mind if they open it from times to times, but I know they are quite busy. Mark must also be acknowledged for letting me have my first taste of experimental taphonomy, public outreach, whisky tasting and congratulations via text messages.

All the clerical, technical, teaching members of staff in the department of Geology at the University of Leicester are thanked for their help and advice. To make it short, you guys rock. I should not forget my fellow post-graduates and friends; thumbs up to Nina for the coffee machine, much appreciated. Thanks to all the members of the palaeobiology research group and the labgroup meetings. We had many exciting interactions and it has been a pleasure discussing science with Rob, Sarah, Rowan, Jon, David, Joe, Duncan, Laura et al. Also thanks to Jan and Mark W. I shall find the time to read your book in the near future.

Away from Leicester, many thanks to Zerina Johanson for guiding me through the collections of the Natural history museum of London; to Živile for her support. Thanks to all my colleagues and friends, especially the Bristol group, for their contribution to enjoyable ProgPal and PalAss meetings. Actually, for the PalAss meetings, thanks also to my fellow researchers, post-grads or otherwise from what I now call “overseas”. Special thanks go to Zozo, Seb, Bastien, Ivan, Jean-mi, and many others, especially the special team of “Crayssacois”, Adeline and the other Jean-mi.

Thanks must go to Alain Blieck at the University of Lille who gave me my first hands-on experience of palaeoichthyology, which lead ultimately to this Ph.D. Thanks also to all the people from the former department of Palaeozoic Palaeontology and Palaeogeography and all my friends from Northern France.

Last but not least, thanks to all my family. Thanks to my brothers Florian and Thierry, both role-models for me in their own special ways. Thanks to my parents Jean-Luc and Michèle for their help, their support, for giving me the taste and the resolve to do more than just the bare minimum. No matter what happens next, I shall try to make you proud (but for the castle in Spain you will have to wait, I am afraid). Many thanks to the most unique grand-mother for she never gave up, carried on through many hardships, but still kept on helping and motivating her children, grand-children and others, never stopping, never tiring, just because she could. Thanks, Cécile, none of this would have happened without you.

Type of presentation: oral

 Darras L.1

 1Department of Geology, University of Leicester

Dental microwear-based inferences of diet are most often performed at the specific level. The ecosystem-dependent nature of inferred trophic palaeoecologies has to be considered if an already studied species is to be later used as a palaeoenvironmental proxy. Measures from modern populations collected and analysed over a short timespan provide an ecological snapshot and reference. Fossil “populations”, on the other hand, are accumulated through time and represent an average estimate of a species’ ecology. Recent works highlighted trophic diversity within a single species across different environments or localities. As the latest technological developments have greatly improved the accuracy and level of resolution of our palaeoecological inferences, the degree of ecological flexibility can be investigated before occurence-based extrapolation of food webs or palaeoenvironments.

Here I investigate trophic diversity in modern and fossil populations of fishes via dental microwear texture analysis, from the ordinal to the individual level. In particular, late Jurassic pycnodontiform fishes, expected to be specialised shell-crushers, exhibit a surprising ecological diversity at the ordinal level, narrowing down within the family Pycnodontidae. Reconstitutions of the interactions within palaeoecological communities that it allows are illustrated within the kimmeridgian pycnodonts from Dorset.

A look at some data

Here comes some more about using R, about teeth in fossil fish and more. As none of this has been published yet, the active scientists among you will understand why some information (specimen number, etc…) is not provided. On the other hand, we will be looking at actual real data, microtexture data from the teeth of a fossil fish. This is how sexy it actually looks when I get it:

Tooth Pos1 Pos2 Rank Par1 Par2 Par3 Par4 Par5 Par6 Par7 Par8
Tooth8 posterior inner

24

0.604

0.495

11.327

12.43

8.819

21.249

2.69E+06

0.48

Tooth8 anterior inner

23

0.431

0.473

6.763

1.882

1.488

3.37

1.85E+06

0.73

Tooth8 anterior inner

23

0.306

-0.196

8.157

2.112

2.283

4.395

2.32E+06

0.806

Tooth8 anterior outer

22

0.318

-0.71

16.741

4.555

4.979

9.535

3.41E+06

0.586

Tooth7 posterior inner

21

0.295

-1.452

9.657

1.378

2.381

3.759

2.15E+06

0.097

Tooth7 central central

20

0.249

-0.492

14.577

2.951

4.578

7.529

3.16E+06

0.745

Tooth7 anterior inner

19

0.222

-0.676

7.371

1.883

1.616

3.499

1.61E+06

0.752

Tooth6 posterior outer

18

0.506

-0.127

6.922

3.762

3.62

7.382

2.39E+06

0.723

Tooth6 posterior outer

18

0.416

2.006

21.118

5.462

3.661

9.122

2.82E+06

0.237

Tooth6 posterior inner

17

0.335

-0.155

9.519

2.801

3.192

5.992

1.81E+06

0.88

Tooth6 anterior inner

16

0.244

-0.103

4.857

2.737

1.922

4.66

1.79E+06

0.776

Tooth6 anterior outer

15

0.481

0.048

9.606

2.038

3.634

5.671

2.08E+06

0.814

Tooth4 posterior outer

14

0.269

0.145

5.837

2.586

0.925

3.511

2.47E+06

0.746

Tooth4 posterior inner

13

0.342

-0.057

5.235

2.44

1.09

3.53

2.28E+06

0.674

Tooth4 anterior inner

12

0.147

-0.552

5.111

0.687

1.311

1.997

1.03E+06

0.86

Tooth3 posterior outer

11

0.249

-0.79

7.007

1.277

3.059

4.335

2.10E+06

0.75

Tooth3 posterior inner

10

0.484

-1.233

13.272

2.867

4.424

7.291

1.62E+06

0.768

Tooth3 central central

9

0.362

-0.881

7.34

1.132

1.838

2.969

1.87E+06

0.787

Tooth3 anterior inner

8

0.293

-1.381

11.455

1.572

3.303

4.874

1.92E+06

0.624

Tooth2 posterior outer

7

0.646

-3.454

25.219

1.882

4.75

6.631

2.65E+06

0.436

Tooth2 posterior inner

6

0.3

-0.532

9.535

2.425

3.356

5.78

1.65E+06

0.745

Tooth2 central central

5

0.487

-0.681

6.548

2.25

3.906

6.157

1.71E+06

0.755

Tooth2 anterior inner

4

0.221

-0.214

5.203

1.404

1.801

3.205

1.54E+06

0.858

Tooth1 posterior outer

3

0.394

-0.042

11.118

4.264

2.561

6.825

1.83E+06

0.863

Tooth1 posterior inner

2

0.25

-0.795

9.868

1.921

2.775

4.696

2.08E+06

0.665

Tooth1 anterior inner

1

0.218

-0.087

11.446

2.482

2.121

4.603

1.28E+06

0.782

There already are a few modifications: Pos1 and Pos2 indicate where the data comes from on the tooth: the anterior, posterior or central part of the inner, outer or central rings of ornamentation. If you have a hard time picturing it, just imagine that a tooth from that fossil fish is similar to a simple target, bull’s eye kind of like, with one outer ring, one inner ring and a central point, and the data comes from top to bottom in the order: top outer ring, top inner ring, central point, bottom inner ring, bottom outer ring. I could not always get good data from everywhere, though, and sometimes I thought I had bad data so I sampled again, in the end I have two measurements for similarly placed areas. Oh, and we have several teeth along a tooth row so… stack them targets one atop another along the wall. And let’s stop mentioning targets, before I start getting confused as to what is the topic here. From the most anterior part to the most posterior, positions have been numbered in the “rank” column.

Just to let you know, I did not collect the data for the fun of it. Nor was it gathered in that manner for trivial reasons, no, we will be testing a hypothesis and further exploring the data here. The hypothesis being: “Microtextural data is similar at any position along the tooth row.” The alternative one: “Microtextural data does change with the sampling position.” Why test that? Well if only a part of the tooth is preserved undamaged, it would be useful to know whether it can be compared with the rest of our sample anyways. Otherwise, one would need to only compare similar positions between them, to compare like with like, also take good notes and be very careful when acquiring data.

First let’s get the numbers: just copy the data frame above in anything that will allow you to save it and read it. For this example and because I write from a computer using the most widespread OS, I will use notepad to paste the copied data and save it in the R folder as “test.txt”. Then one just needs to set it as the working directory for the session. For me, the R folder is on the D:/ drive so in R I just set the directory as:

setwd(“D:/R”)

And I bring the data in, before checking it.

test<-read.table(“test.txt”,header=TRUE)

str(test)

We can now test the hypothesis in several ways. What I will use here is a standard analysis of variance. One could write a lot about the analysis of variance and the many precautionary steps one should take before using it, but this is a topic for another time. We will assume that there is no particular issue to apply it here. Analysis of variance, or anova, can be done in R using a command line such as:

aov(test$Par1~test$Tooth)

Which tells you a lot or pretty little, depending on how much you know about it. But it does not provide what we are interested in: a result telling us if the variance in the parameter 1 (Par1) can be explained by the fact that it comes from different teeth (“Tooth” factor). For that, we need to use the summary function

summary(aov(test$Par1~test$Tooth))

What have we got here? Similar information (degrees of freedom, sum of squares) and also the F-statistic, and the p-value. What the software does is that it compares the F-statistic calculated to that which you would expect if the factor Tooth had no influence on the data whatsoever. The p-value expresses broadly an estimate of the chances of making a mistake when considering that the factor explains the observed values. As a rule of thumb, usually a p-value below 0.05 or 0.01 is used to reject the null hypothesis (according to which the tested variable is not under the influence of the factor). Here you should have a P-value of 0.3333, henceforth, we cannot show that the tooth factor influences the data. Perhaps it does but because of bad luck our data does not show it, in that case we accept the null hypothesis since there is no support for the alternative one.

Then we can do the same test for all parameters, and also look at different factors if we want, don’t hesitate to give a try:

summary(aov(test$Par2~test$Tooth))

summary(aov(test$Par3~test$Tooth))

summary(aov(test$Par1~test$Pos1))

summary(aov(test$Par1~test$Pos2))

Typing it all is a bit tedious, though. One thing that can be done quite easily in R is to have the same commands done on similar series of data. We can do it with “for”. In fact we will use the for function to have the anovas (with the tooth factor) done for columns 5 to 12 (Par1 to Par8), just make sure that it makes sense, so “for any value of “i” in the series 5, 6, 7, 8, 9, 10, 11, 12, perform an anova testing whether the values in column number “i” can be explained by the tooth factor”. In R code this gives:

for(i in 5:12){summary(aov(test[,i]~test$Tooth))}

Surely you typed/entered it and saw nothing happen. The reason is that we asked the software to perform the analysis, not to print the results on the screen:

for(i in 5:12){print(summary(aov(test[,i]~test$Tooth)))}

All right, now we have the results but we do not know for which parameter. Luckily, we just need to have the software print that as well, before the test, i.e. we ask R to perform two tasks, just do it by adding “;” between the commands:

for(i in 5:12){print(colnames(test)[i]);print(summary(aov(test[,i]~test$Tooth)))}

Better, no? The “tooth” factor does not seem to have a significant influence on the data. Let’s see if another one has. Perhaps “Pos1” (position 1) would make sense: could areas from the posterior part of the tooth have a different microtexture than the ones from the anterior part?

for(i in 5:12){print(colnames(test)[i]);print(summary(aov(test[,i]~test$Pos1)))}

Still nothing. What about the actual position along the tooth row? We can do the test with the variable Rank, used as a poor surrogate for the “distance from the anterior part of the jaw”.

for(i in 5:12){print(colnames(test)[i]);print(summary(aov(test[,i]~test$Rank)))}

HAHA! The parameter 7 seems to vary with position along the jaw. That is a result, and as a matter of fact it can be biologically interesting, as it means that from anterior to posterior, the values we can expect to get for it are not identical, and since Par7 is expressing some aspect of the homogeneity of the texture, we can conclude that from anterior to posterior, the different areas are more (or less) heterogeneous in texture. We also know that this is not because the different teeth are worn in different ways. Well they are, but it is not which tooth is considered that explains the values of the data (before, it was assumed that each tooth had its own “microtexture signature”, i.e. that any point on the tooth was as good as another but that the teeth were different in respective signatures), rather the position of the sampled point matters. If you recall the previous entry about R, now is the time to make good use of it to look at the data. Apparently, values get higher as one gets farther from the anterior part of the jaw.

plot(Par7~Rank,data=test,pch=16)

Time to have fun! We can also have one symbol for each position (anterior, posterior, central) and one colour for each considered ring (inner, outer, central point). And do you remember the linear models and predictions as well? No reason not to make use of it. Before that, we will also separate the plot device into several ones in order to check on our progress:

par(mfrow=c(2,2))

plot(Par7~Rank,data=test,pch=c(15,16,17)[Pos1],col=c(“red”,”green”,”blue”)[Pos2],ylim=c(min(test$Par7),max(test$Par7)),main=”Par7~distance from the anterior”,xlab=”Distance from the anterior”)

Model1<-lm(Par7~Rank,data=test)

Pred1<-predict(Model1,se.fit=TRUE,interval=”confidence”)

par(new=TRUE,bty=”n”,xaxt=”n”,yaxt=”n”)

matplot(test$Rank,cbind(Pred1$fit),lty=c(1,3,3),type=”l”,col=”black”,lwd=2,ylim=c(min(test$Par7),max(test$Par7)),xlab=NA,ylab=NA)

You know what? I would rather have those three lines displayed as on line in the middle of an area, a bit transparent if at all possible. The line part is fairly simple if using what we just typed:

par(xaxt=”l”,yaxt=”l”)#this is just to have the axes drawn

plot(Par7~Rank,data=test,pch=c(15,16,17)[Pos1],col=c(“red”,”green”,”blue”)[Pos2],ylim=c(min(test$Par7),max(test$Par7)),main=”Par7~distance from the anterior”,xlab=”Distance from the anterior”,bty=”l”)

par(new=TRUE,bty=”n”,xaxt=”n”,yaxt=”n”)#and here so as not to have new axes drawn

matplot(test$Rank,Pred1$fit[,1],pch=20,type=”p”,col=rgb(0.1,0.1,0.7,0.5,1),ylim=c(min(test$Par7),max(test$Par7)),xlab=NA,ylab=NA)

The way the colour is set here uses the function rgb (for “red”,”green”,”blue”), the first numbers stand for the values of red, green and blue respectively, the fourth one is for the opacity and the fifth one sets the maximum value for the first four. i.e. here we have a colour set as 10% of the maximum red, 10% maximum green, 70% maximum blue, half-transparent.

You may notice that two points appear more opaque than others. Those are the positions for which two samples were taken, so two points are drawn one over another. We could manage to have only one point, but for the time being it is unnecessary hassle. The fun bit starts here, for we wish to display the confidence interval as an area. For that we will use the function polygon and a little trick. Polygon needs coordinates to display the shape correctly, so we can’t really just give values of X and Y for the upper and lower limits. See for yourselves:

par(xaxt=”l”,yaxt=”l”)

plot(Par7~Rank,data=test,pch=c(15,16,17)[Pos1],col=c(“red”,”green”,”blue”)[Pos2],ylim=c(min(test$Par7),max(test$Par7)),main=”Par7~distance from the anterior”,xlab=”Distance from the anterior”,bty=”l”)

polygon(test$Rank,Pred1$fit[,2])

polygon(test$Rank,Pred1$fit[,3])

And just concatenating the two series of values won’t do, it would just give crossed lines as one goes from an extremity of the X axis to the other:

polygon(rep(test$Rank,2),c(Pred1$fit[,2], Pred1$fit[,3]))

In the end, I find it more convenient to have an object containing the values in the order. Since Rank is in decreasing order in the data frame, it will need sorting:

PolX<-c(sort(test$Rank,decreasing=FALSE),test$Rank)

That’s for the X part of the polygon, for the Y part, it is going to be tricky, since we have 26 values to sort but using the sort function may end up in mismatched results. Actually, here, with the values we have, it could work, but imagine that the slope of the line were not that steep, then sorting the values in increasing or decreasing order would not do. We cannot either use the values in the Rank variable as a factor to order values from 1 to 26 with a factor going from 1 to 24. But one could use a factor made from a sequence from 26 to 1, then the polygon should be fine:

PolY1<-as.numeric(c(Pred1$fit[,2][as.factor(seq(26,1))],Pred1$fit[,3]))

par(xaxt=”l”,yaxt=”l”)

plot(Par7~Rank,data=test,pch=c(15,16,17)[Pos1],col=c(“red”,”green”,”blue”)[Pos2],ylim=c(min(test$Par7),max(test$Par7)),main=”Par7~distance from the anterior”,xlab=”Distance from the anterior”,bty=”l”)

polygon(x=PolX,y=PolY1)

And now to start colouring the polygon, without border, then we add the regression line:

par(xaxt=”l”,yaxt=”l”)

plot(Par7~Rank,data=test,pch=c(15,16,17)[Pos1],col=c(“red”,”green”,”blue”)[Pos2],ylim=c(min(test$Par7),max(test$Par7)),main=”Par7~distance from the anterior”,xlab=”Distance from the anterior”,bty=”l”)

polygon(x=PolX,y=PolY1,border=NA,col=rgb(0.2,0.2,0.6,0.2,1))

par(new=TRUE,bty=”n”,xaxt=”n”,yaxt=”n”)#and here so as not to have new axes drawn

matplot(test$Rank,Pred1$fit[,1],pch=20,type=”p”,col=rgb(0.1,0.1,0.7,0.5,1),ylim=c(min(test$Par7),max(test$Par7)),xlab=NA,ylab=NA)

For further improvement we can also add an area showing the 99% confidence interval instead of the 95% or on top of it.

Pred2<-predict(Model1,se.fit=TRUE,interval=”confidence”,level=0.99)

PolY2<-as.numeric(c(Pred2$fit[,2][as.factor(seq(26,1))],Pred2$fit[,3]))

par(xaxt=”l”,yaxt=”l”)

plot(Par7~Rank,data=test,ylim=c(min(test$Par7),max(test$Par7)),main=”Par7~distance from the anterior”,xlab=”Distance from the anterior”,bty=”l”,type=”n”)

polygon(x=PolX,y=PolY1,border=NA,col=rgb(0.2,0.2,0.6,0.2,1))

par(new=TRUE,bty=”n”,xaxt=”n”,yaxt=”n”)#and here so as not to have new axes drawn

matplot(test$Rank,Pred1$fit[,1],pch=20,type=”p”,col=rgb(0,0,0.7,0.5,1),ylim=c(min(test$Par7),max(test$Par7)),xlab=NA,ylab=NA)

polygon(x=PolX,y=PolY2,border=NA,col=rgb(0,0.6,0,0.2,1))

points(Par7~Rank,data=test,pch=c(21,22,23)[Pos1],bg=c(“red”,”green”,”blue”)[Pos2],col=”black”)

We have had our fair share of graphical fun, and looking at the graph you may have noticed something striking: the green points all seem to have lower values than the blue ones. This is something that was not tested for in the anovas from earlier (though you may have cleverly checked it for yourself). This shows how plotting the data with points and colours according to different factors can give you an idea of where the important information might be:

for(i in 5:12){print(colnames(test)[i]);print(summary(aov(test[,i]~test$Pos2)))}

As you can see, the values we get for the parameter 7 can be explained by the factor considered here. This factor distinguishes the outer, inner and central parts of the teeth. Now we know that the outside part of the tooth is not heterogeneous in the same way as the inner ring, and perhaps not the center part, though for it we have only three points, which is very low, so we will not draw conclusions for that bit. There are actually ways to highlight which categories are different one from another, but this is not our purpose here. Just know that we could explore the data so as to see if the data is under the influence of only the factor Pos2, the distance from the anterior or an interaction with other factors e.g.:

summary(aov(Par7~Pos2*Pos1,data=test)) #only Pos2 has an influence on the data

summary(aov(Par7~Pos2*Tooth,data=test)) #only Pos2 has an influence on the data

summary(aov(Par7~Pos2*Rank,data=test)) #Both Pos2 and Rank influence the data, though each in its own way (their interaction is not significant, btw this is an ancova, analysis of covariance, but more about that another time)

So there is no need to worry, what we have done so far is not useless or uninformative, there is just more to the data. Were the interaction significant, it could be justified to look at separate models, but here the two elements of importance (higher values away from the anterior extremity and higher values for the outer ring) are visible enough. We can conclude that for that one parameter there is ground to pay attention to where the data comes from along the jaw. All other parameters (examined here and many others) actually do not vary with the distance from the anterior extremity or the considered ring of the teeth. Why does the heterogeneity vary with which part of the ornamentation is sampled? I would suggest that the bundles formed of crystals of hydroxylapatite, the hard parts of the tooth enameloid or dentine, are not oriented in a similar way all over the tooth. Actually, in many fish species, they have a radiating pattern in the enameloid (just like rays around the sun on a child’s drawing), so they are oriented more parallel to the long axis of the jaw on the outer ring than on the inner one.

Just a potential explanation, associated with a pretty graph.

par(bg=”transparent”,mfrow=c(1,1),xaxt=”l”,yaxt=”l”,fg=”navajowhite”,col.axis=”navajowhite”,col.main=”navajowhite”,col.lab=”navajowhite”,col.sub=”navajowhite”)

plot(Par7~Rank,data=test,ylim=c(min(test$Par7),max(test$Par7)),main=”Par7~distance from the anterior”,xlab=”Distance from the anterior”,bty=”l”,type=”n”)

polygon(x=PolX,y=PolY1,border=NA,col=rgb(0.4,0.4,0.9,0.5,1))

par(new=TRUE,bty=”n”,xaxt=”n”,yaxt=”n”)#and here so as not to have new axes drawn

matplot(test$Rank,Pred1$fit[,1],pch=20,type=”p”,col=”slateblue”,ylim=c(min(test$Par7),max(test$Par7)),xlab=NA,ylab=NA)

polygon(x=PolX,y=PolY2,border=NA,col=rgb(0,0.8,0,0.4,1))

points(Par7~Rank,data=test,pch=c(21,22,23)[Pos1],bg=c(“mistyrose”,”violet”,”orchid4″)[Pos2])

Some may have noticed a rather long “silent” interval in this blog. I was planning for more regular updates but much of what is yet to come might actually turn to be publication material, and as I am writing up my thesis right now, I am a little bit paranoid and do not wish to take risks.

So I thought that instead, we could have fun with numbers. I like to have fun with numbers. Many may have heard that mathematics are some sort of universal language. Like other languages, it is useful to learn it, and sometimes go back to the core basics of it. Maybe not the basics, but we can start looking at a few useful things.

From a methodological point of view, when one has data available, it is always sensible to search for patterns, links, variables that explain one another. e.g. if one can calculate values for a variable “b” after the values of a variable “a”, perhaps a causes b or b causes a, but more likely the same phenomenon influences values of both a and b. This can be helpful for c. What’s c? Well c is a third variable. We know that something influences b and c in such a way that one can calculate c after b. But what if we do not have values for b, just for a?

Sounds like a lot of theoretical gibberish, perhaps an example could be useful. Let’s imagine that we have two samples of fish, one is an ensemble of fossilised bones, the other one is an ensemble of modern members of the same order, a bit like two heavy metal bands would be part of the same genre, perhaps even one has descended/”been influenced” from/by the other: Let’s call the fossil species Niger sabbatum and the modern one Magnus magus.

Now, we want to know how hard a bite Niger sabbatum can have, in order to see if it could have crushed some large oysters or such stuff found in the same strata. But we have only fossil bones and a modern analogue at our disposal, for which we have measurements.

Now is the time for you to start to play with me. In order to do that, you will use R, an open-source number-crunching software more and more widely used in science, available from here: http://www.r-project.org/

You can just copy and paste the following commands or type them, as you wish. Just remember that R is case-sensitive. Plot and plot are not the same.

First we will have R generate fake measurements of the bite force of Magnus magus (the modern fish)

bite<-sort(rnorm(n=100,mean=6))

Here “bite” is an object in the virtual environment, it stores the data. “rnorm(n=100,mean=6)” is the command used to generate the data, it did generate 100 values, according to a “normal” law, with a mean of 6 and a standard deviation of 1 (that last parameter is the default for the function, so there is no need to write it. For more information about functions in R, just type “?” in front of the name of the function e.g. ?rnorm). Also “sort” means that the data has been sorted from the lowest to the highest value. “<-“ represents an arrow basically meaning that the object on the left stores what is on the right. Note that a function is always followed by brackets containing the parameters.

If you want to look at your data, type bite it will give you a list of 100 values. If for any reason you want to generate another set of values, just type the first line of code again. You could try changing the value for the mean or use a different standard deviation. Also, R makes some assumptions when reading the command lines, one is that you provide the parameters of the function in the default order for it. So typing rnorm(n=100,mean=6) or rnorm(100,6) is the same for R.

Now, we will generate a set of values representing a physical measurement, let’s say… the length of the dentary of our extant animals:

dlength<-sort(runif(100,min=2,max=6))

Note that it does follow a uniform distribution from 2 to 6, and is once again randomly generated and sorted.

What does it look like? Let’s see, what we have if we plot bite as a function of dlength, i.e. bite force as a function of dentary length. The function to type would be:

plot(bite~dlength)

 

note that we use “~” between the two arguments of the function, this in R is in fact considered as a single argument of type “formula”. You can get the same graph by précising both x and y as arguments: plot(y=bite,x=dlength) which, because of the order of the default arguments (x first), is different from plot(bite,dlength).

Since the data is randomly generated it is unlikely you have the same results as me, but there is no need to worry about it. It seems like there is some sort of rather good correlation between the two variables. We will use it as a simple linear model, that would be bite force = a*length of the dentary + b. Obviously, R will calculate a and b for us:

model1<-lm(bite~dlength)

And to check your model, just type model1. It will give you the intercept and the slope.

“Yes but excel also tells me if it is a good slope and…” You want more information about your model? Type summary(model1). If you want to add a “regression line” abline(model1).

This is just so primitive, when we can have that trend and a confidence interval containing 99% of the data predicted:

d1<-predict(model1,interval=”prediction”,level=0.99)

Here we asked R to predict, based on model1 a series of values representing the main trend in the data (where you could expect the points to plot if they followed the model perfectly) and also a 99% interval, which represents where 99% of the data actually would be, according to the parameters of the model. It represents the natural uncertainty in the data, i.e. the variability of our Magnus magus. R has even been kind enough to tell us that this is an estimate for the response of the model, not a representation of the observed variability.

You perhaps checked d1, it is just a matrix with 3 columns of 100 numbers. We will see that it is useful nonetheless. Let’s plot our data again, this time using complete circles. We can change the plotting symbols with the argument pch:

plot(bite~dlength,pch=16)

And now we will add the regression line and the representation of the uncertainty of predictions based on the model. We will use the function “matplot”, précising dlength as x and d1 as y. R will “understand” that the three series of numbers of d1 have to be plotted according to the same x values. We will also precise the type of representation of the data, here “l” for line, the line type lty, and the color (col) of the lines. We precise that we want the upper and lower interval lines plotted differently, so we provide a vector of values thanks to the function “c” (for “concatenate”). We also want them in different colors so we indicate it: one time in blue, two times in red (rep is for repeat, here: repeat “red” 2 times). Typing add=TRUE means that we want to add the lines to the current plot.

matplot(x=dlength,y=d1,lty=c(1,2,2),type=”l”,col=c(“blue”,rep(“red”,2)),add=TRUE)

Now we will bring the measurements from the fossils (Niger sabbatum) in the virtual environment:

dfossil<-sort(runif(50,min=6,max=10))

But if we want to make predictions based on such data, we need to comply with the requirements of the predict function: the new data must be a data frame with the same names for columns as the original data. So we will turn dfossil into a data frame with as.data.frame and name the single column of it “dlength” (R interprets anything between the the “” symbols as text).

dfossil<-as.data.frame(dfossil)

colnames(dfossil)<-”dlength”

We can then have the software predict hypothetical bite force values for the fossil, by providing the fossil measurements as new data to be used instead of the old data:

fossil.bite<-predict(model1,newdata=dfossil,interval=”prediction”,level=0.99)

Now, before we plot the results, we should have a look at it. Typing fossil.bite[,1] will give you the predicted values for the fossil bite force ([] when after an object allows you to get a part of the information, if the object has more than one dimension, you have to separate the dimensions with a “,”. Here we want all the values from the single column so [,1] gives us all the values of the column coming first, and since we did not indicate which rows had the interesting information, we get all of them. To get everything but a part of the data, you can use – in front of the number(s)). If you used similar values to mine, it will be way out of the plotting region of the graph we made earlier. So we will use a little trick to make sure we have all our values and estimates being plotted on our next graph. We will concatenate the measures and estimates in two objects and then plot the data between the minimal and maximal values for them, thus ensuring we get everything plotted.

lengths<-c(dlength,dfossil$dlength)

bites<-c(bite,fossil.bite[,1])

And we can now plot our data, just like before, but with the arguments ylim and xlim defining the limits of the plotting region as the minimal and maximal values of our variables or estimates (using the functions min and max). And we will add some text to the axes:

plot(bite~dlength,pch=16,xlim=c(min(lengths),max(lengths)),ylim=c(min(bites),max(bites)),xlab=”Dentary length (m)”,ylab=”Bite force (N)”)

matplot(dlength,d1,lty=c(1,2,2),type=”l”,add=TRUE,col=c(“blue”,rep(“red”,2)))

Let’s add the confidence interval for the predicted fossil’s bite force:

matplot(dfossil,fossil.bite[,-1],lty=rep(2,2),type=”l”,add=TRUE,col=rep(“violet”,2))

And to finish, we simply add the points of the predicted force and measured fossil dimensions:

points(fossil.bite[,1]~dfossil$dlength,pch=16,col=”blue”)

Pretty, isn’t it? Perhaps next time we will see how to even decorate it a bit more like that:

Copresented with Mark Purnell, Martin Rücklin, Philip C. Donoghue, Emily Rayfield, Zerina Johanson, Kate Trinajstic, Federica Marone and Marco Stampanoni

Representatives of the clade Gnathostomata include most modern vertebrates and form a major component of post-Silurian ecosystems. The morphology of their jaws shows a major diversification in the late Silurian and early Devonian followed by stable patterns of functional morphospace occupation. Recent work in modern ecosystems and organisms demonstrates however that morphology and ecology are not always tightly linked. Inferences of predator-prey dynamics in the fossil record could be undermined unless reliable predictors of trophic ecology are developed.

Placoderms were a major component of Devonian aquatic ecosystems. We apply modern microwear and microtexture analysis techniques to their jaws, and assess the power of the methods to answer questions of ecomorphology, ontogenetic shift in diet and predation-driven macroevolution events.

Occlusion in the statodont dentition of placoderms is maintained through wear of the feeding structures. This wear reveals dentine and bone and resets the microwear signature on a regular basis. Until recently, microwear on dentine was thought to be less useful than enamel, but microtextural analysis takes a very different approach and can yield ecological information. Microtextural analysis of dentine and bone along the jaws of placoderms allows us to test hypotheses of trophic diversity among these earliest gnathostomes.

As I mentioned in the previous post, I will here share some knowledge of dental microwear. As a foreword,  “dens” is the latin for teeth (And please do not take offense if I mention it, I am not assuming that you are dens… eurh… lame enough joke) and dental is derived from it, with the meaning “pertaining to teeth”. It definitely does not sound very english, but is a bit nicer on the tongue and potentially less offensive than “toothic”. As for microwear, it has nothing to do with microwaves, save for most letters. You surely already understood that it is the wear that one can witness at a microscopic scale.

In “Size matters 1″ I mentioned when dental microwear was first used to compare different feeding habits in groups of animals. Walker and colleagues did not make a precise count of the observable scratches, pits, etc… at the surface of teeth, but already the idea of comparing the dimensions (length, width) and density of such features were mentioned, along with the fact that the microwear patterns did vary with seasons and available food, as seen in Procavia johnstoni.

Really, all that was needed then was a standard way to measure, record, compare dental microwear. Several teams got started on it, using images they got from scanning electron microscope or other high-magnification imaging techniques and measuring, first by hand, then on computer screens.

Microwear in several primates

The images can give you an idea of what it looks like. They are from a study by Merceron and colleagues (2005) looking at digitized photographs of dental surfaces in a range of primates in order to get an idea of the diet of a fossil primate (here: Ouranopithecus macedoniensis) and hence get a clue as to where it fits in the food chain of its past ecosytem. Several similar studies are out there applying that same protocol: use a modern analogue and apply it to the fossils.

I think it is worth mentioning that the amount of work prior to a wide application of the techique must have been tantalizing. Grab a mirror, and I recommend you don’t break it, not that I am superstitious, but it can cut pretty badly. Have a look into your mouth and at your teeth. See how complicated that is in reality? You have surely already learnt that there are several types of teeth: incisors, canines, premolars, molars. Look at them closely, keep in mind that we want to look at them at the microscopic scale, and you will see that they are not “that” simple. Molars especially are like a miniature landscape with valleys and mountains. Some people dedicated years taking high-magnification photographs of each and every tooth at all the different angles to look at each and every facet and count, measure (size matters, you see…), compare the microwear features in order to find where the next researchers to come would have to look to find the most accurate information pertaining to the diet of those animals. It knid of reminds you about that story of Thomas Edison finding several hundreds or thousands (depending on which/whose story you read/listen to) of ways to assemble a lightbulb that will not work, and a few (or a single) efficient one. But anyways, as one of my favourite vampires would say, “Where’s the fun without complications?!”.

And complications arise when you think things would get simple. True, the technique is being perfected for mammals, cute furry fluffy animals that do chew and rub teeth one against another, which means they have wear facets on their teeth: flat areas, even at the microscopic scale. And it is possible to take pictures of them fairly easily, provided the microscope is good enough. What it tells us about how and what animals eat and ate is actually impressive, it is possible to know what an animal was eating several million years ago, and if we know what an herbivore was eating, we know what kind of vegetation was around, so we have an idea of the environment and ecosystem, etc… One can use the technique along with others to draw a picture of the entire area as it was a long, long time ago in a galaxy not that far away. Sounds great, so let’s try to apply it to fish, to know how things were in the oceans as well!…

Would have been great if our little scaly friends did not have a few particularities:

  •  Polyphiodonty: Basically it means that they replace their teeth all through their life, not just once like humans.
  • Coniform teeth: Making things funnier: the new teeth are cone-shaped, without wear facets, so it is difficult to have a flat surface to measure the actual dimensions and orientation
  • Lack of or incomplete occlusion: They don’t really rub their teeth one against another, so we will not get a wear facet, no matter how long we give them

Nevertheless, by taking images of the teeth and focusing on the “flattest” observable area, researchers at the university of Leicester (UK) managed to get enough measurable information to discriminate between populations of sticklebacks, a group of fish that have been studied a lot because of their habit of evolving into “pointy” and “non-pointy” morphologies, the first one living at the top of the water column (the pelagic ones) and the later at the bottom (benthic). Simply put, fishes feeding closer to the bottom and the sediment there had a different microwear pattern than the ones feeding way above. Ok, nice, so now what? Being able to say that such group of animals was feeding close to the bottom of a alke for millions of years is interesting but it is not really revolutionnary. To be able to say that in that fish lineage, several times in the last million years populations of one type evolved into populations of the other type, in response to environmental change, is more interesting, but I would like to be able to tell more than that.

The big issue is that teeth from most animals are three-dimensional in shape, no matter how you look at them or at what scale. Wear facets of mammals are the exception. But now is the third millenium after an arbitrarily decided time, and we can study such 3D surfaces at the microscopic scale, surely, can’t we? Once again, trust the mammalogists, especially those working on primates and other Hominidae, to come up with a solution. Dental microwear texture analysis they call it. Looking at how rough or smooth, how directional, heterogeneous, etc… the surface of teeth is at the microscopic scale. Not only does it provide at least as much information as what is now “clasic microwear”, it also makes for nice pictures. Even better, since the data is in fact just a points cloud, a large number of XYZ coordinates, it can theoretically be electronically exported and shared around the world.

Scott et al. 2006

Example of pictures of dental microwear texture, from Scott et al., 2006.

Then came the time to try and apply it to something funnier: fish teeth! This is where the story of my work will start…

Despite what seems to be an international saying, size matters. Just so much as dimension, scale, quantity and many other ways to use numbers in order to compare two or more things. If size did not matter, there would never have been any Eiffel tower, doppelsoldner or Carolus Magnus (Also known as Charlemagne, Charles the great, Karl der Grosse, so on so forth). I may not continue on the habit of humans to build bigger things, strike harder or possess more.
What does that “size matters” have to do with my work? As a matter of fact, it has to do with most of the scientific sphere, as many (most) among us come to conclusions thanks to measurements. Whether we try to measure the size of an expanding universe, the quantity of water to brew a great lager or the proportion of crushed food in the diet of a fish, we do it with measurements and we compare it with other (dis)similar measurements.

Now we get to an interesting point: comparing. Size matters, because we compare. That habit may be quite atavistic in nature, as I am keen to trust that our early ancestors did it regularly. Who would blame a nice, lovely, furry Morganucodon (let’s say it is a male, particularly furry, and ginger as well) to estimate the size of one of his comrades before trying to chase him out of his territory or operating a clever but efficiently hurried tactical retreat ? In a similar way, australopithecines who did throw rocks at saber-toothed tigers (such as Dinofelis that you might have seen on “walking with beasts”)surely had more success (and ensuing chances to reproduce) than those throwing harmless pebbles or trying to throw boulders they could barely lift off the ground.

Hence when the wise and civilised Homo sapiens comes to witness a feat in an animal which it can itself not expect to perform with such ease, it tries to understand it through comparison of measurements (this sentence is intended to keep away the knights of “ni”). The surprising efficiency of an atlantic wolffish (Anarhichas lupus) when crushing a crab can be explained by the proportionately heavier teeth in its jaw and stronger, bigger cheek muscles. If you cannot be bothered to go browse the web for a comparison, I would say that their dentition is to ours what an hydraulic press is to a kid’s plastic hammer (which produces an interesting noise once used, not that different from the wild sounds of the miniature giraffe) and their cheek muscles are like Conan to our inner Gandhi (for most of us).

Thus is wisdom registered: that big broad, heavy teeth can be used to crush hard food, and being cheeky can help as well. And the wisdom passes on by word of mouth, through scriptures or other more esoteric or technical means. We humans (I am here assuming that only mere humans will read this. If I stand corrected, please accept my apologies as I was unaware of the existence of any other reading-able entity at the time of writing) record a lot of things and call it culture. The thing with culture is that it provides another reference level with which to compare new discoveries. Here again size matters e.g.: “My fish is a bigger crusher than yours, it could crush a car!” Why would any fish want to crush a car remains up to speculation, but I suppose that if your groceries and yourself are inside it, a comparison with a tin can is in order.

Gyrodus cuvieri

Vomer (the "palate") of Gyrodus cuvieri

Finally, the main question: Is anatomy a reliable proxy to infer ecology in fossil organisms? Back to big, heavy, ”crushing” teeth in our cheeky fish. If one were to ever find fossils displaying such a molariform dentition, it is easy to jump to conclusions: Such animals were shell-crushers because they clearly were equipped for it. One example: Pycnodontiformes. The pycnodontiformes are a monophyletic group of morphologically distinctive neopterygian fishes (Kriwet & Schmitz, 2005) with such teeth (see pictures).

Eomesodon granulatus

Pre-articular of Eomesodon granulatus

It all sounds pretty logical until you actually look at more of the animals living around us, the most characteristic one might be the dog. Dogs have teeth adapted for hunting and eating other animals, the wondruous result of millions of years of evolution, inherited from wolves or other canidae, the whole story still being debated. Auuming that dogs are descended from wolves, they have been twisted afterwards by human selection, as viciously as the flesh of a Tremere at the hands of a Tzimisce, into a variety of shapes not really that of hunters, but they retained most of their meat-processing teeth and we feed them… a variety of strange things such as biscuits or even so-called “vegetarian dog food”. Far from the wild hare.
Farther from us, wild animals with an apparently specialised morphology often behave as generalists. This is called Liem’s paradox, but requires surely a complete separate post with examples. I will just say that in Florida, populations of the sheepshead seabream (Archosargus probatocephalus) are known to be anatomically identical and yet have significantly different feeding habits, grazing on algae on one side and crushing shelled invertebrates on the other. Guess what kind of teeth they have?

Jaws of Archosargus probatocephalus

Jaws from two different Archosargus probatocephalus. I swear they eat different stuff!

Exactly! They have such big teeth that make for a wonderful nutcracker, though Hoffmann, Dumas and Tchaikovsky unlikely ever considered any mention of it in their respective adaptations of the story (anybody keen to hear more of it can always listen to the suite arranged for organ here). But onto the main matter at fin (or lepidotrichia to be anato-geographically consistent): Liem’s paradox unparadoxically is seriously bugging our interpretation of the ecology of fossil organisms. Henceforth, anybody looking at trends in the fossil record in the hope of finding correlations between predators and prey (one of the most common type of macro-ecological study) should make an intensive use of “perhaps”, “may”, “could”, “supposedly” or start looking for another way to track predator-prey relationships, perhaps in another dimension.

I swore to myself I would not get started on the M or string theory, I will therefore stop this digression now and explain myself: Size matters, but dimension and scale do too and are closely associated with it. Simply looking with the naked eye may not provide much information about the diet of two apparently identical fishes whereas considering the result of processing different foods could be revealing much more. It is such an idea (though not linked in anyways to the ecology of fossil fish or Liem’s paradox) that led to the first studies linking dental microwear and diet. The study by Alan Walker, Hendrick H. Noeck and Linda Perez published in 1978 in Science was an early drop falling into an otherwise placid lake. The ripples of this study would later turn into major waves as they gained momentum, but looking at the published works in the late 70′s, early 80′s, their work must have been looked at as an interesting curiosity, little else. Their study on two sympatric (living in the same place) species of Hyrax showed that the grazers and browsers could be distinguished by their microwear. More about it on the magazine’s website.

Dental microwear is regarded as one of the most efficient tools to infer diets in fossil toothed organisms. This term encompasses all the minute scratches, pits, gouges, and other damage at a microscopic scale that do get recorded at the surface of teeth. Imagine yourself chewing leaves with some grit or dust on it: the surface of your teeth will get covered in scratches as you rub the lower and upper teeth one against another, one part of such wear because of the grit, the other one because of tooth-tooth contact. If on the other hand you were to repeatedly crush nuts, or fruits with tiny but very hard seeds, rather than rubbing your teeth against each other, you will bring them in contact to crush, and the most resilient part of the food will impact their surface quite literally, as pits will be produced.
We have here unlocked the access to another dimension of knowledge. Indeed, we need to look at teeth at a different scale at the risk of spreading myopia through the academic world, and we make our measurements in not so quite big a dimension as to show off with the “bigger, meaner, tougher than yours” stuff. Yet size matters, just so much as dimension, and scale, which we have dealt with, the size and quantity of scratches, gouges, pits, their length, width, depth, orientation, all of it, we can measure and compare.

Enter the world of dental microwear analysis, which will be the topic of “Size matters 2″

If you are interested:

  • The study comparing populations of Archosargus probatocephalus

Cutwa, M.M. & Turingan, R.G., 2000. Intralocality Variation in Feeding Biomechanics and Prey Use in Archosargus probatocephalus (Teleostei, Sparidae), with Implications for the Ecomorphology of Fishes. Environmental Biology of Fishes, 59(2). http://dx.doi.org/10.1023/A:1007679428331

  • The works by Walker, Noeck and Perez
Walker, A., Hoeck, H.N., & Perez, L., 1978. Microwear of mammalian teeth as an indicator of diet. Science, 201(4359). http://www.sciencemag.org/content/201/4359/908
  • The paper by Kriwet and Schmitz

Kriwet, J. & Schmitz, L., 2005. New insight into the distribution and palaeobiology of the pycnodont fish GyrodusActa Palaeontologica Polonica 50(1). http://www.app.pan.pl/article/item/app50-049.html

I will here tell how I started being interested in dental microwear in fish, not how this field of study came to be.
I suppose you could say it all started back in 2007. I was at the time a trainee, as part of my masters course, in the Department of Geology at the University of Lille1, under supervision by Prof. Alain Blieck. My project was simple and rich of opportunities: prepare, describe, illustrate fossils found and donated to the department by Mr Christian Loones a local amateur palaeontologist.

BrachiopodsThe samples were coming from the Boulonnais area, from the quarries around Ferques, more precisely. If you are searching for fossils, though, I’d advise to go there only with the authorisation of the companies working the quarries, as this can be very dangerous. The place is particularly good if you are looking for crinoids or brachiopods.

Years of collecting had as a result an accumulation of odd bits and pieces of rock in the rock store of the geology building. And I started taking them out, extracting fossils from the limestone, mostly by plunging them into acid. The rocks were of Devonian age, mostly Givetian, but also Frasnian, and I found there plates of placoderms, teeth and scales of actinopterygians and one weird thing…

toothplate of Melanodus loonesi

It had one smooth and punctured side, the opposite one broken, revealing a bony-like structure. It was black, as most fossils of vertebrates in the palaeozoic limestone of the Boulonnais are, and was like nothing else one could have expected to find there. After discussing the matter with my supervisors (A. Blieck and C. Derycke) and reviewing litterature, one was forced to admit that we had the oldest known toothplate from an Holocephalan. Holocephalans, you may better know as ratfishes, are medium-sized chondrichthyans (cartilaginous fishes) with very broad toothplates, the result of the fusion of several teeth from a toothwhorl. They can be pretty ugly, but some are fairly nice-looking animals with the right light and orientation. Usually, fossil chondrichthyans from the Givetian look more like the Orodontid tooth here. So to to find a massive toothplate like that was shocking.

Orodontida indet.

Orodontida indet.

We described and named it, after checking that it was really from the strata the labels mentioned, something like two dozen times, with thin sections of what was left of the matrix it was found into, etc… Its name is Melanodus loonesi, meaning “the black tooth found by Mr Loones”: simple and efficient.

microwear(?) on Melanodus loonesi

Yet the best was still to come. For as I looked at it under the SEM (scanning electron microscope), minute scratches at the surface were easily spotted, all over the surface. As I had already read about dental microwear in mammals, I just thought (in french then): “Waow, this may actually help us tell what that animal was eating 380 million years ago!”

Far was I to suspect where this would lead me. At that time dental microwear in fish had only been studied by one group: a team of palaeontologists and biologists from Leicester, whose papers were published in the Journal of Animal Ecology and Science.
 
And a couple of years later, I was actually part of that team, working on a project that may or may not work, may or may not be applicable to the fossils, but was looking very promising.
 
I suppose that you have now had enough of my nostalgia and not enough of science. Next time I may explain a bit about what microwear is, how it can be studied.
 
To conclude, I’d like to say that the two pictures of Melanodus loonesi are coming from this paper.
Follow

Get every new post delivered to your Inbox.

%d bloggers like this: