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, primero describimos el algoritmo de agrupamiento aglomerativo. A continuación, presentamos una sección de laboratorio de R con muchos ejemplos para calcular y visualizar la agrupación jerárquica. Seguimos explicando cómo interpretar los dendogramas. Finalmente, proporcionamos código R para dendogramas de grupo
El agrupamiento aglomerativo funciona de abajo hacia arriba. Es decir, cada objeto se considera inicialmente como un conjunto de elementos individuales (hojas). En cada paso del algoritmo, los dos grupos más similares se fusionan en un nuevo grupo más grande (nodo). Este proceso se repite hasta que todos los puntos sean miembros de un gran grupo (raíz).
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.
Los datos deben ser una matriz numérica con:
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
Para decidir qué objetos/grupos fusionar o dividir, necesitamos formas de medir la similitud de los objetos.
Existen muchos métodos (diferencias) para calcular información, incluida la distancia euclidiana y la distancia de Manhattan (Capítulo 3). En R, la función dist() se puede usar para calcular la distancia entre cada par de objetos en un conjunto de datos. El resultado de este cálculo se denomina matriz de distancia o diferencia. De forma predeterminada, la función dist() calcula la distancia euclidiana entre objetos, pero se pueden especificar otras métricas mediante argumentos de método. lo ves Distancia para más detalles. Por ejemplo, dado el conjunto de datos subyacente 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
usando la matriz “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: La estructura de disparidad producida por la función dist(). -método: método de agregación (asociación) para calcular distancias entre conglomerados. Los valores permitidos son uno de ward.D, ward.D2, single, complete, mean, mequitty, mediana o centroide.
El dendrograma corresponde a la representación gráfica del árbol jerárquico generado por la función hclust(). El programa dendro se puede trazar en R usando la función gráfica base (res.hc), donde res.hc es el resultado de Aclust(). Aquí usaremos fuiz _dend()| paquete realmente R para obtener un buen dendrograma. Primero, instale factoextra escribiendo: install.packages(“factoextra”); luego muestre el dendograma así:
# 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 incorporar las características en su conjunto de datos en un árbol de calor jerárquico, es posible que desee evaluar si las distancias (es decir, las elevaciones) en el árbol reflejan con precisión las distancias originales.
Una forma de medir qué tan bien el árbol de clústeres generado por hclust() refleja sus datos es calcular la correlación entre la distancia cofenética y los datos de distancia originales generados por dist(). Si la agrupación es correcta, la asociación de características en el árbol de agrupación debe estar fuertemente correlacionada con las distancias entre las características en la matriz de distancia original.
Cuanto más cerca esté el coeficiente de correlación de 1, con mayor precisión la solución de conglomerados representará sus datos. Los valores por encima de 0,75 se consideran buenos. El método de asociación “promedio” parece dar un valor alto a esta estadística. Esta puede ser una de las razones por las que es tan popular. La función básica R cophenetic() se puede usar para calcular la distancia cophenetic para la agrupación jerárquica.
# 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.
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: Usamos funciones como fviz_cluster() [de facto extra], para 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 (cluster plot), en el
cual se ven diferentes figuras con 3 colores en los cuales hay diferente
ciudades de los Estados Unidos con sus porcentajes de las dimensiones
.
El paquete de clústeres R admite el análisis de clústeres en R. Proporciona las funciones agnes() y diana() para calcular la aglomeración y el agrupamiento discreto, respectivamente. Estas funciones hacen todo el trabajo necesario por usted. No necesita ejecutar scale(), dist() y hclust() por separado. Las funciones que se pueden realizar son las siguientes:
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: Logramos ver un grafico de dendograma en el cual observamos en el arbol diferentes ciudades , cada uno con diferentes alturas
Análisis de datos de expresión Cuando se analizan datos de expresión génica, el agrupamiento suele utilizarse como uno de los primeros pasos en el descubrimiento de datos. Nos interesa saber si existen grupos de genes o grupos de muestras que comparten el mismo patrón de expresión génica. Se describen varias medidas de distancia (Capítulo 3) para evaluar la similitud o diferencia entre factores para decidir qué elementos agrupar. juntos o no Estas medidas se pueden utilizar para agrupar genes o patrones similares. En los programas de agrupación en clústeres más populares, la distancia euclidiana es la medida de distancia predeterminada. Los métodos más comunes para los datos de expresión génica son utilizar log2 (expresión 0,25), distancia de correlación y agrupamiento de aglomeración de agrupamiento de asociación completa. Un solo punto de anclaje completo produce el mismo dendro, ya sea que esté utilizando datos sin procesar, registros de datos o cualquier otra transformación de datos que conserve el orden, porque lo que importa es cuál tiene la distancia más pequeña. Otros métodos son sensibles a la escala.
El agrupamiento jerárquico es una técnica de análisis de conglomerados que produce una representación de datos en forma de árbol (es decir, un dendrograma). Los objetos en el dendrograma están relacionados entre sí sobre la base de la similitud. Para realizar un análisis de conglomerados jerárquicos en R, el primer paso es calcular la matriz de distancia por pares mediante la función dist(). La función hclust() luego usa el resultado de este cálculo para crear un árbol jerárquico. Finalmente, puede usar fviz_dend() [en realidad, un paquete R opcional] para crear fácilmente un programa dendro atractivo. También es posible cortar árboles a cierta altura para dividir los datos en grupos (función cuttree() R).