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)
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:
Murder: Tasa de asesinatos (por 100,000 habitantes).
Assault: Tasa de asaltos (por 100,000 habitantes).
UrbanPop: Porcentaje de población urbana.
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")
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))
para trazar un/os subarbol/es dentro de un dedrogramas es lo siguiente:
# 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")
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
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)
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: