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 Conceptos básicos

Antes de calcular cualquier índice, es importante tener claros los conceptos fundamentales sobre los cuales se construye el análisis de diversidad:

Especie: Grupo de organismos que se pueden reproducir entre sí y generar descendencia fértil.

Comunidad: Conjunto de diferentes especies que interactúan entre sí en un espacio y tiempo determinados. Por ejemplo, la comunidad de peces asociada a un arrecife de coral en el Caribe colombiano.

_
_

Muestreo: Método mediante el cual inferimos propiedades de una comunidad a partir de una porción de ella. En ecosistemas marinos costeros, puede realizarse mediante transectos en banda, censos visuales o redes de muestreo.

Esfuerzo de muestreo: Número de individuos registrados o el tiempo/área invertidos en obtener los datos. A mayor esfuerzo, mayor probabilidad de detectar especies raras.

_
_

Abundancia: Qué tan común o raro es encontrar una especie en una comunidad. Puede expresarse como número de individuos, densidad o cobertura.

Diversidad: Propiedad emergente de las comunidades que incorpora el grado de heterogeneidad en términos de especies, gremios funcionales, grupos taxonómicos, etc.

_
_

Interpolación: Modelar datos dentro del intervalo de muestreo observado.

Extrapolación: Modelar datos fuera del intervalo de muestreo observado (proyección más allá del esfuerzo real).

Rarefacción: Técnica estadística basada en remuestreo que permite comparar la diversidad de comunidades con diferente esfuerzo de muestreo, llevándolas a una base común.

1.2 Tipos de diversidad

_
_

No existe una única forma de medir biodiversidad. Las tres escalas más utilizadas son:

Escala Definición ¿Qué mide?
Diversidad α (alfa) Diversidad dentro de un sitio Riqueza e índices en cada punto de muestreo
Diversidad β (beta) Diversidad entre sitios Recambio de especies entre comunidades
Diversidad γ (gamma) Diversidad total del paisaje Riqueza en toda el área de estudio

En esta guía nos enfocamos en la diversidad alfa, que es la base de todo análisis de comunidades.

1.3 ¿Por qué medir la diversidad?

Medir la diversidad alfa en ecosistemas marinos costeros del Caribe permite:

  • Entender patrones de distribución de especies entre arrecifes, pastos marinos y manglares
  • Poner a prueba hipótesis sobre el efecto de perturbaciones (blanqueamiento, pesca, contaminación)
  • Establecer líneas base de biodiversidad para la gestión de áreas marinas protegidas
  • Identificar sitios prioritarios para conservación

1.4 ¿Qué es la diversidad alfa?

La diversidad alfa (α) mide la diversidad de especies dentro de un sitio o comunidad. Es la escala más básica y más utilizada en estudios de biodiversidad marina y costera.

Las tres escalas de diversidad se relacionan así:

Escala Pregunta que responde Ejemplo en ecosistemas del Caribe
Alfa (α) ¿Cuántas especies hay en este arrecife? Diversidad de peces en un transecto
Beta (β) ¿Cuánto cambia la comunidad entre arrecifes? Recambio entre Tayrona y Cabo de la Vela
Gamma (γ) ¿Cuántas especies hay en toda el área de estudio? Total de peces en el Caribe colombiano

En esta guía nos enfocamos exclusivamente en la diversidad alfa, empleando los índices clásicos más utilizados en ecología marina.

1.5 Componentes de la diversidad alfa

Todo índice de diversidad alfa resume, en distintas proporciones, dos componentes:

  • Riqueza: cuántas especies están presentes.
  • Equitabilidad: qué tan uniformes son las abundancias entre especies.

Una comunidad puede tener muchas especies pero con una especie dominando completamente (baja equitabilidad), o pocas especies con abundancias muy similares (alta equitabilidad). Los índices capturan estas diferencias de manera distinta.

1.6 Relevancia en ecosistemas marinos costeros

Medir la diversidad alfa en arrecifes de coral, pastos marinos y manglares del Caribe colombiano permite:

  • Comparar el estado de salud entre sitios perturbados y protegidos
  • Detectar los efectos del blanqueamiento, la pesca o la contaminación sobre las comunidades
  • Establecer líneas base previas a la implementación de áreas marinas protegidas
  • Monitorear la recuperación de ecosistemas intervenidos

2 Instalación y Carga de Paquetes

2.1 Instalación

# Ejecuten este bloque UNA SOLA VEZ
# Solo es necesario si aún no tienen instalados estos paquetes
install.packages(c("vegan",      # Análisis de diversidad ecológica
                   "tidyverse",  # Manipulación de datos y gráficos
                   "knitr",      # Tablas formateadas
                   "ggpubr",     # Gráficos con estadísticos
                   "corrplot"))  # Matrices de correlación

2.2 Carga de paquetes

# Ejecuten este bloque al inicio de cada sesión de trabajo
library(vegan)      # Funciones de diversidad: specnumber(), diversity(), rarecurve()
library(tidyverse)  # ggplot2, dplyr, tidyr
library(knitr)      # kable() para tablas
library(ggpubr)     # stat_cor(), ggqqplot()
library(corrplot)   # corrplot()

# Verificar que vegan cargó correctamente
cat("Paquete vegan cargado — versión:", as.character(packageVersion("vegan")), "\n")
## Paquete vegan cargado — versión: 2.6.10

3 Los Datos: Peces Arrecifales del Caribe Colombiano

3.1 Descripción del conjunto de datos

