Sources

R packages

"ape" (Paradis et al 2004)

Data

brain size and body size on primates ("primate_ind.txt", a tab separated text file), with more than one observation for the majority of species, individual-specific data

phylogeny ("primate_tree.phy", in phylip format) is taken from 10kTrees (Arnold et al 2010) and tailored to the data at hand

Codes

To obtain species-specific data (means and variances) from individual-specific data

data.ind = read.table("primate_ind.txt", sep = "\t", header = TRUE)
body_mean = tapply(data.ind$body, data.ind$species, mean)
brain_mean = tapply(data.ind$brain, data.ind$species, mean)
body_N = tapply(data.ind$body, data.ind$species, length)
brain_N = tapply(data.ind$brain, data.ind$species, length)
body_var = tapply(data.ind$body, data.ind$species, var)
brain_var = tapply(data.ind$brain, data.ind$species, var)
se <- function(x) sqrt(var(x)/length(x))
body_se <- tapply(data.ind$body, data.ind$species, se)
brain_se <- tapply(data.ind$brain, data.ind$species, se)

To calculate measurement errors based on pooled CV

body_cv = sqrt(body_var)/body_mean
body_cv.pool = sum(body_cv * body_N, na.rm = T)/sum(body_N, na.rm = T)
body_se.adj = (body_cv.pool * body_mean)/sqrt(body_N)
body_var.adj = (body_cv.pool * body_mean)^2
brain_cv = sqrt(brain_var)/brain_mean
brain_cv.pool = sum(brain_cv * brain_N, na.rm = T)/sum(brain_N, na.rm = T)
brain_se.adj = (brain_cv.pool * brain_mean)/sqrt(brain_N)
brain_var.adj = (brain_cv.pool * brain_mean)^2

To log-transform data

lg.body_var.adj = log(body_var.adj/(body_mean^2) + 1)
# note that this gives the same value for all species use the following
# instead:
lg.body_var.adj = log(body_se.adj^2/(body_mean^2) + 1)
lg.body = log(body_mean) - 0.5 * lg.body_var.adj
lg.brain_var.adj = log(brain_se.adj^2/(brain_mean^2) + 1)
lg.brain = log(brain_mean) - 0.5 * lg.brain_var.adj

To create data frame at the species level

data.spec = data.frame(row.names = 1:length(body_mean), species = row.names(body_mean),
    cbind(body_mean, body_N, body_var, lg.body, lg.body_var.adj, brain_mean,
        brain_N, brain_var, lg.brain, lg.brain_var.adj), check.rows = TRUE,
    check.names = TRUE)

To import and check phylogeny:

library(ape)
tree = read.tree("primate_tree.phy")
str(tree)
## List of 4
##  $ edge       : int [1:170, 1:2] 87 88 89 90 91 92 92 93 94 95 ...
##  $ Nnode      : int 85
##  $ tip.label  : chr [1:86] "Allenopithecus_nigroviridis" "Cercopithecus_albogularis" "Cercopithecus_mitis" "Cercopithecus_ascanius" ...
##  $ edge.length: num [1:170] 26.19 16.81 8.59 6.54 2.98 ...
##  - attr(*, "class")= chr "phylo"
##  - attr(*, "order")= chr "cladewise"

To plot phylogeny:

plot(tree, cex = 0.6, no.margin = T)
plot of chunk unnamed-chunk-6

References