"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