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.


1 Introducción

1.1 ¿Por qué los índices clásicos son insuficientes?

En la Parte 4 aprendimos a calcular riqueza (S), Shannon (H’), Simpson (D) y Pielou (J’). Aunque útiles, estos índices tienen dos limitaciones importantes:

  1. 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.

  2. 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.

1.2 La solución: Números de Hill

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:

  • Intuitivos: siempre en unidades de “número de especies”
  • Comparables: si sitio A tiene \(^1D = 20\) y sitio B tiene \(^1D = 10\), A es exactamente el doble de diverso
  • Unificados: una sola fórmula abarca riqueza, Shannon y Simpson

\[^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.

1.3 Los tres órdenes principales

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.


2 Instalación y Carga de Paquetes

# 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
cat("vegan:", as.character(packageVersion("vegan")), "\n")
## vegan: 2.6.10

3 Datos: Comunidades Marinas del Caribe Colombiano

3.1 Conjunto de datos

Usamos dos conjuntos complementarios para ilustrar el análisis con números de Hill:

  • Peces arrecifales en cuatro sitios (dos protegidos / dos no protegidos)
  • Macroinvertebrados de manglar en dos estaciones (lluvias / seca)
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
cat("Manglar:           ", nrow(manglar),  "estaciones ×", ncol(manglar), "especies\n")
## Manglar:            2 estaciones × 9 especies

4 Cálculo Manual de Números de Hill

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")
Índices clásicos vs. Números de Hill — peces arrecifales
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
cat("══════════════════════════════════════════════════════\n")
## ══════════════════════════════════════════════════════
cat("  VERIFICACIÓN: Relación entre índices y números de Hill\n")
##   VERIFICACIÓN: Relación entre índices y números de Hill
cat("══════════════════════════════════════════════════════\n\n")
## ══════════════════════════════════════════════════════
s <- "Tayrona_1"
x <- arrecife[s,]
cat(sprintf("  Sitio: %s\n\n", s))
##   Sitio: Tayrona_1
cat(sprintf("  S     = %d          →  ⁰D = %d (idénticos)\n",
            specnumber(x), numeros_hill(x)["q0"]))
##   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.


5 Perfil de Diversidad

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.

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).

6 Curvas de Rarefacción e Interpolación con iNEXT

6.1 ¿Qué hace iNEXT?

El paquete iNEXT (INterpolation and EXTrapolation) implementa los números de Hill combinados con técnicas de remuestreo para:

  • Interpolar (rarefacción): estimar la diversidad con un esfuerzo menor al observado.
  • Extrapolación: proyectar la diversidad esperada con un esfuerzo mayor al observado.
  • Calcular intervalos de confianza al 95% mediante bootstrap.

Esto permite comparar comunidades con diferente esfuerzo de muestreo de forma rigurosa y con medidas de incertidumbre.

6.2 Preparación de los datos para iNEXT

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

6.3 Calcular curvas con iNEXT

# 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.
cat("Sitios analizados:", length(resultado$iNextEst), "\n")
## Sitios analizados: 2

6.4 Estimaciones asintóticas

# 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)
Estimaciones asintóticas de números de Hill por sitio
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

7 Visualizaciones con iNEXT

7.1 Curvas de rarefacción e interpolación por orden q

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%.

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%.

7.2 Curvas por cobertura muestral

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.

Curvas de rarefacción por cobertura muestral. Comparar sitios a igual cobertura elimina el sesgo del esfuerzo de muestreo.

7.3 Perfil de diversidad (por orden q)

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.

Perfil de diversidad por orden q para cada sitio. Sitios cuyas curvas no se cruzan son consistentemente más diversos.


8 Aplicación al Ecosistema de Manglar

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)
Números de Hill — macroinvertebrados de manglar
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.

Curvas de rarefacción/extrapolación para macroinvertebrados de manglar en dos estaciones climáticas.


9 Tabla Integradora: Índices Clásicos vs. Números de Hill

# 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")
Comparación integral: índices clásicos y números de Hill
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.


10 Completitud del Muestreo

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")
Cobertura muestral observada por sitio
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
cat("══════════════════════════════════════════════════════\n")
## ══════════════════════════════════════════════════════
cat("  EVALUACIÓN DE LA COBERTURA MUESTRAL\n")
##   EVALUACIÓN DE LA COBERTURA MUESTRAL
cat("══════════════════════════════════════════════════════\n\n")
## ══════════════════════════════════════════════════════
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 ✓
cat("══════════════════════════════════════════════════════\n")
## ══════════════════════════════════════════════════════

11 Recomendaciones Prácticas

  1. 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.

  2. Verifiquen la cobertura muestral antes de comparar sitios. Si la cobertura es inferior al 80%, los estimados asintóticos serán imprecisos.

  3. 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.

  4. 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.

  5. 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.


12 Ejercicios Prácticos

12.1 Ejercicio 1 — Cálculo manual de números de Hill

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?

12.2 Ejercicio 2 — Análisis iNEXT completo para manglar

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?

12.3 Ejercicio 3 — Perfil de diversidad comparativo

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)


13 Bibliografía

  • Chao, A. et al. (2014). Rarefaction and extrapolation with Hill numbers. Ecological Monographs, 84(1), 45–67.
  • Hill, M. O. (1973). Diversity and evenness: A unifying notation and its consequences. Ecology, 54(2), 427–432.
  • Hsieh, T. C., Ma, K. H. & Chao, A. (2016). iNEXT: An R package for rarefaction and extrapolation of species diversity (Hill numbers). Methods in Ecology and Evolution, 7, 1451–1456.
  • Jost, L. (2006). Entropy and diversity. Oikos, 113(2), 363–375.

Recursos en línea:


Cristian Granados-Martínez PhD. — Programa de Biología, Universidad de La Guajira
Diplomado en Manejo de Ecosistemas Marinos Costeros del Caribe — 2026