Estudio de caso. Peces Marinos de México

Estudio de caso 1
Autor/a
Afiliación

Gelen Juvinao, Alejandra Acosta, Isabella Ortiz y Anny Aldana.

Fecha de publicación

11 de septiembre de 2024

1. Base de datos

1.1. Contextualización

Variables biológicas: Factores o variables agrupadoras: Observaciones:

2. Componente teórico.

2.1. Introducción

2.2. Objetivos

2.3. Pregunta Investigativa

2.4. Bibliografía

3. Organización de la base de datos y exploración gráfica inicial

3.1 cargar las librerias

# Librerías requeridas


library(tidyverse)    # Para procedimientos de las bases de datos
library(readxl)       # Cargar bases de datos con Tidyverse
library(corrplot)     # Para figuras de elipses
library(vegan)        # Para el PCA y Transf. Hellinger
library(factoextra)   # Para el PCA
library(kableExtra)   # Para Editar las tablas

3.2 cargar base de datos

datos1 <- read_xlsx("DatosPecesMexicanos.xlsx","organizados")   # paquete "readxl"
View(datos1)
# Variables biológicas
spe <- datos1[,7:96]
head(spe)
# A tibble: 6 × 90
  `Hypanus sabinus` `Atractosteus spatula` `Elops saurus` `Megalops atlanticus`
              <dbl>                  <dbl>          <dbl>                 <dbl>
1                 0                      0              0                     0
2                 0                      0              0                     0
3                 0                      0              0                     0
4                 0                      0              0                     0
5                 0                      0              0                     0
6                 0                      0              0                     0
# ℹ 86 more variables: `Albula vulpes` <dbl>, `Anguila rostrata` <dbl>,
#   `Myrophis punctatus` <dbl>, `Anchoa mitchilli` <dbl>,
#   `Anchoa hepsetus` <dbl>, `Brevoortia gunteri` <dbl>,
#   `Brevoortia patronus` <dbl>, `Dorosoma cepedianum` <dbl>,
#   `Dorosoma petenense` <dbl>, `Harengula jaguana` <dbl>,
#   `Opisthonema oglinum` <dbl>, `Campostoma anomalum` <dbl>,
#   `Cyprinella lutrensis` <dbl>, `Cyprinus carpio` <dbl>, …
# Variables ambientales
amb <- datos1[,2:6]
head(amb)
# A tibble: 6 × 5
  Altitude Conductivity Salinity   TDS Turbidez
     <dbl>        <dbl>    <dbl> <dbl>    <dbl>
1      455         361      2      219     0   
2      773         475      2      317     0   
3      594         462.     2      100     0   
4      444         533.     1.67   211     0.67
5      632         388      2.5    100     1   
6      530         301      2      100     1   

3.3 Extraer las 15 especies más abundantes

3.3.1 Filtrado con comandos generales

# Extraer los promedios de las abundancias
prom = colMeans(spe)

# Extraer las 15 especies más abundantes 
# FALSE muestra las 15 menos abundantes
ab <- names(sort(prom, decreasing = TRUE)[1:15])

# Crear un nuevo dataframe con las dos columnas seleccionadas
spe.ab <- data.frame(datos1[, ab])
# Otra opción de dataframe: spe.ab <- datos1[, ab]

head(spe.ab)
  Poecilia.mexicana Astyanax..mexicanus Herichthys.cyanoguttatus
1                21                  32                        4
2                 0                   0                        3
3                 0                  76                        0
4               432                  41                      143
5               210                  55                        5
6               333                  47                       73
  Gambusia.regani Poecilia.formosa Notropis.aguirrepequeñoi Gambusia.affinis
1               0                5                        0                0
2               0                0                        0                0
3               0                0                        0                0
4               1                0                       48                0
5               0                0                       76                0
6               0                0                      250               14
  Gambusia.sp. Micropterus.spp. Aplodinotus.grunniens Dorosoma.petenense
1            0               14                     0                  0
2            0                0                     0                  0
3            0                0                     0                  0
4            0                0                     0                  0
5            0                0                     0                  0
6            0                0                     0                  0
  Oreochromis.aureus Moxostoma.congestum Dorosoma.cepedianum Ariopsis.felis
