1 Introducción

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.

2 Instalación de R y RStudio

2.1 Instalación de R

R es el lenguaje de programación y entorno estadístico que utilizaremos. Para instalarlo:

2.1.1 Windows

  1. Visita https://cran.r-project.org/
  2. Haz clic en “Download R for Windows”
  3. Selecciona “base”
  4. Descarga la versión más reciente (R-4.x.x-win.exe)
  5. Ejecuta el instalador y sigue las instrucciones por defecto

2.1.2 macOS

  1. Visita https://cran.r-project.org/
  2. Haz clic en “Download R for macOS”
  3. Descarga el archivo .pkg apropiado para tu versión de macOS
  4. Ejecuta el instalador

2.1.3 Linux (Ubuntu/Debian)

sudo apt update
sudo apt install r-base r-base-dev

2.2 Instalación de RStudio

RStudio es un entorno de desarrollo integrado (IDE) que facilita el trabajo con R.

  1. Visita https://www.rstudio.com/products/rstudio/download/
  2. Descarga RStudio Desktop (versión gratuita)
  3. Selecciona la versión apropiada para tu sistema operativo
  4. Ejecuta el instalador

2.3 Verificación de la instalación

Una vez instalados R y RStudio:

  1. Abre RStudio
  2. En la consola (panel inferior izquierdo), escribe:
# Verificar versión de R
R.version.string

# Realizar una operación simple
2 + 2

Si ves el resultado [1] 4, ¡la instalación fue exitosa!

3 Conociendo RStudio

RStudio se divide en cuatro paneles principales:

3.1 Panel 1: Editor de Scripts (Superior Izquierdo)

  • Aquí escribes y editas tus scripts de R
  • Para crear un nuevo script: File > New File > R Script (Ctrl+Shift+N)

3.2 Panel 2: Consola (Inferior Izquierdo)

  • Donde se ejecutan los comandos
  • Muestra los resultados y mensajes

3.3 Panel 3: Environment/History (Superior Derecho)

  • Environment: Muestra objetos en la memoria
  • History: Historial de comandos ejecutados

3.4 Panel 4: Files/Plots/Packages/Help (Inferior Derecho)

  • Files: Explorador de archivos
  • Plots: Visualización de gráficos
  • Packages: Gestión de paquetes
  • Help: Documentación y ayuda

4 Conceptos Básicos de R

4.1 Mi primer script en R

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!"

4.2 Operaciones básicas

R puede utilizarse como una calculadora:

# Operaciones aritméticas básicas
2 + 3    # Suma
## [1] 5
10 - 4   # Resta
## [1] 6
5 * 6    # Multiplicación
## [1] 30
20 / 4   # División
## [1] 5
2^3      # Potenciación
## [1] 8
sqrt(16) # Raíz cuadrada
## [1] 4

4.3 Asignación de variables

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
temperatura_agua
## [1] 18.5
sitio_muestreo
## [1] "Río Magdalena"

4.4 Tipos de datos básicos

# Tipos de datos
entero <- 10L                    # Integer
numerico <- 3.14                 # Numeric
caracter <- "Ephemeroptera"      # Character
logico <- TRUE                   # Logical

# Verificar el tipo de dato
class(entero)
## [1] "integer"
class(numerico)
## [1] "numeric"
class(caracter)
## [1] "character"
class(logico)
## [1] "logical"

5 Estructuras de Datos

5.1 Vectores

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"
abundancias
## [1] 15  8 23 12
# Acceder a elementos específicos
especies[1]        # Primer elemento
## [1] "Baetis"
abundancias[2:4]   # Elementos del 2 al 4
## [1]  8 23 12
especies[c(1,3)]   # Elementos 1 y 3
## [1] "Baetis"     "Chironomus"

5.2 Factores

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
levels(calidad_agua)
## [1] "Mala"    "Regular" "Buena"

5.3 Matrices

# 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
# Acceder a elementos
datos_macro[1, 2]      # Fila 1, columna 2
## [1] 8
datos_macro[, 1]       # Toda la columna 1
## Sitio_1 Sitio_2 Sitio_3 
##      15      12      20
datos_macro[1, ]       # Toda la fila 1
##      Baetis    Simulium  Chironomus Hydropsyche 
##          15           8          23          12

5.4 Data Frames

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
# Estructura del data frame
str(datos_campo)
## '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
# Resumen estadístico
summary(datos_campo)
##     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  
##             
##             
##             
## 

6 Importación y Exportación de Datos

6.1 Trabajando con archivos CSV

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

6.2 Exploración inicial de datos

