Introduction: Phylogenetic Comparative Methods

Fitting linear models, and performing statistical analyses in general, to assess biological hypotheses regarding closely-related species presents a problem to the researcher. Standard statistical models rely on the assumption that observations are independent and identically distributed (iid). Mathematically, this means that the Gaussian error of an iid dataset can be expressed as an identity matrix. However, when species are closely related (for example within the same genus) by phylogeny, we expect observations taken on them to be more similar than those taken from more distantly-related species. This means that error in this case cannot be expressed as an identity matrix. In other words, observations taken from closely related species cannot be considered independent, or identically distributed. Phylogenetic Comparative Methods (PCM) is an analytical toolkit consisting of methodologies designed to account for this issue of non-independence of observations. With this toolkit, researchers can construct models and perform other related analyses with non independent observations by subsequently \(conditioning\) those observations on a phylogeny. Under this PCM analytical umbrella are Phylogenetic ANOVA, Phylomorphospace, Phylogenetic Signal, and Evolutionary Rates, all of which can be performed using functions in geomorph.

Comparing Phylogenetic Signals

The compare.physignal.z function allows the user to statistically compare phylogenetic signal effect sizes calculated using the physignal.z function. Following Collyer et al., (2022), the function performs a two-sample test statistic (\(Z_{12}\)) on two or more analyses of optimized Lambda (\(\hat{\lambda}\)), and returns pairwise Z-scores and P-values for each comparison.

Important Note! Statistical comparison between optimized Lambda (Collyer et al., 2022) effect size values is possible because \(\hat{\lambda}\) has an approximately normal distribution. Therefore, this function only works with objects of class ‘physignal.z’, or objects generated by the function physignal.z

compare.physignal.z()
  • \(...\): saved analyses of class physignal.z
  • \(two.tailed\): Logical (TRUE/FALSE) value to indicate whether a two-tailed test should be performed



Example Analyses

By way of example, we will compare two previously run analyses of \(\hat{\lambda}\), calculated on the plethodontid jaw and cranium. To see how to perform these initial analyses, please visit the tutorial for physignal.z before continuing here.

We begin by combining our two objects into a single list. Alternatively, these objects can be listed separately in the function input.
PS.list <-list(PS.jaw, PS.cranium)
names(PS.list) <- c("jaw", "cranium")



Then we run the function:
PS.Z <- compare.physignal.z(PS.list)



Results can be summarized using the base R function summary.
summary(PS.Z)
## 
## Effect sizes (Z-scores)
## 
##      jaw  cranium 
## 1.624806 1.684868 
## 
## Effect sizes for pairwise differences in phylogenetic signal.
## 
##               jaw   cranium
## jaw     0.0000000 0.2890467
## cranium 0.2890467 0.0000000
## 
## P-values
## 
##               jaw   cranium
## jaw     1.0000000 0.7725457
## cranium 0.7725457 1.0000000



This returns a table of pairwise Z-scores and P-values for each comparison.

The function returns an object of class “compare.physignal.z”, which is a list, whose objects can be accessed using the $ operator.

compare.physignal.z() Output
  • \(sample.z\): A vector of effect sizes for each sample.

  • \(sample.r.sd\): A vector of standard deviations for each sampling distribution (following Box-Cox transformation).

  • \(pairwise.z\): A matrix of pairwise, two-sample z scores between all pairs of effect sizes.

  • \(pairwise.p\): A matrix of corresponding P-values.