Introducción

El análisis de clusters procura formar grupos en los que se clasifican los individuos de una base de datos de manera que los individuos dentro de cada grupos sean lo más similares entre ellos y los grupos sean lo más diferentes entre uno y otro.

La primera cuestión, en el análisis de clústers es establecer en base a qué variables construir los conglomerados. Dicho aspecto no es nada trivial y depende más del conocimiento y experiencia del analista.

El proceso de construcción de clusters normalmente se realiza en dos fase: primero se construye la matriz de proximidades (distancias similaridades) y despues se aglomeran/agrupan los individuos.

\[ \text{Matriz de datos --> Matriz de proximidades --> Clusters} \]

Aunque la agrupación se realiza en base a la proximidad, no siempre es la distancia euclídea la que deb ser usada.

Técnicas jerárquicas de aglomeración

Actúan de forma secuencial.

Fases del proceso de aglomeración

1. identificación de los elementos más próximos

A partir de la matriz de distancias \(\mathbf{D}_{n\times n}= (d_{ij})\), que prácticamente representa el conglomerado inicial de \(n\) elementos, se unen los dos indivíduos, \(u\space v\), más proximos según la matriz, eso es: \[ d_{uv}=min(d_{ij}\in \mathbf D) \]

Ahora tendremos 2 conglomerados: uno con \(2\) elementos y otro con \(n-2\) elementos.

2. Cálculo de una nueva matriz

Se calcula una nueva matriz \(\Delta =(\delta_{ij})\) cuyos elementos son \(\delta_{ij}=(\delta_{ij})\), según la distancia considerada.

3. Un nuevo conglomerado

Se forma uno nuevo, unidendo los dos más próximos según la matriz \(\mathbf \Delta\), tal que \[ \delta_{sw}=min(\delta_{ij} \in \mathbf\Delta) \]

Y a continuación, se repiten la segunda y tercera fase.

Ejemplo

Matriz \(D\) de distancias entre \(6\) individuos
1 2 3 4 5 6
1 0 1 4.5 4 8 9
2 1 0 2 5 5 6
3 4.5 2 0 4 10 5
4 5 5 4 0 3.5 3
5 8 5 10 3.5 0 6
6 9 6 5 3 6 0

El primer paso es encontrar los primeros dos elementos que tengan la menor distancia entre si. Estos son \(\textbf1\) y \(\textbf2\), con distancia \(1\) que formaran el primer cluster, \(\delta_{12}\).

Sucesivamente, serán:

\[ \begin{align} & \delta_{(12)3}=d_{min}=2\\ & \delta_{(123)4}=d_{min}=4\\ & \delta_{(123)(46)}=d_{min}=3\\ & \delta_{(123)(46)5}=d_{min}=3.5 \end{align} \]

Distancias y similaridades entre individuos

Dada una matriz \[ Individuos \begin{pmatrix} & Variables\\ x_{11} & x_{12} &... & x_{1p}\\ ... & ... &... & ...\\ x_{u1} & x_{u2} &... & x_{up}\\ x_{w1} & x_{w2} &... & x_{wp}\\ ... & ... &... & ...\\ x_{n1} & x_{n2} &... & x_{np} \end{pmatrix} \]

La matriz de distancias entre individuos será una matriz \(n\times n\) de la forma:

\[ \begin{pmatrix} 0 & & & \\ d(2,1) & 0 & & \\ d(3,1) & d(3,2) & 0 & \\ ... & ... &... & 0 \\ d(n,1) & d(n,2) & d(n,3) & ...& 0 \\ \end{pmatrix} \]

\(d_{i,j}\) Es pues la distancia entre el individuo \(i\) y el \(j\). Lo que no tiene que ser una distancia en el sentido matemático del término. Basta con que sea tal que: \[ d(i,i)=0\;\;d(i,j)\geq0\;\;d(i,j)=d(j,i)\;,\;\forall \;i,j \]

En algún caso se requiere la desigualdad triangular \[ d(i,j)\leq d(i,k)+d(k,j)\;,\;\forall\;i,j,k \]

o en incluso la desigualdad ultramétrica

\[ d(i,j)\leq \max(d(i,k),d(k,j)) \;,\;\forall\;i,j,k \]

Cálculo de la matriz de distancias

El cálculo de la matriz de distancias depende del tipo de datos que tengamos.

Datos cuantitativos en escala aproximadamente lineal

Si todos los datos de la matriz son de este tipo se puede utilizar la distancia euclidea, definida por

\[ d_{uw}=\sqrt{\sum_{i=1}^p{(x_{ui}-x_{wi})^2 } } \]

La distancia Euclídea es la más usada, aunque también se puede utilizar la distancia de Manhattan

\[ d_{uw}=\sqrt{\sum_{i=1}^p{|x_{ui}-x_{wi}| } } \]

Ejemplo 1

Tenemos 6 indivíduos con altura y pesos diferentes:

\[ \textbf{D}_1= \begin{pmatrix} 1 & 1.72 & 75.00 \\ 2 & 1.75 & 80.00 \\ 3 & 1.60 & 65.00 \\ 4 & 1.80 & 79.00 \\ 5 & 1.65 & 71.00 \\ 6 & 1.90 & 92.00 \\ \end{pmatrix} \]

La matriz de de distancias sería

\[ \mathbf D= \begin{pmatrix} 0 & & & \\ d(2,1) & 0 & & \\ d(3,1) & d(3,2) & 0 & \\ d(4,1) & d(4,2) & d(4,3) & 0 & \\ d(5,1) & d(5,2) & d(5,3) & d(5,4) & 0 \\ d(6,1) & d(6,2) & d(6,3) & d(6,4) & d(6,5) & 0 \\ \end{pmatrix} \]


Lo que, en distancia euclídea daría la matriz

\[ d(1,2)= \sqrt{(1.72-1.75)^2+(75-80)^2}=\sqrt{0.0009+25}=5.000090, \text{etc.}\\ \mathbf D= \begin{pmatrix} 1 & 0.000000 \\ 2 & 5.000090 & 0.000000 \\ 3 & 10.000720 & 15.000750 & 0.000000 \\ 4 & 4.000800 & 1.001249 & 14.001428 & 0.000000 \\ 5 & 4.000612 & 9.000556 & 6.000208 & 8.001406 & 0.000000 \\ 6 & 17.000953 & 12.000937 & 27.001667 & 13.000385 & 21.001488 & 0.000000 \\ \end{pmatrix} \]


Y, análogamente, en distancia Manhattan:

\[ \mathbf D= \begin{pmatrix} 1 & 0.00 \\ 2 & 5.03 & 0.00 \\ 3 & 10.12 & 15.15 & 0.00 \\ 4 & 4.08 & 1.05 & 14.20 & 0.00 \\ 5 & 4.07 & 9.10 & 6.05 & 8.15 & 0.00 \\ 6 & 17.18 & 12.15 & 27.30 & 13.10 & 21.25 & 0.00 \\ \end{pmatrix} \]


Estandadización previa de los datos

Como puede ser fácilmente observado, en este cálculo que acabamos de ver, la diferenecia de escala juega un peso fundamental, ya que la variable \(Estatura\) juega un rol mucho mayor que \(Peso\). Si el cálculo de la estatura se hubiese hecho en \(cm\) en lugar que \(m\), el resultado hubiera sido el contrario.

Para obviar tales problemáticas, es decir los efectos indeseados de las escalas en la medición de las variables, hay que estandardizar/tipificar los datos previamente al cálculo de distancias