Trabajamos con datos simulados de censos visuales de peces realizados en ocho sitios de arrecife de coral del Caribe colombiano. Cuatro sitios se encuentran dentro de zonas protegidas (Parque Tayrona e Isla Aguja) y cuatro en zonas no protegidas (Punta Gallinas y Cabo de la Vela).

Cada fila de la matriz representa un sitio de muestreo y cada columna una especie. Los valores corresponden al número de individuos observados en un transecto de 25 m².

3.2 Crear la matriz de abundancias

set.seed(2026)

# ── Nombres de los sitios ─────────────────────────────────────────────────────
sitios <- c("Tayrona_1",   "Tayrona_2",
            "Aguja_1",     "Aguja_2",
            "Gallinas_1",  "Gallinas_2",
            "Vela_1",      "Vela_2")

# ── Especies de peces arrecifales del Caribe colombiano ──────────────────────
especies <- c(
  "Acanthurus_bahianus",     # Cirujano café
  "Sparisoma_viride",        # Loro verde
  "Haemulon_sciurus",        # Ronco macabi
  "Epinephelus_guttatus",    # Mero colorado
  "Stegastes_partitus",      # Damísela bicolor
  "Lutjanus_apodus",         # Pargo amarillo
  "Cephalopholis_cruentata", # Mero tomate
  "Holocanthus_tricolor",    # Ángel roca
  "Pomacanthus_paru",        # Ángel francés
  "Chaetodon_capistratus",   # Mariposa cuatro ojos
  "Bodianus_rufus",          # Vieja española
  "Thalassoma_bifasciatum",  # Señorita cabeza azul
  "Scarus_iserti",           # Loro rayado
  "Abudefduf_saxatilis",     # Sargento mayor
  "Gramma_loreto"            # Basslet real
)

# ── Matriz de abundancias ─────────────────────────────────────────────────────
# Sitios protegidos tienen mayor abundancia promedio
abundancias <- matrix(
  c(rpois(2 * length(especies), lambda = 22),  # Tayrona
    rpois(2 * length(especies), lambda = 18),  # Aguja
    rpois(2 * length(especies), lambda = 11),  # Gallinas
    rpois(2 * length(especies), lambda = 9)),  # Cabo de la Vela
  nrow  = length(sitios),
  ncol  = length(especies),
  byrow = TRUE,
  dimnames = list(sitios, especies)
)

# Introducir ceros (ausencias naturales — especies raras)
abundancias[abundancias < 4] <- 0

# Mostrar la matriz
kable(abundancias,
      caption = "Matriz de abundancias de peces arrecifales (ind./transecto de 25 m²)",
      align   = "c")
Matriz de abundancias de peces arrecifales (ind./transecto de 25 m²)
Acanthurus_bahianus Sparisoma_viride Haemulon_sciurus Epinephelus_guttatus Stegastes_partitus Lutjanus_apodus Cephalopholis_cruentata Holocanthus_tricolor Pomacanthus_paru Chaetodon_capistratus Bodianus_rufus Thalassoma_bifasciatum Scarus_iserti Abudefduf_saxatilis Gramma_loreto
Tayrona_1 24 16 12 28 26 20 25 18 17 10 29 18 21 27 21
Tayrona_2 13 22 30 30 22 25 30 19 21 15 22 27 24 17 22
Aguja_1 23 25 25 26 24 14 21 16 21 19 13 12 19 15 22
Aguja_2 16 28 17 16 10 19 32 18 20 18 23 14 24 20 9
Gallinas_1 16 19 13 13 11 16 11 8 9 14 16 11 8 9 10
Gallinas_2 7 11 7 15 7 9 12 13 14 7 10 10 14 18 7
Vela_1 9 16 12 10 9 12 7 4 5 10 8 7 10 8 6
Vela_2 11 13 12 10 9 10 18 7 11 6 8 10 10 11 9

3.3 Variables ambientales por sitio

env_data <- data.frame(
  sitio           = sitios,
  zona            = c("Protegida",    "Protegida",
                      "Protegida",    "Protegida",
                      "No protegida", "No protegida",
                      "No protegida", "No protegida"),
  profundidad_m   = c(8.5,  10.2, 7.8,  9.5,
                      12.1, 11.4, 13.0, 10.8),
  temperatura_C   = c(27.5, 27.8, 28.1, 27.9,
                      29.2, 28.8, 29.5, 28.6),
  salinidad_ppt   = c(36.1, 36.3, 35.9, 36.2,
                      36.5, 36.4, 36.8, 36.3),
  cobertura_coral = c(48.2, 45.6, 41.3, 43.8,
                      27.5, 29.1, 22.4, 25.8),
  turbidez_NTU    = c(2.1, 2.4, 2.8, 2.5,
                      5.2, 4.8, 6.1, 5.5)
)

kable(env_data,
      caption = "Variables ambientales por sitio de muestreo",
      digits  = 2)
Variables ambientales por sitio de muestreo
sitio zona profundidad_m temperatura_C salinidad_ppt cobertura_coral turbidez_NTU
Tayrona_1 Protegida 8.5 27.5 36.1 48.2 2.1
Tayrona_2 Protegida 10.2 27.8 36.3 45.6 2.4
Aguja_1 Protegida 7.8 28.1 35.9 41.3 2.8
Aguja_2 Protegida 9.5 27.9 36.2 43.8 2.5
Gallinas_1 No protegida 12.1 29.2 36.5 27.5 5.2
Gallinas_2 No protegida 11.4 28.8 36.4 29.1 4.8
Vela_1 No protegida 13.0 29.5 36.8 22.4 6.1
Vela_2 No protegida 10.8 28.6 36.3 25.8 5.5

