Capítulo 7

Agrupación aglomerativa

El agrupamiento aglomerativo es el tipo más común de uso de agrupamiento jerárquico para agrupar objetos en clústeres en función de su similitud. También se conoce como AGNES (Aglomerative Nesting).

En este artículo comenzamos describiendo los algoritmos de agrupamiento aglomerativo. A continuación, proporcionamos secciones de laboratorio de R con muchos ejemplos para calcular y visualizar el agrupamiento jerárquico. Continuamos explicando cómo interpretar el dendograma. Finalmente, proporcionamos códigos R para dividir dendrogramas en grupos.

7.1 Algoritmo

El agrupamiento aglomerativo funciona de manera “de abajo hacia arriba”. Es decir, cada objeto se considera inicialmente como un grupo de un solo elemento (hoja). En cada paso del algoritmo, los dos grupos que son más similares se combinan en un nuevo grupo más grande (nodos). Este procedimiento se repite hasta que todos los puntos son miembros de un solo grupo grande (raíz) (ver la figura a continuación).

Tenga en cuenta que el agrupamiento aglomerativo es bueno para identificar pequeños grupos. El agrupamiento divisivo es bueno para identificar grandes grupos. En este artículo, nos centraremos principalmente en el agrupamiento jerárquico aglomerativo.

7.2 Pasos para el agrupamiento jerárquico aglomerativo

Seguiremos los pasos a continuación para realizar un agrupamiento jerárquico aglomerativo utilizando el software R.:

  1. Preparando los datos

  2. Cálculo de información de (des)similitud entre cada par de objetos en el conjunto de datos.

  3. Uso de la función de vinculación para agrupar objetos en un árbol de clúster jerárquico, en función de la información de distancia generada en el paso 1. Los objetos/agrupaciones que están muy cerca se vinculan mediante la función de vinculación.

  4. Determinar dónde cortar el árbol jerárquico en grupos. Esto crea una partición de los datos.

Describiremos cada uno de estos pasos en la siguiente sección.

7.2.1 Estructura y preparación de datos

Los datos deben ser una matriz numérica con:

  • filas que representan observaciones (individuos);
  • y columnas que representan variables.

Aquí, usaremos los conjuntos de datos R base USArrests.

# Load the data
data ("USArrests")

# Standardize the data

df <- scale (USArrests)

# Show the first 6 TOWS
head(df, nrow = 6)
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292
## Colorado   0.02571456 0.3988593  0.8608085  1.864967207

7.2.2 Medidas de similitud

Para decidir qué objetos/grupos deben combinarse o dividirse, necesitamos métodos para medir la similitud entre los objetos.

Existen muchos métodos para calcular la información de (des)similitud, incluidas las distancias euclidiana y manhattan (Capítulo 3). En el software R, puede usar la función dist() para calcular la distancia entre cada par de objetos en un conjunto de datos. Los resultados de este cálculo se conocen como matriz de distancia o disimilitud.

De forma predeterminada, la función dist() calcula la distancia euclidiana entre objetos; sin embargo, es posible indicar otras métricas utilizando el método de argumento. ¿Ver? distancia para obtener más información.

Por ejemplo, considere el conjunto de datos base R USArrests, puede calcular la matriz de distancia de la siguiente manera:

# Compute the dissimilarity matrix
# df = the standardized data
res.dist <- dist(df, method = "euclidean")

Para ver fácilmente la información de distancia entre objetos, reformateamos los resultados de la función dist() en una matriz usando la función as.matriz(). En esta matriz, el valor en la celda formada por la fila i, la columna j, representa la distancia entre el objeto i y el objeto j en el conjunto de datos original. Por ejemplo, el elemento 1,1 representa la distancia entre el objeto 1 y él mismo (que es cero). El elemento 1,2 representa la distancia entre el objeto 1 y el objeto 2, y así sucesivamente.

El siguiente código R muestra las primeras 6 filas y columnas de la matriz de distancia:

