9  Actividad 2

9.1 Análisis en modo R

Existe el interés de explorar como cambian las condiciones abióticas del agua en distintas localidades de la costa nor-occidental de México, con la finalidad de explorar potenciales relaciones entre dichas variables, así como la similitud entre distintas localidades con base en sus condiciones abióticas. Las variables fueron: temperatura (°C), salinidad (ups), pH, oxígeno disuelto (mg/l), clorofila (mg/m\(^3\)), nitrito (mg/l). Los datos se encuentran en la pestaña ‘abiot’ del archivo ‘datosIAM.xlsx’.

  1. Importa los datos registrados, copiando el siguiente código. Identifica qué hace cada línea de comando. Examina el objeto que creaste y responde a las siguientes preguntas:
Código
#|eval: false
library(readxl)
dat <- read_excel("datosIAM.xlsx", sheet = "abiot")
dat
# A tibble: 6 × 6
   Temp  Oxig    pH Salin   Clor   NO2
  <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl>
1  27.0  5.02  8.87  75.8  36.5  0.153
2  29.8  4.68  9.27  82.3  14.4  0.163
3  24.2  2.35  7.76  12.5 307.   0.165
4  23.8  1.61  7.67  12.5 301.   0.19 
5  27.4  5.28  8.28  34.4   1.74 0.008
6  27.5  5.27  8.21  34.4   1.74 0.011
  1. ¿Cuántos descriptores están siendo usados para caracterizar las 6 localidades?
  2. ¿Son similares las escalas (y unidades) en las que están siendo medidas las variables abióticas? Explica.
  3. Aplica la función summary sobre el objeto dat y describe lo que obtienes. ¿Sirve esta información resumida para comprender cómo se correlacionan unas variables con otras?
  4. Copia el siguiente código para trasponer la matriz dat, y aplica la función summary sobre la nueva matriz dat.t. ¿Sirve esta información para comparar las localidades?
Código
#|eval: false
dat.t <- t(as.matrix(dat))
summary(dat.t)
       V1               V2               V3                V4         
 Min.   : 0.153   Min.   : 0.163   Min.   :  0.165   Min.   :  0.190  
 1st Qu.: 5.982   1st Qu.: 5.827   1st Qu.:  3.703   1st Qu.:  3.125  
 Median :17.960   Median :11.810   Median : 10.130   Median : 10.070  
 Mean   :25.555   Mean   :23.425   Mean   : 59.074   Mean   : 57.787  
 3rd Qu.:34.130   3rd Qu.:25.953   3rd Qu.: 21.312   3rd Qu.: 21.005  
 Max.   :75.750   Max.   :82.270   Max.   :307.420   Max.   :300.930  
       V5               V6        
 Min.   : 0.008   Min.   : 0.011  
 1st Qu.: 2.625   1st Qu.: 2.623  
 Median : 6.780   Median : 6.740  
 Mean   :12.861   Mean   :12.862  
 3rd Qu.:22.650   3rd Qu.:22.670  
 Max.   :34.420   Max.   :34.450  
  1. A partir de la observación detenida de ‘dat’, ¿puedes saber si algunas localidades están caracterizadas por ciertos valores de las variables (por ejemplo, salinidad alta, temp baja)?
  1. Usa la función stack para apilar la columnas (valores de variables) unas encima de otras. Esto te permitirá elaborar gráficas usando la función qplot (del paquete ggplot2) con la información contenida en dat. Para ello corre el código y sigue estas intrucciones:
Código
#|eval: false
library(ggplot2)
dat.s <- data.frame(stack(dat), loc = row.names(dat))
  1. Examina el objeto dat.s y describe a qué se refiere ind, values y loc.
  2. Copia el siguiente código e interpreta la gráfica de salida ¿Qué puedes decir sobre las diferencias en los valores de las variables para las distintas localidades? ¿Hay variables que varían conjuntamente?
Código
#|eval: false
qplot(
  data = dat.s,
  x = loc,
  y = values,
  group = ind,
  col = ind,
  shape = ind,
  geom = c("point", "line"),
  xlab = "Localidad",
  ylab = "Unidades de Medición"
)
Warning: `qplot()` was deprecated in ggplot2 3.4.0.

  1. Copia ahora el siguiente código e interpreta esta segunda gráfica. ¿Qué puedes decir sobre las diferencias entre localidades?¿Hay localidades que se parecen entre si por los valores de sus variables?
