Skip to content

fblpalmeira/GEEQ

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 

Repository files navigation

GEEQ - Grupo de Estudos em Ecologia Quantitativa

Workshop "Construindo redes de interações no R"

Contruindo redes de interação ecológica utilizando o CarniDIET (version 1.0), uma base contendo dados quantitativos sobre a dieta de mamíferos terrestres (Middleton et al 2021). O objetivo desta prática será construir uma rede de interação bipartida utilizado o pacote ‘bipartite’ (Dormann et al 2021). Também será possível estimar o padrão de conectividade entre predadores e presas (interações observadas e possíveis), o grau de conectância e a sua distribuição, o quanto as espécies interagem, qual a força desta interação, como as interações se sobrepõem e se agrupam, qual o papel das espécies (espécies hub da rede, hub do módulo, conectoras e/ou periféricas) e quais os aspectos ecológicos mais importantes para a estrutura e a dinâmica da rede.

Material utilizado

O Código 1 - Bipartite, é o nosso principal documento. Utilizando esse código é possível analisar e visualizar dados de redes ecológicas bipartidas. Ele também carrega automaticamente os outros dois códigos, que contêm funções para organizar a matriz Código 2 - Ordernet e calcular a entropia Código 3 - Entropy.

Prática

Esta prática tem três etapas principais:

  • Preparando os dados (Carregar, manipular e limpar o arquivo de dados);

  • Construindo redes (Extrair métricas e visualizar as redes de interações); e,

  • Inserindo silhuetas (Carregar as silhuetas das espécies e incorporar no gráfico).

Preparando os dados

Carregar, manipular e limpar o arquivo de dados no R:

#######################
# Preparando os dados #
#######################

#Middleton et al 2021. CarniDIET 1.0: A database of terrestrial carnivorous mammal diets. Global Ecology and Biogeography 30:1175-1182. https://doi.org/10.1111/geb.13296
y1<-read.csv("https://onlinelibrary.wiley.com/action/downloadSupplement?doi=10.1111%2Fgeb.13296&file=geb13296-sup-0011-CarniDIET.csv", sep = ",")
y1            #Ver a tabela (omite as ultimas linhas quando a tabela e muito grande)
head(y1)      #Ver o cabecalho da tabela - mostra o cabecalho e as seis primeiras linhas
View(y1)      #Ver a tabela inteira
summary(y1)   #Ver o resumo dos resultados
str(y1)       #Ver a estrutura das variaveis (uma alternativa ao "summary")
names(y1)     #Ver o nome das colunas 
class(y1)     #Confirmar qual é classe de dados do objeto (ex.: data frame, matriz, vetor, etc...)

library(dplyr) #Abrir pacote 'dplyr' para manipular os dados

y2<-y1%>%
  select(familyCarni, scientificNameCarni, commonNameCarni, 
         foodType, orderPrey, familyPrey, genusPrey, scientificNamePrey, commonNamePrey,
         percentage, country) %>% 
  count(familyCarni, scientificNameCarni, commonNameCarni, 
        foodType, orderPrey, familyPrey, genusPrey, scientificNamePrey, commonNamePrey,
        percentage, country, sort=T)
View(y2)

y2%>%
  filter(familyCarni=="Felidae")%>%
  select(commonNameCarni, orderPrey)%>% 
  count(commonNameCarni, orderPrey, sort=T)

y3<-y2%>%
  filter(commonNameCarni %in% c("Geoffroy's cat","Jaguar","Jaguarundi","Margay","Ocelot","Oncilla","Puma"))%>%
  select(commonNameCarni, orderPrey)%>% 
  count(commonNameCarni, orderPrey, sort=T)
y3

library(reshape2) #Abrir o pacote 'reshape2' para remodelar a tabela de dados
y4=dcast(y3, orderPrey ~ commonNameCarni, value.var="n")
y4
class(y4)

library(janitor) #Abrir o pacote 'janitor' para limpar algumas linhas de dados
y5<-y4[-c(14), ]

library(tidyr) #Abrir o pacote 'tidyr' para trabalhar com valores/dados faltantes (NA's)
y6<-mutate_all(y5, ~replace_na(.,0)) #Substituir os NA's por zeros
y6
class(y6)

colnames(y6)<-NULL
colnames(y6)<-c("","Geoffroy's cat","Jaguar","Jaguarundi","Margay","Ocelot","Oncilla","Puma")
y6<-noquote(y6)

web<-as.matrix(y6, row.names=1)
print(web, row.names = F)
write.csv(web, "geb13296-sup-0011-carnidiet2.csv", row.names=FALSE)

Redes bipartidas

Construir e visualizar as redes de interação no R:

######################
# Construindo redes  #
######################

library (bipartite)
library (sna)
library (igraph)

web<-as.matrix(read.csv("geb13296-sup-0011-carnidiet2.csv", row.names=1))

