Para el trabajo con matrices vamos a emplear un análisis de componentes principales. El análisis de componentes principales puede encuadrarse dentro del conjunto de técnicas multivariantes conocidas como métodos factoriales (también se incluyen el análisis de factores y el análisis de correspondencias). Pretendemos sintetizar un gran conjunto de datos, crear estructuras de interdependencia entre variables cuantitativas para crear unas nuevas variables que son función lineal de las originales y de las que podemos hacer una representación gráfica. El objetivo del análisis de componentes principales será el reducir la dimensión de un conjunto de $p$ variables a un conjunto $m$ de menor número de variables para mejorar la interpretabilidad de los datos.
Las nuevas variables, las componentes principales, determinan lo esencial de las variables originales, son una combinación lineal de ellas que además tienen unas propiedades interesantes:
- Son ortogonales (cada componente representa una dirección del espacio de las variables originales).
- Cada puntuación está incorrelada con la anterior.
- La primera componente es la que más varianza contiene y la $j$-ésima tiene más varianza que la $(j-1)$-ésima…
- Las primeras $j$ componentes dan la solución de mínimos cuadrados del modelo $Y = X B + E$.
Si hay relaciones estocásticas entre las $p$ variables originales, entonces podríamos condensar esa información en otras $m$ variables que explican sólo la variación del sistema descartando la información redundante. Geométricamente, el subespacio que creamos con las $m$ primeras componentes da el mejor ajuste posible al conjunto de datos, medido mediante la suma de los cuadrados de las distancias perpendiculares desde cada punto al subespacio. El subespacio de menor dimensionalidad sería $m=1$ componente; podríamos hacer la representación en un solo eje pero el conjunto inicial se podría distorsionar, así introduciríamos un nuevo eje para definir un subespacio $m=2$ y perderíamos menos información. Si $m=p$ tendríamos el mismo número de variables, no reduciríamos la dimensión, sólo haríamos una rotación rígida del conjunto de datos.
No voy a entrar en el algoritmo matemático para la obtención de las componentes; sí haré alguna reseña en algún momento. Veamos un ejemplo de cálculo de componentes principales mediante cálculo matricial:
Ejemplo 14.1:
Partimos del siguiente conjunto de datos: Se trata de datos de coches de importación y nacionales [Douglas Montgomery and David Friedman, “Prediction Using Regression Models with Multicollinear Predictor Variables” IIE Transactions (Mayo, 1993) vol. 25 nº 3, 73-85; Montgomery D.C. & Peck E.A., Introduction to Linear Regression Analysis, 2ª edición, J. Wiley and Sons, N.Y. (1992)]. Este conjunto de datos contiene las siguientes variables:
| Variable | Tipo | Columnas | Descripción añadida |
|---|---|---|---|
| Desplazamiento | numérico | 1-5 | en pulgadas cúbicas |
| Potencia | numérico | 7-9 | en ft-lbs |
| Par motor | numérico | 11-13 | en ft-lbs |
| Razón de compresión | numérico | 15-17 | |
| Razón árbol trasero | numérico | 19-21 | |
| Nº de carburadores | numérico | 23 | |
| Velocidades | numérico | 25 | |
| Longitud del coche | numérico | 27-31 | en pulgadas |
| Anchura del coche | numérico | 33-36 | en pulgadas |
| Peso del coche | numérico | 38-41 | en lbs |
| Tipo de transmisión | numérico | 43 | 0=manual 1=automático |
| Recorrido gasolina | numérico | 45-48 | en millas por galón de gasolina |
Disponemos de 12 variables; sólo seleccionaremos algunas de ellas. El primer paso es crear el objeto con los datos de trabajo y seleccionar las variables con las que vamos a trabajar:
options(prompt = "")
datos <- read.table(url("https://es.geocities.com/r_vaquerizo/Conjuntos_datos/GAS.TXT"))
attach(datos)
conjunto <- data.frame(V1, V2, V3, V8, V9, V10, V12) # seleccionamos un subconjunto
detach(datos)
nombres <- c("desplazamiento", "potencia", "par", "longitud", "anchura", "peso", "recorrido")
names(conjunto) <- nombres
Hemos variado el prompt de la línea de comandos con la función options para evitar problemas a la hora de editar mensajes en el blog. Leemos el conjunto de datos colgado en una dirección web mediante la función read.table con la opción url. Empleamos la función attach para “atacar” un conjunto de datos y generamos un subconjunto con las 7 variables que participarán en nuestro análisis, que llevaremos a cabo a partir de la matriz de correlaciones y a partir de la matriz de covarianzas. En esta entrega obtendremos las componentes principales a partir de la matriz de correlaciones y este ejemplo nos servirá para realizar una aproximación al cálculo matricial con R.
Componentes principales a partir de la matriz de correlaciones :
matriz.correlaciones <- cor(conjunto)
matriz.correlaciones
Aunque WordPress no nos facilite mucho la lectura, se aprecian unas altas correlaciones entre las variables; se detectan relaciones lineales entre variables lo que nos permite establecer patrones que unen las diferentes variables para crear unas nuevas variables que nos describan de forma más simple el conjunto de datos de coches con el que estamos trabajando. Ahora queda obtener las componentes; éstas son las combinaciones lineales de las variables que hacen máxima su varianza y esto se consigue obteniendo los autovalores y los autovectores de la matriz de correlaciones (podéis consultar en la red el razonamiento matemático, lo explican con bastante detalle). Veamos cómo obtenemos autovalores y autovectores en R:
componentesI <- eigen(matriz.correlaciones)
componentesI
Vemos que la función eigen nos crea un objeto con los autovalores y los autovectores. El número de autovalores no nulos proporciona la dimensión del espacio en el que se encuentran las observaciones; un autovalor nulo revelaría la existencia de una dependencia lineal entre las variables originales. Pues si $Z$ es la matriz de datos tipificados y $R$ es la matriz de correlaciones con pares de autovalores y autovectores $(\lambda_1, e_1), (\lambda_2, e_2), \dots, (\lambda_p, e_p)$, entonces la $i$-ésima componente muestral viene dada por $y = e_i Z = e_{1i} z_1 + \dots + e_{pi} z_p$, donde los autovalores son una observación genérica de las variables $Z_1, Z_2, \dots, Z_p$. La varianza total es la suma de los autovalores, y la varianza que explica la $j$-ésima componente es el autovalor $j$-ésimo dividido por el número de variables:
componentesI$values[1] / 7 # Variabilidad explicada por la primera componente
(componentesI$values[1] + componentesI$values[2]) / 7 # Variabilidad por la segunda componente
Vemos que una sola componente ya explica un $88.5%$; con dos componentes este porcentaje sube al $94.2%$. El número de componentes a emplear irá en función de la variabilidad que deseemos explicar. En este caso, un $88.5%$ es más que suficiente, luego nos quedamos con la primera componente; veamos cuál es:
componentesI$vectors[, 1]
Pues aquí tenemos la componente principal: $Z_1 = -0.3926 \cdot \text{desplazamiento} - 0.3734 \cdot \text{potencia} - 0.3914 \cdot \text{par} - 0.3744 \cdot \text{longitud} - 0.356 \cdot \text{anchura} - 0.3966 \cdot \text{peso} + 0.359 \cdot \text{recorrido}$. Toma valores muy parecidos para todas las variables excepto recorrido, que es positiva. Esto se puede interpretar como: a menor valor tome la variable componente, mejor será el coche, aunque hay que tener en cuenta que los coches buenos hacen un recorrido menor que los coches pequeños. Para ver cómo se comporta la componente, hemos de introducir esta variable en el conjunto de datos de forma que veamos qué valor toma para cada observación; esto lo podemos hacer con cálculo matricial:
x <- as.matrix(scale(conjunto)) # x es la matriz del conjunto de datos tipificada 30x7
y <- as.matrix(componentesI$vectors[, 1]) # y es la matriz 7x1 con los valores de la componente
x %*% y # multiplicamos matrices y obtenemos una matriz 30x1 con los valores de la componente
Ahora vamos a unir esta componente a nuestro conjunto de datos de partida:
componente.datos <- as.matrix(x %*% y)
conjunto.final <- cbind(conjunto, componente.datos) # unimos horizontalmente matrices con la función cbind
conjunto.final
Vemos que los coches menos potentes tienen un valor menor en la componente; sin embargo, recorren muchos más kilómetros que aquellos que tienen mucho más tamaño y motor. En la siguiente entrega veremos este mismo ejemplo pero a partir de la matriz de covarianzas. Comentar que en el paquete stats de R disponemos de la función princomp para el análisis de componentes principales. En este caso el código que habríamos de emplear sería:
ejemplo.14.1 <- princomp(conjunto, cor = TRUE)
summary(ejemplo.14.1)
En la función princomp hemos de emplear la opción cor = TRUE para realizar el análisis con la matriz de correlaciones, ya que por defecto emplea la matriz de covarianzas. Los resultados son los mismos (evidentemente).