4 Índice 1 — Riqueza de Especies (S)

4.1 ¿Qué mide?

La riqueza de especies (S) es el número total de especies presentes en una muestra. Es el índice más simple e intuitivo de diversidad, pero también el más sensible al esfuerzo de muestreo: a mayor esfuerzo, mayor probabilidad de registrar especies raras.

4.2 Cálculo en R

La función specnumber() del paquete vegan cuenta automáticamente el número de especies con abundancia mayor a cero en cada fila de la matriz.

# Calcular riqueza de especies por sitio
riqueza <- specnumber(abundancias)

cat("Riqueza de especies por sitio:\n")
## Riqueza de especies por sitio:
print(riqueza)
##  Tayrona_1  Tayrona_2    Aguja_1    Aguja_2 Gallinas_1 Gallinas_2     Vela_1 
##         15         15         15         15         15         15         15 
##     Vela_2 
##         15
cat("\nEstadísticos descriptivos de la riqueza:\n")
## 
## Estadísticos descriptivos de la riqueza:
cat("  Media:               ", round(mean(riqueza), 2), "especies\n")
##   Media:                15 especies
cat("  Desviación estándar: ", round(sd(riqueza), 2),   "\n")
##   Desviación estándar:  0
cat("  Mínimo:              ", min(riqueza), "especies\n")
##   Mínimo:               15 especies
cat("  Máximo:              ", max(riqueza), "especies\n")
##   Máximo:               15 especies

4.3 Visualización de la riqueza

data.frame(sitio   = names(riqueza),
           riqueza = as.numeric(riqueza),
           zona    = env_data$zona) |>
  ggplot(aes(x = reorder(sitio, riqueza), y = riqueza, fill = zona)) +
  geom_col(alpha = 0.85) +
  geom_text(aes(label = riqueza), hjust = -0.3, size = 4, fontface = "bold") +
  coord_flip() +
  scale_fill_manual(values = c("Protegida"    = "#4E9BB9",
                               "No protegida" = "#E07B54")) +
  labs(
    title    = "Riqueza de Especies de Peces Arrecifales",
    subtitle = "Caribe colombiano — Censos visuales en transectos de 25 m²",
    x        = NULL,
    y        = "Número de especies (S)",
    fill     = "Zona"
  ) +
  theme_classic(base_size = 13) +
  theme(legend.position = "bottom")
Riqueza de especies de peces por sitio de muestreo, coloreado por zona de protección.

Riqueza de especies de peces por sitio de muestreo, coloreado por zona de protección.


5 Índice 2 — Índice de Shannon (H’)

5.1 ¿Qué mide?

El índice de Shannon (H’) mide la incertidumbre en la identidad de un individuo tomado al azar de la comunidad. Combina dos componentes:

  • Riqueza: cuántas especies hay
  • Equitabilidad: qué tan similares son sus abundancias

Valores más altos indican comunidades más diversas y con mejor distribución de la abundancia entre especies.

\[H' = -\sum_{i=1}^{S} p_i \ln p_i\]

Donde \(p_i\) es la proporción de individuos de la especie \(i\) respecto al total de individuos del sitio.

Guía de interpretación:

H’ Diversidad
< 1.5 Baja
1.5 — 3.0 Moderada
> 3.0 Alta

5.2 Cálculo en R

# Calcular índice de Shannon
shannon <- diversity(abundancias, index = "shannon")

cat("Índice de Shannon (H') por sitio:\n")
## Índice de Shannon (H') por sitio:
print(round(shannon, 3))
##  Tayrona_1  Tayrona_2    Aguja_1    Aguja_2 Gallinas_1 Gallinas_2     Vela_1 
##      2.671      2.682      2.681      2.659      2.673      2.659      2.654 
##     Vela_2 
##      2.676
# Interpretación automática
cat("\nInterpretación:\n")
## 
## Interpretación:
for (i in seq_along(shannon)) {
  nivel <- ifelse(shannon[i] > 3.0, "Alta diversidad",
           ifelse(shannon[i] > 1.5, "Diversidad moderada",
                                    "Baja diversidad"))
  cat(sprintf("  %-14s  H' = %.3f  →  %s\n",
              names(shannon)[i], shannon[i], nivel))
}
##   Tayrona_1       H' = 2.671  →  Diversidad moderada
##   Tayrona_2       H' = 2.682  →  Diversidad moderada
##   Aguja_1         H' = 2.681  →  Diversidad moderada
##   Aguja_2         H' = 2.659  →  Diversidad moderada
##   Gallinas_1      H' = 2.673  →  Diversidad moderada
##   Gallinas_2      H' = 2.659  →  Diversidad moderada
##   Vela_1          H' = 2.654  →  Diversidad moderada
##   Vela_2          H' = 2.676  →  Diversidad moderada

5.3 Comparación riqueza vs. Shannon

tabla_s_h <- data.frame(
  Sitio  = names(riqueza),
  Zona   = env_data$zona,
  S      = as.numeric(riqueza),
  H      = round(as.numeric(shannon), 3)
)

kable(tabla_s_h,
      col.names = c("Sitio", "Zona", "Riqueza (S)", "Shannon (H')"),
      caption   = "Comparación de riqueza e índice de Shannon por sitio",
      align     = "c")
Comparación de riqueza e índice de Shannon por sitio
Sitio Zona Riqueza (S) Shannon (H’)
Tayrona_1 Protegida 15 2.671
Tayrona_2 Protegida 15 2.682
Aguja_1 Protegida 15 2.681
Aguja_2 Protegida 15 2.659
Gallinas_1 No protegida 15 2.673
Gallinas_2 No protegida 15 2.659
Vela_1 No protegida 15 2.654
Vela_2 No protegida 15 2.676

6 Índice 3 — Índice de Simpson (D)

6.1 ¿Qué mide?

El índice de Simpson mide la probabilidad de que dos individuos elegidos al azar de la comunidad pertenezcan a especies diferentes. Está más influenciado por las especies dominantes que por las raras.

Se usa en dos formas:

\[D = 1 - \sum_{i=1}^{S} p_i^2 \quad \text{(Gini-Simpson)}\]

\[\frac{1}{D} = \frac{1}{\sum_{i=1}^{S} p_i^2} \quad \text{(Inverso de Simpson)}\]

El inverso de Simpson (1/D) es más intuitivo: representa el número de especies igualmente abundantes necesarias para obtener la misma diversidad observada.

6.2 Cálculo en R

# Índice de Gini-Simpson
simpson <- diversity(abundancias, index = "simpson")

# Inverso de Simpson
inv_simpson <- diversity(abundancias, index = "invsimpson")

cat("Índice de Gini-Simpson (D) por sitio:\n")
## Índice de Gini-Simpson (D) por sitio:
print(round(simpson, 3))
##  Tayrona_1  Tayrona_2    Aguja_1    Aguja_2 Gallinas_1 Gallinas_2     Vela_1 
##      0.929      0.930      0.930      0.927      0.929      0.927      0.926 
##     Vela_2 
##      0.929
cat("\nInverso de Simpson (1/D) por sitio:\n")
## 
## Inverso de Simpson (1/D) por sitio:
print(round(inv_simpson, 2))
##  Tayrona_1  Tayrona_2    Aguja_1    Aguja_2 Gallinas_1 Gallinas_2     Vela_1 
##      14.01      14.27      14.25      13.67      14.01      13.64      13.51 
##     Vela_2 
##      14.04

7 Índice 4 — Equitabilidad de Pielou (J’)

7.1 ¿Qué mide?

La equitabilidad de Pielou (J’) mide qué tan uniformemente se distribuyen los individuos entre las especies. Es independiente de la riqueza.

\[J' = \frac{H'}{\ln S}\]

  • J’ = 1: todas las especies tienen exactamente la misma abundancia
  • J’ = 0: un dominio total de una sola especie

7.2 Cálculo en R

# Equitabilidad de Pielou
pielou <- shannon / log(riqueza)

cat("Equitabilidad de Pielou (J') por sitio:\n")
## Equitabilidad de Pielou (J') por sitio:
print(round(pielou, 3))
##  Tayrona_1  Tayrona_2    Aguja_1    Aguja_2 Gallinas_1 Gallinas_2     Vela_1 
##      0.986      0.990      0.990      0.982      0.987      0.982      0.980 
##     Vela_2 
##      0.988

8 Índice 5 — Dominancia de Berger-Parker

8.1 ¿Qué mide?

El índice de Berger-Parker expresa la proporción de individuos que corresponden a la especie más abundante del sitio. Es una medida directa de dominancia: valores altos indican que una especie controla la comunidad.

\[BP = \frac{N_{max}}{N_{total}}\]

8.2 Cálculo en R

# Índice de Berger-Parker
berger_parker <- apply(abundancias, 1,
                       function(x) max(x) / sum(x))

# Especie dominante en cada sitio
especie_dom <- apply(abundancias, 1,
                     function(x) names(which.max(x)))

dominancia <- data.frame(
  Sitio             = names(berger_parker),
  Zona              = env_data$zona,
  Especie_dominante = especie_dom,
  Berger_Parker     = round(berger_parker, 3)
)

kable(dominancia,
      col.names = c("Sitio", "Zona", "Especie dominante", "Berger-Parker"),
      caption   = "Dominancia por sitio — Índice de Berger-Parker",
      align     = "c")
Dominancia por sitio — Índice de Berger-Parker
Sitio Zona Especie dominante Berger-Parker
Tayrona_1 Tayrona_1 Protegida Bodianus_rufus 0.093
Tayrona_2 Tayrona_2 Protegida Haemulon_sciurus 0.088
Aguja_1 Aguja_1 Protegida Epinephelus_guttatus 0.088
Aguja_2 Aguja_2 Protegida Cephalopholis_cruentata 0.113
Gallinas_1 Gallinas_1 No protegida Sparisoma_viride 0.103
Gallinas_2 Gallinas_2 No protegida Abudefduf_saxatilis 0.112
Vela_1 Vela_1 No protegida Sparisoma_viride 0.120
Vela_2 Vela_2 No protegida Cephalopholis_cruentata 0.116

9 Tabla Consolidada de Índices

indices <- data.frame(
  Sitio       = names(riqueza),
  Zona        = env_data$zona,
  S           = as.numeric(riqueza),
  H           = round(as.numeric(shannon), 3),
  D           = round(as.numeric(simpson), 3),
  InvD        = round(as.numeric(inv_simpson), 2),
  J           = round(as.numeric(pielou), 3),
  BP          = round(berger_parker, 3)
)