Código
#|eval: false
qplot(
  data = dat.s,
  x = ind,
  y = values,
  group = loc,
  col = loc,
  shape = loc,
  geom = c("point", "line"),
  xlab = "Variables",
  ylab = "Unidades de Medición"
) 

  1. ¿Cómo harías un resúmen de la información numérica y gráfica obtenida hasta ahora? ¿Puedes responder a alguna de las preguntas de los investigadores?
  1. Si obtuvieras una matriz con los valores de covariación entre todas las variables abióticas, considerando los valores en las 6 localidades:
  1. ¿Cuántas columnas y filas tendría dicha matriz? ¿Qué forma tendría?
  2. ¿Qué habría en la diagonal?
  3. Obtén ésta matriz de covariación usando la función cov y verifica tus respuestas.
  4. ¿Cuáles son las variables que se correlacionan directamente y cuáles los hacen inversamente? ¿Cuáles son las que están más fuertemente asociadas? Para ello usa la función cor.
  5. Aplica la función pairs a la matriz de correlaciones, y examina el resultado gráfico. ¿Cuáles son las unidades de los ejes en los gráficos obtenidos?

9.2 Medidas de distancias

  1. Obtén una matriz con las medidas de distancia Euclidiana entre todas las localidades considerando los valores de las 6 variables abióticas. Usa la función dist del paquete stats e identifica qué ocurre en cada una de las tres línea de comando.
Código
#|eval: false
dist(dat, method = "euclidean")
            1           2           3           4           5
2  23.2516365                                                
3 278.2441887 301.3247612                                    
4 271.9488582 295.0385787   6.5450229                        
5  54.0029650  49.5546479 306.4960111 300.0386989            
6  53.9811482  49.5246222 306.4984749 300.0412394   0.0917006
Código
dist(dat, method = "euclidean", diag = TRUE)
            1           2           3           4           5           6
1   0.0000000                                                            
2  23.2516365   0.0000000                                                
3 278.2441887 301.3247612   0.0000000                                    
4 271.9488582 295.0385787   6.5450229   0.0000000                        
5  54.0029650  49.5546479 306.4960111 300.0386989   0.0000000            
6  53.9811482  49.5246222 306.4984749 300.0412394   0.0917006   0.0000000
Código
dist(dat, method = "euclidean", diag = TRUE, upper = TRUE)
            1           2           3           4           5           6
1   0.0000000  23.2516365 278.2441887 271.9488582  54.0029650  53.9811482
2  23.2516365   0.0000000 301.3247612 295.0385787  49.5546479  49.5246222
3 278.2441887 301.3247612   0.0000000   6.5450229 306.4960111 306.4984749
4 271.9488582 295.0385787   6.5450229   0.0000000 300.0386989 300.0412394
5  54.0029650  49.5546479 306.4960111 300.0386989   0.0000000   0.0917006
6  53.9811482  49.5246222 306.4984749 300.0412394   0.0917006   0.0000000
  1. ¿qué ocurre en cada una de las tres línea de comando?
  2. ¿Cuántas columnas y filas tiene la matriz? ¿Qué forma tienen?
  3. ¿Qué hay en la diagonal?
  4. ¿Puedes decir qué localidades son las más y las menos similares entre si?
  5. Si aplicas la función sort al objeto resultante de dist puedes ordenar estos datos en una escala de distancia euclideana ¿Sirve esto a tu propósito de describir resumidamente las diferencias entre localidades?
  1. Copia el siguiente código para elaborar una gráfica tipo raster de la matriz de distancias euclideanas
