Как использовать идентификацию для горизонтальной дендрограммы дендрограммы классов в R

Я использую Identify для изучения специфических особенностей кластеров в дендрограмме в R. Идентификация работает отлично, используя объект hclust, но мне он нужен для горизонтальной дендрограммы класса dendrogram. из "hclust". У меня установлен пакет dendextend, который обычно должен расширять функциональность идентификации до объектов дендрограммы класса и горизонтальных дендрограмм (http://rpackages.ianhowson.com/cran/dendextend/man/identify.dendrogram.html). Для моего конкретного набора данных identify работает для вертикальной дендрограммы (дендрограммы класса), но не работает для горизонтальной. Ошибка, которую я всегда получаю:

Error in rect.dendrogram(x, k = k, x = X$x, cluster = cluster[, k - 1],  : 
k must be between 2 and 10

Здесь вы можете найти воспроизводимый и упрощенный пример:

#Install packages
install.packages(c("TraMineR","dendextend"))
#Load packages
library(TraMineR)
library(dendextend)

#Create fake dataset (each row is a sequence of characters)
a <- c(rep('A',50), rep('B',50))
seqdf <- rbind(a=a, b=sample(a), c=sample(a), d=sample(a), e=sample(a), f=sample(a),g=sample(a),h=sample(a),
i=sample(a), j=rep('A',100),k=rep('B',100),l=sample(a)) 
colnames(seqdf)<- paste(rep('a',100),c(1:100),sep='') 

#Turn it into a sequence object 
seq_def <- seqdef(seqdf, 1:100, id = rownames(seqdf), xtstep = 4)

#Calculate the dissimilarity (hamming distance) between sequences 
hd <- seqdist(seq_def, method = "HAM", with.missing = TRUE)
rows<-list(rownames(seqdf),rownames(seqdf))
dimnames(hd) <- rows
#Perform Ward clustering on dissimilarity matrix hd
ward <- hclust(as.dist(hd), method = "ward.D2")     
#Dendrogram object
dend <- as.dendrogram(ward) 

#Horizontal dendrogram 
plot(dend, horiz=TRUE)
identify(dend, horiz=TRUE) # HERE IDENTIFY GIVES AN ERROR

#Vertical dendrogram
plot(dend)
identify(dend) # this works, there is no error

Надеюсь, кто-нибудь знает, как решить эту проблему.

Лучший,


person jedgroev    schedule 18.09.2015    source источник


Ответы (1)


Это общее поведение функции идентификации (скажем, identify.hclust), когда вы щелкаете "слишком близко" к краям экрана. Вы можете увидеть это, если побежите (и щелкните возле листьев):

plot(ward)
identify(ward, MAXCLUSTER = 12) 

Я согласен с вами, что это несколько раздражающее поведение (поскольку мы не всегда можем щелкнуть именно там, где хотели). Поэтому я добавил в пакет dendextend новый параметр (stop_if_out), который сейчас по умолчанию для identify.dendrogram установлено значение FALSE. Это означает, что функция больше не будет останавливаться, если щелкнуть слишком далеко за пределами дендрограммы. (это было бы как для вертикальных, так и для горизонтальных графиков)

Вероятно, пройдет некоторое время, прежде чем я выпущу эту версию для CRAN, но вы можете легко получить к ней доступ, используя devtools и запустив:

install.packages.2 <- function (pkg) if (!require(pkg)) install.packages(pkg);
install.packages.2('devtools')
# make sure you have Rtools installed first! if not, then run:
#install.packages('installr'); install.Rtools()
devtools::install_github('talgalili/dendextend')

Надеюсь, это поможет.

person Tal Galili    schedule 20.09.2015
comment
Большое спасибо за ваш быстрый ответ и точное решение! Проблема решена! - person jedgroev; 21.09.2015