creating dendrogram from cluster hierarchy
Martin Maechler schrieb:
"Timo" == Timo Becker <timo.becker at oeaw.ac.at>
on Tue, 28 Feb 2006 11:01:26 +0100 writes:
Timo> Dear R users, I have created data for hierarchical Timo> agglomerative cluster analysis which consist of the Timo> merging pairs and the agglomeration heights, e.g. Timo> something like Timo> my.merge <- matrix(c(-1,-2,-3,1), ncol=2, byrow=TRUE) Timo> my.height <- c(0.5, 1) Timo> I'd like to plot a corresponding dendrogram but I Timo> don't know how to convert my data to achieve this. Is Timo> it possible to create a dendrogram object from a Timo> cluster hierarchy? Yes, it is possible. R does it already with the as.dendrogram() method for objects of class "hclust".
Unfortunately the hierarchy is created by another program than R. This is the reason why the only available data for the hclust or dendrogram object creation are the merge-matrix and the agglomeration heights. So as.dendrogram() does not work here.
But I assume you'd also like to know *how* you can do it... ;-) I'd strongly recommend to take the example of hclust() and have your function return an object ``like'' the one hclust() returns. Then, as.dendrogram( <your object> ) will work. You have to decide for yourself if your function should return an object of class "hclust" (which is partly described by ?hclust ), and you use as.dendrogram[.hclust]() directly, or rather your function returns a class "hclustTimo" and you write your own as.dendrogram.hclustTimo() method. I'd recommend looking at and using the R's source code, e.g., from https://svn.R-project.org/R/trunk/src/library/stats/R/hclust.R and https://svn.R-project.org/R/trunk/src/library/stats/R/dendrogram.R Regards, Martin Maechler, ETH Zurich
I adapted the source code of hclust.R and a quick (and VERY dirty)
solution is as follows:
hierarchy2dendrogram <- function(hierarchy) {
tree <- list(merge = hierarchy[,1:2],
height= hierarchy[,3],
order = seq(1:(dim(hierarchy)[1]+1)),
method=NULL,
call = match.call(),
dist.method = "whatever")
class(tree) <- "hclust"
return(tree)
}
my.merge <- matrix(c(-1,-2,-3,1), ncol=2, byrow=TRUE)
my.height <- c(0.5, 1)
my.hierarchy <- cbind(my.merge, my.height)
my.hclust.object <- hierarchy2dendrogram(my.hierarchy)
plot(my.hclust.object)
Perhaps there exists a "cleaner" solution which also returns the optimal
order (if I am right the ordering is accomplished by the Fortran
function "hcass2") but the above works fine for me.
Thanks a lot and best regards,
Timo
Timo Becker Phonetics Austrian Academy of Sciences Acoustics Research Institute