En este documento se encuentra el análisis gráfico y de índices de la red trófica de las lagunas de la Reserva de Humacao. A partir de estos resultados y referencias de la literatura científica, deben responder las preguntas y cumplir con lo pedido para elaborar un informe. Las preguntas se encuentran numeradas, en letras más grandes y resaltadas.
Aunque no es obligatorio, puede realizar el informe usando el código R Markdown y los datos .csv (los puede descargar de MOODLE). Los datos originales (Google Sheets procesados por mi) los puede encontrar en este enlace: Datos Originales
Para el análisis de una red trófica necesitan, en primer lugar, construir una red mediante un paquete adecuado; utilizamos el paquete igraph. Además necesitamos paquetes que calculen algunos parámetros para la evaluación y comparación de las redes tróficas.
library(igraph)
library(fluxweb)
library(NetIndices)
Necesitamos las funciones externas trophiclevels y plotfw para completar algunos de los análisis. A continuación hay un código oculto que carga las funciones externas; estos códigos se encuentran en el archivo .Rmd en MOODLE.
Dos tipos de archivos serán utilizados para crear la red utilizando el paquete igraph: uno con los enlaces entre consumidor y recurso (por ejemplo: depredador y presa), llamado usualmente links (o edges) y otro con la descripción de las especies (o taxas, o grupos funcionales), llamado usualmente nodes (o info, o vertex).
# datos al ambiente R en dos objetos
nodes <- read.csv("data/lagunas-nodes.csv", header=T)
links <- read.csv("data/lagunas-links.csv", header=T)
El objeto igraph (net) se crea con la función graph_from_data_frame. A partir de este objeto se pueden mostrar los enlaces (edges o links) y los taxones (nodes o vertex). La función str muestra la estructura del objeto igraph.
# create igraph object
net <- graph_from_data_frame(d=links, vertices=nodes, directed=T)
# examine object
# enlaces
E(net)
## + 280/280 edges from 2f7b309 (vertex names):
## [1] sp085->sp001 sp038->sp002 sp041->sp002 sp123->sp002 sp041->sp004
## [6] sp006->sp007 sp059->sp007 sp008->sp008 sp022->sp008 sp059->sp008
## [11] sp059->sp008 sp038->sp011 sp059->sp011 sp092->sp011 sp092->sp013
## [16] sp041->sp014 sp069->sp014 sp085->sp015 sp085->sp016 sp093->sp017
## [21] sp059->sp018 sp069->sp020 sp070->sp020 sp069->sp019 sp070->sp019
## [26] sp038->sp021 sp071->sp021 sp085->sp021 sp069->sp022 sp070->sp022
## [31] sp092->sp022 sp059->sp023 sp059->sp024 sp059->sp025 sp092->sp025
## [36] sp022->sp026 sp059->sp026 sp064->sp026 sp092->sp026 sp096->sp026
## [41] sp085->sp027 sp059->sp028 sp092->sp028 sp070->sp029 sp038->sp030
## [46] sp059->sp030 sp071->sp030 sp069->sp030 sp008->sp031 sp059->sp031
## + ... omitted several edges
# nodos (especies)
V(net)
## + 125/125 vertices, named, from 2f7b309:
## [1] sp001 sp002 sp003 sp004 sp005 sp006 sp007 sp008 sp009 sp010 sp011 sp012
## [13] sp013 sp014 sp015 sp016 sp017 sp018 sp019 sp020 sp021 sp022 sp023 sp024
## [25] sp025 sp026 sp027 sp028 sp029 sp030 sp031 sp032 sp033 sp034 sp035 sp036
## [37] sp037 sp038 sp039 sp040 sp041 sp042 sp043 sp044 sp045 sp046 sp047 sp048
## [49] sp049 sp050 sp051 sp052 sp053 sp054 sp055 sp056 sp057 sp058 sp059 sp060
## [61] sp061 sp062 sp063 sp064 sp065 sp066 sp067 sp068 sp069 sp070 sp071 sp072
## [73] sp073 sp074 sp075 sp076 sp077 sp078 sp079 sp080 sp081 sp082 sp083 sp084
## [85] sp085 sp086 sp087 sp088 sp089 sp090 sp091 sp092 sp093 sp094 sp095 sp096
## [97] sp097 sp098 sp099 sp100 sp101 sp102 sp103 sp104 sp105 sp106 sp107 sp108
## [109] sp109 sp110 sp111 sp112 sp113 sp114 sp115 sp116 sp117 sp118 sp119 sp120
## + ... omitted several vertices
# tipo de objeto
str(net)
## Class 'igraph' hidden list of 10
## $ : num 125
## $ : logi TRUE
## $ : num [1:280] 84 37 40 122 40 5 58 7 21 58 ...
## $ : num [1:280] 0 1 1 1 3 6 6 7 7 7 ...
## $ : num [1:280] 199 240 198 70 82 87 100 126 5 7 ...
## $ : num [1:280] 0 1 2 3 4 5 6 7 8 10 ...
## $ : num [1:126] 0 0 0 2 3 8 9 9 20 25 ...
## $ : num [1:126] 0 1 4 4 5 5 5 7 11 11 ...
## $ :List of 4
## ..$ : num [1:3] 1 0 1
## ..$ : Named list()
## ..$ :List of 4
## .. ..$ name : chr [1:125] "sp001" "sp002" "sp003" "sp004" ...
## .. ..$ SpName : chr [1:125] "aguila_pescadora" "Alevines" "algas" "almejas" ...
## .. ..$ GrupoTax : chr [1:125] "Aves" "Peces" "Plantas" "Moluscos" ...
## .. ..$ TipoAlimentacion: chr [1:125] "carnivoro" "omnivoro" "autotrofo" "herbivoro" ...
## ..$ : list()
## $ :<environment: 0x15bf3ff70>
El manual de igraph describe diversas formas de graficar la red a partir del objeto igraph (en este caso: net). En nuestro caso tenemos una gráfica con los nombres de los taxones e identificados según su tipo de alimentación: verde: autótrofos, rojo: carnívoros, gris: descomponedores, amarillo: herbívoros, negro: materia orgánica y marrón: omnívoros.
## colores según tipo de alimentación
levels(as.factor(nodes$TipoAlimentacion))
## [1] "autotrofo" "carnivoro" "descomponedor" "herbivoro"
## [5] "MO" "omnivoro"
colrs <- c("green", "red", "gray", "yellow", "black", "brown")
V(net)$color <- colrs[as.factor(V(net)$TipoAlimentacion)]
plot(net, vertex.label=V(net)$SpName,
vertex.label.cex=.7,
vertex.color=V(net)$color,
edge.width=0.3,
edge.arrow.size=0.2)
FIGURA 1. Red de taxones recursos-consumidores, en las lagunas de la Reserva de Humacao. Esta gráfica no muestra niveles tróficos.
Preguntas sobre la FIGURA 1:
Otra manera de mostrar gráficamente la red trófica, es mediante una gráfica circular. En este tipo de gráfica podemos detectar nodos (taxones) que están muy conectados.
# Matriz de adyacencia
charca.graph<-graph.edgelist(as.matrix(links))
charca.adjmatrix<-get.adjacency(charca.graph,sparse=F)
# gráfica circular
plot.igraph(charca.graph,
vertex.label=V(net)$SpNumber,
vertex.label.font=1,
vertex.label.cex=0.5,
vertex.size=0.1,
edge.arrow.size=.25,
layout=layout.circle)
FIGURA 2. Gráfica circular de enlaces entre los nodos de recursos y consumidores en las lagunas de la Reserva de Humacao.
La matriz de interacciones o de adyacencia se puede graficar con las columnas como consumidores y las filas como los recursos. Mientras más puntos se alineen de manera horizontal, indica que el recurso de esa fila es altamente consumido.
# matriz de interacciones
netmatrix <- get.adjacency(net, sparse=F)
# mapa de calor de interacciones: columna = consumidor, fila = recurso
heatmap(netmatrix, Rowv=NA, Colv=NA, labRow = nodes[[2]], labCol = nodes[[2]], scale="none", cexRow=0.2, cexCol = 0.2)
FIGURA 3. Matriz de interacciones de recurso-consumidor. Las interacciones son desde los consumidores en el eje horizontal (columnas) a los recursos (eje vertical o filas).
A continuación construimos una gráfica especial para representar la red trófica. Esta gráfica es diferente a las anteriores por la distribución de los taxones (nodos) de acuerdo a su nivel trófico (eje vertical). Los nodos poseen un color de acuerdo a su tipo de alimentación (ver arriba) y el tamaño depende de la cantidad de enlaces que poseen.
# niveles tróficos de los taxones
troph.charca<-TrophInd(charca.adjmatrix)
levels(as.factor(nodes$TipoAlimentacion))
## [1] "autotrofo" "carnivoro" "descomponedor" "herbivoro"
## [5] "MO" "omnivoro"
colrs <- c("green", "red", "gray", "yellow", "black", "brown")
V(net)$color <- colrs[as.factor(V(net)$TipoAlimentacion)]
plotfw(net, col=V(net)$color,
rescale = TRUE,
lab=V(net)$name,
labcex=0.4,
edge.width=0.3,
edge.arrow.size=0.03)
FIGURA 4. Gráfica de la red trófica de las lagunas de la Reserva de Humacao. La escala vertical indica el nivel trófico de los taxones, con un valor de 1 para los taxones basales. La gráfica muestra mediante colores (indicados arriba) el tipo de alimentación de cada taxón; el tamaño del nodo representa la cantidad de interacciones de ese nodo.
A continuación algunos índices que describen la estructura de la red trófica, y que son esenciales para: (1) evaluar el efecto de diferentes escenarios en la estructura de la red trófica, (2) comparar la red trófica con otras redes.
Especies basales:
algas, anfibios, anolis, aves, bacterias, crustaceos, fitoplankton,
hongos, iguana, Mangle_blanco, materia_organica, materia_vegetal,
moluscos, plankton, plantas, plantas_acuaticas, protozoarios, ratones,
reptiles, zooplankton
Depredadores topes:
aguila_pescadora, Alevines, Anolis_cristatellus, comadreja, avoceta,
becasina_comun, boba_parda, boba_patirroja, candelita,
Cangrejo_Violinista, Cangrejo_Azul, carpintero, carpintero_PR,
chambergo, chango, charran, chiriria, Chopa, chorlos, clerigo,
coco_prieto, cocolias, comename, corua, Eleutherodactylus_coqui, falcon,
gallaretas, gallinazo_americano, gallinazo_nativo, gallito_amarillo,
gallito_sora, garrapatero, garzas, gavilan_cienaga, gavilan_cola_tijera,
gaviotas, Gobio, golondrinas, gorriones, guaraguao_colirojo, halcones,
Jicotea, jueyes, jui_PR, julian_chivi, martin_pescador_norteno,
Martinete, martinetito, monjita_tricolor, mucaro_PR, mucaro_real,
napoleon_tejedor, obispo_rojo, pajaro_bobo, paloma_cabeciblanca,
paloma_domestica, paloma_turca, Pargo, patos, pelicano_pardo, perdiz,
perico_aliamarillo, pitirre_gris, pizpitas, pollo_de_mangle, reina_mora,
reinitas, Robalo_comun, rolita, ruisenor, Sabalo, tigua, tijerilla,
Tilapia, tordo_lustroso, tortola, tortola_cardosantera, tubeworms,
turpial, veteranos, violinista, viuda, viuda_colicinta, yaboa_comun,
yaboa_real, zaramago, zorzal_pardo, zumbadores
Omnivoría: 0.7757567
Riqueza de especies: 125
Conectancia: 0.0180645
Densidad de enlaces: 2.144
Generalidad: 2.6666667
Vulnerabilidad: 7.5675676
Ruta más corta: 2.7676129
Nivel trófico promedio: 2.3239247
Kortsch, S.; Frelat, R.; Pecuchet, L.; Olivier, P.; Putnis, I.; Bonsdorff, E.; Ojaveer, H.; Jurgensone, I.; Strake, S.; Rubene, G.; Kruze, E. and Nordström, M. 2022. Introduction to food webs metrics: the Gulf of Riga case study. https://rfrelat.github.io/BalticFoodWeb.html
Kortsch, S., Frelat, R., Pecuchet, L., Olivier, P., Putnis, I., Bonsdorff, E., Ojaveer, H., Jurgensone, I., Strāķe, S., Rubene, G., Krūze, Ē., Nordström, M.C., 2021. Disentangling temporal food web dynamics facilitates understanding of ecosystem functioning. J Anim Ecol 90, 1205–1216. https://doi.org/10.1111/1365-2656.13447