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

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


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

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

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.

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

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.

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


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.

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


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