2017-01-25 3 views
1

Ich möchte Zweige einer dendrogram bei einer Toleranzgrenze reduzieren.Ein Dendrogramm mit einer Toleranzgrenze schließen

Ich folge dendextend 's collapse_branchexample.

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

enter image description here

Im Gegensatz zu den in dendrogram s dendextend ‚s example, würde Ich mag alle kollabierte Zweige ersetzen (dh jeder Clade Recht auf die vertikale rote Linie gestrichelt) durch ein Dreieck ähnlich wie clades sind in dieser Figur (von this link) präsentiert:

enter image description here

Wenn dies zu viel ist ich zum Schneiden t würde begleichen zu fragen er verzweigt sich an der Toleranzgrenze.

Antwort

1

Dreiecke zu bekommen ist in der Tat ein bisschen zu viel, aber Sie können die Zweige färben. Entweder durch Höhe oder durch die Anzahl von Clustern, von color_branches Verwendung:

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) 

enter image description here

Sie auch die Anzahl der Cluster auswählen kann unter Verwendung von find_k die die Silhouette Koeffizient verwendet (die in diesem Fall ist, 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) 

enter image description here

+0

Sehr schön zurück. Ist es wirklich unmöglich, das Dendrogramm auf der Toleranzgrenze zu schneiden? Wenn man ein Dendrogramm mit vielen Blättern hat, aber die Anzahl bedeutungsvoller Cluster viel kleiner ist (daher wird die Toleranzgrenze sehr hoch sein), wird ein Schnitt-Dendrogramm so viel einfacher zu betrachten sein als der Standard-Dschungel, den man erhält geh den ganzen Weg hinunter zu den Blättern. – dan

0

One dieverwenden könnenpackage-drop.tip ‚s:

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) 

enter image description here

Also unsere Toleranzgrenze ist 0,28 und damit wollen wir Blätter (1,5) und (3,4), kollabieren, da die Tiefe ihrer Vorfahren Knoten sind unter 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) 

enter image description here

Jetzt können wir es konvertieren zu einem dendrogram (Chronogram)

new.dend <- chronos(phylo.dend) 
Verwandte Themen