as.matrix(res.dist)[1:6, 1:6]
##             Alabama   Alaska  Arizona Arkansas California Colorado
## Alabama    0.000000 2.703754 2.293520 1.289810   3.263110 2.651067
## Alaska     2.703754 0.000000 2.700643 2.826039   3.012541 2.326519
## Arizona    2.293520 2.700643 0.000000 2.717758   1.310484 1.365031
## Arkansas   1.289810 2.826039 2.717758 0.000000   3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641   0.000000 1.287619
## Colorado   2.651067 2.326519 1.365031 2.831051   1.287619 0.000000

Por ejemplo, dada una matriz de distancia “res.dist” generada por la función dist(), la función base de R hclust() puede usarse para crear el árbol jerárquico.

hclust() se puede utilizar de la siguiente manera:

res.hc <- hclust(d = res.dist, method = "ward.D2")

-d: una estructura de disimilitud producida por la función dist(). -método: el método de aglomeración (enlace) que se utilizará para calcular la distancia entre los clústeres. Los valores permitidos son uno de “ward.D”, “ward.D2”, “single”, “complete”, “average”, “mequitty”, “median” o “centroid”.

7.24 Dendograma

Los dendogramas corresponden a la representación gráfica del árbol jerárquico generado por la función hclust(). El dendrograma se puede producir en R usando la función base plot(res.hc), donde res.hc es la salida de Aclust(). Aquí, usaremos la función fuiz _dend()| en factoeztra paquete R] para producir un hermoso dendrograma.

Primero instale factoextra escribiendo esto: install.packages(“factoextra”); luego visualice el dendrograma de la siguiente manera:

# cex : label size
library("factoextra")
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_dend(res.hc, cex = 0.5)
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## ℹ The deprecated feature was likely used in the factoextra package.
##   Please report the issue at <https://github.com/kassambara/factoextra/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Figura 1: En el dendrograma que se muestra arriba, cada hoja corresponde a un objeto. A medida que ascendemos en el árbol, los objetos que son similares entre sí se combinan en ramas, que a su vez se fusionan a mayor altura.

La altura de la fusión, proporcionada en el eje vertical, indica la (des)similitud/distancia entre dos objetos/clusters. Cuanto mayor sea la altura de la fusión, menos similares serán los objetos. Esta altura se conoce como la distancia cofenética entre los dos objetos.

7.3 Verificar el árbol de clústeres

Después de vincular los objetos en un conjunto de datos en un árbol de clúster jerárquico, es posible que desee evaluar que las distancias (es decir, las alturas) en el árbol reflejen con precisión las distancias originales.

Una forma de medir qué tan bien el árbol de clúster generado por la función hclust() refleja sus datos es calcular la correlación entre las distancias cofenéticas y los datos de distancia originales generados por la función dist(). Si la agrupación es válida, la vinculación de objetos en el árbol de agrupación debería tener una fuerte correlación con las distancias entre objetos en la matriz de distancia original.

Cuanto más cerca esté el valor del coeficiente de correlación a 1, con mayor precisión la solución de agrupación reflejará sus datos. Los valores superiores a 0,75 se consideran buenos. El método de vinculación “promedio” parece producir valores altos de esta estadística. Esta puede ser una de las razones por las que es tan popular.

La función base de R cophenetic() se puede usar para calcular las distancias cofenéticas para el agrupamiento jerárquico.

# Compute cophentic distance
res.coph <- cophenetic(res.hc)

# Correlation between cophenetic distance and
# the original distance
cor(res.dist, res.coph)
## [1] 0.6975266

Ejecute la función hclust() nuevamente usando el método de vinculación promedio. A continuación, llame a cophenetic() para evaluar la solución de agrupación.

res.hc2 <- hclust(res.dist, method = "average")

cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382

El coeficiente de correlación muestra que el uso de un método de vinculación diferente crea un árbol que representa ligeramente mejor las distancias originales.

7.4 Cortar el dendograma en diferentes grupos

Uno de los problemas con la agrupación jerárquica es que no nos dice cuántos grupos hay o dónde cortar el dendrograma para formar grupos.

Puede cortar el árbol jerárquico a una altura determinada para dividir sus datos en grupos. La función base de R cutree() se puede usar para cortar un árbol, generado por la función hclust(), en varios grupos, ya sea especificando el número deseado de grupos o la altura de corte. Tt devuelve un vector que contiene el número de grupo de cada observación.