# Primeras filas
head(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
# Últimas filas  
tail(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
# Dimensiones
dim(datos_campo)
## [1] 5 6
nrow(datos_campo)
## [1] 5
ncol(datos_campo)
## [1] 6
# Nombres de columnas
names(datos_campo)
## [1] "sitio"        "temperatura"  "ph"           "oxigeno"      "num_especies"
## [6] "calidad"
colnames(datos_campo)
## [1] "sitio"        "temperatura"  "ph"           "oxigeno"      "num_especies"
## [6] "calidad"

7 Manipulación Básica de Datos

7.1 Selección de datos

# Seleccionar columnas
datos_campo$temperatura          # Una columna
## [1] 18.5 19.2 17.8 20.1 18.9
datos_campo[, "ph"]             # Una columna alternativa
## [1] 7.2 6.8 7.5 6.9 7.1
datos_campo[, c("temperatura", "ph")]  # Múltiples columnas
##   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
# Seleccionar filas
datos_campo[1:3, ]              # Primeras 3 filas
##   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
datos_campo[datos_campo$temperatura > 19, ]  # Filas con condición
##   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

7.2 Creación de nuevas variables

# 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

8 Estadística Descriptiva Básica

# Medidas de tendencia central
mean(datos_campo$temperatura)    # Media
## [1] 18.9
median(datos_campo$temperatura)  # Mediana
## [1] 18.9
mode(datos_campo$calidad)       # Moda (para factores)
## [1] "numeric"
# Medidas de dispersión
var(datos_campo$temperatura)     # Varianza
## [1] 0.725
sd(datos_campo$temperatura)      # Desviación estándar
## [1] 0.8514693
range(datos_campo$temperatura)   # Rango
## [1] 17.8 20.1
IQR(datos_campo$temperatura)     # Rango intercuartílico
## [1] 0.7
# Cuantiles
quantile(datos_campo$temperatura)
##   0%  25%  50%  75% 100% 
## 17.8 18.5 18.9 19.2 20.1
quantile(datos_campo$temperatura, c(0.25, 0.75))
##  25%  75% 
## 18.5 19.2

9 Visualización Básica

9.1 Gráficos básicos

# 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"))

10 Instalación y Uso de Paquetes

10.1 Instalación de paquetes esenciales para ecología

# Instalar paquetes (solo se hace una vez)
install.packages(c("vegan", "ggplot2", "dplyr", "readr", "tidyr"))

# Para paquetes de Bioconductor
if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
BiocManager::install("phyloseq")

10.2 Cargar paquetes

# Cargar paquetes (se hace en cada sesión)
library(vegan)      # Análisis de diversidad
library(ggplot2)    # Gráficos avanzados
library(dplyr)      # Manipulación de datos
library(readr)      # Importación de datos

11 Funciones Básicas para Diversidad Alfa

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)

12 Buenas Prácticas

12.1 Organización de proyectos

  1. Crea una carpeta para cada proyecto

  2. Estructura sugerida:

    Proyecto_Macroinvertebrados/
    ├── datos/
    ├── scripts/
    ├── resultados/
    └── figuras/

12.2 Nomenclatura de archivos y variables

# 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

12.3 Comentarios y documentación

# 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 Shannon

13 Guardar y Cargar el Trabajo

13.1 Guardar objetos

# Guardar objetos individuales
save(datos_campo, file = "datos_campo.RData")

# Guardar múltiples objetos
save(datos_campo, datos_macro, file = "datos_completos.RData")

# Guardar toda la sesión
save.image("sesion_completa.RData")

13.2 Cargar objetos

# Cargar objetos guardados
load("datos_campo.RData")
load("sesion_completa.RData")

14 Obtener Ayuda

# Diferentes formas de obtener ayuda
?mean              # Ayuda sobre una función específica
help(mean)         # Equivalente a ?mean
??diversity        # Buscar en toda la documentación
help.search("diversity")  # Equivalente a ??diversity

# Ejemplos de uso
example(mean)

# Ayuda sobre un paquete
help(package = "vegan")

15 Ejercicios Prácticos

15.1 Ejercicio 1: Operaciones básicas

Calcula 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"
print(paste("Mediana:", mediana_abund))
## [1] "Mediana: 24"
print(paste("Desviación estándar:", sd_abund))
## [1] "Desviación estándar: 6.49444206824403"

15.2 Ejercicio 2: Creación de data frame

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
str(sitios_ejercicio)
## '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

16 Recursos Adicionales

16.1 Libros recomendados

  • “R for Data Science” por Hadley Wickham
  • “The R Book” por Michael Crawley
  • “Numerical Ecology with R” por Borcard, Gillet & Legendre

17 Próximos Pasos

En las siguientes sesiones profundizaremos en:

  1. Análisis de diversidad alfa específico para macroinvertebrados
  2. Uso del paquete vegan para cálculos ecológicos
  3. Visualización avanzada con ggplot2
  4. Análisis estadísticos para comparar diversidad entre sitios
  5. Interpretación ecológica en el contexto del cambio climático

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.

# Información de la sesión
sessionInfo()
## 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