6 votos

Iterativa PCA R

Tengo un amplio conjunto de datos (400.000 variables de 1000 muestras). Me gustaría identificar cuál es el mejor conjunto de estas variables para capturar la mayor parte de la varianza entre muestras.

¿Cuál es la mejor manera de realizar un análisis de componente principal iterativo que quizás pasará por X rondas de entre variables Y y Z cada vez y resultará en una lista de cuál redonda conduce al menor número de PCs para capturar un cierto porcentaje de varianza?

6voto

Jake Puntos 3853

Como entiendo tu problema, el principal problema es el tamaño del conjunto de datos, y no es que contiene el valor que falta (es decir, "disperso"). De tal problema, yo recomendaría hacer un parcial de PCA con el fin de resolver para un subconjunto de los líderes de Pc. El paquete irlba permite esta realizando un "Lanczos bidiagonalization". Es mucho más rápido para matrices grandes si sólo está interesado en la devolución de algunos de los líderes de Pc. En el ejemplo siguiente, he adaptado un arranque técnica que he discutido aquí en una función que incorpora este método así como una variable de sub-muestreo parámetro. En la función bootpca, se puede definir el número de variables de la muestra, n, el número de PCs para volver, npc, y el número de iteraciones B para el sub-muestreo de rutina. Para este método, he centrado y escala de la sub-muestreada de la matriz con el fin de estandarizar la varianza del conjunto de datos y permitir la comparación entre los valores singulares de la matriz de descomposición. Haciendo un boxplot de estos bootstrap valores singulares, lam, usted debería ser capaz de diferenciar entre la Pc que llevan las señales de aquellos que están dominados por el ruido.

Ejemplo

Generar datos

m=50
n=100

x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n

#field
Xt <- 
 outer(sin(x), sin(t)) + 
 outer(sin(2.1*x), sin(2.1*t)) + 
 outer(sin(3.1*x), sin(3.1*t)) +
 outer(tanh(x), cos(t)) + 
 outer(tanh(2*x), cos(2.1*t)) + 
 outer(tanh(4*x), cos(0.1*t)) + 
 outer(tanh(2.4*x), cos(1.1*t)) + 
 tanh(outer(x, t, FUN="+")) + 
 tanh(outer(x, 2*t, FUN="+"))

Xt <- t(Xt)
image(Xt)

#Noisy field
set.seed(1)
RAND <- matrix(runif(length(Xt), min=-1, max=1), nrow=nrow(Xt), ncol=ncol(Xt))
R <- RAND * 0.2 * Xt

#True field + Noise field
Xp <- Xt + R
image(Xp)

carga bootpca función

library(irlba)

bootpca <- function(mat, n=0.5*nrow(mat), npc=10, B=40*nrow(mat)){
  lam <- matrix(NaN, nrow=npc, ncol=B)
  for(b in seq(B)){
    samp.b <- NaN*seq(n)
    for(i in seq(n)){
        samp.b[i] <- sample(nrow(mat), 1)
    }
    mat.b <- scale(mat[samp.b,], center=TRUE, scale=TRUE)
    E.b  <- irlba(mat.b, nu=npc, nv=npc)
    lam[,b] <- E.b$d
    print(paste(round(b/B*100), "%", " completed", sep=""))
  }
  lam   
}

Resultado y de la trama

res <- bootpca(Xp, n=0.5*nrow(Xp), npc=15, B=999) #50% of variables used in each iteration, 15 PCs computed, and 999 iterations

par(mar=c(4,4,1,1))
boxplot(t(res), log="y", col=8, outpch="", ylab="Lambda [log-scale]")

Es obvio que la principal 5 PCs llevan la mayor parte de la información, aunque no eran técnicamente 9 señales en el conjunto de datos de ejemplo.

Para su conjunto de datos muy grande, puede que desee utilizar una fracción más pequeña de las variables (es decir, filas) en cada iteración, pero el número de iteraciones.

2voto

Gmaster Puntos 21

¿Por qué no hacer directamente un PCA en el conjunto completo y ver dónde te lleva? PCA es computacionalmente muy rápido, y usted será capaz de determinar rápidamente cuántas variables parecen ser importantes para los primeros componentes. He tenido éxito con ese número de variables (aunque en un tamaño de muestra más pequeño).

Alternativamente, puede probar un enfoque como PCA regularizado o escaso PCA. Si está usando R, eche un vistazo a los paquetes "elasticnet" y "mixOmics".

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X