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

 
 
 

Contributors

Languages