Как использовать идентификатор для горизонтальной дендрограммы класса "дендрограмма" в R
Я использую идентификацию для изучения специфических особенностей кластеров в дендрограмме в R. Идентификация работает отлично, используя объект "hclust", но он мне нужен для горизонтальной дендрограммы класса "дендрограмма" вместо "hclust". У меня установлен пакет dendextend, который обычно должен расширять функциональность идентификации до объектов класса дендрограмм и горизонтальных дендрограмм ( http://rpackages.ianhowson.com/cran/dendextend/man/identify.dendrogram.html). Для моего конкретного набора данных identifier работает для вертикальной дендрограммы (дендрограммы класса), но не работает для горизонтальной. Ошибка, которую я всегда получаю:
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)
Я согласен с вами, что это несколько раздражающее поведение (поскольку мы не всегда можем кликнуть именно там, где хотели). Поэтому я добавил в пакет dendextend новый параметр (stop_if_out
), который теперь установлен в FALSE
по умолчанию для identif.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')
Надеюсь, это поможет.