1                  0                   0                   0              0
2                  0                   0                   0              0
3                  0                   0                   0              0
4                  0                  56                   0              0
5                  0                  17                   0              0
6                  0                  18                   0              0

3.3.2 Filtrado con comandos del tidyverse

# Extraer los promedios de las abundancias
prom <- spe %>%
  summarise_all(mean)

# Obtener los nombres de las 15 especies más abundantes
ab <- prom %>%
  pivot_longer(cols = everything()) %>%
  arrange(desc(value)) %>%
  slice(1:15) %>%
  pull(name)

# Crear un nuevo dataframe con las dos columnas seleccionadas
spe_ab <- datos1 %>%
  select(all_of(ab))

# Mostrar las primeras filas del nuevo dataframe
head(spe_ab)
# A tibble: 6 × 15
  `Poecilia mexicana` `Astyanax  mexicanus` `Herichthys cyanoguttatus`
                <dbl>                 <dbl>                      <dbl>
1                  21                    32                          4
2                   0                     0                          3
3                   0                    76                          0
4                 432                    41                        143
5                 210                    55                          5
6                 333                    47                         73
# ℹ 12 more variables: `Gambusia regani` <dbl>, `Poecilia formosa` <dbl>,
#   `Notropis aguirrepequeñoi` <dbl>, `Gambusia affinis` <dbl>,
#   `Gambusia sp.` <dbl>, `Micropterus spp.` <dbl>,
#   `Aplodinotus grunniens` <dbl>, `Dorosoma petenense` <dbl>,
#   `Oreochromis aureus` <dbl>, `Moxostoma congestum` <dbl>,
#   `Dorosoma cepedianum` <dbl>, `Ariopsis felis` <dbl>

4. Exploración de relaciones

4.1 elipses para las mas abundantes

# Elipses para especies
# Elipses para especies
M1 <- cor(spe.ab)            # Matriz de Correlación (M)

#| label: fig-fig1
#| fig-cap: Relaciones entre parejas de variables ficoquímicas y biológicas, las elipses azules representan a las relaciones lineales positivas y las rojas a las relaciones negativas.
#Elipses con colores
corrplot(M1, method = "ellipse", title = "Relaciones entre parejas de variables ficoquímicas y biológicas", mar = c(0,0,2,0)) 

# Selección de variables numéricas
str(amb)
tibble [43 × 5] (S3: tbl_df/tbl/data.frame)
 $ Altitude    : num [1:43] 455 773 594 444 632 530 509 520 501 447 ...
 $ Conductivity: num [1:43] 361 475 462 533 388 ...
 $ Salinity    : num [1:43] 2 2 2 1.67 2.5 2 2 3 2 1 ...
 $ TDS         : num [1:43] 219 317 100 211 100 ...
 $ Turbidez    : num [1:43] 0 0 0 0.67 1 1 1 0 0 1 ...

5. Técnica de PCA - factoExtra

5.1 Linealización de las abundancias

# Siete primeros Taxones transformados con Hellinger
spe.hel= decostand(spe,"hellinger")
round(head(spe.hel[,1:7]),2)
  Hypanus sabinus Atractosteus spatula Elops saurus Megalops atlanticus
1               0                    0            0                   0
2               0                    0            0                   0
3               0                    0            0                   0
4               0                    0            0                   0
5               0                    0            0                   0
6               0                    0            0                   0
  Albula vulpes Anguila rostrata Myrophis punctatus
1             0                0                  0
2             0                0                  0
3             0                0                  0
4             0                0                  0
5             0                0                  0
6             0                0                  0

5.2 PCA para variables ambientales

# str(amb)
# Rangos de prof a factor
amb$`Altitude`=as.factor(amb$`Altitude`)
str(amb)
tibble [43 × 5] (S3: tbl_df/tbl/data.frame)
 $ Altitude    : Factor w/ 42 levels "2","7","11","17",..: 32 42 38 30 39 37 34 36 33 31 ...
 $ Conductivity: num [1:43] 361 475 462 533 388 ...
 $ Salinity    : num [1:43] 2 2 2 1.67 2.5 2 2 3 2 1 ...
 $ TDS         : num [1:43] 219 317 100 211 100 ...
 $ Turbidez    : num [1:43] 0 0 0 0.67 1 1 1 0 0 1 ...