#Kawada Kawai - melhor para ver nos centrais
gplot(web, gmode="twomode", usearrows="FALSE", mode="kamadakawai", main="Visualizar nohs centrais", object.scale = 0.03)

#Fruchterman Reignold - melhor para ver modulos
gplot(web, gmode="twomode", usearrows="FALSE", mode="fruchtermanreingold", main="Visualizar modulos", object.scale = 0.03)

source("Ordernet.R") #Carrega a funcao

order.web=order.net(mat=web) #Organiza a matriz de acordo com o grau das especies

#Grau decrescente - melhor para ver aninhamento
plotweb(web, method="normal",arrow="both",bor.col.interaction="grey", y.width.low=0.02, y.width.high=0.02, col.high="red", col.low="blue", high.lablength=0, low.lablength=0)
mtext("", side=3, line=1, font=1)

#------------------#
# Conectividade    #
#------------------#

#Grau 
K.web.Pred=apply(web,1,sum) #Exemplo de como calcular o grau dos predadores
K.web.Pred
K.web.Prey=apply(web,2,sum) #Exemplo de como calcular o grau das presas
K.web.Prey

#Grau medio 
KMed.web.Pred=mean(apply(web,1,sum)) #Calculo do grau medio de predadores
KMed.web.Pred
KMed.web.Prey=mean(apply(web,2,sum)) #Calculo do grau medio de presas
KMed.web.Prey

#Conectancia
K.web=apply(web,2,sum) 				        #Grau das colunas
E.web=apply(as.matrix(K.web), 2, sum)	#Numero de arestas (interacoes) na rede
R.web=dim(web)[1]				             	#Numero de linhas
C.web=L=dim(web)[2]					          #Numero de colunas
Conec.web=E.web/(R.web*C.web) 			  #Calculo da conectancia
Conec.web

#Visualizando os resultados de conectancia da rede
Connectance=data.frame(c(round(Conec.web,2)))
colnames(Connectance)=c("Connectance")
Connectance

#Distribuicao do grau
d.web = degreedistr(web) #Calcula graus para cada espécie e constroi uma distribuicao cumulativa.
d.web #Retorna os coeficientes e os ajustes de três funções diferentes de distribuições (exponencial, lei de potência e lei de potência truncada). 

#Entropia
source("Entropy.R") #Chama o código com a função que calcula a entropia
Entropy.web=entropy(web)
Entropy.web

#Visualizando os resultados de entropia
Entropy=data.frame(c(Entropy.web$Row.Entropy),c(Entropy.web$Col.Entropy),row.names=c("Entropia"))
colnames(Entropy)=c("Predator.Entropy","Prey.Entropy")
Entropy
                   
#-----------------------------#
# Aninhamento e distancias    #
#-----------------------------#
                   
#Aninhamento
web.NODF=nested(web, method = "NODF2") #Calcula NODF das matrizes
web.NODF

#Visualizando os resultados de aninhamento
Nestedness=data.frame(c(round(web.NODF,2)), row.names=c(""))
colnames(Nestedness)=c("NODF")
Nestedness
                   
#Distancias 
edgelist.web=web2edges(web, return=TRUE) #Criando listas de interaca de uma matriz n x m. Nohs das linhas vao de 0 a n-1. Nohs das colunas vao de n a m-1 
edgelist.web

write.table(edgelist.web[,1:2]-1,file="web.edge.txt",row.names=F, col.names=F, append=T, quote=F) #cria o arquivo de edgelist
                   
web.igraph=read.graph("web.edge.txt", format="edgelist", direct=FALSE) #le arquivo de edgelist e grava em variavel da classe igraph
web.igraph

#Matriz de distancia do noh da linha ao noh da coluna
web.paths=shortest.paths(web.igraph)  
web.paths
                   
#Caminho medio
path1.len.web=average.path.length(web.igraph) #media dos caminhos da rede
path1.len.web

Path.1=data.frame(c(round(path1.len.web,2)), row.names=c(""))
colnames(Path.1)=c("Caminho.medio1")
Path.1
                   
# Plotar e salvar o grafico bipartido
png(file="carnidiet_bipartite.png", width = 900, height = 600)
plotweb(web, labsize=1.3, text.rot=90, col.high="#6699CC", 
col.low="#999933", col.interaction="#999999")
dev.off()
                   
visweb(web, type="diagonal") 
                   
networklevel(web) #Calcula uma variedade de indices e valores para uma rede bipartida
specieslevel(web) #Outros indices simples sao calculados e retornados
nodespec(web) #Calcula um indice de especializacao com base nas posicoes dos nohs para todas as especies e separadamente para os niveis troficos superior e inferior
(ex<-second.extinct(web, participant="lower", method="random", nrep=50, details=F))
slope.bipartite(ex)
                   
nullmodel(web, N=1000, method=4)
nullmodel(web, N=1000, method=5)
                   
