Diplomado: MANEJO DE ECOSISTEMAS MARINOS COSTEROS DEL CARIBE
Programa: Biología — Universidad de La Guajira
Facultad: Ciencias Básicas y Aplicadas
Docente: Cristian Granados-Martínez PhD.
Antes de calcular cualquier índice, es importante tener claros los conceptos fundamentales sobre los cuales se construye el análisis de diversidad:
Especie: Grupo de organismos que se pueden reproducir entre sí y generar descendencia fértil.
Comunidad: Conjunto de diferentes especies que interactúan entre sí en un espacio y tiempo determinados. Por ejemplo, la comunidad de peces asociada a un arrecife de coral en el Caribe colombiano.
Muestreo: Método mediante el cual inferimos propiedades de una comunidad a partir de una porción de ella. En ecosistemas marinos costeros, puede realizarse mediante transectos en banda, censos visuales o redes de muestreo.
Esfuerzo de muestreo: Número de individuos registrados o el tiempo/área invertidos en obtener los datos. A mayor esfuerzo, mayor probabilidad de detectar especies raras.
Abundancia: Qué tan común o raro es encontrar una especie en una comunidad. Puede expresarse como número de individuos, densidad o cobertura.
Diversidad: Propiedad emergente de las comunidades que incorpora el grado de heterogeneidad en términos de especies, gremios funcionales, grupos taxonómicos, etc.
Interpolación: Modelar datos dentro del intervalo de muestreo observado.
Extrapolación: Modelar datos fuera del intervalo de muestreo observado (proyección más allá del esfuerzo real).
Rarefacción: Técnica estadística basada en remuestreo que permite comparar la diversidad de comunidades con diferente esfuerzo de muestreo, llevándolas a una base común.
No existe una única forma de medir biodiversidad. Las tres escalas más utilizadas son:
| Escala | Definición | ¿Qué mide? |
|---|---|---|
| Diversidad α (alfa) | Diversidad dentro de un sitio | Riqueza e índices en cada punto de muestreo |
| Diversidad β (beta) | Diversidad entre sitios | Recambio de especies entre comunidades |
| Diversidad γ (gamma) | Diversidad total del paisaje | Riqueza en toda el área de estudio |
En esta guía nos enfocamos en la diversidad alfa, que es la base de todo análisis de comunidades.
Medir la diversidad alfa en ecosistemas marinos costeros del Caribe permite:
La diversidad alfa (α) mide la diversidad de especies dentro de un sitio o comunidad. Es la escala más básica y más utilizada en estudios de biodiversidad marina y costera.
Las tres escalas de diversidad se relacionan así:
| Escala | Pregunta que responde | Ejemplo en ecosistemas del Caribe |
|---|---|---|
| Alfa (α) | ¿Cuántas especies hay en este arrecife? | Diversidad de peces en un transecto |
| Beta (β) | ¿Cuánto cambia la comunidad entre arrecifes? | Recambio entre Tayrona y Cabo de la Vela |
| Gamma (γ) | ¿Cuántas especies hay en toda el área de estudio? | Total de peces en el Caribe colombiano |
En esta guía nos enfocamos exclusivamente en la diversidad alfa, empleando los índices clásicos más utilizados en ecología marina.
Todo índice de diversidad alfa resume, en distintas proporciones, dos componentes:
Una comunidad puede tener muchas especies pero con una especie dominando completamente (baja equitabilidad), o pocas especies con abundancias muy similares (alta equitabilidad). Los índices capturan estas diferencias de manera distinta.
Medir la diversidad alfa en arrecifes de coral, pastos marinos y manglares del Caribe colombiano permite:
# Ejecuten este bloque UNA SOLA VEZ
# Solo es necesario si aún no tienen instalados estos paquetes
install.packages(c("vegan", # Análisis de diversidad ecológica
"tidyverse", # Manipulación de datos y gráficos
"knitr", # Tablas formateadas
"ggpubr", # Gráficos con estadísticos
"corrplot")) # Matrices de correlación# Ejecuten este bloque al inicio de cada sesión de trabajo
library(vegan) # Funciones de diversidad: specnumber(), diversity(), rarecurve()
library(tidyverse) # ggplot2, dplyr, tidyr
library(knitr) # kable() para tablas
library(ggpubr) # stat_cor(), ggqqplot()
library(corrplot) # corrplot()
# Verificar que vegan cargó correctamente
cat("Paquete vegan cargado — versión:", as.character(packageVersion("vegan")), "\n")## Paquete vegan cargado — versión: 2.6.10
Trabajamos con datos simulados de censos visuales de peces realizados en ocho sitios de arrecife de coral del Caribe colombiano. Cuatro sitios se encuentran dentro de zonas protegidas (Parque Tayrona e Isla Aguja) y cuatro en zonas no protegidas (Punta Gallinas y Cabo de la Vela).
Cada fila de la matriz representa un sitio de muestreo y cada columna una especie. Los valores corresponden al número de individuos observados en un transecto de 25 m².
set.seed(2026)
# ── Nombres de los sitios ─────────────────────────────────────────────────────
sitios <- c("Tayrona_1", "Tayrona_2",
"Aguja_1", "Aguja_2",
"Gallinas_1", "Gallinas_2",
"Vela_1", "Vela_2")
# ── Especies de peces arrecifales del Caribe colombiano ──────────────────────
especies <- c(
"Acanthurus_bahianus", # Cirujano café
"Sparisoma_viride", # Loro verde
"Haemulon_sciurus", # Ronco macabi
"Epinephelus_guttatus", # Mero colorado
"Stegastes_partitus", # Damísela bicolor
"Lutjanus_apodus", # Pargo amarillo
"Cephalopholis_cruentata", # Mero tomate
"Holocanthus_tricolor", # Ángel roca
"Pomacanthus_paru", # Ángel francés
"Chaetodon_capistratus", # Mariposa cuatro ojos
"Bodianus_rufus", # Vieja española
"Thalassoma_bifasciatum", # Señorita cabeza azul
"Scarus_iserti", # Loro rayado
"Abudefduf_saxatilis", # Sargento mayor
"Gramma_loreto" # Basslet real
)
# ── Matriz de abundancias ─────────────────────────────────────────────────────
# Sitios protegidos tienen mayor abundancia promedio
abundancias <- matrix(
c(rpois(2 * length(especies), lambda = 22), # Tayrona
rpois(2 * length(especies), lambda = 18), # Aguja
rpois(2 * length(especies), lambda = 11), # Gallinas
rpois(2 * length(especies), lambda = 9)), # Cabo de la Vela
nrow = length(sitios),
ncol = length(especies),
byrow = TRUE,
dimnames = list(sitios, especies)
)
# Introducir ceros (ausencias naturales — especies raras)
abundancias[abundancias < 4] <- 0
# Mostrar la matriz
kable(abundancias,
caption = "Matriz de abundancias de peces arrecifales (ind./transecto de 25 m²)",
align = "c")| Acanthurus_bahianus | Sparisoma_viride | Haemulon_sciurus | Epinephelus_guttatus | Stegastes_partitus | Lutjanus_apodus | Cephalopholis_cruentata | Holocanthus_tricolor | Pomacanthus_paru | Chaetodon_capistratus | Bodianus_rufus | Thalassoma_bifasciatum | Scarus_iserti | Abudefduf_saxatilis | Gramma_loreto | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Tayrona_1 | 24 | 16 | 12 | 28 | 26 | 20 | 25 | 18 | 17 | 10 | 29 | 18 | 21 | 27 | 21 |
| Tayrona_2 | 13 | 22 | 30 | 30 | 22 | 25 | 30 | 19 | 21 | 15 | 22 | 27 | 24 | 17 | 22 |
| Aguja_1 | 23 | 25 | 25 | 26 | 24 | 14 | 21 | 16 | 21 | 19 | 13 | 12 | 19 | 15 | 22 |
| Aguja_2 | 16 | 28 | 17 | 16 | 10 | 19 | 32 | 18 | 20 | 18 | 23 | 14 | 24 | 20 | 9 |
| Gallinas_1 | 16 | 19 | 13 | 13 | 11 | 16 | 11 | 8 | 9 | 14 | 16 | 11 | 8 | 9 | 10 |
| Gallinas_2 | 7 | 11 | 7 | 15 | 7 | 9 | 12 | 13 | 14 | 7 | 10 | 10 | 14 | 18 | 7 |
| Vela_1 | 9 | 16 | 12 | 10 | 9 | 12 | 7 | 4 | 5 | 10 | 8 | 7 | 10 | 8 | 6 |
| Vela_2 | 11 | 13 | 12 | 10 | 9 | 10 | 18 | 7 | 11 | 6 | 8 | 10 | 10 | 11 | 9 |
env_data <- data.frame(
sitio = sitios,
zona = c("Protegida", "Protegida",
"Protegida", "Protegida",
"No protegida", "No protegida",
"No protegida", "No protegida"),
profundidad_m = c(8.5, 10.2, 7.8, 9.5,
12.1, 11.4, 13.0, 10.8),
temperatura_C = c(27.5, 27.8, 28.1, 27.9,
29.2, 28.8, 29.5, 28.6),
salinidad_ppt = c(36.1, 36.3, 35.9, 36.2,
36.5, 36.4, 36.8, 36.3),
cobertura_coral = c(48.2, 45.6, 41.3, 43.8,
27.5, 29.1, 22.4, 25.8),
turbidez_NTU = c(2.1, 2.4, 2.8, 2.5,
5.2, 4.8, 6.1, 5.5)
)
kable(env_data,
caption = "Variables ambientales por sitio de muestreo",
digits = 2)| sitio | zona | profundidad_m | temperatura_C | salinidad_ppt | cobertura_coral | turbidez_NTU |
|---|---|---|---|---|---|---|
| Tayrona_1 | Protegida | 8.5 | 27.5 | 36.1 | 48.2 | 2.1 |
| Tayrona_2 | Protegida | 10.2 | 27.8 | 36.3 | 45.6 | 2.4 |
| Aguja_1 | Protegida | 7.8 | 28.1 | 35.9 | 41.3 | 2.8 |
| Aguja_2 | Protegida | 9.5 | 27.9 | 36.2 | 43.8 | 2.5 |
| Gallinas_1 | No protegida | 12.1 | 29.2 | 36.5 | 27.5 | 5.2 |
| Gallinas_2 | No protegida | 11.4 | 28.8 | 36.4 | 29.1 | 4.8 |
| Vela_1 | No protegida | 13.0 | 29.5 | 36.8 | 22.4 | 6.1 |
| Vela_2 | No protegida | 10.8 | 28.6 | 36.3 | 25.8 | 5.5 |
La riqueza de especies (S) es el número total de especies presentes en una muestra. Es el índice más simple e intuitivo de diversidad, pero también el más sensible al esfuerzo de muestreo: a mayor esfuerzo, mayor probabilidad de registrar especies raras.
La función specnumber() del paquete vegan
cuenta automáticamente el número de especies con abundancia mayor a cero
en cada fila de la matriz.
# Calcular riqueza de especies por sitio
riqueza <- specnumber(abundancias)
cat("Riqueza de especies por sitio:\n")## Riqueza de especies por sitio:
## Tayrona_1 Tayrona_2 Aguja_1 Aguja_2 Gallinas_1 Gallinas_2 Vela_1
## 15 15 15 15 15 15 15
## Vela_2
## 15
##
## Estadísticos descriptivos de la riqueza:
## Media: 15 especies
## Desviación estándar: 0
## Mínimo: 15 especies
## Máximo: 15 especies
data.frame(sitio = names(riqueza),
riqueza = as.numeric(riqueza),
zona = env_data$zona) |>
ggplot(aes(x = reorder(sitio, riqueza), y = riqueza, fill = zona)) +
geom_col(alpha = 0.85) +
geom_text(aes(label = riqueza), hjust = -0.3, size = 4, fontface = "bold") +
coord_flip() +
scale_fill_manual(values = c("Protegida" = "#4E9BB9",
"No protegida" = "#E07B54")) +
labs(
title = "Riqueza de Especies de Peces Arrecifales",
subtitle = "Caribe colombiano — Censos visuales en transectos de 25 m²",
x = NULL,
y = "Número de especies (S)",
fill = "Zona"
) +
theme_classic(base_size = 13) +
theme(legend.position = "bottom")Riqueza de especies de peces por sitio de muestreo, coloreado por zona de protección.
El índice de Shannon (H’) mide la incertidumbre en la identidad de un individuo tomado al azar de la comunidad. Combina dos componentes:
Valores más altos indican comunidades más diversas y con mejor distribución de la abundancia entre especies.
\[H' = -\sum_{i=1}^{S} p_i \ln p_i\]
Donde \(p_i\) es la proporción de individuos de la especie \(i\) respecto al total de individuos del sitio.
Guía de interpretación:
| H’ | Diversidad |
|---|---|
| < 1.5 | Baja |
| 1.5 — 3.0 | Moderada |
| > 3.0 | Alta |
# Calcular índice de Shannon
shannon <- diversity(abundancias, index = "shannon")
cat("Índice de Shannon (H') por sitio:\n")## Índice de Shannon (H') por sitio:
## Tayrona_1 Tayrona_2 Aguja_1 Aguja_2 Gallinas_1 Gallinas_2 Vela_1
## 2.671 2.682 2.681 2.659 2.673 2.659 2.654
## Vela_2
## 2.676
##
## Interpretación:
for (i in seq_along(shannon)) {
nivel <- ifelse(shannon[i] > 3.0, "Alta diversidad",
ifelse(shannon[i] > 1.5, "Diversidad moderada",
"Baja diversidad"))
cat(sprintf(" %-14s H' = %.3f → %s\n",
names(shannon)[i], shannon[i], nivel))
}## Tayrona_1 H' = 2.671 → Diversidad moderada
## Tayrona_2 H' = 2.682 → Diversidad moderada
## Aguja_1 H' = 2.681 → Diversidad moderada
## Aguja_2 H' = 2.659 → Diversidad moderada
## Gallinas_1 H' = 2.673 → Diversidad moderada
## Gallinas_2 H' = 2.659 → Diversidad moderada
## Vela_1 H' = 2.654 → Diversidad moderada
## Vela_2 H' = 2.676 → Diversidad moderada
tabla_s_h <- data.frame(
Sitio = names(riqueza),
Zona = env_data$zona,
S = as.numeric(riqueza),
H = round(as.numeric(shannon), 3)
)
kable(tabla_s_h,
col.names = c("Sitio", "Zona", "Riqueza (S)", "Shannon (H')"),
caption = "Comparación de riqueza e índice de Shannon por sitio",
align = "c")| Sitio | Zona | Riqueza (S) | Shannon (H’) |
|---|---|---|---|
| Tayrona_1 | Protegida | 15 | 2.671 |
| Tayrona_2 | Protegida | 15 | 2.682 |
| Aguja_1 | Protegida | 15 | 2.681 |
| Aguja_2 | Protegida | 15 | 2.659 |
| Gallinas_1 | No protegida | 15 | 2.673 |
| Gallinas_2 | No protegida | 15 | 2.659 |
| Vela_1 | No protegida | 15 | 2.654 |
| Vela_2 | No protegida | 15 | 2.676 |
El índice de Simpson mide la probabilidad de que dos individuos elegidos al azar de la comunidad pertenezcan a especies diferentes. Está más influenciado por las especies dominantes que por las raras.
Se usa en dos formas:
\[D = 1 - \sum_{i=1}^{S} p_i^2 \quad \text{(Gini-Simpson)}\]
\[\frac{1}{D} = \frac{1}{\sum_{i=1}^{S} p_i^2} \quad \text{(Inverso de Simpson)}\]
El inverso de Simpson (1/D) es más intuitivo: representa el número de especies igualmente abundantes necesarias para obtener la misma diversidad observada.
# Índice de Gini-Simpson
simpson <- diversity(abundancias, index = "simpson")
# Inverso de Simpson
inv_simpson <- diversity(abundancias, index = "invsimpson")
cat("Índice de Gini-Simpson (D) por sitio:\n")## Índice de Gini-Simpson (D) por sitio:
## Tayrona_1 Tayrona_2 Aguja_1 Aguja_2 Gallinas_1 Gallinas_2 Vela_1
## 0.929 0.930 0.930 0.927 0.929 0.927 0.926
## Vela_2
## 0.929
##
## Inverso de Simpson (1/D) por sitio:
## Tayrona_1 Tayrona_2 Aguja_1 Aguja_2 Gallinas_1 Gallinas_2 Vela_1
## 14.01 14.27 14.25 13.67 14.01 13.64 13.51
## Vela_2
## 14.04
La equitabilidad de Pielou (J’) mide qué tan uniformemente se distribuyen los individuos entre las especies. Es independiente de la riqueza.
\[J' = \frac{H'}{\ln S}\]
El índice de Berger-Parker expresa la proporción de individuos que corresponden a la especie más abundante del sitio. Es una medida directa de dominancia: valores altos indican que una especie controla la comunidad.
\[BP = \frac{N_{max}}{N_{total}}\]
# Índice de Berger-Parker
berger_parker <- apply(abundancias, 1,
function(x) max(x) / sum(x))
# Especie dominante en cada sitio
especie_dom <- apply(abundancias, 1,
function(x) names(which.max(x)))
dominancia <- data.frame(
Sitio = names(berger_parker),
Zona = env_data$zona,
Especie_dominante = especie_dom,
Berger_Parker = round(berger_parker, 3)
)
kable(dominancia,
col.names = c("Sitio", "Zona", "Especie dominante", "Berger-Parker"),
caption = "Dominancia por sitio — Índice de Berger-Parker",
align = "c")| Sitio | Zona | Especie dominante | Berger-Parker | |
|---|---|---|---|---|
| Tayrona_1 | Tayrona_1 | Protegida | Bodianus_rufus | 0.093 |
| Tayrona_2 | Tayrona_2 | Protegida | Haemulon_sciurus | 0.088 |
| Aguja_1 | Aguja_1 | Protegida | Epinephelus_guttatus | 0.088 |
| Aguja_2 | Aguja_2 | Protegida | Cephalopholis_cruentata | 0.113 |
| Gallinas_1 | Gallinas_1 | No protegida | Sparisoma_viride | 0.103 |
| Gallinas_2 | Gallinas_2 | No protegida | Abudefduf_saxatilis | 0.112 |
| Vela_1 | Vela_1 | No protegida | Sparisoma_viride | 0.120 |
| Vela_2 | Vela_2 | No protegida | Cephalopholis_cruentata | 0.116 |
indices <- data.frame(
Sitio = names(riqueza),
Zona = env_data$zona,
S = as.numeric(riqueza),
H = round(as.numeric(shannon), 3),
D = round(as.numeric(simpson), 3),
InvD = round(as.numeric(inv_simpson), 2),
J = round(as.numeric(pielou), 3),
BP = round(berger_parker, 3)
)
kable(indices,
col.names = c("Sitio", "Zona", "S", "H' (Shannon)",
"D (Simpson)", "1/D", "J' (Pielou)", "BP"),
caption = "Índices de diversidad alfa — resumen por sitio",
align = "c")| Sitio | Zona | S | H’ (Shannon) | D (Simpson) | 1/D | J’ (Pielou) | BP | |
|---|---|---|---|---|---|---|---|---|
| Tayrona_1 | Tayrona_1 | Protegida | 15 | 2.671 | 0.929 | 14.01 | 0.986 | 0.093 |
| Tayrona_2 | Tayrona_2 | Protegida | 15 | 2.682 | 0.930 | 14.27 | 0.990 | 0.088 |
| Aguja_1 | Aguja_1 | Protegida | 15 | 2.681 | 0.930 | 14.25 | 0.990 | 0.088 |
| Aguja_2 | Aguja_2 | Protegida | 15 | 2.659 | 0.927 | 13.67 | 0.982 | 0.113 |
| Gallinas_1 | Gallinas_1 | No protegida | 15 | 2.673 | 0.929 | 14.01 | 0.987 | 0.103 |
| Gallinas_2 | Gallinas_2 | No protegida | 15 | 2.659 | 0.927 | 13.64 | 0.982 | 0.112 |
| Vela_1 | Vela_1 | No protegida | 15 | 2.654 | 0.926 | 13.51 | 0.980 | 0.120 |
| Vela_2 | Vela_2 | No protegida | 15 | 2.676 | 0.929 | 14.04 | 0.988 | 0.116 |
indices |>
pivot_longer(cols = c(S, H, D, J),
names_to = "Indice",
values_to = "Valor") |>
mutate(Indice = recode(Indice,
S = "Riqueza (S)",
H = "Shannon (H')",
D = "Simpson (D)",
J = "Pielou (J')"
)) |>
ggplot(aes(x = Zona, y = Valor, fill = Zona)) +
geom_boxplot(alpha = 0.55, outlier.shape = NA, width = 0.45) +
geom_jitter(aes(color = Zona), width = 0.13, size = 3, alpha = 0.8) +
facet_wrap(~ Indice, scales = "free_y", ncol = 2) +
scale_fill_manual(values = c("Protegida" = "#4E9BB9",
"No protegida" = "#E07B54")) +
scale_color_manual(values = c("Protegida" = "#1F6E8C",
"No protegida" = "#C0415A")) +
labs(
title = "Índices de Diversidad Alfa por Zona",
subtitle = "Peces arrecifales — Caribe colombiano",
x = NULL,
y = "Valor del índice"
) +
theme_bw(base_size = 12) +
theme(legend.position = "bottom",
strip.background = element_rect(fill = "#2C3E50"),
strip.text = element_text(color = "white", face = "bold"))Comparación de los cuatro índices de diversidad alfa entre zonas protegidas y no protegidas.
Las curvas de rango-abundancia ordenan las especies de mayor a menor abundancia y las grafican en escala logarítmica. La forma de la curva revela la estructura de dominancia de la comunidad:
# Construir la tabla de rango-abundancia para todos los sitios
ra_data <- purrr::map_dfr(sitios, function(s) {
ab <- sort(abundancias[s, abundancias[s, ] > 0], decreasing = TRUE)
if (length(ab) == 0) return(NULL)
data.frame(
sitio = s,
zona = env_data$zona[env_data$sitio == s],
rango = seq_along(ab),
abundancia = as.numeric(ab)
)
})
ggplot(ra_data, aes(x = rango, y = abundancia,
color = zona, group = sitio)) +
geom_line(linewidth = 0.9, alpha = 0.75) +
geom_point(size = 2.5, alpha = 0.8) +
scale_y_log10() +
scale_color_manual(values = c("Protegida" = "#1F6E8C",
"No protegida" = "#C0415A")) +
labs(
title = "Curvas de Rango-Abundancia — Peces Arrecifales",
subtitle = "Eje Y en escala logarítmica | Cada línea = un sitio",
x = "Rango de la especie",
y = "Abundancia (escala log₁₀)",
color = "Zona"
) +
theme_classic(base_size = 13) +
theme(legend.position = "bottom")Curvas de rango-abundancia por sitio. Una curva más plana indica mayor equitabilidad.
Una limitación importante de la riqueza observada (S) es que depende del esfuerzo de muestreo. Si un sitio tiene más individuos registrados, es probable que tengamos más especies, independientemente de si la comunidad es realmente más diversa.
La rarefacción resuelve esto estandarizando todos los sitios al mismo número de individuos (el del sitio con menor esfuerzo de muestreo), haciendo que las comparaciones sean justas.
n_min <- min(rowSums(abundancias))
cat("Tamaño mínimo de muestra:", n_min, "individuos (sitio de menor esfuerzo)\n")## Tamaño mínimo de muestra: 133 individuos (sitio de menor esfuerzo)
rarecurve(abundancias,
step = 5,
sample = n_min,
col = c(rep("#1F6E8C", 4), rep("#C0415A", 4)),
lwd = 2,
label = TRUE,
main = "Curvas de Rarefacción — Peces Arrecifales",
xlab = "Número de individuos muestreados",
ylab = "Riqueza esperada de especies")
abline(v = n_min, lty = 2, col = "gray40", lwd = 1.5)
legend("bottomright",
legend = c("Protegida", "No protegida"),
col = c("#1F6E8C", "#C0415A"),
lwd = 2, bty = "n")Curvas de rarefacción por sitio. La línea vertical punteada indica el tamaño mínimo de muestra al que se estandariza.
rare_std <- rarefy(abundancias, sample = n_min)
comparacion_rare <- data.frame(
Sitio = names(riqueza),
Zona = env_data$zona,
N_total = rowSums(abundancias),
S_observada = as.numeric(riqueza),
S_rarefactada = round(as.numeric(rare_std), 1),
Diferencia = round(as.numeric(riqueza) - as.numeric(rare_std), 1)
)
kable(comparacion_rare,
col.names = c("Sitio", "Zona", "N total",
"S observada", "S rarefactada", "Diferencia"),
caption = paste0("Riqueza observada vs. rarefactada ",
"(estandarizada a ", n_min, " individuos)"),
align = "c")| Sitio | Zona | N total | S observada | S rarefactada | Diferencia | |
|---|---|---|---|---|---|---|
| Tayrona_1 | Tayrona_1 | Protegida | 312 | 15 | 15 | 0 |
| Tayrona_2 | Tayrona_2 | Protegida | 339 | 15 | 15 | 0 |
| Aguja_1 | Aguja_1 | Protegida | 295 | 15 | 15 | 0 |
| Aguja_2 | Aguja_2 | Protegida | 284 | 15 | 15 | 0 |
| Gallinas_1 | Gallinas_1 | No protegida | 184 | 15 | 15 | 0 |
| Gallinas_2 | Gallinas_2 | No protegida | 161 | 15 | 15 | 0 |
| Vela_1 | Vela_1 | No protegida | 133 | 15 | 15 | 0 |
| Vela_2 | Vela_2 | No protegida | 155 | 15 | 15 | 0 |
💡 Cuando la S rarefactada es similar entre sitios con diferente S observada, significa que la diferencia en riqueza se debe al esfuerzo de muestreo, no a una diferencia real en diversidad.
El estimador Chao1 estima el número de especies que aún no hemos detectado. La completitud es la proporción de species estimadas que sí registramos.
estimadores <- estimateR(abundancias)
# Calcular completitud basada en Chao1
completitud <- as.numeric(riqueza) / estimadores["S.chao1", ]
resumen_comp <- data.frame(
Sitio = colnames(estimadores),
Zona = env_data$zona,
S_obs = estimadores["S.obs", ],
S_Chao1 = round(estimadores["S.chao1", ], 1),
S_ACE = round(estimadores["S.ACE", ], 1),
Completitud = paste0(round(completitud * 100, 1), " %")
)
kable(resumen_comp,
caption = "Estimadores de riqueza total y completitud del muestreo",
align = "c")| Sitio | Zona | S_obs | S_Chao1 | S_ACE | Completitud | |
|---|---|---|---|---|---|---|
| Tayrona_1 | Tayrona_1 | Protegida | 15 | 15 | 15 | 100 % |
| Tayrona_2 | Tayrona_2 | Protegida | 15 | 15 | NaN | 100 % |
| Aguja_1 | Aguja_1 | Protegida | 15 | 15 | NaN | 100 % |
| Aguja_2 | Aguja_2 | Protegida | 15 | 15 | 15 | 100 % |
| Gallinas_1 | Gallinas_1 | No protegida | 15 | 15 | 15 | 100 % |
| Gallinas_2 | Gallinas_2 | No protegida | 15 | 15 | 15 | 100 % |
| Vela_1 | Vela_1 | No protegida | 15 | 15 | 15 | 100 % |
| Vela_2 | Vela_2 | No protegida | 15 | 15 | 15 | 100 % |
comp_prom <- mean(completitud, na.rm = TRUE)
cat("══════════════════════════════════════════════════════\n")## ══════════════════════════════════════════════════════
## EVALUACIÓN DE LA COMPLETITUD DEL MUESTREO
## ══════════════════════════════════════════════════════
## Completitud promedio: 100.0 %
if (comp_prom < 0.70) {
cat(" ⚠️ BAJA: Se recomienda aumentar el esfuerzo de muestreo.\n")
cat(sprintf(" Se estima un %.0f %% más de especies por registrar.\n",
(1 / comp_prom - 1) * 100))
} else if (comp_prom < 0.85) {
cat(" ⚡ MODERADA: Muestreo aceptable.\n")
cat(" Se recomienda muestreo adicional en sitios con\n")
cat(" completitud menor al 70 %.\n")
} else {
cat(" ✓ ALTA: El esfuerzo de muestreo es adecuado.\n")
}## ✓ ALTA: El esfuerzo de muestreo es adecuado.
## ══════════════════════════════════════════════════════
datos_cor <- data.frame(
Riqueza = as.numeric(riqueza),
Shannon = as.numeric(shannon),
Simpson = as.numeric(simpson),
Pielou = as.numeric(pielou),
Profundidad = env_data$profundidad_m,
Temperatura = env_data$temperatura_C,
Cobertura_coral = env_data$cobertura_coral,
Turbidez = env_data$turbidez_NTU
)
matriz_cor <- cor(datos_cor, use = "complete.obs")
corrplot(matriz_cor,
method = "color",
type = "upper",
addCoef.col = "black",
tl.col = "black",
tl.srt = 45,
col = colorRampPalette(c("#E84855", "white", "#2E86AB"))(200),
title = "Diversidad vs. Variables Ambientales",
mar = c(0, 0, 2, 0),
number.cex = 0.85)Correlaciones entre índices de diversidad alfa y variables ambientales.
datos_cor |>
mutate(zona = env_data$zona) |>
ggplot(aes(x = Cobertura_coral, y = Riqueza, color = zona)) +
geom_point(size = 4, alpha = 0.85) +
geom_smooth(method = "lm", se = TRUE,
color = "gray40", linetype = "dashed") +
stat_cor(method = "pearson",
label.x = 22, label.y = max(as.numeric(riqueza))) +
scale_color_manual(values = c("Protegida" = "#1F6E8C",
"No protegida" = "#C0415A")) +
labs(
title = "Cobertura de Coral vs. Riqueza de Peces",
x = "Cobertura de coral (%)",
y = "Riqueza de especies (S)",
color = "Zona"
) +
theme_classic(base_size = 13)Relación entre cobertura de coral y riqueza de peces arrecifales.
sitio_max_S <- names(which.max(riqueza))
sitio_min_S <- names(which.min(riqueza))
sitio_max_H <- names(which.max(shannon))
media_prot <- mean(as.numeric(riqueza)[grepl("Tayrona|Aguja", names(riqueza))])
media_noprot <- mean(as.numeric(riqueza)[grepl("Gallinas|Vela", names(riqueza))])
cat("══════════════════════════════════════════════════════════\n")## ══════════════════════════════════════════════════════════
## RESUMEN — DIVERSIDAD ALFA DE PECES ARRECIFALES
## Caribe colombiano
## ══════════════════════════════════════════════════════════
## Riqueza promedio: 15.0 sp./sitio
## Rango riqueza: 15 — 15 especies
## Sitio más rico: Tayrona_1 (15 sp.)
## Sitio menos rico: Tayrona_1 (15 sp.)
## Shannon promedio: H' = 2.669
## Sitio más diverso: Tayrona_2 (H' = 2.682)
## Riqueza media protegidas: 15.0 sp.
## Riqueza media no protegidas: 15.0 sp.
cat(sprintf(" Diferencia: %.1f sp. (%.0f %%)\n",
media_prot - media_noprot,
((media_prot - media_noprot) / media_noprot) * 100))## Diferencia: 0.0 sp. (0 %)
## ══════════════════════════════════════════════════════════
📝 Resuelvan los siguientes ejercicios de manera individual o en pareja. Modifiquen el código de esta guía como referencia.
Con base en la tabla consolidada de índices (sección 6), respondan:
a) ¿Qué sitio presenta la mayor equitabilidad de Pielou (J’)? ¿Qué significa biológicamente que un sitio tenga J’ cercano a 1?
b) Comparen los valores de Shannon (H’) y Simpson (D) en el sitio con mayor riqueza (S). ¿Coinciden en señalar alta diversidad? ¿Por qué pueden diferir?
c) ¿Cuál es la especie dominante en los sitios no protegidos según el índice de Berger-Parker? ¿Qué podría explicar esta dominancia en un arrecife del Caribe colombiano bajo presión de pesca?
# Escriban aquí su código de apoyo para responder las preguntas
# Por ejemplo, para ver los índices del sitio con mayor riqueza:
sitio_max <- names(which.max(riqueza))
cat("Sitio con mayor riqueza:", sitio_max, "\n")
cat("Shannon:", round(shannon[sitio_max], 3), "\n")
cat("Simpson:", round(simpson[sitio_max], 3), "\n")
cat("Pielou: ", round(pielou[sitio_max], 3), "\n")Respuesta a): …
Respuesta b): …
Respuesta c): …
Observen las curvas de rarefacción de la sección 8 y respondan:
a) ¿Cuál es el tamaño mínimo de muestra al que se estandarizaron los sitios? ¿Qué sitio determinó ese mínimo?
b) Después de la estandarización por rarefacción, ¿las diferencias en riqueza entre zonas protegidas y no protegidas se mantienen o desaparecen? ¿Qué implica esto para la interpretación ecológica?
c) Si una curva de rarefacción aún sigue subiendo pronunciadamente al final del eje X, ¿qué indica sobre el muestreo de ese sitio?
# Código de apoyo: tabla de completitud y riqueza rarefactada
print(comparacion_rare)
print(resumen_comp)Respuesta a): …
Respuesta b): …
Respuesta c): …
Calculen los índices de diversidad alfa para los siguientes datos de macroalgas en arrecifes del Caribe colombiano. Los valores representan el porcentaje de cobertura por especie en cada sitio.
# Datos de cobertura de macroalgas (%) — ejecuten este bloque directamente
algas <- matrix(
c(15, 8, 0, 12, 5, 3, 0, 9,
10, 0, 14, 6, 8, 0, 11, 4,
3, 0, 5, 0, 18, 22, 4, 0,
0, 7, 0, 3, 9, 15, 0, 12),
nrow = 4,
byrow = TRUE,
dimnames = list(
c("Tayrona_S", "Aguja_S", "Gallinas_S", "Vela_S"),
c("Lobophora", "Dictyota", "Halimeda", "Caulerpa",
"Sargassum", "Turbinaria", "Padina", "Galaxaura")
)
)
# Visualizar la matriz
kable(algas,
caption = "Cobertura de macroalgas (%) por sitio — datos del ejercicio",
align = "c")| Lobophora | Dictyota | Halimeda | Caulerpa | Sargassum | Turbinaria | Padina | Galaxaura | |
|---|---|---|---|---|---|---|---|---|
| Tayrona_S | 15 | 8 | 0 | 12 | 5 | 3 | 0 | 9 |
| Aguja_S | 10 | 0 | 14 | 6 | 8 | 0 | 11 | 4 |
| Gallinas_S | 3 | 0 | 5 | 0 | 18 | 22 | 4 | 0 |
| Vela_S | 0 | 7 | 0 | 3 | 9 | 15 | 0 | 12 |
# ── COMPLETEN: reemplacen los espacios en MAYÚSCULAS con el código correcto ───
# 1. Riqueza de especies
riqueza_algas <- specnumber(NOMBRE_MATRIZ)
print(riqueza_algas)
# 2. Índice de Shannon
shannon_algas <- diversity(NOMBRE_MATRIZ, index = "INDICE")
print(round(shannon_algas, 3))
# 3. Equitabilidad de Pielou
pielou_algas <- SHANNON / log(RIQUEZA)
print(round(pielou_algas, 3))
# 4. Tabla consolidada
data.frame(
Sitio = names(riqueza_algas),
S = as.numeric(riqueza_algas),
H = round(as.numeric(shannon_algas), 3),
J = round(as.numeric(pielou_algas), 3)
)Interpretación del grupo: ¿Qué sitio de macroalgas presenta mayor diversidad? ¿Coinciden riqueza y Shannon en la misma conclusión?
Realicen una prueba t para evaluar si la riqueza de especies de peces difiere significativamente entre zonas protegidas y no protegidas. Usen lo aprendido en la Parte 3 de la guía.
# Construir el data.frame necesario para la prueba t
datos_t <- data.frame(
riqueza = as.numeric(riqueza),
zona = env_data$zona
)
# Verificar normalidad
datos_t |>
group_by(zona) |>
rstatix::shapiro_test(riqueza)
# Prueba t
t.test(___ ~ ___, data = datos_t, var.equal = ___)
# Visualización
library(ggpubr)
ggplot(datos_t, aes(x = zona, y = riqueza, fill = zona)) +
geom_boxplot(alpha = 0.6) +
geom_jitter(width = 0.15, size = 3, alpha = 0.7) +
stat_compare_means(method = "t.test", label = "p.format") +
labs(title = "Riqueza de Peces: Protegida vs. No Protegida",
x = NULL, y = "Riqueza (S)") +
scale_fill_manual(values = c("Protegida" = "#4E9BB9",
"No protegida" = "#E07B54")) +
theme_classic(base_size = 13) +
theme(legend.position = "none")Conclusión: ¿Existe diferencia significativa? Indiquen el valor p y redacten una conclusión en términos biológicos.
Recursos en línea: