Para una matriz aleatoria, ¿no debería una SVD explicar nada? ¿Qué estoy haciendo mal?

13

Si construyo una matriz 2D compuesta completamente de datos aleatorios, esperaría que los componentes PCA y SVD esencialmente no explicaran nada.

En cambio, parece que la primera columna SVD parece explicar el 75% de los datos. ¿Cómo puede ser esto posible? ¿Qué estoy haciendo mal?

Aquí está la trama:

ingrese la descripción de la imagen aquí

Aquí está el código R:

set.seed(1)
rm(list=ls())
m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)
svd1 <- svd(m, LINPACK=T)
par(mfrow=c(1,4))
image(t(m)[,nrow(m):1])
plot(svd1$d,cex.lab=2, xlab="SVD Column",ylab="Singluar Value",pch=19)

percentVarianceExplained = svd1$d^2/sum(svd1$d^2) * 100
plot(percentVarianceExplained,ylim=c(0,100),cex.lab=2, xlab="SVD Column",ylab="Percent of variance explained",pch=19)

cumulativeVarianceExplained = cumsum(svd1$d^2/sum(svd1$d^2)) * 100
plot(cumulativeVarianceExplained,ylim=c(0,100),cex.lab=2, xlab="SVD column",ylab="Cumulative percent of variance explained",pch=19)

Actualizar

Gracias @ Aaron. La solución, como notó, era agregar una escala a la matriz para que los números se centren alrededor de 0 (es decir, la media es 0).

m <- scale(m, scale=FALSE)

Aquí está la imagen corregida, que muestra para una matriz con datos aleatorios, la primera columna SVD está cerca de 0, como se esperaba.

Imagen corregida

Aplazamiento de pago
fuente
44
[0 0,1]100R100Rnortenorte1/ /3norte/ /3-(norte-1)/ /121/ /12(norte/ /3-(norte-1)/ /12)/ /(norte/ /3)=3/ /4 4+1/ /(4 4norte)norte=10075.25

Respuestas:

11

La primera PC explica que las variables no están centradas alrededor de cero. Escalar primero o centrar sus variables aleatorias alrededor de cero tendrá el resultado que espera. Por ejemplo, cualquiera de estos:

m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)
m <- scale(m, scale=FALSE)

m <- matrix(runif(10000,min=-25,max=25), nrow=100,ncol=100)
Aaron dejó Stack Overflow
fuente
3
Planteas un buen punto, pero creo que esto solo cuenta una parte de la historia. De hecho, supongo que el OP probaría cada uno de estos y aún se sorprendería con el resultado. El hecho del asunto es que debido a que los valores singulares están ordenados en la salida, no aparecerán (y de hecho no están) distribuidos uniformemente como podría esperarse ingenuamente de los datos "aleatorios". La distribución Marchenko-Pastur rige su comportamiento en este caso.
Cardenal
@ Aaron Gracias, tenías toda la razón. He agregado un gráfico de la salida corregida arriba para mostrar cuán hermoso es el resultado.
Contango
1
@cardinal Gracias por tu comentario, tienes toda la razón (ver el gráfico producido por el código corregido, arriba). Creo que los valores SVD se distribuirían de manera menos uniforme a medida que la matriz se hace más pequeña, ya que una matriz más pequeña tendría más posibilidades de tener patrones que no serían aplastados por la ley de los grandes números.
Contango
3

Agregaré una respuesta más visual a su pregunta, mediante el uso de una comparación de modelo nulo. El procedimiento baraja aleatoriamente los datos en cada columna para preservar la varianza general mientras se pierde la covarianza entre variables (columnas). Esto se realiza varias veces y la distribución resultante de valores singulares en la matriz aleatoria se compara con los valores originales.

Yo uso en prcomplugar de svdpara la descomposición de la matriz, pero los resultados son similares:

set.seed(1)
m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)

S <- svd(scale(m, center = TRUE, scale=FALSE))
P <- prcomp(m, center = TRUE, scale=FALSE)
plot(S$d, P$sdev) # linearly related

La comparación del modelo nulo se realiza en la matriz centrada a continuación:

