Tratamiento de datos ecológicos

La búsqueda de estructuras ecológicas en estos conjuntos multidimensionales, está siempre basada en matrices de asociación. De aquí, todos los métodos involucran medidas de semejanza o coeficientes de asociación.

La información para el análisis de datos multivariados es una tabla de distintas variables o descriptores medidos en los elementos de un conjunto, en una serie de observaciones o unidades de muestreo. Es una matriz de n unidades de muestreo ×p variables.

Agrupamiento

Es una operación mediante la que un conjunto de objetos (o descriptores) es dividido en dos o más subconjuntos (grupos o clústers). ### Ordenación Es una operación mediante la cual los objetos (o descriptores) se ubican en un espacio de menos dimensiones de las que tenía el conjunto original.

Modos Q y R

Modo Q: “Entrando por las filas”, se busca relaciones entre objetos o unidades de muestreo. La medida de asociación es es la distancia o similitud entre pares de objetos (Distancia euclidiana, similitud de Jaccard).

La matriz secundaria de distancias o similitudes es una matriz cuadrada de n × n, y también se llama matriz de asociación o de proximidad

!(_UNLu\2022_eco3_2022_7_5_Legendre.jpg)

Modo R: “Entrando por las columnas”, se busca analizar la dependencia entre descriptores o variables. La medida de asociación es una medida de dependencia entre variables como la covarianza o la correlación.

La matriz de dependencia entre los descriptores o variables es una matriz cuadrada de p × p, y puede ser de covarianza o de correlación y en casos especiales también de distancias.

tabla 7.3 tabla 7.4

#Primero, construir la tabla

Unidad_de_muestreo<-c("p","q","r")
Especie1<-c(0,1,0)
Especie2<-c(1,0,4)
Especie3<-c(1,0,4)

Tabla1<-cbind(Unidad_de_muestreo,Especie1,Especie2,Especie3)
Tabla1<-data.frame(Tabla1, row.names = 1) #para que identifique que la primer fila es el nombre de cada columna
Tabla1
##   Especie1 Especie2 Especie3
## p        0        1        1
## q        1        0        0
## r        0        4        4

##Paradoja de Orloci

La distancia euclidiana, como medida de la asociación de sitios en base ala abundancia de las especies puede llevar a la paradoja de que dos sitios sin especies en común tengan menor distancia que otro par de sitios comparten especies

Unidad de muestreo Especie1 Especie2 Especie3 p 0 1 1 q 1 0 0 r 0 4 4

library(vegan)
## Loading required package: permute
## Loading required package: lattice
## This is vegan 2.6-2

Distancia euclidiana

Matriz de Distancia

Ejemplo

Dpq<-sqrt(((1-0)^2)+ ((0-1)^2) + ((0-1)^2)) #es igual a la raíz cuadrada de 3
Dpq #Distancia entre p y q
## [1] 1.732051
Dqr<-sqrt(((0-1)^2) + ((4-0)^2) + ((4-0)^2)) 
Dqr #Distancia entre q y r
## [1] 5.744563
Drp<-sqrt(((0-1)^2) + ((4-1)^2) + ((4-1)^2))  
Drp
## [1] 4.358899
Tabl_orloci<-cbind(Dpq,Dqr,Drp)
distt1<-dist(Tabla1)
distt1
##          p        q
## q 1.732051         
## r 4.242641 5.744563

Dos sitios que no comparten especies tienen menor dist que sitios que sí

Si bien la distancia euclideana puede aplicarse a matrices de presencia-ausencia, no es recomendable ya que presenta el problema de los “dobles ceros” (Legendre y Legendre 1998, Gagné y Proulx 2009). En la MBD de la Tabla 4.3 la distancia entre A y B es igual a dos, con una especie en común (especie 3), mientras que la distancia entre C y D también es igual a dos, a pesar de no tener especies en común. Esto se debe a su desarrollo matemático, ya que la diferencia entre especies compartidas (1 – 1) es igual a la diferencia entre ausencias compartidas (0 – 0) para los sitios en cuestión