Estandardización con la Desviación Absoluta Media (Average Absolute Deviation ) \(\text{AAD}\)

Ver también en.wikipedia.org. Conocida también como desviación media de la media. Importante no confundir conceptos: la \(\text {AAD}\) a veces se encuentra como \(text{MAD}\) (ver abajo) incluso en documentación de R. Fijarse bien cuando se ejecuta alguna función si se trata de mediana o de media.

\[ AAD=\frac{1}{n} \sum_{i=1}^n|x_{ij}-\overline x_i| \]

Por lo tanto, cada dato dato \(x_{ij}\) de la matriz se tipificará así:

\[ x_{ij}=\frac{|x_{ij}-\overline x|}{AAD} \]

Estandardización con la Desviación Absoluta Mediana (Median Absolute Deviation ) \(\text{MAD}\)

Ver también en.wikipedia.org. Conocida también como desviación mediana de la mediana.

\[ MAD=mediana(|x_{ij}-M|)_{j=1}^n \]

Por basarse en la mediana, en lugar que en el promedio, es un valor más robusto, menos influenciado por los valores atípicos.

A partir de aquí, ya se pueden calcular las distancias y generar la matriz de distancias.

Ejemplo 1 (continuación con R)

Cálculo de \(\text{AAD}\)

# Se aplica una iteración por columnas

# AAD: Método 1
# AAD = 1/n * SUM|(x- mx)| / n -------Desviación absoluta media (Average Absolute Deviation)
AAD <- sapply(1:ncol(m), function(x) {
  sum(abs(m[,x] - mean(m[,x])))
  }) / nrow(m)

AAD
## [1] 0.080000 6.666667

Cálculo de \(\text{MAD}\)

# Se aplica una iteración por columnas

MAD <- sapply(1:ncol(m), function(x) {
  median(abs(m[,x] - median(m[,x])))
  })

MAD
## [1] 0.075 4.500

Se puede observar como, en el casos de los pesos, los valores de la desviación son diferentes según el método utilizado.

Matriz de datos tipificados

Utilizando la desviación absoluta media (AAD)

# Matriz de datos tipificada

TDM_AAD <- sapply(1:2, function(x) {
   abs(m[,x] - mean(m[,x]))/AAD[x]
})

TDM_AAD
##           [,1] [,2]
## [1,] 0.2083333 0.30
## [2,] 0.1666667 0.45
## [3,] 1.7083333 1.80
## [4,] 0.7916667 0.30
## [5,] 1.0833333 0.90
## [6,] 2.0416667 2.25

Utilizando la desviación absoluta mediana (MAD)

TDM_MAD <- sapply(1:2, function(x) {
   abs(m[,x] - mean(m[,x]))/MAD[x]
})

TDM_MAD
##           [,1]      [,2]
## [1,] 0.2222222 0.4444444
## [2,] 0.1777778 0.6666667
## [3,] 1.8222222 2.6666667
## [4,] 0.8444444 0.4444444
## [5,] 1.1555556 1.3333333
## [6,] 2.1777778 3.3333333

Cálculo de la matriz de distancias

Utilizando la desviación absoluta media (AAD) i la función \(\texttt{dist()}\) de R

d_AAD <- dist(TDM_AAD,diag = T, method = "euclidian")
d_AAD
##           1         2         3         4         5         6
## 1 0.0000000                                                  
## 2 0.1556795 0.0000000                                        
## 3 2.1213203 2.0492038 0.0000000                              
## 4 0.5833333 0.6427480 1.7579186 0.0000000                    
## 5 1.0609548 1.0211649 1.0957304 0.6671353 0.0000000          
## 6 2.6764923 2.5991585 0.5600099 2.3162470 1.6555672 0.0000000

Utilizando la desviación absoluta mediana (MAD) i la función \(\texttt{dist()}\) de R

d_MAD <- dist(TDM_MAD,diag = T, method = "euclidian")

d_MAD
##           1         2         3         4         5         6
## 1 0.0000000                                                  
## 2 0.2266231 0.0000000                                        
## 3 2.7382972 2.5892465 0.0000000                              
## 4 0.6222222 0.7027284 2.4278223 0.0000000                    
## 5 1.2888889 1.1834246 1.4907120 0.9417609 0.0000000          
## 6 3.4885350 3.3333333 0.7555556 3.1817380 2.2460940 0.0000000

Se pueden pues visualizar las diferencias que nos podemos encontrar utilizando un método u otro. Lo que queda evidente es la enorme diferencia con el método sin estandardizar. Cosa que tendremos que tener presente siempre que trabajemos con unidades de medición diferentes.

Datos cuantitativos que sean rangos de observaciones

Se incluyen en este apartado las observaciones de una variable ordenadas de menor a mayor (1, para el valor más pequeño, 2 para el siguiente \(n\) para el más grande). También se incluyen las observaciones que no vengan referidas a una escala fixa de medida, como por ejemplo las que usan la escala Likkert: unos valores ordenados (de 1 a 10, de 1 a 5, etc.), para medir coincidencia de opiniones, estados de ánimo, etc.

Tipificación en una escala de valores de 0 a 1

