Как пометить конечные узлы разрезанной дендрограммы?

Я использовал следующий код, чтобы вырезать дендрограмму на определенной высоте. Проблема, с которой я столкнулся, заключается в том, что когда я вырезаю дендрограмму, я не могу понять, как добавить метки к узлам. Как я могу вырезать дендрограмму с метками с помощью программы R?

library(Heatplus)
cc=as.dendrogram(hclust(as.dist(mat),method="single"))
cutplot.dendrogram(cc,h=20)

person akash    schedule 26.08.2011    source источник
comment
Что такое дендограмма и на каком это языке?   -  person John Saunders    schedule 26.08.2011
comment
@john, это язык R. Я пытаюсь выполнить иерархическую кластеризацию, используя R.   -  person akash    schedule 26.08.2011
comment
Хорошо, а что такое дендограмма? Хотя бы скажите, какая область знаний его определяет. Статистика? Физика?   -  person John Saunders    schedule 26.08.2011
comment
@ John Дендрограмма (от греческого dendron tree, -gramma drawing) — это древовидная диаграмма, часто используемая для иллюстрации расположения кластеров, полученных в результате иерархической кластеризации. Дендрограммы часто используются в вычислительной биологии для иллюстрации кластеризации генов или образцов.   -  person akash    schedule 26.08.2011
comment
Обновленный заголовок лучше описывает вопрос; вы не хотите разрезать дендрограмму, но пометите конечные узлы разрезанной дендрограммы.   -  person Gavin Simpson    schedule 26.08.2011
comment
@JohnSaunders Спасибо за применение тега r.   -  person Andrie    schedule 26.08.2011


Ответы (3)


Изрядно покопавшись в справочной документации для ?dendrogram, я наткнулся на функцию dendrapply, которая содержит пример, чтобы сделать что-то очень похожее. Вот ваше решение, основанное на модификации примера в ?dendrapply:

Создайте дендрограмму и обрежьте ее на высоте h=20:

dhc <- as.dendrogram(hc <- hclust(dist(USArrests), "ave"))
chc <- cut(dhc, h=20)$upper

Определите вектор с помощью newLabels и функцию newLab, которая изменяет метку отдельного узла. Затем передайте это dendrapply:

newLabels <- paste("Custom", 1:22, sep="_")

local({
      newLab <<- function(n) {
        if(is.leaf(n)) {
          a <- attributes(n)
          i <<- i+1
          attr(n, "label") <- newLabels[i]
        }
        n
      }
      i <- 0
    })

nhc <- dendrapply(chc, newLab)
labels(nhc)
 [1] "Custom_1"  "Custom_2"  "Custom_3"  "Custom_4"  "Custom_5"  "Custom_6" 
 [7] "Custom_7"  "Custom_8"  "Custom_9"  "Custom_10" "Custom_11" "Custom_12"
[13] "Custom_13" "Custom_14" "Custom_15" "Custom_16" "Custom_17" "Custom_18"
[19] "Custom_19" "Custom_20" "Custom_21" "Custom_22"

plot(nhc)

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

person Andrie    schedule 26.08.2011

Вот модифицированное решение для того, что написал Андри, но с использованием нового пакета под названием "dendextend", созданного специально для такого рода вещи.

Вы можете увидеть множество примеров в презентациях и виньетках пакета, в разделе «использование» по следующему URL-адресу: https://github.com/talgalili/dendextend

Вот решение этого вопроса:

# define dendrogram object to play with:
dhc <- as.dendrogram(hc <- hclust(dist(USArrests), "ave"))
chc <- cut(dhc, h=20)$upper
# loading the package
require(dendextend)# let's add some color:
# change labels with a simple assignment:
labels(chc) <- paste("Custom", 1:22, sep="_")
plot(chc)

Для установки пакета (поскольку я еще не загрузил его в CRAN) используйте:

####################
## installing dendextend for the first time:

if (!require('installr')) install.packages('installr'); require('installr')
## install.Rtools() # run this if you are using Windows and don't have Rtools
require2(devtools)
install_github('dendextend', 'talgalili')
require2(Rcpp)
install_github('dendextendRcpp', 'talgalili')

Бест, Таль

person Tal Galili    schedule 09.12.2013

cc$labels

Это вектор всех элементов дендрограммы.

cc$labels <- myVector

Вы можете добавить свой собственный вектор, чтобы изменить метки

person A_Skelton73    schedule 30.01.2014