png(file="carnidiet_grid.png", width = 800, height = 700)
res<-computeModules(web)
plotModuleWeb(res)
dev.off()
                   
PAC(web) #Quantifica para cada par de especies de nivel trofico inferior, o potencial de competicao aparente com outra especie, mediada pelo nivel trofico superior
                   
degreedistr(web, plot.it=T)
V.ratio(web)

Inserindo as silhouetas das espécies no R:

#######################
# Inserindo silhuetas #
#######################
                   
library(magick)
                   
#Chamar o gráfico
plot<-image_read("carnidiet_grid.png")

#Inserir cabecalho/titulo
plot2<-image_annotate(plot, "Neotropical felids food web as a grid:
square is used to indicate number of interactions", 
       color = "blue", size = 18,
       location = "10+50", gravity = "north")

#Inserir rodape
plot3<-image_annotate(plot2, "Visualization by @fblpalmeira
       Data: Middleton et al 2021 (doi.org/10.1111/geb.13296)
       Image credit: Microbiotheria (Zimices), Other spp (Public domain) @PhyloPic", 
       color = "gray", size = 12, 
       location = "10+50", gravity = "southeast")

#Chama as silhuetas dos animais
chiroptera<-image_read("http://www.phylopic.org/assets/images/submissions/18bfd2fc-f184-4c3a-b511-796aafcc70f6.512.png") 
out1<-image_composite(plot3,image_scale(chiroptera,"x30"), offset = "+135+90")
                   
didelphis<-image_read("http://www.phylopic.org/assets/images/submissions/96ed3343-20e6-4bea-90e3-06dd157d2447.512.png") 
out2<-image_composite(out1,image_scale(didelphis,"x20"), offset = "+135+135")
                   
bradypus<-image_read("http://www.phylopic.org/assets/images/submissions/dbc172df-a4c7-4d0d-9388-c337d01aca52.512.png") 
out3<-image_composite(out2,image_scale(bradypus,"x40"), offset = "+135+160")
                   
cebidae<-image_read("http://www.phylopic.org/assets/images/submissions/6264cf2b-4f34-4b3f-ba65-cc5565db2de5.512.png") 
out4<-image_composite(out3,image_scale(cebidae,"x40"), offset = "+135+210")
                   
rodentia<-image_read("http://www.phylopic.org/assets/images/submissions/b6c7dab1-a2f8-43f6-98d5-ab6000f58957.512.png") 
out5<-image_composite(out4,image_scale(rodentia,"x30"), offset = "+135+255")
                   
carnivora<-image_read("http://www.phylopic.org/assets/images/submissions/040da77c-f13e-4962-ab09-4e4d0474e204.512.png") 
carnivora2<-image_flop(carnivora)
out6<-image_composite(out5,image_scale(carnivora2,"x30"), offset = "+135+310")
                   
pecari<-image_read("http://www.phylopic.org/assets/images/submissions/44fb7d4f-6d59-432b-9583-a87490259789.512.png") 
out7<-image_composite(out6,image_scale(pecari,"x35"), offset = "+130+345")
                   
armadillo<-image_read("http://www.phylopic.org/assets/images/submissions/5d59b5ce-c1dd-40f6-b295-8d2629b9775e.512.png") 
out8<-image_composite(out7,image_scale(armadillo,"x30"), offset = "+135+385")
                   
lagomorpha<-image_read("http://www.phylopic.org/assets/images/submissions/c3987570-9c82-41b9-bc72-cb5d3de1ff87.original.png") 
out9<-image_composite(out8,image_scale(lagomorpha,"x40"), offset = "+140+415")
                   
micro<-image_read("http://www.phylopic.org/assets/images/submissions/33eb7221-53b6-4d16-b79a-ce96e24e3754.512.png") 
out10<-image_composite(out9,image_scale(micro,"x30"), offset = "+120+465")
                   
tapirus<-image_read("http://www.phylopic.org/assets/images/submissions/8f6b8802-52f9-4f16-8429-0b86ea4a4aa8.512.png") 
out11<-image_composite(out10,image_scale(tapirus,"x45"), offset = "+120+500")

#Visualizar a imagem                  
image_browse(out11)
                   
#Salvar o gráfico com as silhuetas inseridas
image_write(out11, "carnidiet_grid2.png")

Vamos construir uma rede de interação bipartida.

Também vamos construir uma rede de interação em forma de grid.

Referências:

Dormann CF, Fruend J, Gruber B. 2021. Package ‘bipartite’.

Middleton O, Svensson H, Scharlemann JP, Faurby S, Sandom C. 2021. CarniDIET 1.0: A database of terrestrial carnivorous mammal diets. Global Ecology and Biogeography, 30(6):1175-1182.

Link do vídeo no YouTube

Vídeo no canal do GEEQ no YouTube

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages