Del mismo modo que buscamos separar los animales de las plantas en función de sus características e inclusive, el acto de diferenciar y clasificar a los animales según su genero o especie, la clasificación de zonas homogéneas responde a una característica básicas del ser humano, la de querer encasillar cada cosa dentro de alguna categoría.
Figura 1: Clasificación de elementos.
Un ejemplo de esto es la clasificación por geometría que se define para objetos espaciales. en geomática es posible distinguir 3 tipos de geometrías del modelo vectorial para el análisis espacial, estos corresponden a puntos, líneas y polígonos, los cuales hacen referencia a elementos con características particulares y su respectiva representación en el espacio, los polígonos representan elementos bidimensionales superficies, las líneas representan elementos unidimensionales como calles o ríos, mientras que los puntos representarán la posición de algún objeto en el espacio, como, un individuo, el centro de una ciudad e incluso la presencia de algún evento.
Figura 2: Clasificación de elementos espaciales según su geometría.
Desde la antigüedad que el ser humano pretende diferenciar un lugar de otro, tal vez en función de las lenguas que se hablan, de los animales que la habitan, de su cobertura vegetacional, sus características fisiográficas o sus variables climáticas. En este sentido, no han faltado quienes han pretendido desarrollar atlas de caracterización climática o vegetacional distinguiendo zonas bien delimitadas según las variables involucradas en dichos procesos.
Figura 3: Clasificación climatica de Köppen en Europa.
Bajo esta misma lógica viene a colación el hablar del análisis de conglomerados, análisis de cluster o clustering, el cual se trata de un método no paramétrico de cartacter exploratorio o descriptivo, que detecta patrones de agrupación entre observaciones de acuerdo con sus similitudes y/o diferencias, buscando clasificar cualquier tipo de objetos según sus características.
Los objetos a clasificar deben tener por lo menos características cualitativas o cuantitativas, las cuales permitirán su clasificación, la cual debe lograr maximizar la diferencia entre grupos y minimiza la diferencia intergrupo, es decir, una máxima homogeneidad o similitud entre los objetos agrupados y una gran diferencia entre los grupos, teniendo en cuanta siempre que este método no permite hacer inferencia estadística de una población con respecto a una muestra.
Para llevar a cabo este procedimiento se deben seguir una serie de pasos consecutivos que permitan su correcto desarrollo. El primer paso consiste en consolidar una matriz o marco de datos de los objetos a clasificar con una cantidad y calidad adecuada de variables.Posterior a esto, es necesario construir una matriz de distancia o medidas de similitud con la cual comparar los distintos registros de la base de datos para luego elegir un método adecuado de conglomeración y finalmente, validar el proceso de conglomerado
Cómo se comentó anteriormente la construcción del marco de datos es primordial para la realización del análisis de conglomerados. Se requiere una base de datos que cuente con una estructura bien definida, en la que las distintas variables están dispuestas en columnas y los registros en filas, a continuación se expresa el procedimiento para importar y generar un marco de datos adecuado para el análisis.
Existe un gran número de formatos en que se puede importar datos, un ejemplo de estos es el ya conocido csv (Comma Separated Values), o el versátil xlsx de Excel. Para estos ejemplos utilizaremos los materiales encontrados en el repositorio https://github.com/djwillichile/EARN2/tree/main/DATA, también pueden acceder a todo el material utilizado para esta actividad mediante el siguiente enlace.
Este método es uno de los más sencillos de implementar y a la vez, el que permite más formas distintas de realizarlo. utilizaremos el archivo PPM_stat.csv
# Asignamos al objeto "path" la ruta del archivo que utilizaremos
path <- "DATA"
# Asignamos al objeto "file" el nombre del archivo que utilizaremos
file <- "PPM_stat.csv"
# ruta completa del archivo
fileString <- paste0(path,"/",file)
fileString## [1] "DATA/PPM_stat.csv"
# Leemos el archivo mediante la función "read.csv"
Prec <- read.csv(file = fileString)
# Es posible observar una porcion de los datos cargados
head(Prec)## Code Name Lon Lat Alt Jan Feb Mar Apr
## 1 806 MOQUEGUA -70.93167 -17.16917 1420 2.281 2.790 0.986 0.229
## 2 807 CALANA -70.18611 -17.94889 848 2.176 2.600 1.310 0.376
## 3 822 ISLA SUANA -68.85094 -16.33022 3830 198.276 181.810 119.243 45.314
## 4 846 PUNTA COLES -71.37361 -17.69867 30 0.400 1.181 0.105 0.010
## 5 853 LOCUMBA -70.76222 -17.60972 559 0.829 1.633 0.362 0.248
## 6 860 CHUAPALCA -69.64361 -17.30500 4250 113.700 124.952 69.686 17.567
## May Jun Jul Aug Sep Oct Nov Dec Anual
## 1 0.105 0.055 0.205 0.050 0.145 0.035 0.050 0.265 7.157
## 2 0.490 1.315 1.740 1.925 1.950 0.280 0.520 0.865 15.138
## 3 13.333 7.095 11.675 15.325 21.540 34.530 44.160 111.035 791.652
## 4 0.057 0.245 0.810 0.435 0.955 0.205 0.065 0.165 4.495
## 5 0.138 0.185 0.295 0.080 0.170 0.020 0.055 0.205 4.171
## 6 2.433 1.525 3.390 4.485 1.725 6.740 14.745 60.185 416.714
Cabe destacar que es posible leer estos datos utilizando también la función read.table() o read.delim()
# Leemos el archivo mediante la función "read.table"
Prec <- read.table(file = fileString,sep = ",",dec = ".",header = T)
head(Prec)## Code Name Lon Lat Alt Jan Feb Mar Apr
## 1 806 MOQUEGUA -70.93167 -17.16917 1420 2.281 2.790 0.986 0.229
## 2 807 CALANA -70.18611 -17.94889 848 2.176 2.600 1.310 0.376
## 3 822 ISLA SUANA -68.85094 -16.33022 3830 198.276 181.810 119.243 45.314
## 4 846 PUNTA COLES -71.37361 -17.69867 30 0.400 1.181 0.105 0.010
## 5 853 LOCUMBA -70.76222 -17.60972 559 0.829 1.633 0.362 0.248
## 6 860 CHUAPALCA -69.64361 -17.30500 4250 113.700 124.952 69.686 17.567
## May Jun Jul Aug Sep Oct Nov Dec Anual
## 1 0.105 0.055 0.205 0.050 0.145 0.035 0.050 0.265 7.157
## 2 0.490 1.315 1.740 1.925 1.950 0.280 0.520 0.865 15.138
## 3 13.333 7.095 11.675 15.325 21.540 34.530 44.160 111.035 791.652
## 4 0.057 0.245 0.810 0.435 0.955 0.205 0.065 0.165 4.495
## 5 0.138 0.185 0.295 0.080 0.170 0.020 0.055 0.205 4.171
## 6 2.433 1.525 3.390 4.485 1.725 6.740 14.745 60.185 416.714
# Leemos el archivo mediante la función "read.delim"
Prec <- read.delim(file = fileString,sep = ",",dec = ".",header = T)
head(Prec)## Code Name Lon Lat Alt Jan Feb Mar Apr
## 1 806 MOQUEGUA -70.93167 -17.16917 1420 2.281 2.790 0.986 0.229
## 2 807 CALANA -70.18611 -17.94889 848 2.176 2.600 1.310 0.376
## 3 822 ISLA SUANA -68.85094 -16.33022 3830 198.276 181.810 119.243 45.314
## 4 846 PUNTA COLES -71.37361 -17.69867 30 0.400 1.181 0.105 0.010
## 5 853 LOCUMBA -70.76222 -17.60972 559 0.829 1.633 0.362 0.248
## 6 860 CHUAPALCA -69.64361 -17.30500 4250 113.700 124.952 69.686 17.567
## May Jun Jul Aug Sep Oct Nov Dec Anual
## 1 0.105 0.055 0.205 0.050 0.145 0.035 0.050 0.265 7.157
## 2 0.490 1.315 1.740 1.925 1.950 0.280 0.520 0.865 15.138
## 3 13.333 7.095 11.675 15.325 21.540 34.530 44.160 111.035 791.652
## 4 0.057 0.245 0.810 0.435 0.955 0.205 0.065 0.165 4.495
## 5 0.138 0.185 0.295 0.080 0.170 0.020 0.055 0.205 4.171
## 6 2.433 1.525 3.390 4.485 1.725 6.740 14.745 60.185 416.714
Así como importamos la base de datos a partir de un csv que contenía la información, también es posible utilizar distintas extensiones de archivos, como por ejemplo los textos delimitados por tabulación (txt), el texto delimitado por tabulación no necesita de paquetes externos al de r base para su importación.
# Asignamos al objeto "fileStrig" ruta completa del archivo
fileString <- "DATA/PPM_stat.txt"
# Leemos el archivo mediante la función "read.table"
Prec <- read.table(file = fileString,sep = "\t",dec = ".",header = T)
head(Prec)## Code Name Lon Lat Alt Jan Feb Mar Apr
## 1 806 MOQUEGUA -70.93167 -17.16917 1420 2.281 2.790 0.986 0.229
## 2 807 CALANA -70.18611 -17.94889 848 2.176 2.600 1.310 0.376
## 3 822 ISLA SUANA -68.85094 -16.33022 3830 198.276 181.810 119.243 45.314
## 4 846 PUNTA COLES -71.37361 -17.69867 30 0.400 1.181 0.105 0.010
## 5 853 LOCUMBA -70.76222 -17.60972 559 0.829 1.633 0.362 0.248
## 6 860 CHUAPALCA -69.64361 -17.30500 4250 113.700 124.952 69.686 17.567
## May Jun Jul Aug Sep Oct Nov Dec Anual
## 1 0.105 0.055 0.205 0.050 0.145 0.035 0.050 0.265 7.157
## 2 0.490 1.315 1.740 1.925 1.950 0.280 0.520 0.865 15.138
## 3 13.333 7.095 11.675 15.325 21.540 34.530 44.160 111.035 791.652
## 4 0.057 0.245 0.810 0.435 0.955 0.205 0.065 0.165 4.495
## 5 0.138 0.185 0.295 0.080 0.170 0.020 0.055 0.205 4.171
## 6 2.433 1.525 3.390 4.485 1.725 6.740 14.745 60.185 416.714
# Leemos el archivo mediante la función "read.delim"
Prec <- read.delim(file = fileString,sep = "\t",dec = ".",header = T)
head(Prec)## Code Name Lon Lat Alt Jan Feb Mar Apr
## 1 806 MOQUEGUA -70.93167 -17.16917 1420 2.281 2.790 0.986 0.229
## 2 807 CALANA -70.18611 -17.94889 848 2.176 2.600 1.310 0.376
## 3 822 ISLA SUANA -68.85094 -16.33022 3830 198.276 181.810 119.243 45.314
## 4 846 PUNTA COLES -71.37361 -17.69867 30 0.400 1.181 0.105 0.010
## 5 853 LOCUMBA -70.76222 -17.60972 559 0.829 1.633 0.362 0.248
## 6 860 CHUAPALCA -69.64361 -17.30500 4250 113.700 124.952 69.686 17.567
## May Jun Jul Aug Sep Oct Nov Dec Anual
## 1 0.105 0.055 0.205 0.050 0.145 0.035 0.050 0.265 7.157
## 2 0.490 1.315 1.740 1.925 1.950 0.280 0.520 0.865 15.138
## 3 13.333 7.095 11.675 15.325 21.540 34.530 44.160 111.035 791.652
## 4 0.057 0.245 0.810 0.435 0.955 0.205 0.065 0.165 4.495
## 5 0.138 0.185 0.295 0.080 0.170 0.020 0.055 0.205 4.171
## 6 2.433 1.525 3.390 4.485 1.725 6.740 14.745 60.185 416.714
Cómo habrán podido notar, los métodos permiten obtener exactamente los mismos resultados utilizando a su vez una sintaxis simple que no requiere mayor análisis. También, cabe resaltar que la base de datos utilizada posee una cantidad relativamente alta de variables, entre la que podemos encontrar la posición geográfica (Latitud, Longitud y Altitud), valores medios mensuales de precipitación acumulada (de enero a diciembre) y la precipitación media anual, sin embargo, para que el análisis se realice de una manera mucho más eficiente, es que se aconseja que la base de datos no posea más de 8 variables, por lo que es recomendable reducir la cantidad de variables a utilizar.
Un método utilizado para reducir la cantidad de variables dentro de un conjunto de datos corresponde al análisis de componentes principales (ACP), el cual consiste en transformar un conjunto de variables en un conjunto de combinaciones lineales de factores no correlacionados entre sí, estos factores dando cuenta una fracción cada vez más débil de la variabilidad de los datos.
Este método permite representar los datos originales (individuos y variables) en un espacio de dimensión inferior del espacio original, mientras limite al máximo la pérdida de información. La representación de los datos en espacios de dimensión débil facilita considerablemente cualquier análisis análisis.
Para esto no es necesario que las variables sean normales, sin embargo, el cálculo de los componentes principales depende de las unidades de medida empleadas en las variables. Es por tanto importante, antes de aplicar el PCA, estandarizar las variables para que tengan media 0 y desviación estándar 1, ya que, de lo contrario, las variables con mayor varianza dominarían al resto, aunque en el caso en que las variables estén medidas en las mismas unidades, podemos optar por no estandarizarlas, lo cual se puede hacer mediante la función scale().
Existen varias funciones con las que aplicar un PCA en R, sin embargo, la función prcomp() del paquete stats por defecto centra las variables para que tengan media de 0. Con el argumento scale = TRUE indicamos que queremos escalar las variables para que tengan desviación estándar igual a 1.
pcaPrec <- prcomp(Prec[-c(1:2)], scale = TRUE)
names(pcaPrec)## [1] "sdev" "rotation" "center" "scale" "x"
Los elementos “center” y “scale” corresponden con las medias y desviaciones estándar originales de las variables previo al escalado e implementación del PCA. La matriz “rotation” proporciona los componentes principales (cada columna contiene el vector de cada componente principal). Gracias a la función summary() es posible representar la proporción de la varianza explicada por cada componente.
summary(pcaPrec)## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 3.205 1.7278 1.08786 0.86241 0.60937 0.34434 0.32511
## Proportion of Variance 0.642 0.1866 0.07397 0.04648 0.02321 0.00741 0.00661
## Cumulative Proportion 0.642 0.8286 0.90254 0.94903 0.97224 0.97965 0.98625
## PC8 PC9 PC10 PC11 PC12 PC13 PC14
## Standard deviation 0.27083 0.22867 0.20318 0.1443 0.10957 0.09491 0.08308
## Proportion of Variance 0.00458 0.00327 0.00258 0.0013 0.00075 0.00056 0.00043
## Cumulative Proportion 0.99084 0.99411 0.99669 0.9980 0.99874 0.99930 0.99973
## PC15 PC16
## Standard deviation 0.06549 3.686e-06
## Proportion of Variance 0.00027 0.000e+00
## Cumulative Proportion 1.00000 1.000e+00
# Gráfico de la proporción de la varianza explicada
fviz_eig(pcaPrec, addlabels = TRUE, ylim = c(0, 65),
main = "Proporción de la varianza",
ylab="Varianza %", xlab = "Componentes",
ggtheme = myTh)Esta información, junto con el gráfico de la proporción de la varianza explicada permite explicar cuántas dimensiones puede resumir la homogeneidad de los sitios estudiados. Es posible apreciar que los primeros 3 componentes explican más del 90% de la varianza con un 64.2%, 18.66% y 7.39% respectivamente, mientras que si consideramos los primeros 5 componentes, se podría explicar algo más del 97% de la varianza. Con esta información es posible afirmar que las primeras 5 dimensiones son adecuadas para describir la diversidad nuestro fenómeno. Sin embargo, también se debe considerar cuales son las variables mejor representadas por cada uno de estos componentes.
es preciso mencionar que para realizar correctamente el gráfico, se utilizaron los paquetes factoextra, FactoMineR y ggplot2
fviz_pca_var(pcaPrec,col.var="contrib", geom = c("point", "text"),
gradient.cols= c("#00AFBB", "#E7B800", "#FC4E07"),
repel = T,ggtheme = myTh) Es posible apreciar 3 grandes grupos al graficar las viables según las 2 primeras dimensiones, por un lado se pueden observar el grupo de la información espacial (latitud, longitud y altitud), un segundo grupo de los valores medios mensuales de septiembre a abril y finalmente, un tercer grupo con los valores medios mensuales entre los meses de mayo a agosto. Cabe destacar que no existen grandes diferencias entre las variables y que todas se concentran en la zona izquierda del gráfico.
Por otro lado, es posible estimar la calidad de la representación de las variables mediante el mapa de factores denominado cor o de correlación. Cuanto más cerca esté una variable del círculo de correlaciones, mejor será su representación. en este caso, se calcula el valor absoluto
# Cargar paquetes requeridos
library(corrplot)## corrplot 0.92 loaded
library(RColorBrewer)
# Matriz de correlación
CorVarPCA=t(get_pca_var(pcaPrec)$cor)
# Gráfico de correlación
corrplot(abs(CorVarPCA[1:5,]), is.corr=F,
col=brewer.pal(11,"RdYlGn"))# generar gráfico de calidad
ffv=fviz_cos2(pcaPrec, choice = "var", axes = 1:5,
ggtheme = myTh)
# Modificar parámetros título y etiquetas x e y
ffv$labels=list(y="Calidad de la representación",title ="Calidad de la representación para\nlas componentes 1, 2, 3, 4 y 5", x="Variable")
# gráfico
ffvAquí se destacan en verde claro aquellas variables que tienen una mayor relación con cada componente y se puede ver claramente que todas las variables son abordadas por la combinación de estos tres componentes.
Para la obtención de matriz de distancia existe un gran número de métricas utilizadas con frecuencia, entre los ejemplo de dichas métricas se puede encontrar el índice de semejanza de Jaccard, el índice de similitud de Bray-Curtis, así como la Distancia euclídea, entre muchos otros, los cuales pueden ser utilizados mediante la función vegdist() del paquete vegan. Cabe destacar que la elección del índice se debería realizar previa consulta de literatura científica, buscando consensos o recomendaciones en el uso de estos.
Existen diversos métodos de agrupación o clustering, los cuales se pueden clasificar en 2. Por un lado se cuenta con el métodos de partición, el cual no es muy utilizado en la ecología de comunidades, sin embargo, permite al usuario definir la cantidad de grupos a utilizar.Por otra parte, existen los métodos jerárquicos, en el que los grupos se van clasificando de acuerdo con las características de los objetos. Dentro de estos métodos están los procesos Aglomerativos y los Disociativos, que a su vez tiene varias formas de llevarse a cabo.
En el método jerárquico aglomerativo cada observación inicia como un grupo, luego se calcula la similitud entre todos los grupos y los más similares se unen en un solo grupo de manera iterativa, hasta obtener grupos anidados dentro de otros grupos de mayor tamaño. En cambio, el método disociativo o divisivo, comienza con todos los objetos formando parte de un mismo grupo y el algoritmo los divide de acuerdo a sus diferencias.
Cabe destacar que el más utilizado es el método aglomerativo, sin embargo, depende de cómo se desee clasificar a los grupos, si se busca optar por grupos con máximas diferencias entre ellos, se debe utilizar el método disociativo, en cambio si se busca que los objetos dentro de un grupo sean estrictamente similares se debe usar el método aglomerativo.