Sitios<-c("p","q","r")
Sp1<-c(2,3,9)
Sp2<-c(5,5,1)
Sp3<-c(2,2,1)
Sp4<-c(5,4,1)
Sp5<-c(3,3,1)
bray<-cbind(Sitios,Sp1,Sp2,Sp3,Sp4,Sp5)

bray<-data.frame(bray, row.names = 1, colnames = 1)
str(bray)
## 'data.frame':    3 obs. of  6 variables:
##  $ Sp1     : chr  "2" "3" "9"
##  $ Sp2     : chr  "5" "5" "1"
##  $ Sp3     : chr  "2" "2" "1"
##  $ Sp4     : chr  "5" "4" "1"
##  $ Sp5     : chr  "3" "3" "1"
##  $ colnames: num  1 1 1
bray$Sp1<-as.numeric(bray$Sp1)#para que reconozca los valores como númericos
bray$Sp2<-as.numeric(bray$Sp2)
bray$Sp3<-as.numeric(bray$Sp3)
bray$Sp4<-as.numeric(bray$Sp4)
bray$Sp5<-as.numeric(bray$Sp5)
str(bray)
## 'data.frame':    3 obs. of  6 variables:
##  $ Sp1     : num  2 3 9
##  $ Sp2     : num  5 5 1
##  $ Sp3     : num  2 2 1
##  $ Sp4     : num  5 4 1
##  $ Sp5     : num  3 3 1
##  $ colnames: num  1 1 1

Calculo de distancia de Bray-Curtis

0 0.058 0.6 0 0.53 0

brayv2<-vegdist(bray)
brayv2
##            p          q
## q 0.05555556           
## r 0.56250000 0.50000000

Hay desigualdad triangular

Análisis descriptivo Datos Fisicoquímicos

Importar la tabla

library(readxl)
DatosTP12022fq <-read_excel("DatosTP1_2022 alumnos.xlsx", 
    sheet = "Tabla ambiental")
View(DatosTP12022fq)
names(DatosTP12022fq)
## [1] "Sitios"  "Muestra" "Dap"     "Poros"   "H%"      "P"       "MO"     
## [8] "CE"      "pH"
tapply(DatosTP12022fq$MO,DatosTP12022fq$Sitios,mean)
## Pastizal    Tambo 
##  5.29700 10.51467
tapply(DatosTP12022fq$`H%`,DatosTP12022fq$Sitios,mean)
##  Pastizal     Tambo 
##  8.109667 38.049667

Materia orgánica

library(readxl)
DatosTP12022fq <- read_excel("DatosTP1_2022 alumnos.xlsx", 
    sheet = "Tabla ambiental")
View(DatosTP12022fq)

Porosidad

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6      ✔ purrr   0.3.4 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.0      ✔ stringr 1.4.1 
## ✔ readr   2.1.2      ✔ forcats 0.5.2 
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
TablaMO<- DatosTP12022fq %>% group_by(Sitios) %>%
  summarise(sd = sd(MO, na.rm = T),
            mean = mean(MO, na.rm = T),
            range = paste(min(MO, na.rm = T), "-", max(MO, na.rm = T)),
            n = sum(!is.na(MO)))
write.table(TablaMO,file = "TablaMO.csv",sep = ",",row.names = T)
TablaCE<-DatosTP12022fq %>% group_by(Sitios) %>%
  summarise(sd = sd(CE, na.rm = T),
            mean = mean(CE, na.rm = T),
            range = paste(min(CE, na.rm = T), "-", max(CE, na.rm = T)),
            n = sum(!is.na(CE)))
write.table(TablaCE,file = "TablaCE.csv",sep = ",",row.names = T)
aggregate(DatosTP12022fq[,2:8],list(DatosTP12022fq$Sitios),mean)
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
##    Group.1 Muestra       Dap    Poros        H%        P       MO        CE
## 1 Pastizal      NA 1.2040000 54.57500  8.109667  90.9850  5.29700  184.7167
## 2    Tambo      NA 0.9593333 63.78833 38.049667 495.4547 10.51467 1173.8833
aggregate(DatosTP12022fq[,2:8],list(DatosTP12022fq$Sitios),sd)
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm =
## na.rm): NAs introducidos por coerción
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm =
## na.rm): NAs introducidos por coerción
##    Group.1 Muestra        Dap    Poros        H%        P        MO        CE
## 1 Pastizal      NA 0.19507178 7.370857 0.2163546 30.96893 0.5391141  14.03436
## 2    Tambo      NA 0.08793369 3.314568 6.5080312 44.98300 2.5287713 315.20595

Gráfico boxplot

boxplot(DatosTP12022fq$Dap~DatosTP12022fq$Sitios)

Con tidyverse

library(tidyverse)
library(hrbrthemes)
## NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
##       Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
##       if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
library(viridis)
## Loading required package: viridisLite
DatosTP12022fq$Sitios<-as.factor(DatosTP12022fq$Sitios)


DatosTP12022fq%>%
 ggplot( aes(x=Sitios, y=Dap, fill=Sitios)) +
     geom_boxplot() +
    scale_fill_viridis(discrete = TRUE, alpha=0.6) +
      theme_ipsum() +
    theme(
    legend.position="none",
      plot.title = element_text(size=11)
  ) +
   ggtitle("DAP por sitios") +
   xlab("")
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

Histogramas

hist(DatosTP12022fq$Dap)

hist(DatosTP12022fq$Poros)

hist(DatosTP12022fq$`H%`)

hist(DatosTP12022fq$P)

hist(DatosTP12022fq$CE)

hist(DatosTP12022fq$MO)

hist(DatosTP12022fq$pH)

Ver normalidad

shapiro.test(DatosTP12022fq$Dap)
## 
##  Shapiro-Wilk normality test
## 
## data:  DatosTP12022fq$Dap
## W = 0.88115, p-value = 0.2744
shapiro.test(DatosTP12022fq$Poros)
## 
##  Shapiro-Wilk normality test
## 
## data:  DatosTP12022fq$Poros
## W = 0.88178, p-value = 0.2773
shapiro.test(DatosTP12022fq$`H%`)
## 
##  Shapiro-Wilk normality test
## 
## data:  DatosTP12022fq$`H%`
## W = 0.80849, p-value = 0.06998
shapiro.test(DatosTP12022fq$P)
## 
##  Shapiro-Wilk normality test
## 
## data:  DatosTP12022fq$P
## W = 0.80966, p-value = 0.07167
shapiro.test(DatosTP12022fq$CE)
## 
##  Shapiro-Wilk normality test
## 
## data:  DatosTP12022fq$CE
## W = 0.83765, p-value = 0.1246
shapiro.test(DatosTP12022fq$MO)
## 
##  Shapiro-Wilk normality test
## 
## data:  DatosTP12022fq$MO
## W = 0.89921, p-value = 0.3693
shapiro.test(DatosTP12022fq$pH)
## 
##  Shapiro-Wilk normality test
## 
## data:  DatosTP12022fq$pH
## W = 0.84573, p-value = 0.1453

Todas dieron distribucion normal.

No se realizaron las transformaciones a logaritmo, del chunk siguiente:

lnp<-log(DatosTP12022fq$P)
shapiro.test(lnp)
## 
##  Shapiro-Wilk normality test
## 
## data:  lnp
## W = 0.84106, p-value = 0.133
qqnorm(lnp)

hist(lnp)

