Chapter 9

Visualizing Dendrograms

data(USArrests)

dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

En el análisis de clúster, se utilizan algoritmos de agrupamiento para dividir un conjunto de datos en subconjuntos o clústeres basados en la similitud o proximidad entre los elementos. Estos algoritmos evalúan las similitudes o diferencias entre los datos utilizando medidas de distancia o similitud y agrupan los elementos en función de esas medidas.

suppressPackageStartupMessages(library(dendextend))

library(dendextend)

9.1 Visualizing dendrograms

Usaremos la función fviz_dend para crear un dendrograma basico usando el gráfico base R o ggplot2.

También proporciona una opción para dibujar dendrogramas circulares y árboles filogénicos.

suppressPackageStartupMessages(library(factoextra))
  
library(ggplot2)
library(factoextra)
fviz_dend(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.

Puede usar estos argumentos (main, sub, xlab,ylab) para cambiar los títulos del grafico y de los ejes:

fviz_dend (hc, cex = 0.5,
main = "Dendrogram - ward.D2" ,
xlab = "Objects" , ylab = "Distance" , sub= "")

Tambien pondemos presentarlo de manera horizontal:

fviz_dend(hc, cex = 0.5, horiz = TRUE)

Tambien podemos escoger la altura a la que deseamos que sean agrupados los datos, en este caso se describen 4 grupos que son:

  1. Murder: Tasa de asesinatos (por 100,000 habitantes).

  2. Assault: Tasa de asaltos (por 100,000 habitantes).

  3. UrbanPop: Porcentaje de población urbana.

  4. Rape: Tasa de violaciones (por 100,000 habitantes).

fviz_dend(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
ggtheme = theme_gray() # Change theme
)

fviz_dend(hc, cex = 0.5, k = 4, # Cut in four groups
k_colors = "jco" )

Aqui de manera horizontal y ya agrupada

fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "jco",
rect = TRUE, rect_border = "jco", rect_fill = TRUE)

Tambien en diagrama circular con la opcion type = “circular”

fviz_dend(hc, cex = 0.5, k = 4,
k_colors = "jco", type = "circular")

Y en forma de filogenetica usamos las opciones type = “phylogenetic” y repel = TRUE, con esta ultima evitamos que las etiquetas de cada rama se superpongan una por encima de la otra

suppressPackageStartupMessages(require ("igraph"))

require ( "igraph")
fviz_dend(hc, k = 4, k_colors = "jco",
          type = "phylogenic", repel = TRUE
          )

require("igraph")
fviz_dend(hc, k = 4, # Cut in four groups
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")

9.2 Case of dendrogram with large data sets

9.2.1 Zooming in the dendrogram

si deseamos enfocar un/os grupo/s en especifico utilizaremos la funcion xlim y ylim para limitar el area que queremos enfocar.

fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))

9.2.2 Plotting a sub-tree of dendrograms

para trazar un/os subarbol/es dentro de un dedrogramas es lo siguiente:

  1. Creamos el dendrograma usando fviz_dend , y Lo guardamos en un objeto, en este caso es dend_plot.
  2. Con la función cut.dendrogram cortamos el dendrograma a la altura h que deseamos en los subarbol/es
# Create a plot of the whole dendrogram,
# and extract the dendrogram data
dend_plot <- fviz_dend(hc, k = 4, # Cut in four groups
cex = 0.5, # label size
k_colors = "jco"
)
dend_data <- attr(dend_plot, "dendrogram") # Extract dendrogram data
# Cut the dendrogram at height h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualize the truncated version containing
# two branches
fviz_dend(dend_cuts$upper)
## Warning in min(-diff(our_dend_heights)): ningún argumento finito para min;
## retornando Inf

Aquí ya vemos a versión de dendrograma divididos en subgrupos

# Plot the whole dendrogram
print(dend_plot)

y finalmente aquí vemos el dendrograma original cortado y dividido en dos subarboles, por lo general el subarbol es el principal (de izquierda a derecha)

# Plot subtree 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")

# Plot subtree 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")

Circular se presentaria de la siguiente forma:

fviz_dend(dend_cuts$lower[[1]], type = "circular")

fviz_dend(dend_cuts$lower[[2]], type = "circular")

9.2.3 Saving dendrograms into a large PDF page

Esto sirve para poder cuardar un dendrograma en caso tal que sea muy grande, grande en el sentido de muchos datos y tamaño

pdf("dendrogram.pdf", width=30, height=15)  
p <- fviz_dend(hc, k = 4, cex = 1, k_colors ="jco" )
print(p)
dev.off()
## png 
##   2

9.3 Manipulating dendrograms using dendextend

data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

library(dendextend)
dend <- USArrests[1:5,] %>%#data
  scale %>% # Scale the data
  dist %>% # calculate a distance matrix,
  hclust(method = "ward.D2") %>% # Hierarchical clustering
  as.dendrogram # Turn the object into a dendrogram.
plot(dend)

#set(object, what, value)#
library(dendextend)
# 1. Create a customized dendrogram
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1) %>% # Branches line width
set("branches_k_color", mycols, k = 4) %>%#Color branches by groups
set("labels_colors", mycols, k = 4) %>% # Color labels by groups
set("labels_cex", 0.5) # Change Label size

# 2. Create plot
fviz_dend(dend)

9.4 Summary

Describimos funciones y paquetes para visualizar y personalizar dendrogramas, además, tambien aprendimos cómo cortar un subconjunto de dendrogramas grandes, por otro lado aprendimos a usar las funciones para la creación y personalización de los dendogramas:

  • fviz_dend y el paquete factoextra, que proporcionan soluciones convenientes para trazar fácilmente un dendrograma. Se puede utilizar para visualizar dendrogramas rectangulares y circulares, y en árbol filogénico.