2

Я сделал иерархический кластер для проекта. У меня есть 300 наблюдений, каждый из 20 переменных. Я проиндексировал все переменные так, чтобы каждая переменная находилась между 0 и 1, причем большее значение было лучше.Как изменить метки узлов на диаграмме дендрограммы

Для создания кластерного графика я использовал следующий код.

d_data <- dist(all_data[,-1]) 
d_data_ind <- dist(data_ind[,-1]) 
hc_data_ind <- hclust(d_data_ind, method = "complete") 
dend<- as.dendrogram(hc_data_ind) 
plot(dend) 

Теперь метки узлов находятся в именах строк, цифры от 1 до 300 (см. Верхний рис.). Во время анализа я удалил первый столбец фрейма данных, который помечен как «география» (см. Нижний рис.), Потому что они были названиями городов в тексте и завуалировали анализ. Но мне нужно найти названия городов на кластерном участке в их правильных местах, потому что мне нужно выбрать список городов по результатам.

Какой код следует писать, чтобы вставить названия городов в столбце «География» в этот график, соответствующий их именам строк?

Как вы можете видеть из фрейма данных (внизу рис.), Все названия городов расположены в алфавитном порядке, аккуратно в порядке возрастания, точно так же, как имена строк. Я уверен, что нетрудно помещать названия городов в сюжет, я просто не могу найти его по поиску и прошу.

enter image description here How to alter the label of the nodes? Right now it's numbers but I need them to be cities.

enter image description here

+0

Пожалуйста привыкают, чтобы обеспечить воспроизводимый код, готовый для копирования-вставки работай, чтобы сделать его проще для посетителей и читателей. (Например, 'all_data' не указан, скриншоты наборов данных не помогают, поэтому результат' dput (my_data) '- это путь.) – lukeA

+0

спасибо за совет, я буду практиковать это в будущем – Elan

+0

[Почему не улучшите свой вопрос сейчас] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? – Jaap

ответ

2

Вы хотите оригинальные этикетки вместо идентификаторов? Может быть, это поможет вам с вашим анализом:

data <- USArrests[1:5, ] 
data <- cbind(label=row.names(data), data) 
row.names(data) <- NULL 
d <- dist(data[, -1]) 
hc <- hclust(d) 
plot(hc) 
rect.hclust(hc, h=40) 

![enter image description here

data$label[order.dendrogram(as.dendrogram(hc))] 
# [1] "Arkansas" "Arizona" "California" "Alabama" "Alaska" 

clusters <- cutree(hc, h=40) 
split(data$label, clusters) 
# $`1` 
# [1] "Alabama" "Alaska" 
# 
# $`2` 
# [1] "Arizona" "California" 
# 
# $`3` 
# [1] "Arkansas" 

hc$labels <- data$label 
plot(hc) 

enter image description here

PS: Я нашел, что это полезно, чтобы сохранить дендрограммы в PDF, где вы можете увеличивать и уменьшать масштаб легко: pdf("my.pdf"); plot(hc); dev.off() ,

+0

пробовал это решение и возвратил ошибку ... закончил тем, что использовал эскиз, чтобы вручную вводить значения символов в соответствии с номерами строк lol, но я буду больше обманывать, когда у меня будет время – Elan

+0

_ "пробовал это решение и возвращал ошибку .. «_ - что именно вы пытались, какое сообщение об ошибке возвращалось? Вы должны отредактировать сообщение и добавить данные, а также полный код, чтобы воспроизвести вашу проблему. Иначе это не поможет. – lukeA

2

Я думаю, что вы спрашиваете, «как я могу определить метки в дендрограмме». Таким образом, это имеет две части. Например, давайте использовать простые данные чисел c (1,2,5,6)

1) Когда вы создаете hclust с использованием dist, он использует имена элементов. И если они не существуют, то он использует текущий индекс. Например:

x <- c(1,2,5,6) 
d1 <- as.dendrogram(hclust(dist(x))) 
plot(d1) 

enter image description here

Это, очевидно, является проблемой, так как элементы у нас есть, 1,2-5,6 и не 1: 4! Итак, как мы можем это исправить? Один из способов - обновить имена. Например:

x <- c(1,2,5,6) 
names(x) <- x 
x 
d2 <- as.dendrogram(hclust(dist(x))) 
plot(d2) 

enter image description here

Я считаю, что это в основном решает вашу проблему (и, честно говоря, не требует dendextend).Но если вы хотите обновить текст ПОСЛЕ создания дендрограммы - читайте дальше:

2) Пакет dendextend позволяет обновлять метки дендрограммы. Но вам нужно убедиться, что вы используете правильный порядок (поскольку порядок исходного вектора и метки в дереве не совпадают!). Вот как это можно сделать:

if (!require(dendextend)) install.packages(dendextend); 
library(dendextend) 
x <- c(1,2,5,6) 
d3 <- as.dendrogram(hclust(dist(x))) 
labels(d3) <- x[order.dendrogram(d3)] 
plot(d3) 

enter image description here

Вот как мы делаем это для более сложного объекта данных (где мы не хотим играть с именами строк объекта, но обновить дендрограммы):

if (!require(dendextend)) install.packages(dendextend); 
library(dendextend) 
x <- CO2[,4:5] 
d4 <- as.dendrogram(hclust(dist(x))) 
labels(d4) <- apply(CO2[,1:3], 1, paste, collapse = "_")[order.dendrogram(d4)] 

d4 <- set(d4, "labels_cex", 0.6) 
d4 <- color_branches(d4, k = 3) 
par(mar = c(3,0,0,6)) 
plot(d4, horiz = T) 

enter image description here