2015-09-18 3 views
1

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

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 

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

Бест,

ответ

1

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

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

Я согласен с вами, что это несколько раздражает поведение (так как мы не всегда получаем щелкнуть именно там, где мы хотели) , Итак, у меня есть added to the dendextend package a new parameter (stop_if_out), который теперь установлен на FALSE по умолчанию для ident.dendrogram. Это означает, что функция больше не будет останавливаться при нажатии слишком далеко за пределами дендрограммы. (Это было бы для вертикальных и горизонтальных участков)

Это, вероятно, займет некоторое время, прежде чем я выпустить эту версию 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') 

I надеюсь это поможет.

+1

Большое спасибо за ваш быстрый ответ и точное решение! Задача решена! – jedgroev

Смежные вопросы