Esto se realiza con la típica fórmula \[ x'=\frac{x-min}{max-min} \]

que en el caso de una típica escala Likert \(1-5\), sería

\[ x'=\frac{x-1}{5-1}\;\text{Por ejemplo: para 3 sería: } x'=\frac{3-1}{5-1}=\frac{2}{4}=0.5 \]

Por lo que, una matriz de valores en dicha escala: \[\begin{pmatrix} 2 & 5 \\ 5 & 4 \\ 3 & 1 \\ 1 & 3 \\ 4 & 2 \\ \end{pmatrix}\]

Se tipificaría con este resultado:

\[\begin{pmatrix} 0.25 & 1.00 \\ 1.00 & 0.75 \\ 0.50 & 0.00 \\ 0.00 & 0.50 \\ 0.75 & 0.25 \\ \end{pmatrix}\]

Las distancias se calculan de la misma manera que con los datos en escala lineal que hemos visto antes.


Datos cuantitativos en escala no lineal

Por ejemplo los datos de población de bacterias, que crecen de manera exponencial. Hay que tratarlos con una función que les ponga en la esscala lineal. En el ejemplo anterior, habría que aplicarles la escala logarítmica.


Datos cualitativos

Este tipo de datos se refiere a variables cualitativas, como sexo, idioma, estado civil, etc., que toman valores \(x_{ij}\) que en realidad son clases/modalidades que toman dichas variables/carácteres. Como distancia entre el indivíduo \(u=(x_{u1},x_{u2},...,x_{un})\) y el indivíduo \(w= (x_{w1},x_{w2},...,x_{wn})\) suele tomarse el \(\text{SMC-Simple Matching Distance}\), Distancia de Emparejamiento Simple, que deriva de \(\text{SMC Simple Matching Cofficient}\) Coeficiante de Emparejamiento Simple

\[ \text{SMD}= 1-\text{SMC} \]

En el específico, para una matriz de datos de \(p\) variables categóricas, el \(\text{SMD}\) será

\[ \text{SMD o }d_{uw}=\frac{\text{variables "no matching"}}{p} \]

Si nuestra matriz de datos es de \(p=3\) variables y de la forma

\[\begin{pmatrix} ... & ... & ... \\ M & Castaño & Sí \\ ... & ... & ... \\ M & Azul & No \\ ... & ... & ... \\ \end{pmatrix}\]

la distancia entre indivduos \(\text{SMD o }d_{uw}\) será

\[ \text{SMD o }d_{uw}=\frac{\text{variables "no matching"}}{p}=\frac{1}{3} \]

Ya que los dos individuos toman modalidad diferente sólo en una variable.

Si todas las variables de tipo cualitativo son son binarias simétricas (dos posibles valores con la misma importancia). Por ejemplo

\[\begin{matrix} & \begin{matrix} \phantom{i} x\phantom{ii} & y\phantom{ii} & z\phantom{ii} & h\phantom{ii} & g\phantom{ii} \end{matrix} \\ \begin{matrix} 1\\ u\\ 3\\ w\\ 5\\ \end{matrix} & \begin{pmatrix} ... & ... & ... & ... & ... \\ \phantom{ee}1 & \phantom{ee}0 & \phantom{ee}1 & \phantom{ee}1 & \phantom{ee}0 \\ ... & ... & ... & ... & ... \\ \phantom{ee}1 & \phantom{ee}1 & \phantom{ee}1 & \phantom{ee}0 & \phantom{ee}0 \\ ... & ... & ... & ... & ... \\ \end{pmatrix} \\ \end{matrix}\]

Los valores de los dos individus \(u\) y \(w\) pueden ponerse en una tabla de doble entrada

\[ \begin{array} {c|cc} u/w & 1 & 0 \\ \hline 1 & a & b \\ 0 & c & d \end{array} \]

\[ \begin{array} {l} a=\text{Contar 11} \\ b=\text{Contar 01} \\ c=\text{Contar 10} \\ d=\text{Contar 00} \\ \end{array} \]

Para variables categóricas simétricas

Con lo cual, la ecuación de la distancia vendría a ser:

\[ \text{SMD o }d_{uw}=\frac{\text{variables "no matching"}}{p}=\frac{b+c}{a+b+c+d} \]

Volviendo a la matriz de datos de arriba, los valores de la ecuación en la tabla de doble entrada serían:

\[ \begin{array} {c|cc} u/w & 1 & 0 \\ \hline 1 & 2 & 1 \\ 0 & 1 & 1 \end{array} \]

Y la distancia o \(\text{SMD}\) sería

\[ \text{SMD o }d_{uw}=\frac{\text{variables "no matching"}}{p}=\frac{b+c}{a+b+c+d}=\frac{2}{5} \]

Para variables categóricas asimétricas

Cuando la variables son asimétricas (en casos que una de las dos opciones sea más significativa…), se utiliza la distancia denominada Coeficiente de Jaccard, apartando los \(d\), es decir \((0,0)\), del cálculo:

\[ \text{SMD o }d_{uw}=\frac{b+c}{a+b+c}=\frac{2}{4} \]

Datos en que aparecen variables de vario tipo (Distancia de Gower)

Fórmula general: \[ d_{wu}=\frac{\sum_{1=1}^pI_{uw}^id_{uw}^i}{\sum_{uw}^pI_{uw}^i} \]

\(I_{uw}^i\): Es un coeficiente de ponderación que normalmente se pone \(I_{uw}^i=1\), excepto cuando \(p_i\) es categórica asimétrica. Que, como hemos visto arriba, cuando \(d=(0,0)\), no se suma la al numerador, y a \(p\) tampoco. Entonces se pone \(I_{uw}^{asimétrica} =0\). Entonces:

  1. Si no hay variables asimétricas o éstas no son iguales a \(0\),

\[ d_{wu}=\frac{\sum_{1=1}^p d_{uw}^i}{p} \]

  1. Si hay variables asimétricas iguales a \(0\),

\[ d_{wu}=\frac{\sum_{1=1}^p d_{uw}^i}{p-var^{asim=0}} \]

Si \(i\) es una variable dicotómica|asimétrica, \[ d_{ij}^i=0\; si\; x_{ui}=x_{wi}=0;\; else=1 \]

Si \(i\) es una variable categórica, \[ d_{ij}^i=0\; si\; x_{ui}=x_{wi};\; else=1 \]

Si \(i\) es una variable numérica aproximadamente lineal, \[ d_{ij}^i=\frac{|x_{ui}-x_{wi}|}{\max_ux_{ui}-\min_ux_{ui}} \]

Si \(i\) es una variable numérica no lineal o los datos son en rango, se ejecuta en dos: el primero para tipificar, el segundo para calcular realmente las distancias

\[ \begin{array} {c|c} \text{Paso 1} & \text{Paso 2}\\ \hline x_{ij}^i=\frac{x_{ij}-\min{i}}{\max_i - \min_i} & d_{ij}^i=\frac{|x_{ui}-x_{wi}|}{\max_ux_{ui}-\min_ux_{ui}} \end{array} \]


Ejemplo 2

Tenemos una matriz de valores de 4 variables de valores, respectivamente, numericos, categóricos (colores 1=“verde”, 5=“rojo”, 2=“azul”), categóricos asimétricos

\[\begin{matrix} & \begin{matrix} \phantom{i} Numerico & Categórico & Asimétrico \end{matrix} \\ \begin{matrix} 1\\ 2\\ 3\\ \end{matrix} & \begin{pmatrix} \phantom{eeeeeee}1 & \phantom{eeeeeeeee}1 & \phantom{eeeeeeeee}0 \\ \phantom{eeeeeee}2 & \phantom{eeeeeeeee}5 & \phantom{eeeeeeeee}0 \\ \phantom{eeeeeee}3 & \phantom{eeeeeeeee}2 & \phantom{eeeeeeeee}1 \\ \end{pmatrix} \\ \end{matrix}\]

Columna 1 (numérica)

\[ d_{ij}^i=\frac{|x_{ui}-x_{wi}|}{\max_ux_{ui}-\min_ux_{ui}} \]

\[\begin{matrix} & \begin{matrix} \phantom{i} 1\phantom{ii} & 2\phantom{ii} & 3\phantom{ii} \end{matrix} \\ \begin{matrix} 1\\ 2\\ 3\\ \end{matrix} & \begin{pmatrix} 0.0 & 0.5 & 1.0 \\ 0.5 & 0.0 & 0.5 \\ 1.0 & 0.5 & 0.0 \\ \end{pmatrix} \\ \end{matrix}\]

Columna 2 (categórica)

\[ d_{ij}^i=0\; si\; x_{ui}=x_{wi};\; else=1 \]

\[ \begin{matrix} & \begin{matrix} 1 & 2 & 3 \end{matrix} \\ \begin{matrix} 1\\ 2\\ 3\\ \end{matrix} & \begin{pmatrix} 0 & & \\ 1 & 0 & \\ 1 & 1 & 0 \\ \end{pmatrix} \\ \end{matrix} \]

Columna 3 (asimétrica)

\[ d_{ij}^i=0\; si\; x_{ui}=x_{wi}=0;\; else=1 \]

\[ \begin{matrix} & \begin{matrix} 1 & 2 & 3 \end{matrix} \\ \begin{matrix} 1\\ 2\\ 3\\ \end{matrix} & \begin{pmatrix} 0 & & \\ 0 & 0 & \\ 1 & 1 & 0 \\ \end{pmatrix} \\ \end{matrix} \]

Cálculo de la distancia

Considerando \(I_{uw}î\) siempre igual a 1, sin practicar ponderación aplicaremos

\[ d_{wu}=\frac{\sum_{1=1}^p d_{uw}^i}{p} \]

sobre las \(p=3\) variables y \(n\) observaciones

\[ \begin{equation} \begin{split} & d_{1,2}=\frac{0.5+1+0}{2}=\frac{1.5}{2}=0.75\; \text{Fijarse en el denominador: es } p-1\text{ porque la variable asimétrica=0}\\ & d_{1,3}=\frac{1+1+1}{3}=\frac{3}{3}=1\\ & d_{2,3}=\frac{0.5+1+1}{3}=\frac{2.5}{3}=0.8333\\ \end{split} \end{equation} \]

Cálculo con R, utilizando la función \(\texttt{daisy()}\) de la librería \(\texttt{cluster}\)

m <- as.data.frame(matrix(c(
         1,2,3,
         1,5,2,
         0,0,1), 
         ncol = 3))

m$V2 <- as.factor(m$V2) # Importante, si no, daisy() no interpeta correctamente.
m$V1 <- as.numeric(m$V1)

cluster::daisy(m, 
               metric = "gower",
               stand = TRUE,
               type =  list(#numeric = "V1",
                            #factor = "V2",
                            asymm= "V3")
              )
## Dissimilarities :
##           1         2
## 2 0.7500000          
## 3 1.0000000 0.8333333
## 
## Metric :  mixed ;  Types = I, N, A 
## Number of objects : 3

Para calcular las distancias en varibles de diferente tipo utilizando esta función, es importante fijarse en los prametros metric = "gower", y type, donde hay que poner una lista que describe cada variable. En realidad, mejor determinar previamente las variables categórica, ya que, si no, la función las intepreta por defecto como si fueran numéricas (y no sé por qué). Importante type = symm.

Cabe destacar que la función también aplica la distancia de Jaccart si se especifica que la variable asimétrica.

Tipos de clusters

Agrupamiento simple (Simple linkage)

En estadística, el agrupamiento simple es uno de los diversos métodos de agrupación jerárquica. Se basa en la agrupación de conglomerados de abajo a arriba (agrupación aglomerativa), combinando en cada paso dos conglomerados que contengan el par de elementos más cercano que aún no pertenezcan al mismo conglomerado.

Este método tiende a producir clusters largos y delgados en los que los elementos cercanos del mismo cúmulo se encuentran a distancias cortas, pero los elementos en extremos opuestos de un cluster pueden estar mucho más alejados entre sí que dos elementos de otros clusters (efecto chaining). Para algunas clases de datos, esto puede dificultar la definición de clases que permitan subdividir los datos de forma útil. Sin embargo, es popular en astronomía para analizar cúmulos de galaxias, que a menudo pueden incluir largas cadenas de materia; en esta aplicación, también se conoce como el algoritmo de amigos de amigos.

Ejemplo 3

en.wikipedia.org

Este ejemplo práctico se basa en una matriz de distancia genética JC69 calculada a partir del alineamiento de la secuencia de ARN ribosómico 5S de cinco bacterias.

Tenemos pues 5 elementos (\(a,b,c,d,e\)) i la matriz de distancias \(D_1\):

\[\begin{matrix} & \begin{matrix} \phantom{i} a\phantom{i} & b\phantom{i} & c\phantom{i} & d\phantom{i} & e\phantom{i} \end{matrix} \\ \begin{matrix} a\\ b\\ c\\ d\\ e\\ \end{matrix} & \begin{pmatrix} \phantom{e}0 & 17 & 21 & 31 & 23 \\ 17 & \phantom{e}0 & 30 & 34 & 21 \\ 21 & 30 & \phantom{e}0 & 28 & 39 \\ 31 & 34 & 28 & \phantom{e}0 & 43 \\ 23 & 21 & 39 & 43 & \phantom{e}0 \\ \end{pmatrix} \\ \end{matrix}\]

Primer clustering

En este ejemplo \(D_1(a,b)=17\) es el valor más bajo de la matriz, así que agrupamos \(a,b\)

Primera actualización de la matriz

A continuación, actualizamos la matriz de proximidad inicial \(D_1\) en una nueva matriz de proximidad \(D_2\) (ver más abajo), cuyo tamaño pues se reduce en una fila y una columna debido a la agrupación de \(a\) con \(b\). Los valores en negrita en \(D_2\) corresponden a las nuevas distancias, calculadas manteniendo la distancia mínima entre cada elemento del primer grupo \((a,b)\) y cada uno de los elementos restantes:

\[ \begin{matrix} D_2 ((a,b),c) & =& min(D_1 (a,c),D_1 (b,c)) & =&min(21,30)&=& \Large21 \\ D_2 ((a,b),d)&=&min(D_1 (a,d),D_1 (b,d))&=&min(31,34)&=&31 \\ D_2 ((a,b),e)&=&min(D_1 (a,e),D_1 (b,e))&=&min(23,21)&=& \Large21 \\ \end{matrix} \]

El resto de elementos en \(D_2\) no quedean afectados, ya que corresponden a distancias no invloucradas en el primer cluster.

Segundo clustering

Reiteramos les tres operaciones anteriores a partir de la nueva matriz \(D_2\):

\[ D_2= \begin{pmatrix} & (a,b) & c & d & e\\ (a,b) & 0 & \bf \large21 & \bf 31& \bf \large21\\ c& \bf \large21& 0& 28& 39\\ d& \bf 31& 28& 0& 43\\ e& \bf \large21& 39& 43& 0\\ \end{pmatrix} \]

Aquí, \(D_2 ((a,b),c)=21\) y \(D_2 ((a,b),e)=21\) son los valores más bajos de \(D_2\), así que unimos el cluster \((a,b)\) con el elemento \(c\) y con el elemento \(e\).

Segunda actualización de la matriz

Luego procedemos a actualizar la matriz \(D_2\) en una nueva matriz de distancia \(D_3\) (ver a continuación), reducida en tamaño en dos filas y dos columnas debido a la agrupación de \((a,b)\) con \(c\) y con \(e\):

\[ D_3 (((a,b),c,e),d)=min(D_2 ((a,b),d),D_2 (c,d),D_2 (e,d))=min(31,28,43)=28 \]

Clustering final

La matriz final \(D_3\) será:

\[ D_3= \begin{pmatrix} & ((a,b),c,e)& d\\ ((a,b),c,e)& 0&\bf 28\\ d&\bf 28& 0 \end{pmatrix} \]

Juntamos pues los clusters \(((a,b),c,e)\) y \(d\).

Dendrogramas

Dendrograma de agrupamiento simple (Simple linkage)

hcl1 <- hclust(as.dist(a), method = "single")

plot(hcl1,xlab="")

Notar que la altura de la branca que marca el dendrograma corresponde a las distancias entre los clusters.

Dendrograma de agrupamiento simple (Single linkage) con \(\texttt{ggdendro}\) y \(\texttt{ggplot}\)

library(ggdendro)
library(ggplot2)

ggdendrogram(hcl1) +
  labs(title = "Dendrograma clustering ejemplo 3",
       subtitle = "Agrupamiento simple")+
  ylab("Height") +
  theme(plot.title = element_text(hjust = 0, size = 18),
        plot.subtitle = element_text(hjust = 0, size = 15),
        axis.text.x = element_text(size = 15, face = 'bold'))

Agrupamiento completo (Complete linkage)

Es conocido como agrupamiento del vecino más lejano.

En cada paso, se combinan los dos clústers separados por la distancia más corta. La definición de “distancia más corta” es lo que diferencia los distintos métodos de agrupamiento aglomerativo. En el agrupamiento por ligamiento completo, el enlace entre dos clústeres contiene todos los pares de elementos, y la distancia entre clústeres es igual a la distancia entre los dos elementos (uno en cada clúster) más alejados entre sí. El enlace más corto que permanece en cualquier paso provoca la fusión de los dos clústeres cuyos elementos están involucrados.

Matemáticamente, la función de ligamiento completo —la distancia \(D(X,Y)\) entre los clústeres \(X\) e \(Y\) — se describe mediante la siguiente expresión: \[ D(X,Y)=máx_{x∈X,y∈Y} d(x,y) \]

Ejemplo 4

en.wikipedia.org: Complete-linkage clustering

Este ejemplo se basa en la misma matriz de distancia del ejemplo 3.

Tenemos pues 5 elementos (\(a,b,c,d,e\)) i la matriz de distancias \(D_1\):

\[\begin{matrix} & \begin{matrix} \phantom{i} a\phantom{i} & b\phantom{i} & c\phantom{i} & d\phantom{i} & e\phantom{i} \end{matrix} \\ \begin{matrix} a\\ b\\ c\\ d\\ e\\ \end{matrix} & \begin{pmatrix} \phantom{e}0 & 17 & 21 & 31 & 23 \\ 17 & \phantom{e}0 & 30 & 34 & 21 \\ 21 & 30 & \phantom{e}0 & 28 & 39 \\ 31 & 34 & 28 & \phantom{e}0 & 43 \\ 23 & 21 & 39 & 43 & \phantom{e}0 \\ \end{pmatrix} \\ \end{matrix}\]

Primer clustering

En este ejemplo \(D_1(a,b)=17\) es el valor más bajo de la matriz, así que agrupamos \(a,b\)

Primera actualización de la matriz

A continuación, actualizamos la matriz de proximidad inicial \(D_1\) en una nueva matriz de proximidad \(D_2\) (ver más abajo), cuyo tamaño pues se reduce en una fila y una columna debido a la agrupación de \(a\) con \(b\). Los valores en negrita en \(D_2\) corresponden a las nuevas distancias, calculadas manteniendo la distancia máxima entre cada elemento del primer grupo \((a,b)\) y cada uno de los elementos restantes:

\[ \begin{matrix} D_2 ((a,b),c) & =& max(D_1 (a,c),D_1 (b,c)) & =&max(21,30)&=&30 \\ D_2 ((a,b),d)&=&max(D_1 (a,d),D_1 (b,d))&=&max(31,34)&=&34 \\ D_2 ((a,b),e)&=&max(D_1 (a,e),D_1 (b,e))&=&max(23,21)&=& \Large 23 \\ \end{matrix} \]

El resto de elementos en \(D_2\) no quedean afectados, ya que corresponden a distancias no involucradas en el primer cluster.

Segundo clustering

Reiteramos les tres operaciones anteriores a partir de la nueva matriz \(D_2\):

\[ D_2= \begin{pmatrix} & (a,b) & c & d & e\\ (a,b) & 0 & \bf 30 & \bf 34& \bf \Large23\\ c& \bf 30& 0& 28& 39\\ d& \bf 34& 28& 0& 43\\ e& \bf \Large23& 39& 43& 0\\ \end{pmatrix} \]

Aquí, \(D_2((a,b),e)=23\) es el valor más bajo de \(D_2\), así que unimos el cluster \((a,b)\) con el elemento \(\bf e\).

Segunda actualización de la matriz

Procedemos a actualizar la matriz \(D_2\) en una nueva matriz de distancia \(D_3\) (ver a continuación), reducida en tamaño en una fila y una columna debido a la agrupación de \((a,b)\) con \(e\):

\[ \begin{matrix} D_3 (((a,b),e),c) & =& max(D_2 ((a,b),c), D_2 (e,c)) & =&max(30,39)&=&39 \\ D_3 (((a,b),e),d)&=&max(D_2 ((a,b),d), D_2 (e,d))&=&max(34,43)&=&43 \\ \end{matrix} \]

Tercer clustering

Reiteramos les operaciones anteriores a partir de la nueva matriz \(D_3\):

\[ D_3= \begin{pmatrix} & ((a,b),e) & c & d\\ ((a,b),e) & 0 & \bf 39 & \bf 43 \\ c& \bf 39& 0& \Large28\\ d& \bf 43& \Large28& 0\\ \end{pmatrix} \]

Aquí, \(D_3 (c,d)=28\) es el valor más pequeño de \(D_3\) , así que unimos los elementos \(c\) y \(d\).

Tercera actualización de la matriz

Procedemos a actualizar la matriz \(D_3\) en una nueva matriz de distancia \(D_4\) (ver a continuación):

\[D_4 ((c,d),((a,b),e))=max(D_3 (c,((a,b),e)),D_3 (d,((a,b),e)))=max(39,43)=43\]

Clustering final

La matriz final \(D_3\) será:

\[ D_3= \begin{pmatrix} & ((a,b),e)& (c,d)\\ ((a,b),e)& 0&\bf 43\\ (c,d) &\bf 43& 0 \end{pmatrix} \]

Así que, unimos los grupos \(((a,b),e)\) y \((c,d)\).

Dendrogramas

Dendrograma de agrupamiento completo (Complete linkage)

hcl2 <- hclust(as.dist(a), method = "complete")

plot(hcl2,xlab="")

Notar que la altura de la branca que marca el dendrograma corresponde a las distancias entre los clusters.

Dendrograma de agrupamiento simple (Single linkage) con \(\texttt{ggdendro}\) y \(\texttt{ggplot}\)

library(ggdendro)
library(ggplot2)

ggdendrogram(hcl2) +
  labs(title = "Dendrograma clustering ejemplo 4",
       subtitle = "Agrupamiento completo")+
  ylab("Height") +
  theme(plot.title = element_text(hjust = 0, size = 18),
        plot.subtitle = element_text(hjust = 0, size = 15),
        axis.text.x = element_text(size = 15, face = 'bold'))

Observación

Podemos pues observar que, aunque con estos datos sencillos, El Complete Clustering es capaz de crear un segundo conglomerado fuera del principal, como en este caso.


Agrupamiento promedio (Group Average Clustering o UPGMA)

El algoritmo UPGMA construye un (dendrograma) que refleja la estructura presente en una matriz de similitud por pares (o una matriz de disimilitud). En cada paso, los dos clústeres más cercanos se combinan en un clúster de nivel superior. La distancia entre dos clústeres cualesquiera A y B, cada uno con un tamaño (es decir, cardinalidad) |A| y |B|, se considera el promedio de todas las distancias \(d(x,y)\) entre pares de objetos \(x\) en \(A\) e y en \(B\), esto es, la distancia media entre elementos del mismo cluster:

\[ \frac{1}{|A|⋅|B|} ∑_{x∈A} ∑_{_y∈B}d(x,y) \]

Ejemplo 5

en.wikipedia.org: UPGMA

Este ejemplo se basa en la misma matriz de distancia de los dos ejemplos anteriores.

Tenemos pues 5 elementos (\(a,b,c,d,e\)) i la matriz de distancias \(D_1\):

\[\begin{matrix} & \begin{matrix} \phantom{i} a\phantom{i} & b\phantom{i} & c\phantom{i} & d\phantom{i} & e\phantom{i} \end{matrix} \\ \begin{matrix} a\\ b\\ c\\ d\\ e\\ \end{matrix} & \begin{pmatrix} \phantom{e}0 & 17 & 21 & 31 & 23 \\ 17 & \phantom{e}0 & 30 & 34 & 21 \\ 21 & 30 & \phantom{e}0 & 28 & 39 \\ 31 & 34 & 28 & \phantom{e}0 & 43 \\ 23 & 21 & 39 & 43 & \phantom{e}0 \\ \end{pmatrix} \\ \end{matrix}\]

Primer clustering

En este ejemplo \(D_1(a,b)=17\) es el valor más bajo de la matriz, así que agrupamos \(a,b\)

Primera actualización de la matriz

A continuación, actualizamos la matriz de proximidad inicial \(D_1\) en una nueva matriz de proximidad \(D_2\) (ver más abajo), cuyo tamaño pues se reduce en una fila y una columna debido a la agrupación de \(a\) con \(b\). Los valores en negrita en \(D_2\) corresponden a las nuevas distancias, calculadas manteniendo la distancia media entre cada elemento del primer grupo \((a,b)\) y cada uno de los elementos restantes:

\[ \begin{matrix} D_2 ((a,b),c) & = & (D_1 (a,c)\times 1+D_1 (b,c)\times 1)/(1+1) & = &(21+30)/2&=& 25.5 \\ D_2 ((a,b),d)&=& (D_1 (a,d)+D_1 (b,d))/2 &=& (31+34)/2&=&32.5 \\ D_2 ((a,b),e)&=& (D_1 (a,e)+D_1 (b,e))/2&=& (23+21)/2 &=& \Large22 \\ \end{matrix} \]

El resto de elementos en \(D_2\) no quedean afectados, ya que corresponden a distancias no involucradas en el primer cluster.

Segundo clustering

Reiteramos les tres operaciones anteriores a partir de la nueva matriz \(D_2\):

\[ D_2= \begin{pmatrix} & (a,b) & c & d & e\\ (a,b) & 0 & \bf 25.5 & \bf 32.5& \bf \Large{22} \\ c& \bf 25.5& 0& 28& 39\\ d& \bf 32.5& 28& 0& 43\\ e& \bf \Large22& 39& 43& 0\\ \end{pmatrix} \]

Aquí, \(D_2((a,b),e)=22\) es el valor más bajo de \(D_2\), así que unimos el cluster \((a,b)\) con el elemento \(\bf e\).

Segunda actualización de la matriz

Luego, actualizamos \(D_2\) en una nueva matriz de distancias \(D_3\) (ver más abajo), cuyo tamaño se ha reducido en una fila y una columna debido a la agrupación de \((a,b)\) con \(e\). Los valores en negrita en \(D_3\) corresponden a las nuevas distancias, calculadas mediante promedio proporcional, según la metodología que ya hemos visto:

\[ \begin{matrix} D_3 (((a,b),e),c) &=& (D_2 ((a,b),c)×2+D_2 (e,c)×1)/(2+1) &=& (25.5×2+39×1)/3 &=& 30 \\ \end{matrix} \]

Gracias a este promedio proporcional, el cálculo de esta nueva distancia tiene en cuenta el mayor tamaño del grupo \((a,b)\) (dos elementos) con respecto a \(e\) (un elemento). Y de forma similar:

\[ \begin{matrix} & D_3 (((a,b),e),d) &=& (D_2 ((a,b),d)×2+D_2 (e,d)×1)/(2+1) &=& (32.5×2+43×1)/3 &=& 36 \end{matrix} \]

Por lo tanto, el promedio proporcional otorga el mismo peso a las distancias iniciales de la matriz \(D_1\). Por esta razón, se dice que el método no está ponderado: no con respecto al procedimiento matemático, sino con respecto a las distancias iniciales.

Tercer paso

Tercer clustering

Reiteramos nuevamente los tres pasos anteriores, a partir de la matriz de distancias actualizada D3.

\[ D_3= \begin{pmatrix} & ((a,b),e) & c & d & \\ ((a,b),e) & 0 & \bf 30 & \bf 36 \\ c& \bf 30& 0& \Large 28&\\ d& \bf 36& \Large28 & 0&\\ \end{pmatrix} \]

Aquí vemos que \(D_3=28\) es el valor más pequeño. Así que unimos \(c\) y \(d\).

Tercera actualización de la natriz

Hay una única entrada para actualizar, teniendo en cuenta que los dos elementos \(c\) y \(d\) tienen cada uno una contribución de \(1\) en el cálculo del promedio:

\[ D_4 ((c,d),((a,b),e))=(D_3 (c,((a,b),e))×1+D_3 (d,((a,b),e))×1)/(1+1)=(30×1+36×1)/2=33 \]

Clustering final

La matriz final \(D_4\) será

\[ D_4= \begin{pmatrix} & ((a,b),e) & (c,d) \\ ((a,b),e) & 0 & \bf 33 & \\ (c,d) & \bf 33 & 0\\ \end{pmatrix} \]

Dendrogramas

Dendrograma de agrupamiento promedio (Average linkage o UPGMA)

hcl3 <- hclust(as.dist(a), method = "average")

plot(hcl3,xlab="")

Notar que la altura de la branca que marca el dendrograma corresponde a las distancias entre los clusters.

Dendrograma de agrupamiento simple (Single linkage) con \(\texttt{ggdendro}\) y \(\texttt{ggplot}\)

library(ggdendro)
library(ggplot2)

ggdendrogram(hcl3) +
  labs(title = "Dendrograma clustering ejemplo 5",
       subtitle = "Agrupamiento promedio")+
  ylab("Height") +
  theme(plot.title = element_text(hjust = 0, size = 18),
        plot.subtitle = element_text(hjust = 0, size = 15),
        axis.text.x = element_text(size = 15, face = 'bold'))

Observación

Podemos pues observar que también el Average Clustering es capaz de crear un segundo conglomerado fuera del principal, como en el Complete Clusteing.


Agrupamiento centroide (Centroid Linkagage o UPGMC)

Los tres métodos anteriores utilizan únicamente la matriz de distancias, sin requerir observación de los indivíduos. Un método que sí requiere la observación de los indivíduos ee el Agrupamiento Centroide (Centroid Linkage), mediante el cual los clusters, una vez formados, se representan por los valores medios de la \(p\) variables observadas en los individuos que los componen:

Después que se agrupan dos clusters \(A\) y \(B\), el centroide del nuevo \(AB\) es la media ponderada

\[ {\overline{\bf y}}_{AB}= \frac{n_A\overline{\bf y}_A + n_B\overline{\bf y}_B}{n_A+n_B} \]

Ejemplo 6

Adaptamos aquí el ejemplo que se encuentra en EAAR, Cap. 51 sobre estatura en cm y sueldos en Pts de 5 individuos.

\[\begin{matrix} & \begin{matrix} \phantom{i} X_1\phantom{i} & X_2\phantom{i} \end{matrix} \\ \begin{matrix} 1\\ 2\\ 3\\ 4\\ 5\\ \end{matrix} & \begin{pmatrix} 180 & 175 \\ 170 & 180 \\ 175 & 165 \\ 189 & 100 \\ 185 & 110 \\ \end{pmatrix} \\ \end{matrix}\]

Estos dato se pueden representar como puntos en un gráfico de dispersión:

library(latex2exp)

df %>% 
  ggplot(aes(x=X_1,y=X_2)) +
  geom_point() +
  ylab(TeX("$X_2$")) +
  xlab(TeX("$X_1$")) +
  ggrepel::geom_text_repel(aes(label = rownames(df))) +
  theme_classic()+
  ggtitle("Representación de los datos")

La matriz de distancias \(D_1\) sería pues la siguiente:

dist(df)
##          1        2        3        4
## 2 11.18034                           
## 3 11.18034 15.81139                  
## 4 75.53807 82.22530 66.49060         
## 5 65.19202 71.58911 55.90170 10.77033

Primer clustering

En este ejemplo \(D_1(4,5)=10.77033\) es el valor más bajo de la matriz, así que agrupamos los individuos \(\bf4\) y \(\bf 5\), formando el clustr \((\textbf{4,5})\)

Calcular el vector de medias del primer cluster

\[(\frac{189+185}{2},\frac{100+110}{2})=(187,105)\]

Primera actualización de la matriz de datos

\[\begin{matrix} & \begin{matrix} \phantom{i} X_1\phantom{i} & X_2\phantom{i} \end{matrix} \\ \begin{matrix} 1\\ 2\\ 3\\ (45)\\ \end{matrix} & \begin{pmatrix} 180 & 175 \\ 170 & 180 \\ 175 & 165 \\ 187 & 105 \\ \end{pmatrix} \\ \end{matrix}\]

Primera actualización de la matriz de distancias \(D_2\)

dist(df2)
##             1        2        3
## 2    11.18034                  
## 3    11.18034 15.81139         
## (45) 70.34913 76.90254 61.18823

En este recálculo de distancias encontramos que los individuos \(\textbf{1, 2}\) y \(\bf3\) forman un cluster \((\textbf{1,2,3})\), cuyo vector de medias será:

\[ (\frac{180+170+175}{3},\frac{175+180+165}{3})=(175,173.33) \]

Segunda actualización de la matriz de datos

\[\begin{matrix} & \begin{matrix} \phantom{i} X_1\phantom{iiii} & X_2\phantom{iiii} \end{matrix} \\ \begin{matrix} (123)\\ (45)\\ \end{matrix} & \begin{pmatrix} 175.00 & 173.33 \\ 187.00 & 105.00 \\ \end{pmatrix} \\ \end{matrix}\]
dist(df3)
##         (123)
## (45) 69.37896

Interesante notar que si se utiliza la función \(\texttt{hclust()}\), ésta para calcular las alturas (height) utiliza las distancias euclídeas al cuadrado. Además, el método del centroide no garantiza la monotonía. Esto significa que la altura (distancia) a la que se fusionan dos grupos puede ser menor que la altura a la que se formaron los grupos individuales, lo que resulta en “inversiones” en el dendrograma.

Para que coincida con la salida de \(\texttt{hclust(..., method = "centroid")}\), debe calcular su matriz de distancia elevando al cuadrado las distancias euclidianas:

Cálculo sin elevar las distancias al cuadrado

hclust(dist(df), method = "centroid")$height
## [1] 10.77033 11.18034 10.70078 62.55554

Cálculo elevando las distancias al cuadrado

d <- dist(df, method = "euclidean")^2
hc <- hclust(d, method = "centroid")

sqrt(hc$height)
## [1] 10.77033 11.18034 12.50000 69.37899
hclust(dist(df), method = "centroid")$merge
##      [,1] [,2]
## [1,]   -4   -5
## [2,]   -1   -2
## [3,]   -3    2
## [4,]    1    3

Interesante es la utilización del valor \(\texttt{merge}\) de dicha función para investgar la formación del clusters.

Se ve que primero se forma un primer clusters \((\textbf{4,5})\), después \((\textbf{1,3}), \bf3\). Finalmentente, se unen los que se han formado.

Dendrogramas

plot(hclust(dist(df), method = "centroid"))

Hierarchical clustering con R

Ejemplo 7: composición de la leche de diferentes especies de mamíferos

Dataframe \(\texttt{all.mammals.milk}\) de la librería \(\texttt{cluster.datasets}\).

Sobre contenido % de agua, proteinas, grasa, lactosa y cenizas en la leche de mamíferos:

#install.packages("cluster.datasets")
library(cluster.datasets)
data("all.mammals.milk.1956")

milk <- all.mammals.milk.1956

head(milk)
##        name water protein fat lactose  ash
## 1     Horse  90.1     2.6 1.0     6.9 0.35
## 2 Orangutan  88.5     1.4 3.5     6.0 0.24
## 3    Monkey  88.4     2.2 2.7     6.4 0.18
## 4    Donkey  90.3     1.7 1.4     6.2 0.40
## 5     Hippo  90.4     0.6 4.5     4.4 0.10
## 6     Camel  87.7     3.5 3.4     4.8 0.71

Si convertimos la columnas de species en rownames, una vez el dataframe se convierte en matriz puede mantener las etiquetas de las especies.

# Calculamos la distancias con dist() excluyendo 

row.names(milk) <- milk[,1]
milk <- milk[,2:5]
milk <- as.matrix(milk)
millk.n <- scale(milk)

d.milk <- dist(milk, method = "euclidean")

Dendrogama de agrupamiento simple (hclust)

m.hcl.single <- hclust(d.milk, method = "single")

plot(m.hcl.single)
rect.hclust(m.hcl.single, k=4)

Dendrogama de agrupamiento simple (dendextend)

La librería dendextend permite construir el dendrograma creado con hclus() separando los clusters de manera igual, pero con con un efecto visual mejor.

library(dendextend)

dend.milk <- as.dendrogram(m.hcl.single)

dend.milk %>% 
  set("labels_col", value = c("green", "blue","red","brown"), k=4) %>% 
  set("branches_k_color", value = c("red", "blue","red","brown"), k = 4) %>% 
  set("branches_lwd", value = 2) %>% 
          plot(ylab = "Distancias (Height)")
dend.milk %>% 
  rect.dendrogram(k=4, border = 8, lty = 5, lwd = 2) 
  titulo = "Dendrograma clustering all.mammals.milk"
  subtitulo = "Agrupamiento simple (Simple linkage)" 
  mtext(side=3, line=3, adj=-0.1, cex=1.3, titulo)
  mtext(side=3, line=2, adj=-0.08, cex=1, subtitulo)

Dendrogama de agrupamiento completo (hclust)

m.hcl.complete <- hclust(d.milk, method = "complete")
plot(m.hcl.complete)
rect.hclust(m.hcl.complete, k=5)

Dendrogama de agrupamiento completo (dendextend)

library(dendextend)

dend.milk.complete <- as.dendrogram(m.hcl.complete)

dend.milk.complete %>% 
  set("labels_col", value = c("green", "blue","red","brown","violet"), k=5) %>% 
  set("branches_k_color", value = c("green", "blue","red","brown","violet"), k = 5) %>% 
  set("branches_lwd", value = 2) %>% 
          plot(ylab = "Distancias (Height)")
dend.milk.complete %>% 
  rect.dendrogram(k=5, border = 8, lty = 5, lwd = 2) 
  titulo = "Dendrograma clustering all.mammals.milk"
  subtitulo = "Agrupamiento completo (Complete linkage)" 
  mtext(side=3, line=3, adj=-0.1, cex=1.3, titulo)
  mtext(side=3, line=2, adj=-0.08, cex=1, subtitulo)

Dendrogama de agrupamiento promendio (hclust)

m.hcl.average <- hclust(d.milk, method = "average")
plot(m.hcl.average)
rect.hclust(m.hcl.average, k=4)

Dendrogama de agrupamiento promedio (dendextend)

library(dendextend)

dend.milk.average <- as.dendrogram(m.hcl.average)

dend.milk.average %>% 
  set("labels_col", value = c("green", "blue","red","brown"), k=4) %>% 
  set("branches_k_color", value = c("green", "blue","red","brown"), k = 4) %>% 
  set("branches_lwd", value = 2) %>% 
          plot(ylab = "Distancias (Height)")
dend.milk.average %>% 
  rect.dendrogram(k=4, border = 8, lty = 5, lwd = 2) 
  titulo = "Dendrograma clustering all.mammals.milk"
  subtitulo = "Agrupamiento promedio (Average linkage)" 
  mtext(side=3, line=3, adj=-0.1, cex=1.3, titulo)
  mtext(side=3, line=2, adj=-0.08, cex=1, subtitulo)

Dendrogama de agrupamiento centroide

m.hcl.centroid <- hclust(d.milk, method = "centroid")
plot(m.hcl.centroid)
rect.hclust(m.hcl.centroid, k=4)

Técnicas inferenciales de formación de conglomerados

Las técnicas inferenciales en formación de conglomerados se corresponden con las varias técnicas de conglomeración, aportándoles justificación desde la perspectiva inferencial.

El criterio de Approximate Weight of Evidence (AWE) es una medida utilizada principalmente en el modelado de mezclas y clustering para seleccionar el número de componentes (clusters) óptimo, \(K\), actuando como una aproximación bayesiana al factor de Bayes. A diferencia de otros criterios como \(BIC\) o AIC, el \(AWE\) fue diseñado específicamente para favorecer estructuras de clusters más “clasificables” o separadas, imponiendo una penalización más fuerte por complejidad para evitar la sobreestimación del número de componentes.

En cualquier caso, no hay liberías fiables que trabajen directamente con este algoritmo. Así que utilizaremos \(BIC\), tal y como se procesa en \(\tt mclust\).

Siendo el cociente de verosimilitudes:

\[ B_k=\frac{f_k(x_1,...,x_n)}{f_1(x_1,...,x_n)} \]

donde \(f_k\) es el modelo cuando los datos proceden de \(k\) clusters, y \(f_1\) suponiendo que los datos provienen de un único cnglomerado.

\(BIC\) (Bayesian Information Criterion)

\(BIC\) (Bayesian Information Criterion) se define como

\[ \text{BIC}=2\log (B_k) - k\log (n) \]

o, equivalentemente (en lenguaje \(\tt mclust\)): \[ \text{BIC}=2·\text{Log-lik}-p·\log n \]

donde:

\(LogLik\) es el log del cociente de verosimilitud que se obtiene de \(\tt mclust\).

\(p\) es el número de parámetros en el modelo.

\(n\) es el número de observaciones.

library(mclust)
data(faithful)
mod <- Mclust(faithful)

# Extraer componentes
loglik <- mod$loglik
n <- mod$n
p <- mod$df # Degrees of freedom (number of parameters)

# Calcular BIC
bic <- 2 * loglik -  p * log(n)
bic
## [1] -2314.316
mod$bic
## [1] -2314.316

Como se quería demostrar.

Cómo Funciona el Modelo

Selección de Modelos: Se calculan los valores BIC para varios modelos candidatos

Criterio de Elección: Se prefiere el modelo con el menor valor de \(BIC\).

Equilibrio: El BIC busca un equilibrio entre la calidad del ajuste y la parsimonia (sencillez). Un modelo con demasiados parámetros (complejo) podría tener un mejor ajuste (mayor \(\hat {L}\)), pero tendrá un término de penalización \(k\ln (n)\) muy alto, resultando en un BIC elevado.

Uso con muestras grandes: El BIC es más severo que el AIC (Criterio de Información de Akaike) al penalizar modelos complejos, especialmente cuando el tamaño de la muestra (\(n\)) es grande.

Ejemplo 7

% De voto republicano en varias elecciones de EEUU, contenidos en la libería \(\tt cluster\): seleccionaremos las elecciones de 1960, 1964, 1968, 1972, 1976.

vr <- cluster::votes.repub[,27:31]
head(vr)
##            X1960 X1964 X1968 X1972 X1976
## Alabama    41.75  69.5  14.0  72.4 43.48
## Alaska     50.94  34.1  45.3  58.1 62.91
## Arizona    55.52  50.4  54.8  64.7 58.62
## Arkansas   43.06  43.9  30.8  68.9 34.97
## California 50.10  40.9  47.8  55.0 50.89
## Colorado   54.63  38.7  50.5  62.6 55.89

Modelo

modvr <- Mclust(vr)

summary(modvr, parameters = T)
## ---------------------------------------------------- 
## Gaussian finite mixture model fitted by EM algorithm 
## ---------------------------------------------------- 
## 
## Mclust VVE (ellipsoidal, equal orientation) model with 2 components: 
## 
##  log-likelihood  n df       BIC       ICL
##       -734.7031 50 31 -1590.679 -1594.198
## 
## Clustering table:
##  1  2 
## 17 33 
## 
## Mixing probabilities:
##         1         2 
## 0.3228084 0.6771916 
## 
## Means:
##           [,1]     [,2]
## X1960 47.06244 51.31849
## X1964 47.85403 37.93360
## X1968 36.39408 47.81170
## X1972 68.20686 60.08381
## X1976 46.72029 51.71609
## 
## Variances:
## [,,1]
##            X1960      X1964      X1968     X1972     X1976
## X1960   89.45829 -107.79741   84.98862 -22.80387  16.12625
## X1964 -107.79741  214.47710 -127.90031  64.76912 -27.68256
## X1968   84.98862 -127.90031  116.08296 -30.98921  31.07491
## X1972  -22.80387   64.76912  -30.98921  30.32447 -18.43031
## X1976   16.12625  -27.68256   31.07491 -18.43031  41.63526
## [,,2]
##          X1960    X1964    X1968    X1972    X1976
## X1960 24.14953 28.35230 28.33126 16.85002 17.30302
## X1964 28.35230 49.63329 39.53118 21.88003 26.02568
## X1968 28.33126 39.53118 41.52527 21.24681 25.59121
## X1972 16.85002 21.88003 21.24681 29.62491 19.89413
## X1976 17.30302 26.02568 25.59121 19.89413 26.73512

El resumen parece por lo tanto sugerir un modelo formado por \(k=2\) clusters: uno de 17 unidades y un segundo de 33 (ver \(\texttt {Clustering table}\)).

El grafico \(\tt plot\) que realiza \(\tt Mclust\) es una serie de paired, si las dimensiones implicadas son más de dos y no se realiza ninguna selección. En este caso serían 5. Sin embargo, la función \(\tt plot\) dispone del parámetro \(\tt dimens\) para ello.

plot(modvr, what = "classification",dimens = c(4,5))
text(vr[,4],vr[,5],adj = 1)

Alternativamente, la librería \(\tt factoextra\) dispone de una función para representar los clusters que genera \(\tt Mclust\). En este caso, la diferencia es que los ejes son dos Componente Principales. No existe por lo tanto el problema de seleccionar las dimensiones.

#install.packages("factoextra")

library(factoextra)

fviz_mclust(modvr, what = "classification", geom= "point")






  1. A. García Perez, Estadística Aplicada Avanzada con R, Madrid, 2022↩︎