pca1 <- prcomp(amb[,2:5],scale.=T)
summary(pca1)
Importance of components:
                          PC1    PC2    PC3     PC4
Standard deviation     1.5654 0.9092 0.7253 0.44379
Proportion of Variance 0.6126 0.2066 0.1315 0.04924
Cumulative Proportion  0.6126 0.8193 0.9508 1.00000
fviz_pca_ind(pca1,
             geom.ind = "point",                   # Representar con puntos
             col.ind = amb$`Altitude`,             # Color por grupos (en este caso, Altitud)
             palette = "set3",                     # Definir colores personalizados
             addEllipses = TRUE,                   # Agregar elipses
             legend.title = "Species"              # Título de la leyenda
             ) + 
  ggtitle("Distribución de especies basada en análisis de componentes principales (PCA) con símbolos diferenciados")

# str(amb)
# Rangos de prof a factor
amb$`Turbidez`=as.factor(amb$`Turbidez`)
str(amb)
tibble [43 × 5] (S3: tbl_df/tbl/data.frame)
 $ Altitude    : Factor w/ 42 levels "2","7","11","17",..: 32 42 38 30 39 37 34 36 33 31 ...
 $ Conductivity: num [1:43] 361 475 462 533 388 ...
 $ Salinity    : num [1:43] 2 2 2 1.67 2.5 2 2 3 2 1 ...
 $ TDS         : num [1:43] 219 317 100 211 100 ...
 $ Turbidez    : Factor w/ 5 levels "0","0.67","1",..: 1 1 1 2 3 3 3 1 1 3 ...
pca2 <- prcomp(amb[,2:4],scale.=T)
summary(pca2)
Importance of components:
                          PC1    PC2     PC3
Standard deviation     1.4500 0.8263 0.46343
Proportion of Variance 0.7008 0.2276 0.07159
Cumulative Proportion  0.7008 0.9284 1.00000
fviz_pca_ind(pca2,
             geom.ind = "point",                   # Representar con puntos
             col.ind = amb$`Turbidez`,             # Color por grupos (en este caso, Turbidez)
             palette = "set3",                     # Definir colores personalizados
             addEllipses = TRUE,                   # Agregar elipses
             legend.title = "Species"              # Título de la leyenda
             ) + 
  ggtitle("Análisis PCA de especies con elipses de confianza para evaluar la variabilidad grupal")
Too few points to calculate an ellipse

5.3

# Check data types
str(amb)
tibble [43 × 5] (S3: tbl_df/tbl/data.frame)
 $ Altitude    : Factor w/ 42 levels "2","7","11","17",..: 32 42 38 30 39 37 34 36 33 31 ...
 $ Conductivity: num [1:43] 361 475 462 533 388 ...
 $ Salinity    : num [1:43] 2 2 2 1.67 2.5 2 2 3 2 1 ...
 $ TDS         : num [1:43] 219 317 100 211 100 ...
 $ Turbidez    : Factor w/ 5 levels "0","0.67","1",..: 1 1 1 2 3 3 3 1 1 3 ...
sapply(amb, class)
    Altitude Conductivity     Salinity          TDS     Turbidez 
    "factor"    "numeric"    "numeric"    "numeric"     "factor" 
# Convert non-numeric columns to numeric (if appropriate) or exclude them
numeric_amb <- amb[, sapply(amb, is.numeric)]

# Handle missing values (if any)
numeric_amb <- na.omit(numeric_amb)
# Perform PCA
pca3 <- rda(numeric_amb, scale = TRUE)

# View summary of PCA results
summary(pca3)

Call:
rda(X = numeric_amb, scale = TRUE) 

Partitioning of correlations:
              Inertia Proportion
Total               3          1
Unconstrained       3          1

Eigenvalues, and their contribution to the correlations 

Importance of components:
                         PC1    PC2     PC3
Eigenvalue            2.1025 0.6827 0.21477
Proportion Explained  0.7008 0.2276 0.07159
Cumulative Proportion 0.7008 0.9284 1.00000
biplot(pca3, main = "Relación entre sitios y variables ambientales mediante análisis de componentes principales (PCA)")