[R] creating dendrogram from cluster hierarchy

Timo Becker timo.becker at oeaw.ac.at
Tue Feb 28 14:15:32 CET 2006


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




More information about the R-help mailing list