R rect.hclust: слишком высокие прямоугольники в дендрограмме

Я попросил нескольких разных экспертов отсортировать 92 объекта на основе их сходства. На основе их ответов я построил матрицу несходства 92 х 92. в R я исследовал эту матрицу с помощью следующих команд:

cluster1 <- hclust(as.dist(DISS_MATRIX), method = "average") 
plot(cluster1, cex=.55)

Чтобы выделить кластеры, я хотел нарисовать вокруг них прямоугольники:

rect.hclust(cluster1, k = 3, border = "red")

Результат выглядит следующим образом:

введите здесь описание изображения

Однако, когда объекты имеют более длинные имена («AAAAAAAAAAAAAAAA43» вместо «A43»), форматирование отключено:

rownames(DISS_MATRIX) <- paste0(rep("AAAAAAAAAAAAAAAAAAAAAAAAAAAA",92),1:92)
colnames(DISS_MATRIX) <- paste0(rep("AAAAAAAAAAAAAAAAAAAAAAAAAAAA",92),1:92)
cluster1 <- hclust(as.dist(DISS_MATRIX), method = "average") 
plot(cluster1, cex=.55)
rect.hclust(cluster1, k = 3, border = "red")

Это видно из полученной дендрограммы.

введите здесь описание изображения

Кажется, что прямоугольники переместились к концу дендограммы. Не хорошо. Я предполагаю, что этот сбой произошел из-за длинных имен 92 объектов в матрице различий. Это также может показаться не очень актуальным. Просто убедитесь, что ваши объекты имеют достаточно короткие имена.

Однако по разным причинам я хочу, чтобы мои объекты имели свои оригинальные (то есть, по общему признанию, длинные) имена. Этот график для презентации и поэтому я не хочу работать с кодами. Я также не хочу использовать какой-либо другой пакет, так как обычно hclust довольно прост в использовании. Однако я не нахожу способа позиционировать прямоугольники в команде rect.hclust. Следовательно, что я могу сделать, чтобы расположить прямоугольники на дендограмме, даже если имена объектов длинные? Спасибо.


person DomB    schedule 17.03.2019    source источник


Ответы (1)


Вы написали, что «я также не хочу использовать какой-либо другой пакет, так как я обычно нахожу hclust довольно простым в использовании».

Хотя hclust отлично подходит для создания иерархического объекта кластеризации, он мало что поддерживает с точки зрения построения графиков. После того, как у вас есть вывод hclust, лучше изменить его на дендрограмму (используя as.dendrogram) для визуализации (поскольку он лучше подходит для этого). Невозможно делать то, что вы хотите, без использования сложного кода, который упакован в пакет, это лучший путь (ИМХО) для вас, чтобы двигаться вперед. (Я знаю, потому что написал rect. дендрограммы, и потребовалось много труда, чтобы заставь его работать так, как ты хочешь)

Пакет Dendextend R предоставляет множество функций для управления и визуализации дендрограмм (см. виньетка здесь). В частности, функция rect.dendrogram может обрабатывать такие случаи, о которых вы спрашивали (с длинными метками). Например (для удовольствия я добавил color_branches и color_labels):

library(dendextend)
hc <- mtcars[, c("mpg", "disp")] %>% dist %>% hclust(method = "average") 
dend <- hc %>% as.dendrogram %>% hang.dendrogram
# let's make the text longer
labels(dend)[1] <- "AAAAAAAAAAAAAAAAAAAAA"

par(mar = c(15,2,1,1))
dend %>% color_branches(k=3) %>% color_labels(k=3) %>% plot
dend %>% rect.dendrogram(k=3)

введите здесь описание изображения

person Tal Galili    schedule 19.03.2019