MAESTRÍA EN GESTIÓN INTEGRAL FRENTE AL CAMBIO CLIMÁTICO
Análisis de Diversidad Alfa Electiva II: Medición de la diversidad Alfa y Beta en el contexto del cambio climático
Este documento proporciona una guía completa para iniciarse en el uso de R y RStudio, específicamente orientada al análisis de diversidad alfa en macroinvertebrados acuáticos en el contexto del cambio climático. La guía está diseñada para estudiantes de la Maestría en Gestión Integral frente al Cambio Climático.
R es el lenguaje de programación y entorno estadístico que utilizaremos. Para instalarlo:
RStudio es un entorno de desarrollo integrado (IDE) que facilita el trabajo con R.
RStudio se divide en cuatro paneles principales:
File > New File > R Script (Ctrl+Shift+N)Vamos a crear nuestro primer script:
# Mi primer script de R
# Autor: [Tu nombre]
# Fecha: [Fecha actual]
# Propósito: Introducción a R para análisis de diversidad
# Esto es un comentario (inicia con #)
print("¡Hola, mundo de la ecología!")## [1] "¡Hola, mundo de la ecología!"
R puede utilizarse como una calculadora:
## [1] 5
## [1] 6
## [1] 30
## [1] 5
## [1] 8
## [1] 4
En R, utilizamos <- o = para asignar
valores a variables:
# Asignación de variables
numero_especies <- 25
temperatura_agua <- 18.5
sitio_muestreo <- "Río Magdalena"
# Mostrar el contenido de las variables
numero_especies## [1] 25
## [1] 18.5
## [1] "Río Magdalena"
Los vectores son la estructura de datos más básica en R:
# Crear vectores
especies <- c("Baetis", "Simulium", "Chironomus", "Hydropsyche")
abundancias <- c(15, 8, 23, 12)
ph_valores <- c(7.2, 6.8, 7.5, 6.9)
# Mostrar vectores
especies## [1] "Baetis" "Simulium" "Chironomus" "Hydropsyche"
## [1] 15 8 23 12
## [1] "Baetis"
## [1] 8 23 12
## [1] "Baetis" "Chironomus"
Los factores son útiles para variables categóricas:
# Crear factores
orden_taxonomico <- factor(c("Ephemeroptera", "Diptera", "Diptera", "Trichoptera"))
calidad_agua <- factor(c("Buena", "Regular", "Buena", "Regular"),
levels = c("Mala", "Regular", "Buena"))
# Mostrar estructura
str(orden_taxonomico)## Factor w/ 3 levels "Diptera","Ephemeroptera",..: 2 1 1 3
## [1] "Mala" "Regular" "Buena"
# Crear una matriz de datos de macroinvertebrados
# Filas: sitios de muestreo, Columnas: especies
datos_macro <- matrix(c(15, 8, 23, 12,
12, 6, 18, 9,
20, 10, 15, 14),
nrow = 3, ncol = 4,
byrow = TRUE)
# Asignar nombres
rownames(datos_macro) <- c("Sitio_1", "Sitio_2", "Sitio_3")
colnames(datos_macro) <- c("Baetis", "Simulium", "Chironomus", "Hydropsyche")
# Mostrar la matriz
datos_macro## Baetis Simulium Chironomus Hydropsyche
## Sitio_1 15 8 23 12
## Sitio_2 12 6 18 9
## Sitio_3 20 10 15 14
## [1] 8
## Sitio_1 Sitio_2 Sitio_3
## 15 12 20
## Baetis Simulium Chironomus Hydropsyche
## 15 8 23 12
Los data frames son la estructura más importante para análisis estadísticos:
# Crear un data frame
datos_campo <- data.frame(
sitio = c("S1", "S2", "S3", "S4", "S5"),
temperatura = c(18.5, 19.2, 17.8, 20.1, 18.9),
ph = c(7.2, 6.8, 7.5, 6.9, 7.1),
oxigeno = c(8.2, 7.5, 8.8, 7.1, 8.0),
num_especies = c(12, 8, 15, 9, 11),
calidad = factor(c("Buena", "Regular", "Buena", "Regular", "Buena"))
)
# Mostrar el data frame
print(datos_campo)## sitio temperatura ph oxigeno num_especies calidad
## 1 S1 18.5 7.2 8.2 12 Buena
## 2 S2 19.2 6.8 7.5 8 Regular
## 3 S3 17.8 7.5 8.8 15 Buena
## 4 S4 20.1 6.9 7.1 9 Regular
## 5 S5 18.9 7.1 8.0 11 Buena
## 'data.frame': 5 obs. of 6 variables:
## $ sitio : chr "S1" "S2" "S3" "S4" ...
## $ temperatura : num 18.5 19.2 17.8 20.1 18.9
## $ ph : num 7.2 6.8 7.5 6.9 7.1
## $ oxigeno : num 8.2 7.5 8.8 7.1 8
## $ num_especies: num 12 8 15 9 11
## $ calidad : Factor w/ 2 levels "Buena","Regular": 1 2 1 2 1
## sitio temperatura ph oxigeno num_especies
## Length:5 Min. :17.8 Min. :6.8 Min. :7.10 Min. : 8
## Class :character 1st Qu.:18.5 1st Qu.:6.9 1st Qu.:7.50 1st Qu.: 9
## Mode :character Median :18.9 Median :7.1 Median :8.00 Median :11
## Mean :18.9 Mean :7.1 Mean :7.92 Mean :11
## 3rd Qu.:19.2 3rd Qu.:7.2 3rd Qu.:8.20 3rd Qu.:12
## Max. :20.1 Max. :7.5 Max. :8.80 Max. :15
## calidad
## Buena :3
## Regular:2
##
##
##
##
# Importar datos desde un archivo CSV
datos_macroinvert <- read.csv("macroinvertebrados.csv",
header = TRUE,
sep = ",",
stringsAsFactors = FALSE)
# Alternativa usando read.csv2 para archivos con ; como separador
datos_macroinvert <- read.csv2("macroinvertebrados.csv",
header = TRUE,
stringsAsFactors = FALSE)
# Exportar datos a CSV
write.csv(datos_campo, "datos_campo_exportados.csv", row.names = FALSE)## sitio temperatura ph oxigeno num_especies calidad
## 1 S1 18.5 7.2 8.2 12 Buena
## 2 S2 19.2 6.8 7.5 8 Regular
## 3 S3 17.8 7.5 8.8 15 Buena
## 4 S4 20.1 6.9 7.1 9 Regular
## 5 S5 18.9 7.1 8.0 11 Buena
## sitio temperatura ph oxigeno num_especies calidad
## 1 S1 18.5 7.2 8.2 12 Buena
## 2 S2 19.2 6.8 7.5 8 Regular
## 3 S3 17.8 7.5 8.8 15 Buena
## 4 S4 20.1 6.9 7.1 9 Regular
## 5 S5 18.9 7.1 8.0 11 Buena
## [1] 5 6
## [1] 5
## [1] 6
## [1] "sitio" "temperatura" "ph" "oxigeno" "num_especies"
## [6] "calidad"
## [1] "sitio" "temperatura" "ph" "oxigeno" "num_especies"
## [6] "calidad"
## [1] 18.5 19.2 17.8 20.1 18.9
## [1] 7.2 6.8 7.5 6.9 7.1
## temperatura ph
## 1 18.5 7.2
## 2 19.2 6.8
## 3 17.8 7.5
## 4 20.1 6.9
## 5 18.9 7.1
## sitio temperatura ph oxigeno num_especies calidad
## 1 S1 18.5 7.2 8.2 12 Buena
## 2 S2 19.2 6.8 7.5 8 Regular
## 3 S3 17.8 7.5 8.8 15 Buena
## sitio temperatura ph oxigeno num_especies calidad
## 2 S2 19.2 6.8 7.5 8 Regular
## 4 S4 20.1 6.9 7.1 9 Regular
# Agregar nuevas columnas
datos_campo$temp_categoria <- ifelse(datos_campo$temperatura > 19, "Alta", "Normal")
datos_campo$indice_diversidad <- datos_campo$num_especies / 10
# Mostrar resultado
head(datos_campo)## sitio temperatura ph oxigeno num_especies calidad temp_categoria
## 1 S1 18.5 7.2 8.2 12 Buena Normal
## 2 S2 19.2 6.8 7.5 8 Regular Alta
## 3 S3 17.8 7.5 8.8 15 Buena Normal
## 4 S4 20.1 6.9 7.1 9 Regular Alta
## 5 S5 18.9 7.1 8.0 11 Buena Normal
## indice_diversidad
## 1 1.2
## 2 0.8
## 3 1.5
## 4 0.9
## 5 1.1
## [1] 18.9
## [1] 18.9
## [1] "numeric"
## [1] 0.725
## [1] 0.8514693
## [1] 17.8 20.1
## [1] 0.7
## 0% 25% 50% 75% 100%
## 17.8 18.5 18.9 19.2 20.1
## 25% 75%
## 18.5 19.2
# Histograma
hist(datos_campo$temperatura,
main = "Distribución de Temperatura del Agua",
xlab = "Temperatura (°C)",
ylab = "Frecuencia",
col = "lightblue")# Gráfico de dispersión
plot(datos_campo$temperatura, datos_campo$num_especies,
main = "Relación Temperatura vs Número de Especies",
xlab = "Temperatura (°C)",
ylab = "Número de Especies",
pch = 16,
col = "red")
# Agregar línea de tendencia
abline(lm(num_especies ~ temperatura, data = datos_campo), col = "blue")# Boxplot
boxplot(temperatura ~ calidad, data = datos_campo,
main = "Temperatura por Calidad de Agua",
xlab = "Calidad de Agua",
ylab = "Temperatura (°C)",
col = c("lightcoral", "lightblue"))Aunque profundizaremos más adelante, aquí un ejemplo básico:
# Ejemplo con el paquete vegan
library(vegan)
# Calcular índice de Shannon
shannon <- diversity(datos_macro, index = "shannon")
print(shannon)
# Calcular índice de Simpson
simpson <- diversity(datos_macro, index = "simpson")
print(simpson)
# Riqueza de especies
riqueza <- specnumber(datos_macro)
print(riqueza)Crea una carpeta para cada proyecto
Estructura sugerida:
Proyecto_Macroinvertebrados/
├── datos/
├── scripts/
├── resultados/
└── figuras/# Buenas prácticas para nombrar variables
temperatura_agua <- 18.5 # Usar guión bajo
numero_especies <- 25 # Nombres descriptivos
fecha_muestreo <- "2024-03-15" # Evitar espacios y caracteres especiales
# Malas prácticas
`Temp Agua` <- 18.5 # Espacios requieren comillas
x <- 25 # Nombres no descriptivos# Siempre documenta tu código
# Autor: Tu nombre
# Fecha: 2024-03-15
# Propósito: Análisis de diversidad alfa de macroinvertebrados
# Cargar librerías necesarias
library(vegan)
library(ggplot2)
# Importar datos
datos <- read.csv("datos_macroinvertebrados.csv")
# Calcular índices de diversidad
shannon_index <- diversity(datos, index = "shannon") # Índice de ShannonCalcula la media, mediana y desviación estándar de las siguientes abundancias:
abundancias_ej <- c(23, 18, 31, 12, 27, 19, 25, 33, 21, 29)
# Tu código aquí:
media_abund <- mean(abundancias_ej)
mediana_abund <- median(abundancias_ej)
sd_abund <- sd(abundancias_ej)
print(paste("Media:", media_abund))## [1] "Media: 23.8"
## [1] "Mediana: 24"
## [1] "Desviación estándar: 6.49444206824403"
Crea un data frame con información de 5 sitios de muestreo incluyendo: sitio, coordenadas, altitud y tipo de sustrato.
# Ejemplo de solución:
sitios_ejercicio <- data.frame(
sitio = paste("Sitio", 1:5),
latitud = c(4.123, 4.145, 4.167, 4.189, 4.201),
longitud = c(-74.567, -74.589, -74.601, -74.623, -74.645),
altitud = c(2600, 2580, 2620, 2590, 2610),
sustrato = factor(c("Rocoso", "Arenoso", "Rocoso", "Limoso", "Arenoso"))
)
print(sitios_ejercicio)## sitio latitud longitud altitud sustrato
## 1 Sitio 1 4.123 -74.567 2600 Rocoso
## 2 Sitio 2 4.145 -74.589 2580 Arenoso
## 3 Sitio 3 4.167 -74.601 2620 Rocoso
## 4 Sitio 4 4.189 -74.623 2590 Limoso
## 5 Sitio 5 4.201 -74.645 2610 Arenoso
## 'data.frame': 5 obs. of 5 variables:
## $ sitio : chr "Sitio 1" "Sitio 2" "Sitio 3" "Sitio 4" ...
## $ latitud : num 4.12 4.14 4.17 4.19 4.2
## $ longitud: num -74.6 -74.6 -74.6 -74.6 -74.6
## $ altitud : num 2600 2580 2620 2590 2610
## $ sustrato: Factor w/ 3 levels "Arenoso","Limoso",..: 3 1 3 2 1
En las siguientes sesiones profundizaremos en:
Nota: Este documento fue creado en R Markdown. Para
generar el documento final, utiliza el botón “Knit” en RStudio o ejecuta
rmarkdown::render("nombre_archivo.Rmd") en la consola.
## R version 4.3.3 (2024-02-29 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 11 x64 (build 26100)
##
## Matrix products: default
##
##
## locale:
## [1] LC_COLLATE=Spanish_Spain.utf8 LC_CTYPE=Spanish_Spain.utf8
## [3] LC_MONETARY=Spanish_Spain.utf8 LC_NUMERIC=C
## [5] LC_TIME=Spanish_Spain.utf8
##
## time zone: America/Bogota
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## loaded via a namespace (and not attached):
## [1] digest_0.6.35 R6_2.6.1 fastmap_1.1.1 xfun_0.52
## [5] cachem_1.0.8 knitr_1.50 htmltools_0.5.8.1 rmarkdown_2.29
## [9] lifecycle_1.0.4 cli_3.6.2 sass_0.4.9 jquerylib_0.1.4
## [13] compiler_4.3.3 rstudioapi_0.16.0 tools_4.3.3 evaluate_0.23
## [17] bslib_0.7.0 yaml_2.3.8 rlang_1.1.3 jsonlite_1.8.8