Durante a evolução de um determinado grupo, é comum perceber que características evoluem a velocidades diferentes. Um exemplo que vimos em aula é o número de vértebras cervicais em mamíferos. Por outro lado, outras características evoluem muito rápido, como padrões de coloração em peixes. Esta evolução pode ser tão rápida ao ponto de que a história evolutiva desta característica é “apagada”. A capacidade de um caráter de refletir a história evolutiva de um determinado clado é chamada de sinal filogenético. Por exemplo, imagine um gênero com três espécies abaixo:
library(ape)
tr <- read.tree(text = "((sp1:0.5,sp2:0.5):1.5,sp3:2);")
plot(tr)
Se há sinal filogenético em uma característica que estejamos estudando sobre esse grupo, poderíamos esperar que as espécies sp1 e sp2 seriam mais parecidas entre si do que qualquer uma delas com a sp3. Como ir além de afirmações qualitativas como essas para algo mais rigoroso? Para isso, precisamos de um modelo de evolução. Esse modelo nada mais é do que uma maneira na qual acreditamos que uma característica evolua.
Há vários modelos possíveis, mas vamos começar por um dos modelos mais simples que poderíamos imaginar: “movimento browniano”. Este modelo funciona da seguinte forma. Imagine que a média do tamanho de corpo de espécie de ave ancestral seja de 10 cm. Na geração seguinte, a média da espécie aumenta ou diminui uma quantidade muito pequena em relação à média anterior e isso se repete continuamente ao longo do tempo. Vamos ver que tipo de resultados isso poderia gerar. Pra ajudar nossa intuição, vamos gerar o mesmo processo muitas vezes (como se pudéssemos voltar no passado e recomeçar a história evolutiva desse grupo). Primeiro vamos escrever uma função que gera dados de acordo com o movimento browniano.
mb <- function(t, x) {
x <- x
for (i in 1:t) {
x[i + 1] <- x[i] + ((rbinom(1, 1, 0.5) - 0.5)/1000)
}
x
}
# note que t é o número de gerações e x é o valor inicial da
# característica
plot(mb(10000, 10), type = "l")
Agora vamos tentar várias vezes o mesmo processo
dat <- replicate(10, mb(10000, 10))
plot(dat[, 1], type = "l", ylim = c(min(dat), max(dat)))
lines(dat[, 2])
lines(dat[, 3])
lines(dat[, 4])
lines(dat[, 5])
lines(dat[, 6])
lines(dat[, 7])
lines(dat[, 8])
lines(dat[, 9])
lines(dat[, 10])
Uma das características mais úteis de um processo de movimento browniano é a expectativa que a variância entre dois pontos evoluindo por BM deveria aumentar linearmente com o tempo. Ou seja, o quanto uma característica evolui é diretamente proporcional ao tempo. Por exemplo, a variância em uma característica em duas espécies que divergiram entre si há 2 milhões de anos deve ser o dobro (em média) da variância de duas outras espécies que divergiram a 1 milhão de anos.
Uma importante limitação da maneira que estamos pensando na evolução por BM no exemplo acima é que todas as 10 espécies apareceram ao mesmo tempo. No mundo real, se tomamos duas espécies de um determinado gênero, em algum momento no passado essas duas espécies eram uma espécie só (antes do evento de especiação). Para representarmos isso, utilizamos algo que tem um nome complicado, mas que na verdade é bastante simples: a matriz de variância/covariância filogenética. Vamos voltar para a filogenia de 3 espécies do começo deste texto e calcular esta matriz nesse caso.
plot(tr)
vcv(tr)
## sp1 sp2 sp3
## sp1 2.0 1.5 0
## sp2 1.5 2.0 0
## sp3 0.0 0.0 2
Primeiro olhe a diagonal principal da matriz. Todos os números são 2, o que corresponde ao tempo desde a origem deste clado. Como todas as espécies estão vivas hoje em dia, elas tem a mesma idade por definição. Agora note o valor correspondente à linha 3, coluna 1. Por que esse valor é 0? Olhe novamente a filogenia. desde a origem do clado, a linhagem que deu origem à sp3 é independente da linhagem que deu origem à espécie 1. Por isso, como elas não tem história evolutiva compartilhada desde então, elas são independentes e por isso o valor de zero.
Agora veja o valor correspondente à linha 1, coluna 2. O valor é 1.5. O que isso significa? Olhando a filogenia do grupo, percebemos que as espécies sp1 e sp2 eram uma única linhagem por boa parte de sua história evolutiva. Mas precisamente, se a idade de cada espécie desde a origem do clado é 2, elas eram a mesma espécie por 1.5 unidades de tempo.
Por outro lado, imagine a seguinte filogenia:
tr <- read.tree(text = "((sp1:1.9,sp2:1.9):0.1,sp3:2);")
plot(tr)
vcv(tr)
## sp1 sp2 sp3
## sp1 2.0 0.1 0
## sp2 0.1 2.0 0
## sp3 0.0 0.0 2
Note que a linhagem que deu origem a sp1 e sp2 se dividiu pouco tempo antes da origem do clado (0.1 unidades de tempo depois). Podemos imaginar que as espécies sp1 e sp2 serão mais diferentes entre si do que no caso da filogenia anterior. Um caso mais extremo ainda aconteceria se todas as espécies aparecessem ao mesmo tempo:
tr <- read.tree(text = "((sp1:2,sp2:2):0,sp3:2);")
plot(tr)
vcv(tr)
## sp1 sp2 sp3
## sp1 2 0 0
## sp2 0 2 0
## sp3 0 0 2
O método que aprenderemos para medir o signal filogenético de uma característica se baseia no que aprendemos acima. Mais especificamente, fazemos a seguinte pergunta: tendo em vista as medidas de cada uma das espécies de um clado e sua filogenia, os dados são significativamente diferentes de uma situação onde todas as covariâncias são zero?
O método foi desenvolvido por Mark Pagel e consiste em multiplicar as covariâncias por um parâmetro chamado lambda e que varia de 0 (sem sinal filogenético) a 1 (sinal filogenético perfeito).
Para ilustrar o que vimos até agora, vamos usar o pacote phytools para gerar uma filogenia de 50 espécies e um caráter que evolui ao longo dessa filogenia de acordo com BM e finalmente usar o método de Pagel para testar o sinal filogenético dessa característica:
library(phytools)
## Loading required package: mnormt
## Loading required package: phangorn
## Loading required package: igraph
## Attaching package: 'igraph'
## The following object(s) are masked from 'package:ape':
##
## as.igraph, edges
## Loading required package: Matrix
## Loading required package: lattice
## Warning: replacing previous import 'as.igraph' when loading 'igraph'
## Warning: replacing previous import 'edges' when loading 'igraph'
## Loading required package: rgl
## Attaching package: 'phytools'
## The following object(s) are masked from 'package:Matrix':
##
## expm
tree <- pbtree(n = 50)
x <- fastBM(tree)
phylosig(tree, x, method = "lambda", test = TRUE)
## $lambda
## [1] 1.003
##
## $logL
## [1] -64.32
##
## $logL0
## [1] -116.8
##
## $P
## [1] 0
Note o valor de lambda muito próximo de 1, como poderíamos esperar.
Uma maneira interessante de visualizar os resultados é através da função phenogram.
phenogram(tree, x)
Vamos retomar de onde paramos na aula anterior:
library(RCurl)
## Loading required package: bitops
drop <- getURL("https://dl.dropbox.com/u/472794/dados.csv")
dat <- read.csv(textConnection(drop))
dat <- scale(dat)
PCA <- prcomp(dat, cor = F)
library(ape)
library(geiger)
## Loading required package: MASS
## Loading required package: mvtnorm
## Loading required package: msm
## Loading required package: ouch
## Loading required package: subplex
tree <- getURL("https://dl.dropbox.com/u/472794/primates.tre")
tr <- read.tree(textConnection(tree))
dados <- getURL("https://dl.dropbox.com/u/472794/macacos.txt")
PC <- read.table(textConnection(dados))
PC1 <- PC[, 1]
PC2 <- PC[, 2]
PC3 <- PC[, 3]
PC4 <- PC[, 4]
names(PC1) <- names(PC2) <- names(PC3) <- names(PC4) <- rownames(PC)
phylosig(tr, PC1, method = "lambda", test = TRUE)
## $lambda
## [1] 0.8571
##
## $logL
## [1] -181.7
##
## $logL0
## [1] -196
##
## $P
## [1] 8.947e-08
phylosig(tr, PC2, method = "lambda", test = TRUE)
## $lambda
## [1] 0.6163
##
## $logL
## [1] -165
##
## $logL0
## [1] -166.3
##
## $P
## [1] 0.1014
phylosig(tr, PC3, method = "lambda", test = TRUE)
## $lambda
## [1] 6.847e-05
##
## $logL
## [1] -125.7
##
## $logL0
## [1] -125.7
##
## $P
## [1] 1
phylosig(tr, PC4, method = "lambda", test = TRUE)
## $lambda
## [1] 0.6654
##
## $logL
## [1] -124.5
##
## $logL0
## [1] -130.1
##
## $P
## [1] 0.0008194
Curiosamente, o nível de sinal filogenético varia entre os PCs!
phenogram(tr, PC1)
phenogram(tr, PC2)
phenogram(tr, PC3)
phenogram(tr, PC4)