Antes de sumergirnos en el análisis multivariante con R y ver algunas de las técnicas más habituales, su fundamento e implementación, sería conveniente hacernos algunas preguntas para situarnos y sacar el máximo partido posible a nuestro trabajo.
Lo deseable sería hacernos estas preguntas antes de recopilar los datos e incluso antes de diseñar el experimento. Saber qué estamos buscando y dónde queremos llegar, es fundamental para entender qué tipo de datos recopilar y qué tipo de técnica estadística emplear.
Si por desgracia ya tenemos los datos antes de habernos hecho estas preguntas, tenemos que ver en qué punto estamos. Es decir, de qué clase de información disponemos. ¿Son los datos cuantitativos, cualitativos, mixtos?, ¿son medidas directas o nos servirán para inferir algo de naturales más abstracta?. Estas preguntas nos van a permitir saber de dónde partimos y la técnica o técnicas estadísticas que podremos aplicar.
Qué queremos obtener de los datos. Queremos una simple descripción de las variables, queremos estudiar las relaciones entre las distintas variables o bien las utilizaremos como predictores elaborando con ellas modelos predictivos más complejos. Igual que en el caso anterior, esto determinará el tipo o tipos de análisis que realizaremos con nuestros datos.
Esta pregunta esta condicionada por el tipo de datos de que disponemos y nuestro objetivo, por ello es la última pregunta que deberíamos hacernos y que nos servirá definitivamente para tomar conciencia del análisis a realizar.
¿Qué podemos hacer cuando tenemos un conjunto de observaciones de las que hemos tomado una serie de medidas?.
Esto último nos llevaría a la siguiente pregunta: ¿qué variables?
Para esto están (entre otras cosas) las técnicas multivariantes. Un grupo de técnicas estadísticas principal aunque no exclusivamente descriptivas cuya misión es reducir las dimensiones de nuestros datos con la menor perdida de información posible, facilitando su representación gráfica e interpretación.
\[X = \begin{bmatrix} x_{11} & x_{12} & ... & x_{1p}\\ x_{21} & ... & ... & x_{22}&\\ ... & ... & ... & ...&\\ x_{n1} & x_{n2} &... & x_{np}& \end{bmatrix}\]
Donde la variable \(V_1\) – que correspondería a la primera columna –
\[V._1 = [ x_{11}, x_{21}, ..., x_{n1} ]\]
y la observación \(w_1.\) – que correspondería a la primera fila –
\[w_1. = [ x_{11}, x_{12}, ..., x_{1p} ]\]
osos <- read.table( "http://www.stat.sc.edu/~habing/courses/data/bears.txt", head = T )
( df <- head( osos[ , c( 1, 3:6 ) ], 6 ) )
Age Head.L Head.W Neck.G Length
1 70 15.0 6.5 28 78.0
2 8 10.0 4.5 10 43.5
3 19 10.0 5.0 15 45.0
4 45 13.0 6.5 21 60.0
5 19 11.0 6.5 20 47.5
6 21 14.5 5.5 20 61.0
Por ejemplo, en esta tabla, la variable Age está formada por los valores de esa columna [70, 8, 19, 45, 19, 21]
, mientras que la observación 1 está formada por los valores de todas las variables en esa posición [70, 15.0, 6.5, 28, 78.0]
.
En la escuela de filosofía de Atenas, en la antigua Grecia rezaba la inscripción:
Ἀγεωμέτρητος μηδείς εἰσίτω
Que vendría a traducirse como: Aquí no entra nadie que no sepa geometría
Lo que refleja la importancia que le daban en la Grecia clásica a las mátemáticas. Y en definitiva las técnicas multivariantes son una cuestión de geometría, concretamente de distancias entre variables y entre individuos.
Aunque aquí el concepto de distancia no sólo se podría referir a la distancia euclídea que todos tenemos en mente, sino a otro tipos de medidas de distancias y similitudes (o disimilitudes) que nos sirvan para establecer relaciones de semejanza entre observaciones.
Existen otras muchas medidas de distancias basadas en criterios más geométricos o en criterios más relacionados con la similaridad o disimilaridad entre individuos
Distancia euclídea entre dos puntos
\[d_{E}(i,j) = \sqrt{ (x_i - x_j)^2 + (y_i - y_j)^2 }\]
Distancia de Manhattan
\[d_{M}(i,j) = \sum_{k=1}^{n}{\left | i_k-j_k \right |}\]
Distancia de Mahalanobis
\[d_{m}(i,j) = \sqrt{ (i - j)^{T}\sum{}^-1(i - j) }\]
Covarianza
\[\mathrm{cov}(x,y) = \frac{\sum_{i=1}^{n} (x_i - \bar{x}) (y_i - \bar{y})}{n}\]
Correlación
\[r_{xy} = \frac{\mathrm{cov}(x,y)}{s_x ~ s_y}\]
Correlación convertido a distancia
\[\mathrm{dist}(x,y) = 1 - \frac{r_{xy} + 1}{2}\]
Índice de Jaccard
\[I_J = \frac{a}{a+b+c}\]
Como hemos visto en las fórmulas anteriores, la covarianza puede ser una medida de similaridad o disimiliaridad entre variables o individuos. Podemos calcular la matriz de varianzas - covarianzas en R de la siguiente manera:
round( var( osos[ , c( 4:8 ) ] ), 2 )
Head.W Neck.G Length Chest.G Weight
Head.W 2.10 6.34 10.49 9.86 125.60
Neck.G 6.34 29.94 50.01 46.11 582.97
Length 10.49 50.01 112.75 86.57 1063.51
Chest.G 9.86 46.11 86.57 84.01 1011.26
Weight 125.60 582.97 1063.51 1011.26 13077.67
[1] "Varianza total: 13306.476"
La diagonal de la matriz representa la varianza de cada variable, y la suma de la diagonal sería la varianza total contenida en la tabla. Fuera de la diagonal los valores representan la covarianza entre pares de variables y podría entenderse como la información redundante, es decir la varianza compartida. Por lo que si la \(covarianza \neq 0\) existe un cierto grado de redundancia.
A mayor covarianza, mayor redundancia, mayor cantidad de información común aportan esas variables.
Pero puede verse que las variables con valores muy altos en general tienen mayor covarianza con otras variables, que las de valores bajos. Esto no significa necesariamente que sean éstas más similares al resto. Lo que está pasando, es que esta produciendo un sesgo. Las variables con valores más altos (porque se midan en determinadas unidades) están “pesando” más, que aquellas con valores más bajos.
Para evitar esto es conveniente normalizar o tipificar los datos.
La normalización más común es \(\frac{x_i - \overline{x}}{\sigma}\). Esto significa que a cada valor de la tabla de datos le restaré su media (la media de la columna normalmente) y lo dividiré por su desviación típica.
Si aplicamos esa normalización, ahora las variables tendrán media 0 y desviación típica 1. Aplicando la normalización a los datos anteriores tendríamos:
media <- apply( osos[ , 4:8 ], 2, mean )
desv <- apply( osos[ , 4:8 ], 2, sd )
dfN <- t( ( t( osos[,4:8] ) - media ) / desv )
head( round( dfN, 2 ) , 5 )
Head.W Neck.G Length Chest.G Weight
[1,] 0.21 1.36 1.79 1.04 1.34
[2,] -1.17 -1.93 -1.46 -1.25 -1.32
[3,] -0.83 -1.02 -1.31 -1.36 -1.01
[4,] 0.21 0.08 0.10 -0.10 0.01
[5,] 0.21 -0.11 -1.08 -1.25 -0.97
Esta sería la tabla de datos normalizados. Si calculamos sobre ella la matriz de varianzas/covarianzas resultaría:
round( var( dfN[ , 1:5 ] ), 2 )
Head.W Neck.G Length Chest.G Weight
Head.W 1.00 0.80 0.68 0.74 0.76
Neck.G 0.80 1.00 0.86 0.92 0.93
Length 0.68 0.86 1.00 0.89 0.88
Chest.G 0.74 0.92 0.89 1.00 0.96
Weight 0.76 0.93 0.88 0.96 1.00
Como puede verse, la diagonal (las varianzas) es siempre 1. Siendo la suma varianzas igual al número de variables. Además, podemos ver cómo las covarianzas ahora están todas en el rango -1 a 1 por lo que ninguna variable pesa más que otra por su naturaleza, sino que una mayor covarianza refleja realmente una mayor redundancia entre esas variables.
Otra medida de disimilaridad, que hemos visto, es la matriz de correlaciones. Como su propio nombre indica, nos dará información del grado de dependencia de una variable con respecto a otra. Es lógico pensar que una variable consigo misma tendrá una correlación máxima (1) y que cuanto más información compartan dos variables mayor será su correlación. Calculando la correlación para los datos del ejemplo sin normalizar:
round( cor( osos[ ,c( 4:8 ) ] ), 2 )
Head.W Neck.G Length Chest.G Weight
Head.W 1.00 0.80 0.68 0.74 0.76
Neck.G 0.80 1.00 0.86 0.92 0.93
Length 0.68 0.86 1.00 0.89 0.88
Chest.G 0.74 0.92 0.89 1.00 0.96
Weight 0.76 0.93 0.88 0.96 1.00
Vemos que la matriz de correlaciones de datos sin tipificar es idéntica a la matriz de covarianzas con los datos tipificados. Por lo que ya sabemos que trabajar con correlaciones nos va a ahorrar el paso de la normalización.
En función de cómo se aborda el problema multivariante y los objetivos que se desean alcanzar, se pueden clasificar las técnicas multivariantes en técnicas de ordenación y técnicas de clasificación.
En el primer caso, se busca explicar la mayor parte de la variabilidad existente, reduciendo lo máximo posible el número de dimensiones. Esto supone aplicar combinaciones lineales de las variables que implica una rotación de los ejes y la reordenación de las observaciones a lo largo de los nuevos ejes.
Las técnicas de clasificación, agrupamiento, clustering o conglomerados buscan incluir a las observaciones dentro de clases en las que los individuos sean lo más similares posibles en base a las variables que los definen.
Un ejemplo: supongamos que tenemos una serie de plantas a las que les hemos medido longitud y anchura de pétalos y sépalos. Con las técnicas de clasificación generaremos grupos de plantas que sean similares respecto a estas medidas. A los individuos incluidos en el mismo grupo se les asignará la misma etiqueta que les identifica como miembros del grupo. Veremos esto con más detalle en el apartado del curso de clasificación.
En R existen muchos paquetes y funciones orientadas al análisis multivariante. Uno de los más completos y conocidos es el paquete FactoMineR y su complemento para gráficos factoextra.
En las siguientes tablas proporcionamos una serie de funciones de estos paquetes para el análisis y representación de datos multivariantes.
Funciones | Descripción |
---|---|
PCA |
Análisis de componentes principales |
CA |
Análisis de correspondencias |
MCA |
Análisis de correspondencias múltiples |
FAMD |
Análisis factorial de datos mixtos |
MFA |
Análisis factorial múltiple |
HCPC |
Clustering jerárquico sobre componentes principales |
dimdesc |
Descripción sobre las dimensiones |
Funciones | Descripción |
---|---|
fviz_eig |
Visualizar autovalores |
fviz_pca |
Gráficos para PCA |
fviz_ca |
Gráficos para CA |
fviz_mca |
Gráficos para MCA |
fviz_mfa |
Gráficos para MFA |
fviz_famd |
Gráficos para FAMD |
fviz_hmfa |
Gráficos para HMFA |
fviz_ellipses |
Dibuja elipses alrededor de grupos |
fviz_cos2 |
Visualizar el cos2 |
fviz_contrib |
Visualizar las contribuciones |
fviz_dend |
Visualizar dendrograma |
fviz_cluster |
Visualización de clustering iterativo |
Funciones | Descripción |
---|---|
get_eigenvalue |
Acceder a la dimensión de los autovalores |
get_pca |
Acceder a resultados de PCA |
get_ca |
Acceder a resultados de CA |
get_mca |
Acceder a resultados de MCA |
get_mfa |
Accder a resultados de MFA |
get_famd |
Acceder a resultaods de FAMD |
get_hmfa |
Acceder a resultados de HMFA |
facto_summarize |
Resumen del análisis |
Es un buen momento para parar y hacernos unas preguntas que nos ayuden a saber si hemos entendido estos sencillos pero importantes conceptos (acceso).
Es muy importante, antes de diseñar un experimento, pararnos a reflexionar sobre lo que pretendemos encontrar y tener clara nuestra hipótesis de trabajo.
Es también importante tener idea a priori del tipo de análisis que vamos a hacer. Esto nos ayudará a saber qué tipo de datos tenemos que recabar
Finalmente, si uno no va ha analizar sus propios datos, debería hablar con la persona o grupo que los vayan a analizar antes de empezar el experimento y contar ellos en el diseño. Al fin y al cabo son ellos los que analizarán y sabrán cómo deben ser nuestros datos.