1 Capítulo 9

Como se describió en capítulos anteriores, un dendrograma es una representación basada en un árbol de datos creados mediante métodos de agrupación jerárquica (Capítulo 7). En este artículo, proporcionamos código R para visualizar y personalizar dendrogramas. Además, mostramos cómo guardar y ampliar un dendrograma grande. Comenzamos calculando el agrupamiento jerárquico utilizando los conjuntos de datos de USArrests:

# Load data
data(USArrests)
# Compute distances and hierarchical clustering
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

Para visualizar el dendrograma, usaremos las siguientes funciones y paquetes de R: • fviz _dend) en el paquete factoextra R para crear fácilmente un hermoso modelo basado en ggplot2 dendrograma. • paquete dendeztend para manipular dendrogramas Antes de continuar, instale el paquete requerido de la siguiente manera:

install.packages(c("factoextra", "dendextend"))
## Installing packages into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)

1.1 9.1 Visualización de dendogramas

Usaremos la función fviz_dend para crear fácilmente dendrograma utilizando el gráfico base R o ggplot2. También proporciona una opción para dibujando dendogramas circulares y árboles de tipo filogenético. Para crear un dendrograma básico, escriba esto:

library(ggplot2)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
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 los argumentos main, sub, xlab, lab para cambiar los títulos de las gráficas de la siguiente manera:

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

Para dibujar un dendograma horizontal, escriba esto:

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

También es posible cortar el árbol a una altura determinada para dividir los datos en múltiples grupos como se describe en el capítulo anterior: Agrupación jerárquica (Capítulo 7). En En este caso, es posible colorear las ramas por grupos y agregar un rectángulo alrededor de cada una.

fviz_dend(hc, k = 4, # Cut in four groups
cex = 0.5)  # label size

Para cambiar el tema de la trama, use el argumento ggtheme, cuyos valores permitidos incluyen gg- plot2 temas oficiales | tema_gris), tema_bw, tema_minimal), tema_clásico)

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

En el código R a continuación, cambiará los colores del grupo usando “jeo” (revista de oncología clínica)

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

Si desea dibujar un dendograma horizontal con un rectángulo alrededor de los grupos, use esto:

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

Además, puede trazar un dendrograma circular usando la opción type = “circular”.

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

Para trazar un árbol filogenético, use type = “phylogenic” y repel = TRUE (para evitar superposición de etiquetas). Esta funcionalidad requiere del paquete igraph.

install.packages('igraph')
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
require("igraph")
## Loading required package: igraph
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
fviz_dend(hc, k = 4, k_colors = "jco",
          type = "phylogenic", repel = TRUE)

Probemos phylo.layout = layout.gem

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

1.2 9.2 Caso de dendrograma con grandes conjuntos de datos

Si calcula la agrupación jerárquica en un conjunto de datos grande, es posible que desee ampliar el dendograma o trazar sólo un subconjunto del dendograma. Alternativamente, también podría trazar el dendrograma en una página grande en un PDF, que se puede ampliar sin pérdida de resolución.

1.2.1 9.2.1 Zoom en el dendrograma

Si desea ampliar los primeros grupos, es posible utilizar la opción xlim e ylim para limitar el área de la parcela. Por ejemplo:

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

1.2.2 9.2.2 Trazado de un subárbol de dendrogramas

Para trazar un subárbol, seguiremos el siguiente procedimiento: Cree el dendrograma completo utilizando fuiz_ dend() y guarde el resultado en un objeto, llamado dend plot por ejemplo. Utilice la función base R cortada. dendrogram() para cortar el dendrograma, en un determinado altura (h), en múltiples subárboles. Esto devuelve una lista con componentes Cena y Slower, el primero es una versión truncada del árbol original, también de clase dendrograma, este último una lista con las ramas obtenidas al cortar el árbol, cada uno un dendograma. *Visualice subárboles usando fviz_ dend().

El código R es el siguiente. Corta el dendrograma y visualiza la versión truncada:

dend_plot <- fviz_dend(hc, k = 4, # Cut in four groups
                       cex = 0.5, # label size
                       k_colors = "jco")

• Trazar subárboles de dendrogramas:

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)): no non-missing arguments to min;
## returning Inf

print(dend_plot)

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

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

Asímismo, se puede trazar árboles circulares de la siguiente manera:

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

### 9.2.3 Guardar dendrograma en una página PDF grande Si tiene un dendrograma grande, puede guardarlo en una página PDF, donde se puede ser zoom sin pérdida de resolución.

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

1.3 9.3 Manipulación de dendrogramas usando dendextend

El paquete dendextend proporciona funciones para cambiar fácilmente la apariencia de un dendograma y para comparar dendogramas. En esta sección usaremos el operador de encadenamiento (%>% para simplificar nuestro código. El El operador de encadenamiento convierte × %>% f(y) en f(x, y) para que pueda usarlo para reescribir múltiples operaciones de modo que puedan leerse de izquierda a derecha y de arriba a abajo. Por ejemplo, los resultados de los dos códigos R a continuación son equivalentes. • Código R estándar para crear un dendrograma:

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

• Código R para crear un dendrograma usando un operador de encadenamiento:

#R code for creating a dendrogram using chaining operator:
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
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)

Funciones para personalizar dendrogramas: la función set() en el paquete dendextend se puede utilizar para cambiar los parámetros de un dendograma. El formato es:

#set(object, what, value)
  1. object: un objeto dendrograma
  2. what: un carácter que indica cuál es la propiedad del árbol que debe ser configurar/actualizar
  3. valor: un vector con el valor a establecer en el árbol (el tipo de valor depende en el “what”). Ejemplo:
#other form
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)

1.4 9.4 Resumen

Describimos funciones y paquetes para visualizar y personalizar dendrogramas incluyendo: fviz_dend() [de hecho paquete R extra], que proporciona soluciones convenientes para trazando fácilmente un hermoso dendrograrn. Se puede utilizar para crear rectangulares y dendrogramas circulares, así como un árbol filogenético. Y el paquete dendextend, que proporciona métodos flexibles para personalizar dendogramas. Además, describimos cómo trazar un subconjunto de dendrogramas grandes