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.