Criação de dendrograma no R

Reprodução dos scripts do capitulo 9 do livro texto

Visualização de um dendrograma

O dendrograma é um diagrama de árvore que exibe os grupos formados por agrupamento (clustering) de observações em cada passo e em seus níveis de similaridade.

Utilizando a base de dados Carros para calcular o agrupamento

#data(USArrests)
carros<- read.csv("C:/Users/Clevia/Documents/multivariada 2/carros.txt", sep = "")

Definindo a distância de hierarquia dos clusters

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

Instalação e carregamento dos pacotes para visualização e manipulação do dendrograma

install.packages(c("factoextra", "dendextend"))
install.packages("igraph")

Usando a função fviz_dend() do pacote factoextra é possivel criar facilmente um dendograma também há a opção de desenhar dendrogramas circulares e árvores filogenéticas

library(factoextra)
fviz_dend(hc, cex = 0.5)

Usando os argumentos main, sub, xlab, ylab para mudar o título do gráfico e demais rótulos

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

Dendrograma horizontal

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

Também é possível cortar a árvore em uma determinada altura para particionar os dados em vários grupos é possível colorir ramificações por grupos e adicionar retângulos ao redor de cada grupo.

fviz_dend(hc, k = 4, # cortando em 4 grupos
          
          cex = 0.5, # tamanho do rótulo
          k_colors = c("#2E9FDF", "#c066c0", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, # cores por grupo
          rect = TRUE, # Adicionar retângulo ao redor dos grupos
          rect_border = c("#2E9FDF", "#cc84cc", "#E7B800", "#FC4E07"),
          rect_fill = TRUE)

para mudar o tema do gráfico usamos o argumento ggtheme cojos valores possíveis incluem os temas oficiais do ggplot2, theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void()

fviz_dend(hc, k = 4, # corte em 4 grupos
          
          cex = 0.5, # tamanho do rótulo
          k_colors = c("#2E9FDF", "#c066c0", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, # cores por grupo
          ggtheme = theme_gray() #mudar tema
)

Também podemos usar uma paleta de cores, neste a caso foi usado a paleta “jco” (revista de oncologia clínica)

fviz_dend(hc, cex = 0.5, k = 4, # corte em 4 grupos
          
          k_colors = "jco")

Se você precisa desenhar um dendrograma horizontal com retângulos em volta dos agrupamentos

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

É possível fazer um dendrograma circular com o comando type = “circular”.

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

para uma árvore filogenéticatree, use type = “phylogenic” e repel = TRUE ( para evitar sobreposição de rótulos).
Essa função requer o pacote igraph.

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

O layout padrão para árvores filogenéticas é “layout.auto”. Outros layouts possíveis: (“layout.auto”, “layout_with_drl”, “layout_as_tree”, “layout.gem”, “layout.mds”,“layout_with_lgl”).

Para phylo.layout = “layout.gem”

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

Caso de dendrograma com grandes conjuntos de dados

Se você calcular o clustering hierárquico em um grande conjunto de dados, talvez queira aumentar o zoom o dendrograma ou para plotar apenas um subconjunto do dendrograma. Alternativamente, você também pode plotar o dendrograma em uma página grande em um PDF, que pode ser ampliado sem perda de resolução.

Zoom no dendrograma

Se você deseja ampliar os primeiros clusters, é possível usar a opção xlim e ylim para limitar a área do lote. Por exemplo, digite o código abaixo:

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

Plotando uma sub-árvore de dendrogramas

Crie um gráfico de todo o dendrograma e extraia os dados do dendrograma

dend_plot <- fviz_dend(hc, k = 4, # corte em 4 grupos
                       
                       cex = 0.5, 
                       k_colors = "jco"
)

dend_data <- attr(dend_plot, "dendrogram") # extração dos dados do dendograma

Corte do dendrograma na altura h = 10

dend_cuts <- cut(dend_data, h = 10)

Visualize a versão truncada contendo dois ramos.

fviz_dend(dend_cuts$upper)

Plotando todo o dendrograma

print(dend_plot)

Plot sub-arvore 1

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

Plot sub-arvore 2

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

Fazendo um gráfico circular

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

Salvando o dendrograma em uma página PDF grande

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

Manipulando dendrogramas usando dendextend

library(dendextend)
dend <- carros[1:5,] %>% # dados
  scale %>% # escala dos dados
  dist %>% # calcular uma matriz de distância,
  hclust(method = "ward.D2") %>% # Hierarchical clustering
  as.dendrogram # Transformando o objeto em um dendrograma.
plot(dend)

Exemplo

library(dendextend)

1.criando um dendrograma customizado

mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
  set("branches_lwd", 1) %>% # Largura da linha de ramificações
  set("branches_k_color", mycols, k = 4) %>% # Ramos de cores por grupos
  set("labels_colors", mycols, k = 4) %>% # Etiquetas de cores por grupos
  set("labels_cex", 0.5) # Alterar o tamanho da etiqueta

2. criando o gráfico

fviz_dend(dend)