Tabela de conteúdos

Estrutura Filogenética

Arquivo Phylo

A partir da lista de espécies da parcela foi gerada uma hipótese filogenética baseada na supertree do phylomatic http://www.phylodiversity.net/phylomatic/phylomatic.html. O arquivo gerado foi então lido no R utilizando-se a função read.tree do pacote APE. O arquivo original não consegue ser lido e a mensagem de erro fala que há mais do que uma raiz na árvore… isso é um problema que só consegui resolver tirando Podocarpus do arquivo!Não entendo bem porque, mas parece que o podocarpus + palmeiras + outras não consegue ter uma raiz. Entretanto, a saída gráfica do phylocom gera uma árvore o que significa que o problema pode ser no APE.

Atualização 25 setembro de 2009

Não é preciso retirar o Podocarpus do arquivo de espécies para ler o arquivo newick no APE. Só é necessário tirar o último “()” e o taxon relacionado.

Nossa árvore

A partir do arquivo no R gerei a árvore com a função plot (precisa carregar o APE)!

Criando a matriz de distância filogenêtica

# 1. colocar o path do diretorio phylocom no sistema para rodar sem necessidade de indicar o caminho. Ver manual phylocom 
## usando o comando system() para rodar o phylocom no R!
### rodando a distancia filogenetica a partir de um arquivo phylo newick (phylomaticPEIC.cgi) e gravando no arquivo (peic.filodist.txt) 
## Deveria ser mais facil segundo o phylodist. Algum problema no comando system() não grava direto o arquivo de saída. Não consegui descobrir o porquê. Fiz um caminho alternativo! 

write.table(system("phylocom phydist -f phylomaticPEIC.cgi", intern=TRUE), file="peic.filodist.txt", col.names=FALSE, row.names=FALSE, sep="\t", quote=FALSE )


### lendo o mesmo arquivo para o R! Essa redundância se faz necessária pela minha ignorância de fazê-la diretamente.

peic.filodist=read.table("peic.filodist.txt", row.names=1, header=T)

Criando o arquivo "sample" para o filocom

Criei uma função file filocom para formatar o arquivo file do filocom a partir do arquivo peic.

# CRIANDO ARQUIVO AMOSTRA (SAMPLE) FILOCOM #####
#### Para o filocom precisa de outro formato de arquivo (3 colunas: nome da parcela, abundancia, codigo spp)

file.filocom=function()
{
choose.files()->f
read.table(f, header=TRUE,sep="\t", as.is=TRUE)->dados 
dados.uso=dados[dados$status0=="A" & dados$stemtag==1 & dados$sp !="Indet", ] ## retira dados não validos
file.phylocom=aggregate(dados.uso$stemtag,by=list(dados.uso$quadrat,dados.uso$sp),length)
file.phylocom[,2]<-sub(" +$", "", file.phylocom[,2]) ## retira o espaço no final do string sp se houver!!
file.phylocom[,2]<-gsub(" ", "_", file.phylocom[,2])
return(file.phylocom[order(file.phylocom[,1]),c(1,3,2)])

}

file.filocom()->peicfile.pc
write.table(peicfile.pc, "peicfile_pc.txt",quote=FALSE, col.names=FALSE, row.names=FALSE, sep="\t")

Rodando o Phylocom no R!

## RODANDO O PHYLOCOM NO R ######################


## MODELO 0 - suffle phylogenetic taxa label
peic.m0.pc=system("phylocom comstruct -f phylomaticPEIC.txt -s peicfile_pc.txt -m 0", intern=TRUE)[-1]
write.table(peic.m0.pc,file="peic_m0.pc", col.names=TRUE, row.names=FALSE, sep="\t", quote=FALSE)
peicm0.res=read.table("peic_m0.pc", header=TRUE, skip=1,sep="\t", as.is=T)
str(peicm0.res)
	## investigando os dados significativos
	peicm0.res[peicm0.res$NRI>=2 | peicm0.res$NRI<=-2,]
	

## MODELO 0a - suffle phylogenetic taxa label using abundance in the sample file
peic.m0a.pc=system("phylocom comstruct -f phylomaticPEIC.txt -s peicfile_pc.txt -m 0 -a", intern=TRUE)[-1]
write.table(peic.m0a.pc,file="peic_m0a.pc", col.names=TRUE, row.names=FALSE, sep="\t", quote=FALSE)
peicm0a.res=read.table("peic_m0a.pc", header=TRUE, skip=1,sep="\t", as.is=T)
str(peicm0a.res)
	## investigando os dados significativos
	peicm0a.res[peicm0a.res$NRI>=2 | peicm0a.res$NRI<=-2,]


## MODELO 3 - swap algoritm 
peic.m3.pc=system("phylocom comstruct -f phylomaticPEIC.txt -s peicfile_pc.txt -m 3", intern=TRUE)[-1]
write.table(peic.m3.pc,file="peic_m3.pc", col.names=TRUE, row.names=FALSE, sep="\t", quote=FALSE)
peicm3.res=read.table("peic_m3.pc", header=TRUE, skip=1,sep="\t", as.is=T)
str(peicm3.res)

	## investigando os dados significativos
	peicm3.res[peicm3.res$NRI>=2 | peicm3.res$NRI<=-2,]


Juntando dados de Solo da Parcela

## Juntando dados de solo aos dados de estrutura filogenetica

### criando dados de distância cartesianas para as parcelas

letras=rep(LETTERS[1:16],each=16)
numeros=rep(c(paste(rep(0,10),0:9, sep=""),10:15),16)
codigo=paste(letras,numeros,sep="")
parc.x=rep(seq(0,300,by=20),each=16)
parc.y=rep(seq(0,300,by=20),16)
parc.peic=data.frame(parc=codigo, parc.x, parc.y, stringsAsFactors = FALSE)
str(parc.peic)

table(parc.peic$parc%in%peicm3.res$plot)## ver se todos os  plot são  parc
match(parc.peic$parc,peicm3.res$plot) ## ver a posição de cada elemento primeiro em relação ao segundo
match(parc.peic$parc,peic.solo$quad)
table(match(parc.peic$parc,peic.solo$quad)==1:256) ### confere posições

names(peicm3.res)
names(parc.peic)
names(peic.solo)
m3=data.frame(parc=peicm3.res$plot,parc.x=parc.peic$parc.x, parc.y=parc.peic$parc.y, solo.n=peic.solo$tipo, solo.fator=peic.solo$tipo2, nspp=peicm3.res$ntaxa, MPD=peicm3.res$MPD, NRI=peicm3.res$NRI, MNTD=peicm3.res$MNTD, NTI=peicm3.res$NTI, stringsAsFactors = FALSE)

#### Explorando os dados ##########

par(mfrow=c(2,4))
plot(m3$parc.x, m3$NRI)
plot(m3$parc.x, m3$MPD)
plot(m3$parc.x, m3$MNTD)
plot(m3$parc.x, m3$NTI)
plot(m3$parc.y, m3$NRI)
plot(m3$parc.y, m3$MPD)
plot(m3$parc.y, m3$MNTD)
plot(m3$parc.y, m3$NTI)

boxplot(m3$MPD~m3$solo.fator)
mod1.mpd=lm(MPD~solo.fator,data=m3)
summary(mod1.mpd)
plot(mod1.mpd)	

Testando modelos de Autoregressão Espacial (SAR)

### Modelo GLS

library(nlme)
mod2.mpd=gls(MPD~solo.fator,data=m3)	
summary(mod2.mpd)
m3.var=Variogram(mod2.mpd,form=~parc.x + parc.y)	
mod3.mpd=update(mod2.mpd, corr=corSpher(200, form=~parc.x + parc.y))
summary(mod3.mpd)
anova(mod2.mpd,mod3.mpd)


### Modelo SAR do spdep

library(spdep)
nb16r=cell2nb(16,16)
nb16q=cell2nb(16,16, type="queen")
str(nb16q)
nblist.peic=nb2listw(nb16q)
	## modelo errorsar MPD
	mod1.spautolm=spautolm(MPD~solo.fator, data=m3,listw=nblist.peic)
	summary(mod1.spautolm)
	
	mod1.errorsar=errorsarlm(MPD~solo.fator, data=m3,listw=nblist.peic)
	summary(mod1.errorsar)
	
	mod1.sar=lagsarlm(MPD~solo.fator, data=m3,listw=nblist.peic)
	summary(mod1.sar)
	anova.(mod1.errorsar,mod1.sar)
	
	
### Autocorrelograma Moran I
choose.files()->f ### indicar o caminho da função FuncMoran_ale.r
##"C:\\Users\\Alexandre\\Ale_2009\\AleRfunctions\\AnalisEspacial\\funcMoran_ale.r"
source(f)
dados=matrix(t(m3[,6:10]),ncol=256)
names(m3)[6:10]->row.names(dados)
moran.dados=moran.ale(dados)	
moran.nulo.m3=moran.nulo(dados=dados)	

# gráfico para MPD
moran.mpd=moran.nulo.m3["MPD",,]
x.seq=seq(20,200, 20)
plot(x.seq, moran.mpd[,1],ylim=c(-0.2,0.4), xaxp=c(20,220,5),ylab="Moran's Index", xlab="Distance (m)")
lines(x.seq,moran.mpd[,2],lty=2)
lines(x.seq,moran.mpd[,3],lty=2)
x.pol=c(x.seq,rev(x.seq))
y.pol=c(moran.mpd[,2],moran.mpd[10:1,3])
polygon(x.pol, y.pol, col="gray", border=NA, density=20)
vf=moran.mpd[,1]<moran.mpd[,2] |moran.mpd[,1]>moran.mpd[,3]
points(x.seq[vf], moran.mpd[,1][vf], pch=19)
points(x.seq[vf], moran.mpd[,1][vf], cex=1.5)

xy=locator(1)
legend(xy,"Mean Phylogenetic Distance", bty="n")
	
	
# gráfico para NRI
moran.nri=moran.nulo.m3["NRI",,]
x.seq=seq(20,200, 20)
plot(x.seq, moran.nri[,1],ylim=c(-0.2,0.4), xaxp=c(20,220,5),ylab="Moran's Index", xlab="Distance (m)")
lines(x.seq,moran.nri[,2],lty=2)
lines(x.seq,moran.nri[,3],lty=2)
x.pol=c(x.seq,rev(x.seq))
y.pol=c(moran.nri[,2],moran.nri[10:1,3])
polygon(x.pol, y.pol, col="gray", border=NA, density=20)
vf=moran.nri[,1]<moran.nri[,2] |moran.nri[,1]>moran.nri[,3]
points(x.seq[vf], moran.nri[,1][vf], pch=19)
points(x.seq[vf], moran.nri[,1][vf], cex=1.5)

xy=locator(1)
legend(xy,"Net Relatedness Index", bty="n")



# gráfico para nspp
moran.nspp=moran.nulo.m3["nspp",,]
x.seq=seq(20,200, 20)
plot(x.seq, moran.nspp[,1],ylim=c(-0.2,0.4), xaxp=c(20,220,5),ylab="Moran's Index", xlab="Distance (m)")
lines(x.seq,moran.nspp[,2],lty=2)
lines(x.seq,moran.nspp[,3],lty=2)
x.pol=c(x.seq,rev(x.seq))
y.pol=c(moran.nspp[,2],moran.nspp[10:1,3])
polygon(x.pol, y.pol, col="gray", border=NA, density=20)
vf=moran.nspp[,1]<moran.nspp[,2] |moran.nspp[,1]>moran.nspp[,3]
points(x.seq[vf], moran.nspp[,1][vf], pch=19)
points(x.seq[vf], moran.nspp[,1][vf], cex=1.5)

xy=locator(1)
legend(xy,"Net Relatedness Index", bty="n")
		

Gráficos de autocorrelação espacial filogenêtica

Investigando os resultados

Próximos Passos

A distância filognetica entre habitats é maior que a distância intra habitats? OU, se estou certo, a distância filogenética entre habitats é similar a intra hábitats (não há diferença significativa). Entre e intra hábitats é o mesmo! OU seja, é neutra a seleção das espécies evolutivamente!