kable(indices,
      col.names = c("Sitio", "Zona", "S", "H' (Shannon)",
                    "D (Simpson)", "1/D", "J' (Pielou)", "BP"),
      caption   = "Índices de diversidad alfa — resumen por sitio",
      align     = "c")
Índices de diversidad alfa — resumen por sitio
Sitio Zona S H’ (Shannon) D (Simpson) 1/D J’ (Pielou) BP
Tayrona_1 Tayrona_1 Protegida 15 2.671 0.929 14.01 0.986 0.093
Tayrona_2 Tayrona_2 Protegida 15 2.682 0.930 14.27 0.990 0.088
Aguja_1 Aguja_1 Protegida 15 2.681 0.930 14.25 0.990 0.088
Aguja_2 Aguja_2 Protegida 15 2.659 0.927 13.67 0.982 0.113
Gallinas_1 Gallinas_1 No protegida 15 2.673 0.929 14.01 0.987 0.103
Gallinas_2 Gallinas_2 No protegida 15 2.659 0.927 13.64 0.982 0.112
Vela_1 Vela_1 No protegida 15 2.654 0.926 13.51 0.980 0.120
Vela_2 Vela_2 No protegida 15 2.676 0.929 14.04 0.988 0.116

9.1 Visualización comparativa de todos los índices

indices |>
  pivot_longer(cols      = c(S, H, D, J),
               names_to  = "Indice",
               values_to = "Valor") |>
  mutate(Indice = recode(Indice,
    S = "Riqueza (S)",
    H = "Shannon (H')",
    D = "Simpson (D)",
    J = "Pielou (J')"
  )) |>
  ggplot(aes(x = Zona, y = Valor, fill = Zona)) +
  geom_boxplot(alpha = 0.55, outlier.shape = NA, width = 0.45) +
  geom_jitter(aes(color = Zona), width = 0.13, size = 3, alpha = 0.8) +
  facet_wrap(~ Indice, scales = "free_y", ncol = 2) +
  scale_fill_manual(values  = c("Protegida"    = "#4E9BB9",
                                "No protegida" = "#E07B54")) +
  scale_color_manual(values = c("Protegida"    = "#1F6E8C",
                                "No protegida" = "#C0415A")) +
  labs(
    title    = "Índices de Diversidad Alfa por Zona",
    subtitle = "Peces arrecifales — Caribe colombiano",
    x        = NULL,
    y        = "Valor del índice"
  ) +
  theme_bw(base_size = 12) +
  theme(legend.position    = "bottom",
        strip.background   = element_rect(fill = "#2C3E50"),
        strip.text         = element_text(color = "white", face = "bold"))
Comparación de los cuatro índices de diversidad alfa entre zonas protegidas y no protegidas.

Comparación de los cuatro índices de diversidad alfa entre zonas protegidas y no protegidas.


10 Curvas de Rango-Abundancia

10.1 ¿Qué muestran?

Las curvas de rango-abundancia ordenan las especies de mayor a menor abundancia y las grafican en escala logarítmica. La forma de la curva revela la estructura de dominancia de la comunidad:

  • Curva muy inclinada: pocas especies dominan, muchas son raras
  • Curva casi plana: las abundancias están bien distribuidas entre especies

10.2 Cálculo y visualización

# Construir la tabla de rango-abundancia para todos los sitios
ra_data <- purrr::map_dfr(sitios, function(s) {
  ab <- sort(abundancias[s, abundancias[s, ] > 0], decreasing = TRUE)
  if (length(ab) == 0) return(NULL)
  data.frame(
    sitio      = s,
    zona       = env_data$zona[env_data$sitio == s],
    rango      = seq_along(ab),
    abundancia = as.numeric(ab)
  )
})

ggplot(ra_data, aes(x = rango, y = abundancia,
                    color = zona, group = sitio)) +
  geom_line(linewidth = 0.9, alpha = 0.75) +
  geom_point(size = 2.5, alpha = 0.8) +
  scale_y_log10() +
  scale_color_manual(values = c("Protegida"    = "#1F6E8C",
                                "No protegida" = "#C0415A")) +
  labs(
    title    = "Curvas de Rango-Abundancia — Peces Arrecifales",
    subtitle = "Eje Y en escala logarítmica | Cada línea = un sitio",
    x        = "Rango de la especie",
    y        = "Abundancia (escala log₁₀)",
    color    = "Zona"
  ) +
  theme_classic(base_size = 13) +
  theme(legend.position = "bottom")
Curvas de rango-abundancia por sitio. Una curva más plana indica mayor equitabilidad.

Curvas de rango-abundancia por sitio. Una curva más plana indica mayor equitabilidad.


11 Rarefacción

11.1 ¿Por qué es importante?

Una limitación importante de la riqueza observada (S) es que depende del esfuerzo de muestreo. Si un sitio tiene más individuos registrados, es probable que tengamos más especies, independientemente de si la comunidad es realmente más diversa.

La rarefacción resuelve esto estandarizando todos los sitios al mismo número de individuos (el del sitio con menor esfuerzo de muestreo), haciendo que las comparaciones sean justas.

11.2 Curvas de rarefacción

n_min <- min(rowSums(abundancias))
cat("Tamaño mínimo de muestra:", n_min, "individuos (sitio de menor esfuerzo)\n")
## Tamaño mínimo de muestra: 133 individuos (sitio de menor esfuerzo)
rarecurve(abundancias,
          step   = 5,
          sample = n_min,
          col    = c(rep("#1F6E8C", 4), rep("#C0415A", 4)),
          lwd    = 2,
          label  = TRUE,
          main   = "Curvas de Rarefacción — Peces Arrecifales",
          xlab   = "Número de individuos muestreados",
          ylab   = "Riqueza esperada de especies")
