Los métodos de reducción de dimensionalidad son técnicas estadísticas que mapean el conjunto de los datos a subespacios derivados del espacio original, de menor dimensión, que permiten hacer una descripción de los datos a un menor costo.
Estas técnicas cobran importancia ya que muchos algoritmos de diversos campos tales como análisis numérico, aprendizaje automático o minería de datos suelen degradar su rendimiento cuando se usan con datos de alta dimensionalidad. En los casos extemos, el algoritmo deja de ser útil para el fin que fue diseñado. La maldición de la dimensión, se refiere a los diversos fenómenos que surgen al analizar y organizar datos de espacios de múltiples dimensiones.
A continuación veremos algunas de estas técnicas:
Análisis de componentes principales es un método estadístico que permite simplificar la complejidad de espacios muestrales con muchas dimensiones a la vez que conserva su información. Supóngase que existe una muestra con n individuos cada uno con p variables \((X_1, X_2, …, X_p)\), es decir, el espacio muestral tiene \(p\) dimensiones. PCA permite encontrar un número de factores subyacentes \((z<p)\) que explican aproximadamente lo mismo que las \(p\) variables originales. Donde antes se necesitaban \(p\) valores para caracterizar a cada individuo, ahora bastan \(z\) valores. Cada una de estas \(z\) nuevas variables recibe el nombre de componente principal.
Análisis de componentes principales pertenece a la familia de técnicas conocida como Aprendizaje no supervisado. Los métodos tradicionales de regresión tienen el objetivo de predecir una variable respuesta \(Y\) a partir de una serie de predictores. Para ello, se dispone de \(p\) características \((X_1, X_2 … X_p)\) y de la variable respuesta \(Y\) medidas en \(n\) observaciones. En el caso de Aprendizaje no supervisado, la variable respuesta \(Y\) no se tiene en cuenta ya que el objetivo no es predecir Y sino extraer información empleando los predictores, por ejemplo, para identificar subgrupos. El principal problema al que se enfrentan los métodos es la dificultad para validar los resultados dado que no se dispone de una variable respuesta que permita contrastarlos.
El método de PCA permite por lo tanto “condensar” la información aportada por múltiples variables en solo unas pocas componentes. Esto lo convierte en un método muy útil de aplicar previa utilización de otras técnicas estadísticas tales como regresión, clustering, etc.
En esta sección se describen dos de los conceptos matemáticos que se aplican en el PCA: vectores propios y valores propioss. Se trata simplemente de una descripción intuitiva con la única finalidad de facilitar el entendimiento del cálculo de componentes principales.
Los vectores propios son un caso particular de multiplicación entre una matriz y un vector. Obsérvese la siguiente multiplicación:
\[\left( \begin{array}{cc} 2 & 3 \\ 2 & 1\\ \end{array} \right) \times \left( \begin{array}{c} 3\\ 2 \end{array} \right) = \left( \begin{array}{c} 12 \\ 8 \end{array} \right) = 4 \times \left( \begin{array}{c} 3 \\ 2 \end{array}\right) \]
El vector resultante de la multiplicación es un múltiplo entero del vector original. Los vectores propios de una matriz son todos aquellos vectores que, al multiplicarlos por dicha matriz, su resultado ser un múltiplo entero del mismo. Los vectores propios tienen una serie de propiedades matemáticas específicas:
Los vectores propios solo existen para matrices cuadradas, y para una matriz \(n \times n\) tendrá \(n\) vectores propios.
Si se escala un vector propio antes de multiplicarlo por la matriz, se obtiene un múltiplo del mismo vector propio. Esto se debe a que si se escala un vector multiplicándolo por cierta cantidad, lo único que se consigue es cambiar su longitud pero la dirección es la misma.
Todos los vectores propios de una matriz son perpendiculares (ortogonales) entre ellos, independientemente de las dimensiones que tengan.
Dada la propiedad de que multiplicar un vector propio solo cambia su longitud pero no su naturaleza, es frecuente escalarlos de tal forma que su longitud sea 1. De este modo se consigue que todos ellos estén estandarizados. A continuación se muestra un ejemplo:
El vector \(\left( \begin{array}{c} 3\\4 \end{array} \right)\) tiene una longitud de \(\sqrt{3^2+4^2}=\sqrt{25}=5\). Si se divide cada dimensión entre la longitud del vector, se obtiene el vector estandarizado con longitud 1.
\[\left( \begin{array}{c} 3 \\ 4 \end{array} \right) \div 5 = \left( \begin{array}{c} 3/5 \\ 4/5 \end{array} \right)\]
Cuando se multiplica una matriz por alguno de sus vectores propios se obtiene un múltiplo del vector original, es decir, el resultado es ese mismo vector multiplicado por un número. Al valor por el que se multiplica el vector resultante se le conoce como valor propio. A todo vector propio le corresponde un valor propio y viceversa.
En el método PCA, cada una de las componentes es un vector propio, y el orden de las componentes se establece por orden decreciente de los valores propios. Así pues, la primera componente es el vector propio con el valor porpio asociado más alto.
Una forma intuitiva de entender el proceso de PCA consiste en interpretar las componentes principales desde un punto de vista geométrico. Supóngase un conjunto de observaciones para las que se dispone de dos variables \((X_1, X_2)\). El vector que define la primera componente principal \((Z_1)\) sigue la dirección en la que las observaciones varían más (linea roja). La proyección de cada observación sobre esa dirección equivale al valor de la primera componente para dicha observación.
La segunda componente \((Z_2)\) sigue la segunda dirección en la que los datos muestran mayor varianza y que no está correlacionada con la primera componente. La condición de no correlación entre componentes principales equivale a decir que sus direcciones son perpendiculares.
Cada componente principal \((Z_i)\) se obtiene por combinación lineal de las variables originales. Se pueden entender como nuevas variables obtenidas al combinar de una determinada forma las variables originales. La primera componente principal de un grupo de variables \((X_1, X_2,\dots, X_p)\) es la combinación lineal normalizada de dichas variables que tiene mayor varianza: \[Z_1=\phi_{11} X_1+\phi_{21}X_2+\dots+\phi{p1}X_p\]
Que la combinación lineal sea normalizada implica que:
\[\sum_{j=1}^p=\phi_{j1}^2=1\]
Los términos \(\phi_{11},\dots, \phi_{1p}\) reciben en el nombre de pesos y son los que definen a la componente. Se pueden interpretar como el peso o importancia que tiene cada variable en cada componente y, por lo tanto, ayudan a conocer que tipo de información recoge cada una de las componentes.
Dado un conjunt de datos \(X\) con \(n\) observaciones y \(p\) variables, el proceso a seguir para calcular la primera componente principal es:
Centralización de las variables: se resta a cada valor la media de la variable a la que pertenece. Con esto se consigue que todas las variables tengan media cero.
Problema de optimización se resuelve el problema de optimización para encontrar el valor de los pesos con los que se maximiza la varianza. Una forma de resolver esta optimización es mediante el cálculo de evalores y vectores propios de la matriz de covarianza.
Una vez calculada la primera componente \((Z_1)\) se calcula la segunda \((Z_2)\) repitiendo el mismo proceso, pero añadiendo la condición de que la combinación lineal no pude estar correlacionada con la primera componente. Esto equivale a decir que \(Z_1\) y \(Z_2\) tienen que ser perpendiculares. EL proceso se repite de forma iterativa hasta calcular todas las posibles componentes \((\min(n-1, p))\) o hasta que se decida detener el proceso. El orden de importancia de las componentes viene dado por la magnitud del valor propio asociado a cada vector propio.
El proceso de PCA identifica aquellas direcciones en las que la varianza es mayor. Como la varianza de una variable se mide en su misma escala elevada al cuadrado, si antes de calcular las componentes no se estandarizan todas las variables, aquellas variables cuya escala sea mayor dominarán al resto. De ahí que sea recomendable estandarizar siempre los datos.
Al trabajar con varianzas, el método PCA es altamente sensible a outliers, por lo que es altamente recomendable estudiar si los hay. La detección de valores atípicos con respecto a una determinada dimensión es algo relativamente sencillo de hacer mediante comprobaciones gráficas. Sin embargo, cuando se trata con múltiples dimensiones el proceso se complica. Por ejemplo, considérese un hombre que mide 2 metros y pesa 50 \(kg\). Ninguno de los dos valores es atípico de forma individual, pero en conjunto se trataría de un caso muy excepcional.
Por lo general, dada una matriz de datos de dimensiones \(n \times p\), el número de componentes principales que se pueden calcular es como máximo de \(n-1\) o \(p\) (el menor de los dos valores es el limitante). Sin embargo, siendo el objetivo del PCA reducir la dimensionalidad, suelen ser de interés utilizar el número mínimo de componentes que resultan suficientes para explicar los datos. No existe una respuesta o método único que permita identificar cual es el número óptimo de componentes principales a utilizar. Una forma de proceder muy extendida consiste en evaluar la proporción de varianza explicada acumulada y seleccionar el número de componentes mínimo a partir del cual el incremento deja de ser sustancial.
library(ggplot2)
## Warning in as.POSIXlt.POSIXct(Sys.time()): unable to identify current timezone 'H':
## please set environment variable 'TZ'
library(cowplot) # required to arrange multiple plots in a grid
##
## ********************************************************
## Note: As of version 1.0.0, cowplot does not change the
## default ggplot2 theme anymore. To recover the previous
## behavior, execute:
## theme_set(theme_cowplot())
## ********************************************************
theme_set(theme_bw(base_size=12)) # set default ggplot2 theme
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(grid)
data(iris)
head(iris, 5)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
summary(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
cor(iris[,1:4])
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
## Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
## Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
## Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
plot(iris[,1:4], pch='*',col=c("red", "green", "blue")[unclass(iris[,5])])
pairs(iris[1:4], main = "Datos Iris", pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)], lower.panel=NULL, labels=c("SL","SW","PL","PW"), font.labels=2, cex.labels=4.5)
p1 <- ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Species)) + geom_point()
p2 <- ggplot(iris, aes(x=Petal.Length, y=Petal.Width, color=Species)) + geom_point()
p3 <- ggplot(iris, aes(x=Sepal.Length, y=Petal.Length, color=Species)) + geom_point()
p4 <- ggplot(iris, aes(x=Sepal.Width, y=Petal.Width, color=Species)) + geom_point()
plot_grid(p1, p2, p3, p4, labels = "AUTO")
boxplot(iris$Sepal.Length ~ iris$Species, col=c("red", "green", "blue"), main= "Largo de sepalo por especie",xlab=" ",ylab=" ")
library(scatterplot3d)
scatterplot3d(iris$Petal.Width, iris$Sepal.Length, iris$Sepal.Width, color=c("red", "green", "blue")[unclass(iris[,5])])
iris.pca <- prcomp(iris[-5], scale=T)
iris.pca
## Standard deviations (1, .., p=4):
## [1] 1.7083611 0.9560494 0.3830886 0.1439265
##
## Rotation (n x k) = (4 x 4):
## PC1 PC2 PC3 PC4
## Sepal.Length 0.5210659 -0.37741762 0.7195664 0.2612863
## Sepal.Width -0.2693474 -0.92329566 -0.2443818 -0.1235096
## Petal.Length 0.5804131 -0.02449161 -0.1421264 -0.8014492
## Petal.Width 0.5648565 -0.06694199 -0.6342727 0.5235971
summary(iris.pca)
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.7084 0.9560 0.38309 0.14393
## Proportion of Variance 0.7296 0.2285 0.03669 0.00518
## Cumulative Proportion 0.7296 0.9581 0.99482 1.00000
prop_varianza <- iris.pca$sdev^2 / sum(iris.pca$sdev^2)
prop_varianza_acum <- cumsum(prop_varianza)
prop_varianza_acum
## [1] 0.7296245 0.9581321 0.9948213 1.0000000
ggplot(data = data.frame(prop_varianza, pc = 1:4),
aes(x = pc, y = prop_varianza)) +
geom_col(width = 0.3) +
scale_y_continuous(limits = c(0,1)) +
theme_bw() +
labs(x = "Componente principal",
y = "Prop. de varianza explicada")
ggplot(data = data.frame(prop_varianza_acum, pc = 1:4),
aes(x = pc, y = prop_varianza_acum, group = 1)) +
geom_point() +
geom_line() +
geom_label(aes(label = round(prop_varianza_acum,2))) +
theme_bw() +
labs(x = "Componente principal",
y = "Prop. varianza explicada acumulada")
grupos<-iris$Species
plot(iris.pca$x[,1],iris.pca$x[,2],
col=grupos,cex.axis=.7,cex.lab=.7)
library("FactoMineR")
res.pca <- PCA(iris[,-5], graph = F)