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.
En la Parte 4 aprendimos a calcular riqueza (S), Shannon (H’), Simpson (D) y Pielou (J’). Aunque útiles, estos índices tienen dos limitaciones importantes:
Dependen del esfuerzo de muestreo. Un sitio con más individuos registrados tenderá a mostrar mayor diversidad, aunque la comunidad real sea igual de diversa que otra menos muestreada.
No son directamente comparables entre sí. H’ mide “bits de información” y D mide una probabilidad — son escalas distintas que no se pueden comparar en términos de cuánto más diversa es una comunidad respecto a otra.
Los números de Hill (\(^qD\)) resuelven ambos problemas. Expresan la diversidad como un número efectivo de especies: el número de especies igualmente abundantes que producirían el mismo nivel de diversidad que la comunidad observada. Esto los hace:
\[^qD = \left(\sum_{i=1}^{S} p_i^q\right)^{\frac{1}{1-q}}\]
Donde \(p_i\) es la proporción de individuos de la especie \(i\) y \(q\) es el orden de diversidad que controla la sensibilidad a las especies raras vs. comunes.
| Orden | Equivale a | Sensible a |
|---|---|---|
| q = 0 | Riqueza de especies (S) | Todas las especies por igual — muy sensible a raras |
| q = 1 | e^H’ (exponencial del Shannon) | Especies comunes — punto intermedio |
| q = 2 | 1/D (inverso de Simpson) | Especies dominantes — insensible a raras |
💡 Regla práctica: si \(^0D \gg ^2D\), la comunidad tiene muchas especies raras y pocas dominantes. Si \(^0D \approx ^2D\), la comunidad es equitativa.
# Ejecuten este bloque UNA SOLA VEZ
install.packages(c("iNEXT", "vegan", "tidyverse", "knitr", "ggpubr"))# Cargar al inicio de cada sesión
library(iNEXT) # Números de Hill + curvas de rarefacción/extrapolación
library(vegan) # Índices clásicos para comparación
library(tidyverse) # Manipulación de datos y gráficos
library(knitr) # Tablas formateadas
library(ggpubr) # Gráficos adicionales
cat("iNEXT:", as.character(packageVersion("iNEXT")), "\n")## iNEXT: 3.0.1
## vegan: 2.6.10
Usamos dos conjuntos complementarios para ilustrar el análisis con números de Hill:
set.seed(2026)
# ── Peces arrecifales ─────────────────────────────────────────────────────────
especies_peces <- 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"
)
arrecife <- matrix(
c(22, 18, 15, 8, 25, 10, 6, 5, 4, 14, 9, 20, 12, 30, 3,
19, 20, 12, 6, 22, 8, 5, 4, 3, 12, 7, 18, 10, 28, 2,
8, 5, 3, 1, 10, 2, 1, 0, 0, 4, 2, 7, 3, 45, 0,
6, 4, 2, 1, 8, 1, 1, 0, 0, 3, 1, 5, 2, 48, 0),
nrow = 4, byrow = TRUE,
dimnames = list(
c("Tayrona_1", "Tayrona_2", "Vela_1", "Vela_2"),
especies_peces
)
)
# ── Macroinvertebrados de manglar ─────────────────────────────────────────────
manglar <- matrix(
c(161, 3, 44, 55, 0, 212, 4, 27, 48,
357, 0, 0, 185, 2, 22, 0, 30, 767),
nrow = 2, byrow = TRUE,
dimnames = list(
c("Lluvias", "Seca"),
c("Aratus_pisonii", "Callinectes_bocourti",
"Cardisoma_guanhumi", "Goniopsis_cruentata",
"Marisa_cornuarietis", "Minuca_vocator",
"Polymesoda_arctata", "Pomacea_maculata",
"Vitta_virginea")
)
)
cat("Peces arrecifales: ", nrow(arrecife), "sitios ×", ncol(arrecife), "especies\n")## Peces arrecifales: 4 sitios × 15 especies
## Manglar: 2 estaciones × 9 especies
Antes de usar iNEXT, calculamos los números de Hill paso
a paso para comprender la fórmula y ver cómo se relacionan con los
índices clásicos.
# Función para calcular los tres números de Hill
numeros_hill <- function(x) {
x <- x[x > 0]
p <- x / sum(x)
S <- length(p)
q0 <- S # Riqueza
q1 <- exp(-sum(p * log(p))) # exp(Shannon)
q2 <- 1 / sum(p^2) # 1/Simpson
c(q0 = q0, q1 = round(q1, 3), q2 = round(q2, 3))
}
# Calcular para todos los sitios de arrecife
hill_arrecife <- t(apply(arrecife, 1, numeros_hill))
# Comparar con índices clásicos
clasicos <- data.frame(
Sitio = rownames(arrecife),
Zona = c("Protegida","Protegida","No protegida","No protegida"),
S = specnumber(arrecife),
H_prima = round(diversity(arrecife, index = "shannon"), 3),
D_inv = round(diversity(arrecife, index = "invsimpson"), 2),
q0D = hill_arrecife[,"q0"],
q1D = hill_arrecife[,"q1"],
q2D = hill_arrecife[,"q2"]
)
kable(clasicos,
col.names = c("Sitio", "Zona", "S", "H'", "1/D",
"⁰D (q=0)", "¹D (q=1)", "²D (q=2)"),
caption = "Índices clásicos vs. Números de Hill — peces arrecifales",
align = "c")| Sitio | Zona | S | H’ | 1/D | ⁰D (q=0) | ¹D (q=1) | ²D (q=2) | |
|---|---|---|---|---|---|---|---|---|
| Tayrona_1 | Tayrona_1 | Protegida | 15 | 2.533 | 11.13 | 15 | 12.586 | 11.133 |
| Tayrona_2 | Tayrona_2 | Protegida | 15 | 2.494 | 10.52 | 15 | 12.104 | 10.522 |
| Vela_1 | Vela_1 | No protegida | 12 | 1.791 | 3.59 | 12 | 5.993 | 3.590 |
| Vela_2 | Vela_2 | No protegida | 12 | 1.567 | 2.73 | 12 | 4.792 | 2.727 |
## ══════════════════════════════════════════════════════
## VERIFICACIÓN: Relación entre índices y números de Hill
## ══════════════════════════════════════════════════════
## Sitio: Tayrona_1
## S = 15 → ⁰D = 15 (idénticos)
cat(sprintf(" e^H' = %.3f → ¹D = %.3f (idénticos)\n",
exp(diversity(x, "shannon")), numeros_hill(x)["q1"]))## e^H' = 12.586 → ¹D = 12.586 (idénticos)
cat(sprintf(" 1/D = %.3f → ²D = %.3f (idénticos)\n",
diversity(x, "invsimpson"), numeros_hill(x)["q2"]))## 1/D = 11.133 → ²D = 11.133 (idénticos)
💡 La gran ventaja comparativa: si Tayrona_1 tiene \(^1D = 10.2\) y Vela_1 tiene \(^1D = 5.1\), podemos afirmar que Tayrona_1 es exactamente el doble de diverso en términos de especies comunes. Con H’ = 2.32 vs. H’ = 1.63 esta comparación proporcional no es posible.
El perfil de diversidad grafica \(^qD\) para un rango continuo de valores de q, mostrando cómo varía la diversidad según se le dé más o menos peso a las especies dominantes.
# Calcular perfiles para q de 0 a 3
q_seq <- seq(0, 3, by = 0.1)
colores_sitio <- c(
"Tayrona_1" = "#1F6E8C", "Tayrona_2" = "#2E86AB",
"Vela_1" = "#C0415A", "Vela_2" = "#E07B54"
)
perfil_data <- purrr::map_dfr(rownames(arrecife), function(s) {
x <- arrecife[s, ]
x <- x[x > 0]
p <- x / sum(x)
purrr::map_dfr(q_seq, function(q) {
if (abs(q - 1) < 1e-6) {
qD <- exp(-sum(p * log(p)))
} else {
qD <- sum(p^q)^(1/(1-q))
}
tibble(sitio = s, q = q, qD = qD,
zona = ifelse(grepl("Tayrona", s), "Protegida", "No protegida"))
})
})
ggplot(perfil_data, aes(x = q, y = qD, color = sitio, linetype = zona)) +
geom_line(linewidth = 1.1) +
geom_vline(xintercept = c(0, 1, 2), linetype = "dotted",
color = "gray60", linewidth = 0.5) +
annotate("text", x = c(0, 1, 2), y = max(perfil_data$qD) * 0.98,
label = c("q=0\nRiqueza", "q=1\n≈Shannon", "q=2\n≈Simpson"),
size = 3, hjust = -0.1, color = "gray40") +
scale_color_manual(values = colores_sitio) +
scale_linetype_manual(values = c("Protegida" = "solid",
"No protegida" = "dashed")) +
labs(
title = "Perfil de Diversidad — Peces Arrecifales del Caribe Colombiano",
subtitle = "⁰D = Riqueza | ¹D ≈ Shannon | ²D ≈ Simpson",
x = "Orden de diversidad (q)",
y = "Número efectivo de especies (ᵍD)",
color = "Sitio",
linetype = "Zona"
) +
theme_classic(base_size = 13) +
theme(legend.position = "right")Perfil de diversidad para los cuatro sitios de arrecife. Cuando las curvas no se cruzan, el orden de diversidad es consistente para todos los valores de q.
🔍 ¿Qué buscar en el perfil?
- Curvas que no se cruzan → el orden de diversidad es consistente independientemente del valor de q: un sitio es siempre más diverso.
- Curvas que se cruzan → la conclusión sobre cuál sitio es más diverso depende del orden q elegido (y de cuánto peso se le da a las especies raras vs. dominantes).
📊 Interpretación — Perfil de Diversidad (Peces Arrecifales)
El perfil de diversidad muestra cómo cambia el número efectivo de especies (\(^qD\)) para cada sitio a medida que aumenta el orden \(q\), es decir, a medida que se le da más peso a las especies dominantes y menos a las raras.
Sitios de Tayrona (zona protegida): presentan las curvas más altas a lo largo de todo el rango de \(q\), lo que indica una mayor riqueza (\(^0D\)) y también una mayor diversidad efectiva considerando la equitatividad (\(^1D\) y \(^2D\)). La pendiente relativamente suave de sus curvas sugiere que la abundancia está distribuida de manera más equitativa entre las especies: la protección del área parece favorecer comunidades más balanceadas.
Sitios de Vela (zona no protegida): aunque su riqueza observada (\(^0D\), en \(q = 0\)) no es drásticamente inferior, la caída pronunciada de sus curvas al aumentar \(q\) revela que pocas especies concentran la mayoría de los individuos. Esto se debe a la fuerte dominancia de Abudefduf saxatilis en ambos sitios, típica de arrecifes perturbados donde los generalistas desplazan a las especies más especializadas.
Ausencia de cruce de curvas: el hecho de que las curvas de Tayrona permanezcan siempre por encima de las de Vela, para todos los valores de \(q\), es un resultado robusto: la mayor diversidad de los sitios protegidos es consistente independientemente del criterio (riqueza, equitatividad o dominancia) que se utilice para evaluarla.
💡 Mensaje ecológico clave: en los sitios protegidos, la diversidad no solo es mayor en número de especies, sino que la comunidad es más equitativa. La protección efectiva del arrecife parece mantener no solo más especies sino una distribución más justa de los individuos entre ellas.
iNEXTEl paquete iNEXT (INterpolation and EXTrapolation)
implementa los números de Hill combinados con técnicas de remuestreo
para:
Esto permite comparar comunidades con diferente esfuerzo de muestreo de forma rigurosa y con medidas de incertidumbre.
iNEXT recibe una lista donde cada
elemento es el vector de abundancias (solo valores > 0) de cada
sitio.
# Convertir matriz a lista para iNEXT
# iNEXT solo necesita las abundancias positivas de cada comunidad
lista_arrecife <- lapply(rownames(arrecife), function(s) {
x <- arrecife[s, ]
as.integer(x[x > 0])
})
names(lista_arrecife) <- rownames(arrecife)
# Verificar
cat("Estructura de la lista para iNEXT:\n")## Estructura de la lista para iNEXT:
for (s in names(lista_arrecife)) {
cat(sprintf(" %-12s → %d especies, %d individuos\n",
s, length(lista_arrecife[[s]]), sum(lista_arrecife[[s]])))
}## Tayrona_1 → 15 especies, 201 individuos
## Tayrona_2 → 15 especies, 176 individuos
## Vela_1 → 12 especies, 91 individuos
## Vela_2 → 12 especies, 82 individuos
# Calcular curvas para q = 0, 1 y 2
# endpoint = hasta el doble del tamaño máximo de muestra (extrapolación)
resultado <- iNEXT(
lista_arrecife,
q = c(0, 1, 2),
datatype = "abundance",
endpoint = max(rowSums(arrecife)) * 2,
nboot = 50 # reducido para velocidad; usar 200+ en análisis finales
)
cat("Cálculo completado.\n")## Cálculo completado.
## Sitios analizados: 2
# Extraer estimaciones asintóticas (diversidad máxima estimada)
asint <- resultado$AsyEst
# Redondear columnas numéricas individualmente
asint_tabla <- asint[, c("Assemblage", "Diversity", "Observed",
"Estimator", "s.e.", "LCL", "UCL")]
asint_tabla$Observed <- round(asint_tabla$Observed, 3)
asint_tabla$Estimator <- round(asint_tabla$Estimator, 3)
asint_tabla$s.e. <- round(asint_tabla$s.e., 3)
asint_tabla$LCL <- round(asint_tabla$LCL, 3)
asint_tabla$UCL <- round(asint_tabla$UCL, 3)
kable(asint_tabla,
col.names = c("Sitio", "Orden q", "Observado",
"Estimado asint.", "Error est.", "LC inf.", "LC sup."),
caption = "Estimaciones asintóticas de números de Hill por sitio",
align = "c",
row.names = FALSE)| Sitio | Orden q | Observado | Estimado asint. | Error est. | LC inf. | LC sup. |
|---|---|---|---|---|---|---|
| Tayrona_1 | Species richness | 15.000 | 15.000 | 0.212 | 15.000 | 15.415 |
| Tayrona_1 | Shannon diversity | 12.586 | 13.041 | 0.538 | 11.987 | 14.096 |
| Tayrona_1 | Simpson diversity | 11.133 | 11.727 | 0.787 | 10.185 | 13.269 |
| Tayrona_2 | Species richness | 15.000 | 15.000 | 0.668 | 15.000 | 16.309 |
| Tayrona_2 | Shannon diversity | 12.104 | 12.609 | 0.607 | 11.419 | 13.799 |
| Tayrona_2 | Simpson diversity | 10.522 | 11.127 | 0.749 | 9.660 | 12.594 |
| Vela_1 | Species richness | 12.000 | 12.989 | 2.893 | 12.000 | 18.660 |
| Vela_1 | Shannon diversity | 5.993 | 6.443 | 0.751 | 4.971 | 7.914 |
| Vela_1 | Simpson diversity | 3.590 | 3.696 | 0.581 | 2.557 | 4.835 |
| Vela_2 | Species richness | 12.000 | 15.951 | 7.494 | 12.000 | 30.640 |
| Vela_2 | Shannon diversity | 4.792 | 5.306 | 0.912 | 3.518 | 7.093 |
| Vela_2 | Simpson diversity | 2.727 | 2.786 | 0.508 | 1.791 | 3.782 |
ggiNEXT(resultado,
type = 1, # curva por tamaño de muestra
se = TRUE, # mostrar IC 95%
facet.var = "Order.q") +
scale_color_manual(
values = c("Tayrona_1" = "#1F6E8C", "Tayrona_2" = "#2E86AB",
"Vela_1" = "#C0415A", "Vela_2" = "#E07B54")
) +
scale_fill_manual(
values = c("Tayrona_1" = "#1F6E8C", "Tayrona_2" = "#2E86AB",
"Vela_1" = "#C0415A", "Vela_2" = "#E07B54")
) +
labs(
title = "Curvas de Rarefacción/Extrapolación — Peces Arrecifales",
subtitle = "Caribe colombiano | Línea continua = interpolación | Punteada = extrapolación",
x = "Número de individuos muestreados",
y = "Número efectivo de especies (ᵍD)",
color = "Sitio",
fill = "Sitio"
) +
theme_bw(base_size = 12) +
theme(
legend.position = "bottom",
strip.background = element_rect(fill = "#2C3E50"),
strip.text = element_text(color = "white", face = "bold", size = 11)
)Curvas de rarefacción (línea continua) e interpolación/extrapolación (línea punteada) para los tres órdenes de diversidad. La zona sombreada es el intervalo de confianza al 95%.
📊 Interpretación — Curvas de Rarefacción/Extrapolación por Tamaño de Muestra
Cada panel corresponde a un orden de diversidad (\(q = 0\), \(q = 1\), \(q = 2\)). La línea continua representa la interpolación (rarefacción: ¿cuánta diversidad habría con menos individuos?), mientras que la línea punteada extiende la curva hacia la extrapolación (¿cuánta diversidad se esperaría con más individuos?). La zona sombreada es el intervalo de confianza al 95%.
Panel q = 0 (Riqueza): las curvas de Tayrona alcanzan un plateau (meseta) más alto, indicando mayor riqueza esperada incluso si se aumentara el esfuerzo de muestreo. Las curvas de Vela suben más lentamente pero con una tendencia a estabilizarse también, lo que sugiere que la riqueza total no difiere tan drásticamente entre zonas como sí lo hace la equitatividad.
Panel q = 1 (≈ Shannon): la separación entre sitios protegidos y no protegidos se hace más evidente. Las curvas de Vela quedan claramente por debajo, revelando que la diversidad efectiva de especies comunes es considerablemente menor, incluso estandarizando por el número de individuos.
Panel q = 2 (≈ Simpson): la diferencia más marcada entre zonas aparece aquí. Los sitios de Vela muestran valores muy bajos de \(^2D\), confirmando la alta dominancia de pocas especies. En contraste, los sitios de Tayrona mantienen una diversidad efectiva sustancialmente mayor incluso a este nivel de análisis.
⚠️ Precaución al comparar: los sitios de Tayrona tienen aproximadamente el doble de individuos que los de Vela, lo que hace que la comparación directa de las curvas al mismo valor del eje \(x\) no sea del todo justa. Para una comparación más rigurosa, se deben usar las curvas por cobertura muestral (sección siguiente).
La cobertura muestral (sample coverage) es una medida de qué fracción de la diversidad total ha sido registrada. Comparar sitios a igual cobertura es más riguroso que igualar el número de individuos.
ggiNEXT(resultado,
type = 3, # curva por cobertura
se = TRUE,
facet.var = "Order.q") +
scale_color_manual(
values = c("Tayrona_1" = "#1F6E8C", "Tayrona_2" = "#2E86AB",
"Vela_1" = "#C0415A", "Vela_2" = "#E07B54")
) +
scale_fill_manual(
values = c("Tayrona_1" = "#1F6E8C", "Tayrona_2" = "#2E86AB",
"Vela_1" = "#C0415A", "Vela_2" = "#E07B54")
) +
labs(
title = "Diversidad por Cobertura Muestral — Peces Arrecifales",
subtitle = "Comparación estandarizada por cobertura | IC 95%",
x = "Cobertura muestral",
y = "Número efectivo de especies (ᵍD)",
color = "Sitio",
fill = "Sitio"
) +
theme_bw(base_size = 12) +
theme(
legend.position = "bottom",
strip.background = element_rect(fill = "#2C3E50"),
strip.text = element_text(color = "white", face = "bold", size = 11)
)Curvas de rarefacción por cobertura muestral. Comparar sitios a igual cobertura elimina el sesgo del esfuerzo de muestreo.
📊 Interpretación — Diversidad por Cobertura Muestral (Peces Arrecifales)
Al graficar la diversidad en función de la cobertura muestral (fracción de la diversidad total que ha sido registrada, de 0 a 1), se eliminan las diferencias debidas al distinto esfuerzo de muestreo entre sitios. Esta es la comparación más justa y recomendada cuando los sitios tienen diferente número de individuos.
A igual cobertura (e.g., SC = 0.90), los sitios de Tayrona presentan consistentemente mayor número efectivo de especies para los tres órdenes de diversidad. Esto confirma que la diferencia observada no es un artefacto del mayor esfuerzo de muestreo en la zona protegida, sino una diferencia real en la estructura de las comunidades.
Los sitios de Vela alcanzan coberturas altas con relativamente pocos individuos, lo cual es esperable cuando la comunidad está dominada por pocas especies muy abundantes: una vez que se muestrea la especie dominante (Abudefduf saxatilis), ya se “conoce” una fracción grande de la comunidad.
Las bandas de confianza (IC 95%) de Tayrona y Vela no se solapan prácticamente en ningún valor de cobertura para \(q = 1\) y \(q = 2\), lo que indica que las diferencias son estadísticamente robustas.
💡 Regla práctica: use siempre las curvas de cobertura para comparaciones entre sitios con diferente esfuerzo de muestreo. Las curvas por tamaño de muestra son útiles para evaluar si un sitio individual está bien muestreado, pero no para comparar sitios entre sí cuando el esfuerzo difiere.
ggiNEXT(resultado,
type = 2, # perfil por orden q
se = TRUE,
facet.var = "Assemblage") +
scale_color_manual(
values = c("0" = "#2C3E50", "1" = "#2E86AB", "2" = "#E84855")
) +
scale_fill_manual(
values = c("0" = "#2C3E50", "1" = "#2E86AB", "2" = "#E84855")
) +
labs(
title = "Perfil de Diversidad por Orden q",
subtitle = "q=0: Riqueza | q=1: ≈Shannon | q=2: ≈Simpson",
x = "Orden de diversidad (q)",
y = "Número efectivo de especies (ᵍD)",
color = "Orden q",
fill = "Orden q"
) +
theme_bw(base_size = 12) +
theme(
legend.position = "bottom",
strip.background = element_rect(fill = "#2C3E50"),
strip.text = element_text(color = "white", face = "bold", size = 10)
)Perfil de diversidad por orden q para cada sitio. Sitios cuyas curvas no se cruzan son consistentemente más diversos.
📊 Interpretación — Perfil de Diversidad por Orden q (iNEXT, por sitio)
Esta gráfica muestra para cada sitio cómo varía el número efectivo de especies (\(^qD\)) a medida que aumenta el orden \(q\), ahora con los intervalos de confianza calculados por bootstrap. Cada panel corresponde a un sitio; dentro de cada panel, las tres curvas de color representan los tres órdenes de diversidad (\(q = 0\), \(q = 1\), \(q = 2\)).
Tayrona_1 y Tayrona_2: las tres líneas dentro de cada panel caen de forma gradual y relativamente poco pronunciada a medida que \(q\) aumenta. Esto indica una distribución de abundancias más equitativa: \(^0D\) y \(^2D\) están relativamente cerca, señal de que no hay especies que dominen de forma aplastante. El amplio solapamiento de los intervalos de confianza entre los dos sitios de Tayrona sugiere que su diversidad es similar entre sí.
Vela_1 y Vela_2: la caída de las curvas es mucho más abrupta. La gran distancia entre \(^0D\) (en el extremo izquierdo) y \(^2D\) (en el derecho) evidencia la fuerte dominancia de Abudefduf saxatilis: hay varias especies presentes (riqueza moderada), pero la comunidad está lejos de ser equitativa. Esto es un patrón típico de arrecifes bajo presión antropogénica, donde los generalistas oportunistas desplazan a las especies más sensibles y especializadas.
Intervalos de confianza: los IC son más amplios en los sitios con menor número de individuos (Vela), lo que refleja mayor incertidumbre en las estimaciones. En Tayrona, los intervalos más estrechos indican mayor precisión estadística gracias al mayor esfuerzo de muestreo.
💡 Regla de oro: si en un sitio \(^0D \gg ^2D\), la comunidad está dominada por pocas especies y la equitatividad es baja. Si \(^0D \approx ^2D\), la comunidad es más homogénea. Los perfiles de Vela ilustran claramente el primer caso: son comunidades estructuralmente empobrecidas a pesar de su riqueza observable.
Aplicamos el mismo análisis a los datos de macroinvertebrados del manglar (lluvias vs. seca) que ya conocen del taller grupal.
lista_manglar <- lapply(rownames(manglar), function(e) {
x <- manglar[e, ]
as.integer(x[x > 0])
})
names(lista_manglar) <- rownames(manglar)
resultado_manglar <- iNEXT(
lista_manglar,
q = c(0, 1, 2),
datatype = "abundance",
endpoint = max(rowSums(manglar)) * 2,
nboot = 50
)# Estimaciones asintóticas para manglar
asint_m <- resultado_manglar$AsyEst
asint_m_tabla <- asint_m[, c("Assemblage", "Diversity",
"Observed", "Estimator", "s.e.")]
asint_m_tabla$Observed <- round(asint_m_tabla$Observed, 3)
asint_m_tabla$Estimator <- round(asint_m_tabla$Estimator, 3)
asint_m_tabla$s.e. <- round(asint_m_tabla$s.e., 3)
kable(asint_m_tabla,
col.names = c("Estación", "Orden q", "Observado",
"Estimado asint.", "Error est."),
caption = "Números de Hill — macroinvertebrados de manglar",
align = "c",
row.names = FALSE)| Estación | Orden q | Observado | Estimado asint. | Error est. |
|---|---|---|---|---|
| Lluvias | Species richness | 8.000 | 8.000 | 0.331 |
| Lluvias | Shannon diversity | 4.856 | 4.887 | 0.174 |
| Lluvias | Simpson diversity | 3.891 | 3.911 | 0.176 |
| Seca | Species richness | 6.000 | 6.000 | 0.423 |
| Seca | Shannon diversity | 3.021 | 3.027 | 0.061 |
| Seca | Simpson diversity | 2.473 | 2.475 | 0.057 |
ggiNEXT(resultado_manglar,
type = 1,
se = TRUE,
facet.var = "Order.q") +
scale_color_manual(values = c("Lluvias" = "#4E9BB9",
"Seca" = "#E07B54")) +
scale_fill_manual(values = c("Lluvias" = "#4E9BB9",
"Seca" = "#E07B54")) +
labs(
title = "Números de Hill — Macroinvertebrados de Manglar",
subtitle = "Estación de lluvias vs. seca | Caribe colombiano",
x = "Número de individuos muestreados",
y = "Número efectivo de especies (ᵍD)",
color = "Estación",
fill = "Estación"
) +
theme_bw(base_size = 12) +
theme(
legend.position = "bottom",
strip.background = element_rect(fill = "#2C3E50"),
strip.text = element_text(color = "white", face = "bold", size = 11)
)Curvas de rarefacción/extrapolación para macroinvertebrados de manglar en dos estaciones climáticas.
📊 Interpretación — Curvas de Rarefacción/Extrapolación (Macroinvertebrados de Manglar)
Esta gráfica compara la diversidad de macroinvertebrados entre la estación de lluvias y la estación seca del manglar del Caribe colombiano, usando los tres órdenes de diversidad de Hill.
Panel q = 0 (Riqueza): ambas estaciones registran un número similar de especies (8 en lluvias, 7 en seca), y las curvas convergen rápidamente hacia una meseta. Sin embargo, durante la época de lluvias la riqueza efectiva es ligeramente mayor. La entrada de agua dulce y el aumento de materia orgánica disponible en la época húmeda puede favorecer la presencia de más taxones.
Panel q = 1 (≈ Shannon): aquí las diferencias entre estaciones se hacen más evidentes. La estación de lluvias presenta mayor diversidad efectiva de especies comunes, lo que indica que durante este período la comunidad es más equitativa: varias especies contribuyen de forma importante a la comunidad, no solo una o dos.
Panel q = 2 (≈ Simpson): la diferencia más marcada entre estaciones aparece en este panel. En la época seca, los valores de \(^2D\) son considerablemente bajos, revelando una dominancia extrema de Vitta virginea (767 individuos) sobre el resto. Esta especie de gasterópodo tolera bien las condiciones de mayor salinidad y estrés hídrico propias de la sequía, lo que le confiere una ventaja competitiva sobre las demás especies.
Tamaño muestral dispar: la estación seca tiene aproximadamente el doble de individuos (≈ 1363) que la de lluvias (≈ 554), lo que se refleja en que las curvas de seca se extienden más a la derecha. Para una comparación libre de este sesgo, se recomienda trabajar con las curvas de cobertura (type = 3 en
ggiNEXT), como se propone en el Ejercicio 2.💡 Conclusión ecológica: la estacionalidad climática en el Caribe colombiano produce cambios detectables en la estructura de las comunidades de macroinvertebrados del manglar. La época seca favorece la dominancia de pocas especies tolerantes al estrés, reduciendo la equitatividad, mientras que la época lluviosa sostiene comunidades más diversas y balanceadas. Los números de Hill, al capturar simultáneamente riqueza y equitatividad, detectan este patrón con mayor sensibilidad que los índices clásicos.
# Construir tabla comparativa completa para peces arrecifales
hill_todos <- t(apply(arrecife, 1, function(x) {
x <- x[x > 0]; p <- x / sum(x)
c(
q0 = length(p),
q1 = round(exp(-sum(p * log(p))), 2),
q2 = round(1 / sum(p^2), 2)
)
}))
tabla_int <- data.frame(
Sitio = rownames(arrecife),
Zona = c("Protegida","Protegida","No protegida","No protegida"),
S = specnumber(arrecife),
H = round(diversity(arrecife, "shannon"), 3),
InvD = round(diversity(arrecife, "invsimpson"), 2),
J = round(diversity(arrecife,"shannon") / log(specnumber(arrecife)), 3),
q0D = hill_todos[,"q0"],
q1D = hill_todos[,"q1"],
q2D = hill_todos[,"q2"]
)
kable(tabla_int,
col.names = c("Sitio", "Zona", "S", "H'", "1/D", "J'",
"⁰D", "¹D", "²D"),
caption = "Comparación integral: índices clásicos y números de Hill",
align = "c")| Sitio | Zona | S | H’ | 1/D | J’ | ⁰D | ¹D | ²D | |
|---|---|---|---|---|---|---|---|---|---|
| Tayrona_1 | Tayrona_1 | Protegida | 15 | 2.533 | 11.13 | 0.935 | 15 | 12.59 | 11.13 |
| Tayrona_2 | Tayrona_2 | Protegida | 15 | 2.494 | 10.52 | 0.921 | 15 | 12.10 | 10.52 |
| Vela_1 | Vela_1 | No protegida | 12 | 1.791 | 3.59 | 0.721 | 12 | 5.99 | 3.59 |
| Vela_2 | Vela_2 | No protegida | 12 | 1.567 | 2.73 | 0.631 | 12 | 4.79 | 2.73 |
Nota de interpretación: observe que S = \(^0D\), e^H’ = \(^1D\) y 1/D = \(^2D\). Los números de Hill unifican los tres índices en una misma escala y permiten comparaciones proporcionales directas.
La completitud muestral (cobertura) indica qué
fracción de la diversidad real ha sido registrada. iNEXT la
calcula automáticamente.
# Extraer datos de cobertura del objeto iNEXT
cobertura <- resultado$iNextEst |>
purrr::map_dfr(function(df) df, .id = "sitio") |>
filter(Method == "Observed") |>
select(sitio, m, SC, qD, qD.LCL, qD.UCL, Order.q)
cobertura_obs <- cobertura |>
filter(Order.q == 0) |>
select(sitio, m, SC) |>
mutate(
SC_pct = paste0(round(SC * 100, 1), " %"),
zona = ifelse(grepl("Tayrona", sitio), "Protegida", "No protegida")
)
kable(cobertura_obs,
col.names = c("Sitio", "N individuos", "Cobertura",
"Cobertura (%)", "Zona"),
caption = "Cobertura muestral observada por sitio",
align = "c")| Sitio | N individuos | Cobertura | Cobertura (%) | Zona |
|---|---|---|---|---|
| size_based | 201 | 1.0000000 | 100 % | No protegida |
| size_based | 176 | 1.0000000 | 100 % | No protegida |
| size_based | 91 | 0.9784998 | 97.8 % | No protegida |
| size_based | 82 | 0.9518144 | 95.2 % | No protegida |
| coverage_based | 201 | 1.0000000 | 100 % | No protegida |
| coverage_based | 176 | 1.0000000 | 100 % | No protegida |
| coverage_based | 91 | 0.9784998 | 97.8 % | No protegida |
| coverage_based | 82 | 0.9518144 | 95.2 % | No protegida |
## ══════════════════════════════════════════════════════
## EVALUACIÓN DE LA COBERTURA MUESTRAL
## ══════════════════════════════════════════════════════
for (i in seq_len(nrow(cobertura_obs))) {
s <- cobertura_obs$sitio[i]
sc <- cobertura_obs$SC[i]
cat(sprintf(" %-12s SC = %.1f %% → ", s, sc * 100))
if (sc >= 0.90) {
cat("Muestreo suficiente ✓\n")
} else if (sc >= 0.75) {
cat("Muestreo aceptable — considerar esfuerzo adicional\n")
} else {
cat("Muestreo insuficiente ⚠ — incrementar esfuerzo\n")
}
}## size_based SC = 100.0 % → Muestreo suficiente ✓
## size_based SC = 100.0 % → Muestreo suficiente ✓
## size_based SC = 97.8 % → Muestreo suficiente ✓
## size_based SC = 95.2 % → Muestreo suficiente ✓
## coverage_based SC = 100.0 % → Muestreo suficiente ✓
## coverage_based SC = 100.0 % → Muestreo suficiente ✓
## coverage_based SC = 97.8 % → Muestreo suficiente ✓
## coverage_based SC = 95.2 % → Muestreo suficiente ✓
## ══════════════════════════════════════════════════════
Reporten siempre los tres órdenes (\(^0D\), \(^1D\), \(^2D\)). Cada uno captura una faceta distinta de la diversidad y los tres juntos ofrecen una imagen completa de la comunidad.
Verifiquen la cobertura muestral antes de comparar sitios. Si la cobertura es inferior al 80%, los estimados asintóticos serán imprecisos.
Usen las curvas de cobertura (tipo 3 en
ggiNEXT) para comparaciones entre sitios con diferente
esfuerzo — son más robustas que las curvas por tamaño de
muestra.
Si las curvas se cruzan en el perfil de diversidad, su conclusión sobre cuál comunidad es más diversa depende de qué orden q prioricen, y deben justificar esa elección ecológicamente.
En ecosistemas marinos del Caribe, los valores de \(^2D\) muy bajos respecto a \(^0D\) (curvas con pendiente pronunciada en el perfil) suelen indicar perturbación: pocas especies dominan porque las condiciones favorecen a los generalistas o a las especies resistentes al estrés.
Calculen manualmente \(^0D\), \(^1D\) y \(^2D\) para la estación de seca del manglar usando la fórmula directamente, sin funciones auxiliares.
# ── COMPLETEN: extraigan las abundancias de la estación seca ──────────────────
x_seca <- as.numeric(manglar["ESTACION", ])
x_seca <- x_seca[x_seca > 0] # eliminar ceros
# ── COMPLETEN: calculen las proporciones ──────────────────────────────────────
p_seca <- x_seca / sum(VECTOR)
# ── COMPLETEN: calculen los tres números de Hill ──────────────────────────────
q0 <- length(p_seca) # Riqueza
q1 <- exp(-sum(VECTOR * log(VECTOR))) # ≈ Shannon
q2 <- 1 / sum(VECTOR^2) # ≈ Simpson
cat("⁰D (q=0):", q0, "→ número de especies\n")
cat("¹D (q=1):", round(q1, 3), "→ especies efectivas comunes\n")
cat("²D (q=2):", round(q2, 3), "→ especies efectivas dominantes\n")
# ── COMPLETEN: interpreten la diferencia entre q0 y q2 ───────────────────────
# ¿Qué indica que q0 sea mucho mayor que q2 en la estación seca?Con los datos de manglar ya cargados, construyan e interpreten las curvas de cobertura para las dos estaciones.
# ── COMPLETEN: construyan las curvas de cobertura (type = 3) ─────────────────
ggiNEXT(resultado_manglar,
type = NUMERO_TIPO, # ¿qué tipo corresponde a cobertura?
se = TRUE,
facet.var = "Order.q") +
scale_color_manual(values = c("Lluvias" = "#4E9BB9",
"Seca" = "#E07B54")) +
scale_fill_manual(values = c("Lluvias" = "#4E9BB9",
"Seca" = "#E07B54")) +
labs(
title = "TITULO DEL GRAFICO",
x = "Cobertura muestral",
y = "Número efectivo de especies (ᵍD)"
) +
theme_bw(base_size = 12)Interpretación: ¿A igual cobertura muestral, qué estación presenta mayor diversidad para cada orden q? ¿Coincide con lo que calcularon en el taller grupal usando índices clásicos?
Construyan el perfil de diversidad (tipo 2 de ggiNEXT)
para el manglar y respondan: ¿las curvas de lluvias y seca se cruzan? Si
es así, ¿qué implica eso para la comparación de diversidad entre
estaciones?
# ── COMPLETEN: perfil de diversidad por orden q ──────────────────────────────
ggiNEXT(resultado_manglar,
type = NUMERO_TIPO, # tipo para perfil por orden q
se = TRUE,
facet.var = "Assemblage") +
labs(
title = "TITULO DEL GRAFICO",
x = "Orden de diversidad (q)",
y = "Número efectivo de especies (ᵍD)"
) +
theme_bw(base_size = 12)Recursos en línea: