Se eu construir uma matriz 2D composta inteiramente de dados aleatórios, esperaria que os componentes PCA e SVD não explicassem nada.
Em vez disso, parece que a primeira coluna SVD parece explicar 75% dos dados. Como isso pode ser possível? O que estou fazendo de errado?
Aqui está o enredo:
Aqui está o 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)
Atualizar
Obrigado @Aaron. A correção, como você observou, foi adicionar escala à matriz para que os números fiquem centralizados em torno de 0 (ou seja, a média é 0).
m <- scale(m, scale=FALSE)
Aqui está a imagem corrigida, mostrando para uma matriz com dados aleatórios, a primeira coluna SVD está perto de 0, como esperado.
Respostas:
O primeiro PC está explicando que as variáveis não estão centralizadas em torno de zero. Escalar primeiro ou centralizar suas variáveis aleatórias em torno de zero terá o resultado esperado. Por exemplo, um destes:
fonte
Adicionarei uma resposta mais visual à sua pergunta, usando uma comparação de modelo nulo. O procedimento aleatoriamente embaralha os dados em cada coluna para preservar a variação geral enquanto a covariância entre variáveis (colunas) é perdida. Isso é realizado várias vezes e a distribuição resultante de valores singulares na matriz aleatória é comparada aos valores originais.
Eu uso em
prcomp
vez desvd
para a decomposição da matriz, mas os resultados são semelhantes:A comparação do modelo nulo é realizada na matriz centralizada abaixo:
A seguir, é apresentado um gráfico de caixa da matriz permutada com o quantil de 95% de cada valor singular mostrado como a linha sólida. Os valores originais de PCA de
m
são os pontos. todos os quais estão abaixo da linha de 95% - Portanto, sua amplitude é indistinguível de ruído aleatório.O mesmo procedimento pode ser feito na versão não centralizada
m
com o mesmo resultado - sem valores singulares significativos:Para comparação, vejamos um conjunto de dados com um conjunto de dados não aleatório:
iris
Aqui, o 1º valor singular é significativo e explica mais de 92% da variação total:
fonte