Código
#|eval: false
DE <- dist(dat, method = "euclidean")
DE.s <- data.frame(stack(data.frame(as.matrix(DE))), loc = row.names(dat))
qplot(
  data = DE.s,
  x = ind,
  y = loc,
  fill = values,
  geom = c("raster", "text"),
  label = round(values, digits = 2),
  xlab = "Localidad",
  ylab = "Localidad",
  main = "Euclideana",
  size = 1
)

  1. ¿Qué ganaste con esta gráfica en términos de la descripción de los datos abióticos?
  2. Tomando en cuenta la información del objeto dat, identifica la variable que tiene más preponderancia para hacer que dos localidades se parezcan (o distingan). Explica tu respuesta.
  3. ¿Consideras que la distancia euclideana representa con fidelidad qué tanto se parecen 2 localidades por sus condiciones abióticas?
  1. Para ver el efecto de una estandarización de las variables sobre la distancia euclideana, aplica la función decostand de vegan siguiendo el código a continuación. El argumento standardize transforma cada medición en z-scores (ésta centra y divide entre desviación estandar) para volver las medidas comparables.
Código
#|eval: false
library(vegan)
Cargando paquete requerido: permute
Código
dat.stan<-decostand(dat, method = "standardize")
DE.stan <- dist(dat.stan, method = "euclidean")
DE.stan
          1         2         3         4         5
2 1.4360330                                        
3 3.8741736 4.8093617                              
4 4.2138160 5.1211188 0.5947203                    
5 2.4351772 3.1272060 3.7713289 4.2361738          
6 2.4559723 3.1555857 3.7357040 4.1983120 0.1200357
  1. Elabora el gráfico raster con la matriz de DE transformada, sustituyendo los nombres de los objetos en el código del numeral 5, y compara ambas gráficas. ¿Qué cambió?
Código
#|eval: false
#|include: false
DE.stan.s <- data.frame(stack(data.frame(as.matrix(DE.stan))), loc = row.names(dat))
qplot(
  data = DE.stan.s,
  x = ind,
  y = loc,
  fill = values,
  geom = c("raster", "text"),
  label = round(values, digits = 2),
  xlab = "Localidad",
  ylab = "Localidad",
  main = "Euclideana",
  size = 1
)

  1. ¿Cual de las dos formas de resumir la información te parece más realista?
  1. Para ver el efecto de distintas medidas de asociación sobre estos datos ambientales, obtén las distancias de Hellinger y Manhattan, a partir de la matriz dat y compara las matrices triangulares con la de DE.stan. Nota: para obtener la transformación de Hellinger, se aplica decostand a la matriz dat previo a obtener la euclideana. Si tienes dificultades usa la función help.
Código
#|eval: false
#|include: false
DH <- dist(decostand(dat, method = "hell"), method = "euclidean")
DM <- dist(dat, "manhattan")
  1. Copia el siguiente código para comparar los valores de las medidas usadas en esta actividad en términos de sus escalas relativas. ¿Cuáles fueron las diferencias y similitudes en la escala entre estas medidas de asociación?
Código
#|eval: false

par(mfrow = c(2, 2), mar = c(2, 4, 2, 2))
dotchart(as.vector(DE), main = "Euclideana")
dotchart(as.vector(DE.stan), main = "Euclideana (estandarizada)")
dotchart(as.vector(DH), main = "Hellinger")
dotchart(as.vector(DM), main = "Distancia Manhattan")

Código
par(mfrow = c(1, 1))
  1. Obtén las gráficas raster con base en las 4 medidas de asociación usadas en esta actividad para apoyar tu exploración. ¿Cuáles fueron las diferencias y similitudes en el agrupamiento de las localidades usando las distintas medidas de asociación?
Código
#|eval: false

DE.s <- data.frame(stack(data.frame(as.matrix(DE))), loc = row.names(dat))

p1<- qplot(
  data = DE.s,
  x = ind,
  y = loc,
  fill = values,
  geom = c("raster", "text"),
  label = round(values, digits = 2),
  xlab = "Localidad",
  ylab = "Localidad",
  main = "Euclideana",
  size = 1
)

DE.stan.s <- data.frame(stack(data.frame(as.matrix(DE.stan))), loc = row.names(dat))
p2 <- qplot(
  data = DE.stan.s,
  x = ind,
  y = loc,
  fill = values,
  geom = c("raster", "text"),
  label = round(values, digits = 2),
  xlab = "Localidad",
  ylab = "Localidad",
  main = "Euclideana (estandarizada)",
  size = 1
)
DE.stan.s
      values ind loc
