Agrupación jerárquica en R
library(cluster)
library(purrr)
data <- USArrests
# eliminamos los valores nulos
head(data)
Murder Assault UrbanPop Rape
Alabama 13.2 236 58 21.2
Alaska 10.0 263 48 44.5
Arizona 8.1 294 80 31.0
Arkansas 8.8 190 50 19.5
California 9.0 276 91 40.6
Colorado 7.9 204 78 38.7
Al igual que en otros métodos estadísticos (PCA, ridge regression, lasso…), la escala en la que se miden las variables y la magnitud de su varianza pueden afectar en gran medida a los resultados obtenidos por clustering. Si una variable tiene una escala mucho mayor que el resto, determinará en gran medida el valor de distancia/similitud obtenido al comparar las observaciones, dirigiendo así la agrupación final. Escalar y centrar las variables de forma que todas ellas tengan media 0 y desviación estándar 1 antes de calcular la matriz de distancias asegura que todas las variables tengan el mismo peso cuando se realice el clustering.
Para escalar los datos, utilice la función scale(). scale es una función genérica cuyo método predeterminado centra y / o escala las columnas de una matriz numérica. Si el argumento center se establece en VERDADERO, el centrado se realiza tomando las desviaciones medias de cada columna. Si scale = TRUE, la escala se realiza dividiendo las columnas de datos (centradas) por sus desviaciones estándar.
data <- scale(data)
head(data)
Murder Assault UrbanPop Rape
Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
Arizona 0.07163341 1.4788032 0.9989801 1.042878388
Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602
California 0.27826823 1.2628144 1.7589234 2.067820292
Colorado 0.02571456 0.3988593 0.8608085 1.864967207
calcula y devuelve la matriz de distancia calculada utilizando la medida de distancia especificada para calcular las distancias entre las filas de una matriz de datos. El argumento x especifica una matriz numérica, un marco de datos o un objeto “dist”. El método del segundo argumento especifica la medida de distancia que se utilizará. El método debe ser uno de los siguientes:
“euclidiana”, “máximo”, “manhattan”, “canberra”, “binario” o “minkowski”
library(stats)
# Matriz de distancias
res.dist = dist(x = data,
method = "euclidean")
# Imprimi la matriz de distancias
output = as.matrix(res.dist)[1:6, 1:6]
round(output, digits = 3)
Alabama Alaska Arizona Arkansas California Colorado
Alabama 0.000 2.704 2.294 1.290 3.263 2.651
Alaska 2.704 0.000 2.701 2.826 3.013 2.327
Arizona 2.294 2.701 0.000 2.718 1.310 1.365
Arkansas 1.290 2.826 2.718 0.000 3.764 2.831
California 3.263 3.013 1.310 3.764 0.000 1.288
Colorado 2.651 2.327 1.365 2.831 1.288 0.000
El argumento despecifica una estructura de disimilitud producida por la dist() función. El segundo argumento es el method que especifica el método de aglomeración que se utilizará. Debe ser uno de los siguientes:
“ward.D”, “ward.D2”, “single”, “complete”, “average” (UPGMA), “mcquitty” (WPGMA), “median” (WPGMC) or “centroid” (UPGMC).
# Dissimilarity matrix
d <- dist(data, method = "euclidean")
# Hierarchical clustering using Complete Linkage
hc1 <- hclust(d, method = "complete" )
# Plot the obtained dendrogram
plot(hc1, cex = 0.6, hang = -1)
Otra alternativa es la función agnes. Ambas funciones son bastante similares; sin embargo, con la función agnes también puede obtener el coeficiente de aglomeración, que mide la cantidad de estructura de agrupamiento encontrada (los valores más cercanos a 1 sugieren una estructura de agrupación fuerte).
hc2 <- agnes(data, method = "complete")
# Agglomerative coefficient
hc2$ac
[1] 0.8531583
# metodos a comparar
metodo <- c( "average", "single", "complete", "ward")
names(metodo) <- c( "average", "single", "complete", "ward")
# calculo de coeficiente para cada método
ac <- function(x) {
agnes(data, method = x)$ac
}
map_dbl(metodo, ac)
average single complete ward
0.7379371 0.6276128 0.8531583 0.9346210
El método Ward utiliza el coeficiente mas alto de aglomeración.
hc3 <- agnes(data, method = "ward")
pltree(hc3, cex = 0.6, hang = -1, main = "Dendrograma de agnes")
La función ‘diana’ en el paquete de clúster nos ayuda a realizar agrupamientos jerárquicos divisivos. ‘diana’ funciona de manera similar a ‘agnes’. Sin embargo, no hay un argumento de método aquí, y, en lugar del coeficiente de aglomeración, tenemos un coeficiente de división.
# c
hc4 <- diana(data)
# 0.8531583
# Divise coefficient
hc4$dc
[1] 0.8514345
# plot dendrogram
pltree(hc4, cex = 0.6, hang = -1, main = "Dendrograma de diana")
rect.hclust(hc4, k = 9, border = 2:10)
pltree(hc3, cex = 0.6, hang = -1, main = "Dendrograma de agnes")
rect.hclust(hc3, k = 9, border = 2:10)
library(factoextra)
clust <- cutree(hc4, k = 6)
fviz_cluster(list(data = data, cluster = clust)) ## ‘factoextra’ package