# Cut tree into 4 groups
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Number of members in each cluster
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Get the names for the members of cluster Í1
rownames (df) [grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"

El resultado de los cortes se puede visualizar fácilmente usando la función fuiz dend() [de factoextra]:

# Cut in 4 groups and color by groups
fviz_dend(res.hc, k = 4, # Cut in four groups
cex = 0.5, # label size
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # color labels by groups
rect = TRUE # Add rectangle around groups
)

Figura 2: Usando la función fviz_cluster() [de facto extra], también podemos visualizar el resultado en un diagrama de dispersión. Las observaciones están representadas por puntos en la gráfica, utilizando componentes principales. Se dibuja un marco alrededor de cada grupo.

fviz_cluster(list(data = df, cluster = grp),
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
show.clust.cent = FALSE, ggtheme = theme_minimal())

Figura 3: Observamos un grafico de conglomedados, en el cual se ven diferentes figuras con diversos colores en los cuales hay diferente ciudades.

Paquete 7.5 Clúster R

El clúster del paquete R facilita la realización de análisis de clústeres en R. Proporciona la función agnes() y diana() para calcular el agrupamiento aglomerativo y divisivo, respectivamente. Estas funciones realizan todos los pasos necesarios por usted. No necesita ejecutar las funciones scale(), dist() y hclust() por separado. Las funciones se pueden ejecutar de la siguiente manera:

library("cluster")
# Agglomerative Nesting (Hierarchical Clustering)
res.agnes <- agnes(x = USArrests, # data matrix
stand = TRUE, # Standardize the data
metric = "euclidean", # metric for distance matrix
method = "ward" # Linkage method
)
# DIvisive ANAlysis Clustering
res.diana <- diana(x = USArrests, # data matrix
stand = TRUE, # standardize the data
metric = "euclidean" # metric for distance matrix
)

Después de ejecutar agnes() y diana(), puede usar la función fviz_dend()[de factoextra] para visualizar el resultado:

fviz_dend(res.agnes, cex = 0.6, k = 4)

Figura 4: El grafico anterior es un grafico de dendograma en el cual observamos diferentes lugares, viendo al costado las diferentes alturas.

7.6 Aplicación del agrupamiento jerárquico al gen

análisis de datos de expresión En el análisis de datos de expresión génica, el agrupamiento se utiliza generalmente como uno de los primeros pasos para explorar los datos. Estamos interesados en saber si hay grupos de genes o grupos de muestras que tienen patrones de expresión génica similares. Se han descrito varias medidas de distancia (Capítulo 3) para evaluar la similitud o la disimilitud entre elementos, con el fin de decidir qué elementos deben agruparse.

juntos o no. Estas medidas se pueden utilizar para agrupar genes o muestras que son similares. Para los softwares de agrupación en clústeres más comunes, la medida de distancia predeterminada es la distancia euclidiana. Los métodos más populares para los datos de expresión génica son utilizar log2 (expresión + 0,25), distancia de correlación y agrupamiento aglomerativo de agrupamiento de ligamiento completo.

El enlace único y completo da el mismo dendrograma ya sea que use los datos sin procesar, el registro de los datos o cualquier otra transformación de los datos que conserve el orden porque lo que importa es cuáles tienen la distancia más pequeña. Los otros métodos son sensibles a la escala de medición.

7.7 Resumen

El agrupamiento jerárquico es un método de análisis de conglomerados, que produce una representación basada en árboles (es decir, dendrograma) de datos. Los objetos en el dendrograma están vinculados entre sí en función de su similitud. Para realizar un análisis de conglomerados jerárquicos en R, el primer paso es calcular la matriz de distancia por pares usando la función dist(). A continuación, la función hclust() utiliza el resultado de este cálculo para producir el árbol jerárquico. Finalmente, puede usar la función fviz_dend() [en realidad, un paquete adicional de R] para trazar fácilmente un hermoso dendrograma. También es posible cortar el árbol a una altura determinada para dividir los datos en varios grupos (función R cutree()).