UNAL - Departamento de estadística
jueves, 28 de noviembre de 2024
Ejemplo introductorio: Informe Mundial de la Felicidad 2021 para analizar indicadores de bienestar en 149 países.
El PCA busca una combinación lineal de los indicadores que maximice la varianza. Es decir, los combina de manera que reflejen la mayor variación entre los \(149\) países.
\[ \small\textrm{PC}1 = 0.538 (Social) + 0.563 (Life) + 0.498 (Choices) − 0.004 (Generosity) - 0.381 (Corruption) \] \[ \small\textrm{PC}2 = − 0.266 (Social) − 0.243 (Life) + 0.258 (Choices) + 0.799 (Generosity) − 0.407 (Corruption) \]
flowchart LR A(Estandarizar\n las variables) --> B(El PCA tiene como objetivo explicar las variaciones de las variables,\n por lo que es esencial que ciertas variables no contribuyan excesivamente\n a esa variación por razones ajenas a la pregunta de investigación.) B --> C[En situaciones donde hay variables en diferentes\n escalas, es preferible centrar los datos en la media y dividir\n sobre la desviación estándar.] B --> D[Si los datos son de escala positiva y se transforman logarítmicamente,\n esto ya es una forma de estandarización de las variables para tener\n escalas aditivas comparables que reflejen las diferencias multiplicativas en las variables.]
flowchart LR A(Dos caminos) --> B[Eigenvalue decomposition EVD] A --> C[singular value decomposition SVD]
La EVD se aplica sobre la matriz de covarianza de los datos
La SVD se aplica a la matrix de datos opcionalmente estandarizada, pero al menos centrada.
calcula valores propios, denotados habitualmente por \(\lambda_1,\lambda_2,\cdots\) valores positivos en orden descendente, así como vectores propios correspondientes a cada valor propio, denotados por \(v_1,v_2,\cdots\)
Da como resultado un conjunto de valores singulares positivos y dos conjuntos de vectores, los vectores singulares izquierdo y derecho, para las filas y columnas respectivamente. Los valores singulares son proporcionales a las raíces cuadradas de los valores propios de la matriz de covarianza y los vectores singulares izquierdo y derecho conducen a la visualización conjunta de casos y variables en forma de un diagrama de dispersión bidimensional.
Dada una matrix \(X_{n\times p}\) ya centrada o posiblemente estandarizada. La SVD descompone a \(X\) en tres matrices:
\[X=UDV^{t}\] donde,
Escrita como una suma de productos de los vectores individuales, SVD de \(X\) queda:
\[\sum_{k=1}^{m}\alpha_ku_kf_k^{t}\] Donde \(m\) es el rango de \(X\). Dado que la suma de los cuadrados de cada matriz de rango 1 \(u_kv_k^{t}\) es igual a 1 y los valores singulares están en orden descendente, esto sugiere que tomar los primeros términos de la suma dará una aproximación a \(X\).
Para el biplot, las coordenadas de la fila PCA (principal) en \(r\) dimensiones están en las primeras \(r\) columnas de \(UD\), y las coordenadas de la columna (estándar) en las primeras \(r\) columnas de \(V\). Los cuadrados de los valores singulares, expresados en relación con su suma, dan los porcentajes de varianza explicada.
\(\textbf{Pregunta de interés:}\) Qué tanta varianza de los datos es explicada por las consecutivas dimensiones de la solución?
PCA clasifica la variación de los datos en las características principales de los datos en las dimensiones principales y lo que se considera ruido aleatorio, en las dimensiones menores.
La secuencia de porcentajes de varianza explicada sugiere cuantas dimensiones NO ALEATORIAS hay.
La solución de un PCA no tiene por qué ser siempre de dos dimensiones.
La solución puede ser de una sola dimensión, o más de dos.
\[ \tiny\textrm{PC}1 = 0.538 (Social) + 0.563 (Life) + 0.498 (Choices) − 0.004 (Generosity) - 0.381 (Corruption) \] \[ \tiny\textrm{PC}2 = − 0.266 (Social) − 0.243 (Life) + 0.258 (Choices) + 0.799 (Generosity) − 0.407 (Corruption) \]
PC1 | PC2 | PC3 | PC4 | PC5 | SS | |
---|---|---|---|---|---|---|
Valores singulares | ||||||
$$\textrm{Valores singulares}/\sqrt(n)$$ | 1.527 | 1.103 | 0.835 | 0.689 | 0.494 | 5 |
Correlaciones entre las componentes principales y las variables originales | ||||||
$$\textrm{Social}$$ | 0.825 | 0.295 | 0.303 | 0.183 | -0.328 | 1 |
$$\textrm{Life}$$ | 0.862 | 0.269 | 0.002 | 0.252 | 0.347 | 1 |
$$\textrm{Choises}$$ | 0.764 | -0.285 | 0.178 | -0.549 | 0.05 | 1 |
$$\textrm{Generosity}$$ | -0.007 | -0.884 | 0.38 | 0.268 | 0.038 | 1 |
$$\textrm{Corruption}$$ | -0.584 | 0.451 | 0.659 | -0.091 | 0.114 | 1 |
Variabiliad explicada por variable | ||||||
$$R^2. \mathrm{Social}$$ | 0.68 | 0.087 | 0.092 | 0.033 | 0.108 | — |
$$R^2. \mathrm{Life}$$ | 0.744 | 0.072 | 0 | 0.063 | 0.121 | — |
$$R^2. \mathrm{Choises}$$ | 0.583 | 0.081 | 0.032 | 0.301 | 0.002 | — |
$$R^2. \mathrm{Generosity}$$ | 0 | 0.782 | 0.145 | 0.072 | 0.001 | — |
$$R^2. \mathrm{Corruption}$$ | 0.341 | 0.203 | 0.435 | 0.008 | 0.013 | — |
Variabilidad explicada | ||||||
$$\textrm{SS}$$ | 2.348 | 1.226 | 0.703 | 0.478 | 0.245 | 5 |
$$\%$$ | 46.97% | 24.51% | 14.05% | 9.57% | 4.91% | 100.00% |
Contexto: El conjunto de datos consiste en una matriz de tamaño \(63 \times 2308\) de expresiones genéticas en 63 niños y 2308 genes.
Los niños tienen tumores pequeños, redondos y de células azules, clasificados en cuatro tipos principales:
Los datos ya están log-transformados.
Objetivos:
Superposición entre grupos EW y RM.
Separación clara de grupos basada en centroides.
Reducción de genes a los más relevantes con mínima pérdida de varianza.
Representación reducida de los centroides de grupos.
Contexto: Muestras recolectadas entre 1999 y 2004 en el Mar de Barents.
Objetivos:
Resultados:
Pa_bo
(camarón), más abundante en 1999. Tr_es
(faneca noruega) Predomina en 2004.Pueden existir limitaciones prácticas cuando el PCA es aplicado. Esto debido al gran tamaño y dimensionalidad del conjunto de datos en cuestión, generando problemas computacionales.
Ejemplos claros de este problema pueden surgir en aplicaciones tales como:
entre otros.
Las descomposiciones EVD y SVD son computacionalmente demandantes cuando las matrices son muy grandes, y además requieren guardar la matriz completa en la memoria.
Cuando la matriz de datos es parcialmente observada (hay datos faltantes), existen alternativas para proceder con la aplicación del PCA:
Este último método, asume que \(X\) es una matrix con valores faltantes que ha sido centrada y escalada usando los valores observados. La idea es encontrar la matriz \(X\) de rango \(r\), denotada \(X_r\) que minimice la suma de cuadrados de la matriz original.
Ejemplo de simulación: Se simula el \(10\%\) de datos faltantes en la matriz de datos completa del World Happiness Report la cuál tiene \(149 \times 5 = 745\) entradas.
#####################
prop <- 0.1
nrep <- 100
#####################
df <- HAPPY
info <- df[,c(1:2)] %>%
rename(country = 1, region = 2)
df <- df[,c(8:12)] %>%
rename(social = 1, life = 2, choice = 3, generosity = 4, corruption = 5) %>%
mutate(life = as.numeric(gsub(",","",life)))
n <- nrow(df) * ncol(df)
rss <- function(X, A){
sum((X - A)^2, na.rm = TRUE)
}
mPCA <- function(X, rank, maxit = 100, thresh = 1e-5){
A <- outer(rep(1, nrow(X)), colMeans(X, na.rm = T))
score0 <- rss(X, A)
delta <- Inf
it <- 0
while(it < maxit & delta > thresh){
#impute
Xtilde <- X
Xtilde[is.na(X)] <- A[is.na(X)]
#center
m <- colMeans(Xtilde)
Xtilde <- scale(Xtilde, center = m, scale = F)
#lrma
SVD <- svd(Xtilde)
A <- SVD$u[, 1:rank, drop = F] %*% diag(SVD$d[1:rank], rank, rank) %*% t(SVD$v[, 1:rank, drop = F])
#unscale
A <- scale(A, center = -m, scale = F)
#loss
score <- rss(X, A)
delta <- abs((score - score0)/score0)
#cat("iter", it , "rss", score, "delta", delta, "\n")
score0 <- score
it <- it + 1
}
return(score)
}
mPCAnull <- function(X){
A <- outer(rep(1, nrow(X)), colMeans(X, na.rm = T))
score0 <- rss(X, A)
return(score0)
}
result <- c()
for(rep in 1:nrep){
missing <- sample(1:n, n*prop)
df_upd <- as.matrix(df)
df_upd[missing] <- NA
s <- apply(df_upd, 2, sd, na.rm = T)
df_upd <- scale(df_upd, scale = s, center = F)
score0 <- mPCAnull(df_upd)
result <- rbind(result, data.frame(rss = score0, r2 = 0, rank = 0, rep = rep))
for(rank in 1:4){
score <- mPCA(df_upd, rank)
result <- rbind(result, data.frame(rss = score, r2 = 1 - score/score0, rank = rank, rep = rep))
}
}
resultsum <- result %>% group_by(rep) %>%
mutate(vardiff = r2 - lag(r2)) %>%
filter(rank > 0) %>%
group_by(rank) %>%
summarise(mean = mean(vardiff), upper = quantile(vardiff, 0.975), lower = quantile(vardiff, 0.025))
ggplot(resultsum, aes(x = rank, y = mean)) +
geom_bar(stat="identity", fill = "lightskyblue2", color = "black",
position=position_dodge(), width = 0.7) +
geom_errorbar(aes(ymin = upper, ymax= lower), width=.2,
position=position_dodge(.9)) +
ylab("variance explained")+
xlab("PC dimension")+
theme_classic() |> theme(
axis.text.x = element_text(size = 14), # Increase x-axis tick labels
axis.text.y = element_text(size = 14), # Increase y-axis tick labels
axis.title.x = element_text(size = 16), # Increase x-axis title
axis.title.y = element_text(size = 16) # Increase y-axis title
)
\(480189 \hspace{0.1cm} \textrm{usuarios} \times 17770 \hspace{0.1cm}\textrm{películas}\). En promedio, cada usuario calificó alrededor de 200 películas, por lo que se observó apenas el \(1\%\) de la matriz.
\[M \approx CG^T\] \[\widehat{M} = CG^T\] \[\widehat{m}_{ij} = \sum_{k=1}^r c_{ik}g_{jk}\] \[\textrm{RSS} = \sum(m_{ij} - \widehat{m}_{ij})^2\] Esta imputación masiva sería inviable mediante el anterior algoritmo. Se requiere una versión mejorada con estrategias adicionales. Hay dos algoritmos: SoftImpute y HardImpute.
Análisis de componentes principales PCA