sqrtP <- sqrt(DatosTP12022fq$P)
shapiro.test(sqrtP)
## 
##  Shapiro-Wilk normality test
## 
## data:  sqrtP
## W = 0.82227, p-value = 0.09233
qqnorm(sqrtP)

hist(sqrtP)

# Homogeneidad de varianza
fligner.test(DatosTP12022fq$Dap~DatosTP12022fq$Sitios)
## 
##  Fligner-Killeen test of homogeneity of variances
## 
## data:  DatosTP12022fq$Dap by DatosTP12022fq$Sitios
## Fligner-Killeen:med chi-squared = 0.29317, df = 1, p-value = 0.5882

Las varianzas dentro de los sitios (El tambo es homogeneo y por otro lado, la pastura también) son menores que las varianzas entre cada sitio ( la varianza entre Tambo y Pastura es grande)

str(DatosTP12022fq)
## tibble [6 × 9] (S3: tbl_df/tbl/data.frame)
##  $ Sitios : Factor w/ 2 levels "Pastizal","Tambo": 1 1 1 2 2 2
##  $ Muestra: chr [1:6] "P1" "P2" "P3" "T1" ...
##  $ Dap    : num [1:6] 0.981 1.343 1.288 1.023 0.859 ...
##  $ Poros  : num [1:6] 63 49.3 51.4 61.4 67.6 ...
##  $ H%     : num [1:6] 7.94 8.04 8.35 38.28 44.44 ...
##  $ P      : num [1:6] 121.7 59.8 91.5 538.6 498.9 ...
##  $ MO     : num [1:6] 5.26 4.78 5.86 13.38 8.6 ...
##  $ CE     : num [1:6] 198 170 186 1478 1195 ...
##  $ pH     : num [1:6] 6.18 6.43 6.29 7.88 7.7 ...
cor(DatosTP12022fq[,3:9])
##              Dap      Poros         H%          P         MO         CE
## Dap    1.0000000 -0.9999980 -0.7334244 -0.7441712 -0.5076694 -0.6595555
## Poros -0.9999980  1.0000000  0.7323391  0.7432371  0.5068826  0.6585334
## H%    -0.7334244  0.7323391  1.0000000  0.9760976  0.8236614  0.9583945
## P     -0.7441712  0.7432371  0.9760976  1.0000000  0.9055518  0.9723237
## MO    -0.5076694  0.5068826  0.8236614  0.9055518  1.0000000  0.9354578
## CE    -0.6595555  0.6585334  0.9583945  0.9723237  0.9354578  1.0000000
## pH    -0.6231847  0.6219474  0.9757500  0.9793696  0.9037320  0.9796827
##               pH
## Dap   -0.6231847
## Poros  0.6219474
## H%     0.9757500
## P      0.9793696
## MO     0.9037320
## CE     0.9796827
## pH     1.0000000

Alta correlacion inversa entre Dap y Poro, porque a mayor densidad, menor sera la porosidad del suelo, ya que, la tierra estaria mas compactada.

Práctica Lagos

Importar la tabla de similitudes Luego transformarla en matriz de distancias

library(readxl)
Lagos <- read_excel("Lagos.xls")
View(Lagos)
Lagos <- data.frame(Lagos, row.names = 1)
Lagos<-as.matrix(Lagos)
Lagos<-1-as.dist(Lagos)
  1. Realizar el agrupamiento de los datos del cuadro 1 por el método de ligamiento completo y promedio.

  2. ¿Qué es una matriz cofenética?

  3. Indique cómo comparar distintas clasificaciones.

  4. Indique cuáles son los distintos tipos de técnicas de agrupamiento, y a qué tipo pertenece el método del ligamiento simple.

#agrupamiento
lagos.hclust<-hclust(Lagos,method="average")
plot(lagos.hclust)

lagos.hclust.s<-hclust(Lagos,method="single")
plot(lagos.hclust.s)

lagos.hclust.c<-hclust(Lagos,method="complete")
plot(lagos.hclust.c)