1  0.0000000  X1   1
2  1.4360330  X1   2
3  3.8741736  X1   3
4  4.2138160  X1   4
5  2.4351772  X1   5
6  2.4559723  X1   6
7  1.4360330  X2   1
8  0.0000000  X2   2
9  4.8093617  X2   3
10 5.1211188  X2   4
11 3.1272060  X2   5
12 3.1555857  X2   6
13 3.8741736  X3   1
14 4.8093617  X3   2
15 0.0000000  X3   3
16 0.5947203  X3   4
17 3.7713289  X3   5
18 3.7357040  X3   6
19 4.2138160  X4   1
20 5.1211188  X4   2
21 0.5947203  X4   3
22 0.0000000  X4   4
23 4.2361738  X4   5
24 4.1983120  X4   6
25 2.4351772  X5   1
26 3.1272060  X5   2
27 3.7713289  X5   3
28 4.2361738  X5   4
29 0.0000000  X5   5
30 0.1200357  X5   6
31 2.4559723  X6   1
32 3.1555857  X6   2
33 3.7357040  X6   3
34 4.1983120  X6   4
35 0.1200357  X6   5
36 0.0000000  X6   6
Código
DH.s <- data.frame(stack(data.frame(as.matrix(DH))), loc = row.names(dat))
p3 <- qplot(
  data = DH.s,
  x = ind,
  y = loc,
  fill = values,
  geom = c("raster", "text"),
  label = round(values, digits = 2),
  xlab = "Localidad",
  ylab = "Localidad",
  main = "Hellinger",
  size = 1
)
DH.s
        values ind loc
1  0.000000000  X1   1
2  0.184709429  X1   2
3  0.711087737  X1   3
4  0.711653332  X1   4
5  0.401079272  X1   5
6  0.400850638  X1   6
7  0.184709429  X2   1
8  0.000000000  X2   2
9  0.877128261  X2   3
10 0.877488989  X2   4
11 0.261497794  X2   5
12 0.261068155  X2   6
13 0.711087737  X3   1
14 0.877128261  X3   2
15 0.000000000  X3   3
16 0.013579479  X3   4
17 1.008735120  X3   5
18 1.008735550  X3   6
19 0.711653332  X4   1
20 0.877488989  X4   2
21 0.013579479  X4   3
22 0.000000000  X4   4
23 1.010216671  X4   5
24 1.010210766  X4   6
25 0.401079272  X5   1
26 0.261497794  X5   2
27 1.008735120  X5   3
28 1.010216671  X5   4
29 0.000000000  X5   5
30 0.002335465  X5   6
31 0.400850638  X6   1
32 0.261068155  X6   2
33 1.008735550  X6   3
34 1.010210766  X6   4
35 0.002335465  X6   5
36 0.000000000  X6   6
Código
DM.s <- data.frame(stack(data.frame(as.matrix(DM))), loc = row.names(dat))
p4 <- qplot(
  data = DM.s,
  x = ind,
  y = loc,
  fill = values,
  geom = c("raster", "text"),
  label = round(values, digits = 2),
  xlab = "Localidad",
  ylab = "Localidad",
  main = "Manhattan",
  size = 1
)
DM.s
    values ind loc
1    0.000  X1   1
2   32.180  X1   2
3  340.772  X1   3
4  335.567  X1   4
5   77.465  X1   5
6   77.542  X1   6
7   32.180  X2   1
8    0.000  X2   2
9  372.252  X2   3
10 367.047  X2   4
11  64.585  X2   5
12  64.562  X2   6
13 340.772  X3   1
14 372.252  X3   2
15   0.000  X3   3
16   7.775  X3   4
17 334.397  X3   5
18 334.394  X3   6
19 335.567  X4   1
20 367.047  X4   2
21   7.775  X4   3
22   0.000  X4   4
23 329.192  X4   5
24 329.189  X4   6
25  77.465  X5   1
26  64.585  X5   2
27 334.397  X5   3
28 329.192  X5   4
29   0.000  X5   5
30   0.163  X5   6
31  77.542  X6   1
32  64.562  X6   2
33 334.394  X6   3
34 329.189  X6   4
35   0.163  X6   5
36   0.000  X6   6
Código
library(patchwork) #Con este paquete podemos acomodar gráficos generados con ggplot2

(p1 + p2) / (p3 + p4)

  1. Con base en los datos de la matriz dat ¿cuál medida escogerías para describir estos datos?