library(sinkr) # https://github.com/marchtaylor/sinkr

# centred data
Pnull <- prcompNull(m, center = TRUE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda[,1:20], ylim=range(Pnull$Lambda[,1:20], Pnull$Lambda.orig[1:20]), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=FALSE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

El siguiente es un diagrama de caja de la matriz permutada con el cuantil del 95% de cada valor singular que se muestra como la línea continua. Los valores originales de PCA de mson los puntos. todo lo cual se encuentra debajo de la línea del 95%. Por lo tanto, su amplitud es indistinguible del ruido aleatorio.

ingrese la descripción de la imagen aquí

Se puede realizar el mismo procedimiento en la versión no centrada de mcon el mismo resultado. Sin valores singulares significativos:

# centred data
Pnull <- prcompNull(m, center = FALSE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda[,1:20], ylim=range(Pnull$Lambda[,1:20], Pnull$Lambda.orig[1:20]), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=TRUE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

ingrese la descripción de la imagen aquí

A modo de comparación, veamos un conjunto de datos con un conjunto de datos no aleatorio: iris

# iris dataset example
m <- iris[,1:4]
Pnull <- prcompNull(m, center = TRUE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda, ylim=range(Pnull$Lambda, Pnull$Lambda.orig), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=FALSE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

ingrese la descripción de la imagen aquí

Aquí, el primer valor singular es significativo y explica más del 92% de la varianza total:

P <- prcomp(m, center = TRUE)
P$sdev^2 / sum(P$sdev^2)
# [1] 0.924618723 0.053066483 0.017102610 0.005212184
Marc en la caja
fuente
+1. El ejemplo del conjunto de datos de Iris es interesante, porque al mirar las dos primeras PC (como, por ejemplo, en su propia publicación aquí stats.stackexchange.com/a/88092 ) está bastante claro que la segunda sí lleva alguna señal. Sin embargo, la prueba de permutación (también conocida como barajar) indica que solo la primera es "significativa". Está claro que la combinación aleatoria tiende a subestimar la cantidad de PC: la gran variación de la primera PC real se "extenderá" entre las PC barajadas y las elevará a todas a partir de la segunda. Uno puede idear pruebas más sensibles que lo justifiquen, pero esto rara vez se hace.
ameba dice Reinstate Monica
@amoeba - Excelente comentario. Me he estado preguntando sobre el efecto de "propagación" desde hace algún tiempo. Supongo que una prueba de validación cruzada podría ser una de las más sensibles a las que hace referencia (por ejemplo, su respuesta aquí ). Sería genial si pudiera proporcionar un ejemplo / referencia.
Marc en la caja el
Por lo general, prefiero usar la validación cruzada (basada en un error de reconstrucción, según mi respuesta aquí ), pero en realidad no estoy seguro de si de alguna manera no está sufriendo el mismo tipo de insensibilidad o no. Podría tener sentido probarlo en el conjunto de datos de Iris. Con respecto a los enfoques basados ​​en la barajadura, no conozco ninguna referencia para explicar esta "propagación", solo conozco a algunas personas que estaban trabajando en ello recientemente. Creo que querían escribirlo pronto. La idea es introducir algunos factores de reducción de escala para las variaciones de las PC barajadas más altas.
ameba dice Reinstate Monica
@amoeba - Gracias por ese enlace. Explica mucho para mí. Me pareció especialmente interesante ver que la validación cruzada en PCA utiliza métodos que pueden operar en conjuntos de datos con valores perdidos. Hice algunos intentos en este enfoque y (como usted dice) el enfoque de barajado de modelos nulos tiende a subestimar el número de PC importantes. Sin embargo, para el conjunto de datos de iris, siempre devuelvo una sola PC por error de reconstrucción. Interesante dado lo que mencionaste sobre la trama. Podría ser que si estuviéramos midiendo el error basado en las predicciones de especies, los resultados podrían ser diferentes.
Marc en la caja el
Por curiosidad, lo probé con los datos de Iris. En realidad, obtengo dos PC importantes con el método de validación cruzada. Actualicé mi publicación vinculada, mira allí.
ameba dice Reinstate Monica