Свертывание дендрограммы с учетом порога допуска

Я хотел бы свернуть ветви dendrogram с учетом ограничения допуска.

Я использую collapse_branch пример от dendextend.

require(dendextend)
dend <- iris[1:5,-5] %>% dist %>% hclust %>% as.dendrogram 
dend %>% ladderize %>% plot(horiz = TRUE); abline(v = .2, col = 2, lty = 2)

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

В отличие от dendrogram в примере dendextend, я хотел бы заменить все свернутые ветки (т. е. любая клада справа от вертикальной красной пунктирной линии) треугольником, подобно тому, как клады представлены на этом рисунке (из по этой ссылке):

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

Если это слишком много, чтобы просить, я бы согласился на обрезку ветвей в пределе допуска.


person dan    schedule 25.01.2017    source источник


Ответы (2)


Получение треугольников действительно слишком много, но вы можете раскрасить ветки. Либо по высоте, либо по количеству кластеров, используя color_branches:

library(dendextend)
dend <- iris[1:5,-5] %>% dist %>% hclust %>% as.dendrogram 
dend %>% color_branches(h=0.2) %>% ladderize %>% plot(horiz = TRUE); abline(v = .2, col = 2, lty = 2)
# OR
# dend %>% color_branches(k=4) %>% ladderize %>% plot(horiz = TRUE); abline(v = .2, col = 2, lty = 2)

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

Вы также можете выбрать количество кластеров, используя find_k, который использует коэффициент силуэта (который в данном случае равен 2):

require(dendextend)
dend <- iris[1:5,-5] %>% dist %>% hclust %>% as.dendrogram 
find_k(dend)$k
dend %>% color_branches(k=find_k(.)$k) %>% ladderize %>% plot(horiz = TRUE); abline(v = .2, col = 2, lty = 2)

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

person Tal Galili    schedule 28.01.2017
comment
Очень хорошо. Неужели нельзя разрезать дендрограмму на уровне отсечки допуска? Если у вас есть дендрограмма со многими листьями, но количество значимых кластеров намного меньше (следовательно, предел допуска будет очень высоким), то на вырезанную дендрограмму будет намного легче смотреть, чем на «джунгли» по умолчанию, которые вы получаете, имея ее. пройти весь путь до листьев. - person dan; 28.01.2017

Можно использовать ape package до drop.tip:

require(ape)
require(dendextend)
require(data.tree)

dend <- iris[1:5,-5] %>% dist %>% hclust %>% as.dendrogram 
tol.level <- 0.28
dend %>% plot(horiz = TRUE); abline(v=tol.level,col="red",lty=2)

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

Таким образом, наш уровень допуска равен 0,28, и, следовательно, мы хотим свернуть листья (1,5) и (3,4), так как глубина их исходных узлов ниже tol.level.

#convert dendrogram to data.tree
dend.dt <- as.Node(dend)

#get vector of leaves per each internal node
node.list <- lapply(dend.dt$Get(function(node) node$leaves,filterFun = isNotLeaf),function(n) unname(sapply(unlist(n,recursive = T),function(l) l$name)))
#get vector of per each internal node
node.depth.df <- data.frame(depth=c(t(sapply(Traverse(dend.dt,traversal="pre-order",pruneFun=isNotLeaf),function(x) c(x$plotHeight)))),stringsAsFactors=F)

to.drop.leave.names <- c(sapply(which(node.depth.df$depth < tol.level),function(i) node.list[[i]]))

#convert dendrogram to phylo
phylo.dend <- as.phylo(dend)
phylo.dend <- drop.tip(phylo.dend,tip=to.drop.leave.names,interactive=FALSE,trim.internal=FALSE)
plot(phylo.dend,use.edge.length=F)

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

Теперь мы можем преобразовать его обратно в dendrogram (Chronogram)

new.dend <- chronos(phylo.dend)
person dan    schedule 31.01.2017