[R] problem building dendrograms to use with heatmap()
Wittner, Ben
Wittner.Ben at mgh.harvard.edu
Mon Aug 29 15:37:45 CEST 2005
Thanks Paul.
It seems there's an undocumented requirement that in order to use a dendrogram
as an argument to heatmap(),
(a) the leaf nodes must be integers indicating the leaf's position in the
left-to-right ordering of the leafs and/or
(b) only the root of the dendrogram can be of class dendrogram.
I discovered this by doing as you suggested below and with some help from Jeff
Gentry.
-Ben
> -----Original Message-----
> From: Paul Murrell [mailto:p.murrell at auckland.ac.nz]
> Sent: Thursday, August 25, 2005 7:37 PM
> To: Wittner, Ben
> Cc: r-help at stat.math.ethz.ch
> Subject: Re: [R] problem building dendrograms to use with heatmap()
>
> Hi
>
>
> Wittner, Ben wrote:
> > Hi,
> >
> > I'm trying to build dendrograms to pass to heatmap().
> > The dendrograms I build plot properly, but when I pass them to heatmap()
> I get
> > the error message "row dendrogram ordering gave index of wrong length"
> (see
> > output log below).
>
>
> Looks like you're not building the dendrograms "properly". Compare
> unclass(nr2) with unclass() of a dendrogram from
> as.dendrogram(hclust(<something>)). You might need to look closely at
> stats:::as.dendrogram.hclust to get it right.
>
> Paul
>
>
> > I looked in the code of heatmap() and saw that the error was due to a
> NULL
> > return value from order.dendrogram(), which in turn got a NULL return
> value from
> > unlist(). But I have no idea why unlist() is returning NULL.
> >
> > I've included code below which reproduces the problem and below that the
> output
> > from a run of that code on my computer.
> >
> > Any help would be greatly appreciated. Thanks in advance.
> >
> > -Ben
> >
> > ########################### begin code
> ###################################
> >
> > version
> >
> > dendro.leaf <- function(label) {
> > ans <- list()
> > attr(ans, 'members') <- 1
> > attr(ans, 'height') <- 0
> > attr(ans, 'leaf') <- T
> > attr(ans, 'midpoint') <- 0
> > attr(ans, 'label') <- label
> > attr(ans, 'class') <- 'dendrogram'
> > ans
> > }
> >
> > dendro.merge <- function(d1, d2, height) {
> > ans <- list(d1, d2)
> > members <- attr(d1, 'members') + attr(d2, 'members')
> > attr(ans, 'members') <- members
> > attr(ans, 'height') <- height
> > attr(ans, 'leaf') <- F
> > attr(ans, 'midpoint') <- (members - 1)/2
> > attr(ans, 'class') <- 'dendrogram'
> > ans
> > }
> >
> > lc1 <- dendro.leaf('c1')
> > lc2 <- dendro.leaf('c2')
> > lc3 <- dendro.leaf('c3')
> > nc1 <- dendro.merge(lc1, lc2, 0.1)
> > nc2 <- dendro.merge(nc1, lc3, 0.2)
> > plot(nc2)
> >
> > lr1 <- dendro.leaf('r1')
> > lr2 <- dendro.leaf('r2')
> > lr3 <- dendro.leaf('r3')
> > nr1 <- dendro.merge(lr2, lr3, 0.1)
> > nr2 <- dendro.merge(lr1, nr1, 0.3)
> > plot(nr2)
> >
> > x <- matrix(seq(-1, 1, length.out=9), nrow=3)
> > rownames(x) <- paste('r', 1:3, sep='')
> > colnames(x) <- paste('c', 1:3, sep='')
> >
> > heatmap(x, Rowv=nr2, Colv=nc2, scale='none')
> >
> > order.dendrogram(nr2)
> >
> > unlist(nr2)
> >
> > ############### begin output from run of code above ##################
> >
> >
> >>version
> >
> > _
> > platform i686-pc-linux-gnu
> > arch i686
> > os linux-gnu
> > system i686, linux-gnu
> > status
> > major 2
> > minor 1.1
> > year 2005
> > month 06
> > day 20
> > language R
> >
> >>dendro.leaf <- function(label) {
> >
> > + ans <- list()
> > + attr(ans, 'members') <- 1
> > + attr(ans, 'height') <- 0
> > + attr(ans, 'leaf') <- T
> > + attr(ans, 'midpoint') <- 0
> > + attr(ans, 'label') <- label
> > + attr(ans, 'class') <- 'dendrogram'
> > + ans
> > + }
> >
> >>dendro.merge <- function(d1, d2, height) {
> >
> > + ans <- list(d1, d2)
> > + members <- attr(d1, 'members') + attr(d2, 'members')
> > + attr(ans, 'members') <- members
> > + attr(ans, 'height') <- height
> > + attr(ans, 'leaf') <- F
> > + attr(ans, 'midpoint') <- (members - 1)/2
> > + attr(ans, 'class') <- 'dendrogram'
> > + ans
> > + }
> >
> >>lc1 <- dendro.leaf('c1')
> >>lc2 <- dendro.leaf('c2')
> >>lc3 <- dendro.leaf('c3')
> >>nc1 <- dendro.merge(lc1, lc2, 0.1)
> >>nc2 <- dendro.merge(nc1, lc3, 0.2)
> >>plot(nc2)
> >>
> >>lr1 <- dendro.leaf('r1')
> >>lr2 <- dendro.leaf('r2')
> >>lr3 <- dendro.leaf('r3')
> >>nr1 <- dendro.merge(lr2, lr3, 0.1)
> >>nr2 <- dendro.merge(lr1, nr1, 0.3)
> >>plot(nr2)
> >>
> >>x <- matrix(seq(-1, 1, length.out=9), nrow=3)
> >>rownames(x) <- paste('r', 1:3, sep='')
> >>colnames(x) <- paste('c', 1:3, sep='')
> >>
> >>heatmap(x, Rowv=nr2, Colv=nc2, scale='none')
> >
> > Error in heatmap(x, Rowv = nr2, Colv = nc2, scale = "none") :
> > row dendrogram ordering gave index of wrong length
> >
> >>order.dendrogram(nr2)
> >
> > NULL
> >
> >>unlist(nr2)
> >
> > NULL
> >
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide! http://www.R-project.org/posting-
> guide.html
>
>
> --
> Dr Paul Murrell
> Department of Statistics
> The University of Auckland
> Private Bag 92019
> Auckland
> New Zealand
> 64 9 3737599 x85392
> paul at stat.auckland.ac.nz
> http://www.stat.auckland.ac.nz/~paul/
More information about the R-help
mailing list