Introduccion: Después de mostrar cómo calcular la agrupación jerárquica del capitulo anterior 7, describimos aquí cómo comparar dos dendrogramas utilizando el paquete R dendextend. El paquete dendextend proporciona varias funciones para comparar dendrogramas. aquí, nos centraremos en dos funciones: 1-tanglegrams() para la comparación visual de dos dendrogramas 2-cor.dendlist() para calcular una matriz de correlación entre dendrogramas
utilizaremos los conjuntos de datos USArrests de la base R y comenzaremos por normalizar las variables utilizando la función sacle() como se indica a continuación:
df<- scale(USArrests)
Para facilitar la lectura de los gráficos generados en las secciones siguientes, trabajaremos con un pequeño subconjunto aleatorio del conjunto de datos. Por lo tanto, utilizaremos la función sample() para seleccionar aleatoriamente 10 observaciones entre las 50 que contiene el conjunto:
set.seed(123)
ss<- sample(1:50, 10)
df<- df[ss,]
comenzamos creando una lista de dos dendrograms mediante el cálculo de la agrupación jerárquica (HC) utilizando dos métodos de vinculación diferentes. A continuación, transformamos los resultados en dendrograms y creamos una lista que contenga los dos dendrograms.
library(dendextend)
##
## ---------------------
## Welcome to dendextend version 1.17.1
## Type citation('dendextend') for how to cite the package.
##
## Type browseVignettes(package = 'dendextend') for the package vignette.
## The github page is: https://github.com/talgalili/dendextend/
##
## Suggestions and bug-reports can be submitted at: https://github.com/talgalili/dendextend/issues
## You may ask questions at stackoverflow, use the r and dendextend tags:
## https://stackoverflow.com/questions/tagged/dendextend
##
## To suppress this message use: suppressPackageStartupMessages(library(dendextend))
## ---------------------
##
## Attaching package: 'dendextend'
## The following object is masked from 'package:stats':
##
## cutree
res.dist<- dist(df, method = "euclidean")
hc1<- hclust(res.dist, method = "average")
hc2<-hclust(res.dist, method = "ward.D2")
dend1<-as.dendrogram(hc1)
dend2<- as.dendrogram(hc2)
dend_list<- dendlist(dend1, dend2)
Para comparar dos dendrograms, utilizaremos la función tasnglegram() que traza los dos dendrogramas, uno al lado del otro, con sus etiquetas conectadas por líneas. La calidad de la alineación de los dos árboles puede medirse utilizando la función entanglement(). El entrelazamiento es una medida entre 1 (entrelazamiento completo) y 0 (sin entrelazamiento). Un coeficiente de entrelazamiento menor corresponde a una buena alineación.
tanglegram(dend1,dend2)
La forma anterior de construir un tanglregram, no es la unica tambien se
puede realizar de l asiguiente manera
tanglegram(dend1, dend2, highlight_distinct_edges = FALSE, #Turn-off dashed lines
common_subtrees_color_lines = FALSE,#Turn-off line colors
common_subtrees_color_branches = TRUE, #Color common branches
main = paste("entanglement=", round(entanglement(dend_list), 2))
)
La función cor.dendlist() se utiliza para calcular la matriz de
correlación “Baker” o “Cophenetic” entre una lista de árboles. El valor
puede oscilar entre -1 y 1. Los valores cercanos a 0 significan que los
dos árboles no son estadísticamente similares.
cor.dendlist(dend_list, method = "cophenetic")
## [,1] [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
cor.dendlist(dend_list, method = "baker")
## [,1] [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
También es posible comparar simultáneamente varios drendrogramas. El operador de encadenamiento %>% se utiliza para ejecutar varias funciones al mismo tiempo. Sirve para simplificar el código:
dend1<-df%>% dist %>% hclust("complete") %>% as.dendrogram
dend2<- df%>% dist %>% hclust("single") %>% as.dendrogram
dend3<- df %>% dist %>%hclust("average") %>% as.dendrogram
dend4<- df %>% dist %>%hclust("average") %>% as.dendrogram
dend_list <- dendlist("complete "= dend1, "single" = dend2, "Average" = dend3, "Centroid" = dend4)
cors <- cor.dendlist(dend_list)
round(cors, 2)
## complete single Average Centroid
## complete 1.00 0.46 0.45 0.45
## single 0.46 1.00 0.23 0.23
## Average 0.45 0.23 1.00 1.00
## Centroid 0.45 0.23 1.00 1.00
library(corrplot)
## corrplot 0.92 loaded
corrplot(cors, "pie", "lower")