R

Où couper un dendrogramme ?

Divers

La fonction best.cutree est maintenant disponible dans la package JLutils.

Dans le cadre d’une classification hiérarchique, il n’est pas toujours aisée de déterminer le nombre adéquat de classes à retenir.

Le package FactoMineR, dans le cadre de sa fonction HCPC, suggère d’utiliser la partition ayant la plus grande perte relative d’inertie. La fonction best.cutree ci-dessous permet de calculer ce critère à partir de n’importe quel dendrogramme, qu’il ait été calculé avec hclust ou agnes.

best.cutree <- function(hc, min=3, max=20, loss=FALSE, graph=FALSE, ...){
  if (class(hc)!="hclust") hc <- as.hclust(hc)
  max <- min(max, length(hc$height))
  inert.gain <- rev(hc$height)
  intra <- rev(cumsum(rev(inert.gain)))
  relative.loss = intra[min:(max)]/intra[(min - 1):(max - 1)]
  best = which.min(relative.loss)
  names(relative.loss) <- min:max
  if (graph) {
    temp <- relative.loss
    temp[best] <- NA
    best2 <- which.min(temp)
    pch <- rep(1, max-min+1)
    pch[best] <- 16
    pch[best2] <- 21
    plot(min:max, relative.loss, pch=pch, bg="grey75", ...)
  } else {
    if (loss)
      relative.loss
    else
      best + min - 1
  }
}
  • hc : dendrogramme renvoyé par hclust ou agnes
  • min : nombre minimum de classes
  • max : nombre maximum de classes
  • loss : si égal à TRUE, renverra la liste des pertes d’inertie relatives plutôt que la meilleure partition
  • graph : si égal àTRUE, affichera un graphique des pertes d’inertie relatives, la meilleure partition étant représentée par un point noir et la seconde par un point gris

Exemples :

R> best.cutree(arbre)
[1] 5

R> best.cutree(arbre,loss=TRUE)
        3         4         5         6         7 
0.9112290 0.9046093 0.8985344 0.9081087 0.9131271 
        8         9        10        11        12 
0.9223434 0.9542413 0.9569882 0.9626851 0.9667498 
       13        14        15        16        17 
0.9744444 0.9751951 0.9808652 0.9813681 0.9814403 
       18        19        20 
0.9818613 0.9819599 0.9819514 

R> best.cutree(arbre,graph=TRUE)
PNG - 3.5 ko