2010-06-13 17 views
5

me encontré con this interesting website, con una idea de una manera de visualizar un algoritmo de agrupamiento llamado "Clustergram":¿Cómo crear un diagrama "Clustergram"? (En I)

alt text http://www.schonlau.net/images/clustergramexample.gif

No estoy seguro de lo útil que es en realidad, pero con el fin de jugar con él Me gustaría reproducirlo con R, pero no estoy seguro de cómo hacerlo.

¿Cómo crearía una línea para cada artículo para que se mantuviera constante a lo largo de la cantidad de clústeres?

He aquí un ejemplo de código/datos con los que jugar para la posible respuesta:

hc <- hclust(dist(USArrests), "ave") 
plot(hc) 

Respuesta

8

actualización: He publicado una solución con un largo ejemplo y discusión here. (se basa en el código que brindé a continuación). Además, Hadley fue muy amable y ofreció una implementación ggplot2 del código.

Aquí es una solución básica (para una mejor, mirar la "actualización" más arriba):

set.seed(100) 
Data <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2), 
       matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2)) 
colnames(Data) <- c("x", "y") 

# noise <- runif(100,0,.05) 
line.width <- rep(.004, dim(Data)[1]) 
Y <- NULL 
X <- NULL 
k.range <- 2:10 

plot(0, 0, col = "white", xlim = c(1,10), ylim = c(-.5,1.6), 
    xlab = "Number of clusters", ylab = "Clusters means", 
    main = "(Basic) Clustergram") 
axis(side =1, at = k.range) 
abline(v = k.range, col = "grey") 

centers.points <- list() 

for(k in k.range){ 
    cl <- kmeans(Data, k) 

    clusters.vec <- cl$cluster 
    the.centers <- apply(cl$centers,1, mean) 

    noise <- unlist(tapply(line.width, clusters.vec, 
          cumsum))[order(seq_along(clusters.vec)[order(clusters.vec)])] 
    noise <- noise - mean(range(noise)) 
    y <- the.centers[clusters.vec] + noise 
    Y <- cbind(Y, y) 
    x <- rep(k, length(y)) 
    X <- cbind(X, x) 

    centers.points[[k]] <- data.frame(y = the.centers , x = rep(k , k)) 
# points(the.centers ~ rep(k , k), pch = 19, col = "red", cex = 1.5) 
} 

require(colorspace) 
COL <- rainbow_hcl(100) 
matlines(t(X), t(Y), pch = 19, col = COL, lty = 1, lwd = 1.5) 

# add points 
lapply(centers.points, 
     function(xx){ with(xx,points(y~x, pch = 19, col = "red", cex = 1.3)) }) 

enter image description here

+0

interesante ... sólo un par de cosas en su código: tuve para cambiar 'colnames (x)' con 'colnames (data)' y la llamada a 'points (y ~ x)' en el bucle no se usa :) Aparte de eso, parece que funciona bien – nico

+0

Hi Nico, Limpié hasta el código con sus sugerencias (y con algunos otros suplementos agradables). Me alegra que te guste :) Mejor, Tal –

+0

Hola, Nico, creo que te puede interesar saber que escribí una función más detallada y un ejemplo para usar clustergram en mi blog aquí: http: //www.r-statistics. com/2010/06/clustergram-a-graph-for-visualizing-cluster-analyze-r-code / –

Cuestiones relacionadas