abline(v = n_min, lty = 2, col = "gray40", lwd = 1.5)
legend("bottomright",
       legend = c("Protegida", "No protegida"),
       col    = c("#1F6E8C", "#C0415A"),
       lwd    = 2, bty = "n")
Curvas de rarefacción por sitio. La línea vertical punteada indica el tamaño mínimo de muestra al que se estandariza.

Curvas de rarefacción por sitio. La línea vertical punteada indica el tamaño mínimo de muestra al que se estandariza.

11.3 Riqueza rarefactada estandarizada

rare_std <- rarefy(abundancias, sample = n_min)

comparacion_rare <- data.frame(
  Sitio               = names(riqueza),
  Zona                = env_data$zona,
  N_total             = rowSums(abundancias),
  S_observada         = as.numeric(riqueza),
  S_rarefactada       = round(as.numeric(rare_std), 1),
  Diferencia          = round(as.numeric(riqueza) - as.numeric(rare_std), 1)
)

kable(comparacion_rare,
      col.names = c("Sitio", "Zona", "N total",
                    "S observada", "S rarefactada", "Diferencia"),
      caption   = paste0("Riqueza observada vs. rarefactada ",
                         "(estandarizada a ", n_min, " individuos)"),
      align     = "c")
Riqueza observada vs. rarefactada (estandarizada a 133 individuos)
Sitio Zona N total S observada S rarefactada Diferencia
Tayrona_1 Tayrona_1 Protegida 312 15 15 0
Tayrona_2 Tayrona_2 Protegida 339 15 15 0
Aguja_1 Aguja_1 Protegida 295 15 15 0
Aguja_2 Aguja_2 Protegida 284 15 15 0
Gallinas_1 Gallinas_1 No protegida 184 15 15 0
Gallinas_2 Gallinas_2 No protegida 161 15 15 0
Vela_1 Vela_1 No protegida 133 15 15 0
Vela_2 Vela_2 No protegida 155 15 15 0

💡 Cuando la S rarefactada es similar entre sitios con diferente S observada, significa que la diferencia en riqueza se debe al esfuerzo de muestreo, no a una diferencia real en diversidad.


12 Completitud del Muestreo

El estimador Chao1 estima el número de especies que aún no hemos detectado. La completitud es la proporción de species estimadas que sí registramos.

estimadores <- estimateR(abundancias)

# Calcular completitud basada en Chao1
completitud <- as.numeric(riqueza) / estimadores["S.chao1", ]

resumen_comp <- data.frame(
  Sitio       = colnames(estimadores),
  Zona        = env_data$zona,
  S_obs       = estimadores["S.obs", ],
  S_Chao1     = round(estimadores["S.chao1", ], 1),
  S_ACE       = round(estimadores["S.ACE", ], 1),
  Completitud = paste0(round(completitud * 100, 1), " %")
)

kable(resumen_comp,
      caption = "Estimadores de riqueza total y completitud del muestreo",
      align   = "c")
Estimadores de riqueza total y completitud del muestreo
Sitio Zona S_obs S_Chao1 S_ACE Completitud
Tayrona_1 Tayrona_1 Protegida 15 15 15 100 %
Tayrona_2 Tayrona_2 Protegida 15 15 NaN 100 %
Aguja_1 Aguja_1 Protegida 15 15 NaN 100 %
Aguja_2 Aguja_2 Protegida 15 15 15 100 %
Gallinas_1 Gallinas_1 No protegida 15 15 15 100 %
Gallinas_2 Gallinas_2 No protegida 15 15 15 100 %
Vela_1 Vela_1 No protegida 15 15 15 100 %
Vela_2 Vela_2 No protegida 15 15 15 100 %
comp_prom <- mean(completitud, na.rm = TRUE)

cat("══════════════════════════════════════════════════════\n")
## ══════════════════════════════════════════════════════
cat("  EVALUACIÓN DE LA COMPLETITUD DEL MUESTREO\n")
##   EVALUACIÓN DE LA COMPLETITUD DEL MUESTREO
cat("══════════════════════════════════════════════════════\n\n")
## ══════════════════════════════════════════════════════
cat(sprintf("  Completitud promedio: %.1f %%\n\n", comp_prom * 100))
##   Completitud promedio: 100.0 %
if (comp_prom < 0.70) {
  cat("  ⚠️  BAJA: Se recomienda aumentar el esfuerzo de muestreo.\n")
  cat(sprintf("     Se estima un %.0f %% más de especies por registrar.\n",
              (1 / comp_prom - 1) * 100))
} else if (comp_prom < 0.85) {
  cat("  ⚡ MODERADA: Muestreo aceptable.\n")
  cat("     Se recomienda muestreo adicional en sitios con\n")
  cat("     completitud menor al 70 %.\n")
} else {
  cat("  ✓  ALTA: El esfuerzo de muestreo es adecuado.\n")
}
##   ✓  ALTA: El esfuerzo de muestreo es adecuado.
cat("══════════════════════════════════════════════════════\n")
## ══════════════════════════════════════════════════════

13 Relación Diversidad–Ambiente

13.1 Matriz de correlaciones

