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.
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.
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.

#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
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)
Realizar el agrupamiento de los datos del cuadro 1 por el método de ligamiento completo y promedio.
¿Qué es una matriz cofenética?
Indique cómo comparar distintas clasificaciones.
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)