datos_cor <- data.frame(
  Riqueza         = as.numeric(riqueza),
  Shannon         = as.numeric(shannon),
  Simpson         = as.numeric(simpson),
  Pielou          = as.numeric(pielou),
  Profundidad     = env_data$profundidad_m,
  Temperatura     = env_data$temperatura_C,
  Cobertura_coral = env_data$cobertura_coral,
  Turbidez        = env_data$turbidez_NTU
)

matriz_cor <- cor(datos_cor, use = "complete.obs")

corrplot(matriz_cor,
         method      = "color",
         type        = "upper",
         addCoef.col = "black",
         tl.col      = "black",
         tl.srt      = 45,
         col         = colorRampPalette(c("#E84855", "white", "#2E86AB"))(200),
         title       = "Diversidad vs. Variables Ambientales",
         mar         = c(0, 0, 2, 0),
         number.cex  = 0.85)
Correlaciones entre índices de diversidad alfa y variables ambientales.

Correlaciones entre índices de diversidad alfa y variables ambientales.

13.2 Riqueza vs. cobertura de coral

datos_cor |>
  mutate(zona = env_data$zona) |>
  ggplot(aes(x = Cobertura_coral, y = Riqueza, color = zona)) +
  geom_point(size = 4, alpha = 0.85) +
  geom_smooth(method = "lm", se = TRUE,
              color = "gray40", linetype = "dashed") +
  stat_cor(method = "pearson",
           label.x = 22, label.y = max(as.numeric(riqueza))) +
  scale_color_manual(values = c("Protegida"    = "#1F6E8C",
                                "No protegida" = "#C0415A")) +
  labs(
    title  = "Cobertura de Coral vs. Riqueza de Peces",
    x      = "Cobertura de coral (%)",
    y      = "Riqueza de especies (S)",
    color  = "Zona"
  ) +
  theme_classic(base_size = 13)
Relación entre cobertura de coral y riqueza de peces arrecifales.

Relación entre cobertura de coral y riqueza de peces arrecifales.


14 Interpretación Ecológica de los Resultados

sitio_max_S <- names(which.max(riqueza))
sitio_min_S <- names(which.min(riqueza))
sitio_max_H <- names(which.max(shannon))

media_prot   <- mean(as.numeric(riqueza)[grepl("Tayrona|Aguja",   names(riqueza))])
media_noprot <- mean(as.numeric(riqueza)[grepl("Gallinas|Vela",   names(riqueza))])

cat("══════════════════════════════════════════════════════════\n")
## ══════════════════════════════════════════════════════════
cat("  RESUMEN — DIVERSIDAD ALFA DE PECES ARRECIFALES\n")
##   RESUMEN — DIVERSIDAD ALFA DE PECES ARRECIFALES
cat("  Caribe colombiano\n")
##   Caribe colombiano
cat("══════════════════════════════════════════════════════════\n\n")
## ══════════════════════════════════════════════════════════
cat(sprintf("  Riqueza promedio:     %.1f sp./sitio\n", mean(riqueza)))
##   Riqueza promedio:     15.0 sp./sitio
cat(sprintf("  Rango riqueza:        %d — %d especies\n",
            min(riqueza), max(riqueza)))
##   Rango riqueza:        15 — 15 especies
cat(sprintf("  Sitio más rico:       %s (%d sp.)\n",
            sitio_max_S, max(riqueza)))
##   Sitio más rico:       Tayrona_1 (15 sp.)
cat(sprintf("  Sitio menos rico:     %s (%d sp.)\n\n",
            sitio_min_S, min(riqueza)))
##   Sitio menos rico:     Tayrona_1 (15 sp.)
cat(sprintf("  Shannon promedio:     H' = %.3f\n", mean(shannon)))
##   Shannon promedio:     H' = 2.669
cat(sprintf("  Sitio más diverso:    %s (H' = %.3f)\n\n",
            sitio_max_H, max(shannon)))
##   Sitio más diverso:    Tayrona_2 (H' = 2.682)
cat(sprintf("  Riqueza media protegidas:     %.1f sp.\n", media_prot))
##   Riqueza media protegidas:     15.0 sp.
cat(sprintf("  Riqueza media no protegidas:  %.1f sp.\n\n", media_noprot))
##   Riqueza media no protegidas:  15.0 sp.
cat(sprintf("  Diferencia:                   %.1f sp. (%.0f %%)\n",
            media_prot - media_noprot,
            ((media_prot - media_noprot) / media_noprot) * 100))
##   Diferencia:                   0.0 sp. (0 %)
cat("══════════════════════════════════════════════════════════\n")
## ══════════════════════════════════════════════════════════

15 Ejercicios Prácticos

📝 Resuelvan los siguientes ejercicios de manera individual o en pareja. Modifiquen el código de esta guía como referencia.

15.1 Ejercicio 1 — Interpretación de índices

Con base en la tabla consolidada de índices (sección 6), respondan:

a) ¿Qué sitio presenta la mayor equitabilidad de Pielou (J’)? ¿Qué significa biológicamente que un sitio tenga J’ cercano a 1?

b) Comparen los valores de Shannon (H’) y Simpson (D) en el sitio con mayor riqueza (S). ¿Coinciden en señalar alta diversidad? ¿Por qué pueden diferir?

c) ¿Cuál es la especie dominante en los sitios no protegidos según el índice de Berger-Parker? ¿Qué podría explicar esta dominancia en un arrecife del Caribe colombiano bajo presión de pesca?

# Escriban aquí su código de apoyo para responder las preguntas
# Por ejemplo, para ver los índices del sitio con mayor riqueza:
sitio_max <- names(which.max(riqueza))
cat("Sitio con mayor riqueza:", sitio_max, "\n")
cat("Shannon:", round(shannon[sitio_max], 3), "\n")
cat("Simpson:", round(simpson[sitio_max], 3), "\n")
cat("Pielou: ", round(pielou[sitio_max],  3), "\n")

Respuesta a):

Respuesta b):

Respuesta c):


15.2 Ejercicio 2 — Curvas de rarefacción

Observen las curvas de rarefacción de la sección 8 y respondan:

a) ¿Cuál es el tamaño mínimo de muestra al que se estandarizaron los sitios? ¿Qué sitio determinó ese mínimo?

b) Después de la estandarización por rarefacción, ¿las diferencias en riqueza entre zonas protegidas y no protegidas se mantienen o desaparecen? ¿Qué implica esto para la interpretación ecológica?

c) Si una curva de rarefacción aún sigue subiendo pronunciadamente al final del eje X, ¿qué indica sobre el muestreo de ese sitio?

# Código de apoyo: tabla de completitud y riqueza rarefactada
print(comparacion_rare)
print(resumen_comp)

Respuesta a):

Respuesta b):

Respuesta c):


15.3 Ejercicio 3 — Nuevo conjunto de datos

Calculen los índices de diversidad alfa para los siguientes datos de macroalgas en arrecifes del Caribe colombiano. Los valores representan el porcentaje de cobertura por especie en cada sitio.

# Datos de cobertura de macroalgas (%) — ejecuten este bloque directamente
algas <- matrix(
  c(15, 8, 0,  12, 5,  3,  0,  9,
    10, 0, 14, 6,  8,  0,  11, 4,
    3,  0, 5,  0,  18, 22, 4,  0,
    0,  7, 0,  3,  9,  15, 0,  12),
  nrow = 4,
  byrow = TRUE,
  dimnames = list(
    c("Tayrona_S", "Aguja_S", "Gallinas_S", "Vela_S"),
    c("Lobophora", "Dictyota", "Halimeda", "Caulerpa",
      "Sargassum", "Turbinaria", "Padina", "Galaxaura")
  )
)

# Visualizar la matriz
kable(algas,
      caption = "Cobertura de macroalgas (%) por sitio — datos del ejercicio",
      align   = "c")
Cobertura de macroalgas (%) por sitio — datos del ejercicio
Lobophora Dictyota Halimeda Caulerpa Sargassum Turbinaria Padina Galaxaura
Tayrona_S 15 8 0 12 5 3 0 9
Aguja_S 10 0 14 6 8 0 11 4
Gallinas_S 3 0 5 0 18 22 4 0
Vela_S 0 7 0 3 9 15 0 12
# ── COMPLETEN: reemplacen los espacios en MAYÚSCULAS con el código correcto ───

# 1. Riqueza de especies
riqueza_algas <- specnumber(NOMBRE_MATRIZ)
print(riqueza_algas)

# 2. Índice de Shannon
shannon_algas <- diversity(NOMBRE_MATRIZ, index = "INDICE")
print(round(shannon_algas, 3))

# 3. Equitabilidad de Pielou
pielou_algas <- SHANNON / log(RIQUEZA)
print(round(pielou_algas, 3))

# 4. Tabla consolidada
data.frame(
  Sitio = names(riqueza_algas),
  S     = as.numeric(riqueza_algas),
  H     = round(as.numeric(shannon_algas), 3),
  J     = round(as.numeric(pielou_algas),  3)
)

Interpretación del grupo: ¿Qué sitio de macroalgas presenta mayor diversidad? ¿Coinciden riqueza y Shannon en la misma conclusión?


15.4 Ejercicio 4 — Diversidad y zona de protección

Realicen una prueba t para evaluar si la riqueza de especies de peces difiere significativamente entre zonas protegidas y no protegidas. Usen lo aprendido en la Parte 3 de la guía.

# Construir el data.frame necesario para la prueba t
datos_t <- data.frame(
  riqueza = as.numeric(riqueza),
  zona    = env_data$zona
)

# Verificar normalidad
datos_t |>
  group_by(zona) |>
  rstatix::shapiro_test(riqueza)

# Prueba t
t.test(___ ~ ___, data = datos_t, var.equal = ___)

# Visualización
library(ggpubr)
ggplot(datos_t, aes(x = zona, y = riqueza, fill = zona)) +
  geom_boxplot(alpha = 0.6) +
  geom_jitter(width = 0.15, size = 3, alpha = 0.7) +
  stat_compare_means(method = "t.test", label = "p.format") +
  labs(title = "Riqueza de Peces: Protegida vs. No Protegida",
       x = NULL, y = "Riqueza (S)") +
  scale_fill_manual(values = c("Protegida"    = "#4E9BB9",
                               "No protegida" = "#E07B54")) +
  theme_classic(base_size = 13) +
  theme(legend.position = "none")

Conclusión: ¿Existe diferencia significativa? Indiquen el valor p y redacten una conclusión en términos biológicos.



16 Bibliografía

  • Magurran, A.E. (2004). Measuring Biological Diversity. Blackwell Publishing.
  • Gotelli, N.J. & Colwell, R.K. (2001). Quantifying biodiversity: procedures and pitfalls. Ecology Letters, 4, 379–391.
  • Oksanen, J. et al. (2022). vegan: Community Ecology Package. R package version 2.6-4.
  • Legendre, P. & Legendre, L. (2012). Numerical Ecology, 3rd ed. Elsevier.

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