¿Qué diferencia hay en centrar (o desentrañar) los datos para el ACP? He oído que facilita las matemáticas o que evita que el primer PC esté dominado por las medias de las variables, pero siento que aún no he podido entender bien el concepto.
Por ejemplo, la respuesta principal aquí ¿Cómo el centrado de los datos elimina el intercepto en la regresión y el ACP? describe cómo el hecho de no centrar el primer PCA pasaría por el origen, en lugar de por el eje principal de la nube de puntos. Basándome en mi comprensión de cómo se obtienen los PC a partir de los vectores propios de la matriz de covarianza, no puedo entender por qué ocurriría esto.
Además, mis propios cálculos con y sin centrado parecen tener poco sentido.
Considere las flores de setosa en el iris
en R. Calculé los vectores propios y los valores propios de la matriz de covarianza de la muestra como sigue.
data(iris)
df <- iris[iris$Species=='setosa',1:4]
e <- eigen(cov(df))
> e
$values
[1] 0.236455690 0.036918732 0.026796399 0.009033261
$vectors
[,1] [,2] [,3] [,4]
[1,] -0.66907840 0.5978840 0.4399628 -0.03607712
[2,] -0.73414783 -0.6206734 -0.2746075 -0.01955027
[3,] -0.09654390 0.4900556 -0.8324495 -0.23990129
[4,] -0.06356359 0.1309379 -0.1950675 0.96992969
Si centro primero el conjunto de datos, obtengo exactamente los mismos resultados. Esto parece bastante obvio, ya que el centrado no cambia en absoluto la matriz de covarianza.
df.centered <- scale(df,scale=F,center=T)
e.centered<- eigen(cov(df.centered))
e.centered
El prcomp
da como resultado exactamente esta combinación de valores propios y vectores propios, tanto para el conjunto de datos centrado como para el no centrado.
p<-prcomp(df)
p.centered <- prcomp(df.centered)
Standard deviations:
[1] 0.48626710 0.19214248 0.16369606 0.09504347
Rotation:
PC1 PC2 PC3 PC4
Sepal.Length -0.66907840 0.5978840 0.4399628 -0.03607712
Sepal.Width -0.73414783 -0.6206734 -0.2746075 -0.01955027
Petal.Length -0.09654390 0.4900556 -0.8324495 -0.23990129
Petal.Width -0.06356359 0.1309379 -0.1950675 0.96992969
Sin embargo, el prcomp
tiene la opción por defecto center = TRUE
. Si se desactiva esta opción, se obtienen los siguientes PC para los datos no centrados ( p.centered
sigue siendo el mismo cuando center
es falso):
p.uncentered <- prcomp(df,center=F)
> p.uncentered
Standard deviations:
[1] 6.32674700 0.22455945 0.16369617 0.09766703
Rotation:
PC1 PC2 PC3 PC4
Sepal.Length -0.8010073 0.40303704 0.4410167 0.03811461
Sepal.Width -0.5498408 -0.78739486 -0.2753323 -0.04331888
Petal.Length -0.2334487 0.46456598 -0.8317440 -0.19463332
Petal.Width -0.0395488 0.04182015 -0.1946750 0.97917752
¿Por qué es esto diferente de mis propios cálculos de vectores propios en la matriz de covarianza de los datos no centrados? ¿Tiene que ver con el cálculo? He visto que se menciona que prcomp
utiliza algo llamado método SVD en lugar de la descomposición de valores propios para calcular los PC. La función princomp
utiliza este último, pero sus resultados son idénticos a los de prcomp
. ¿Está mi problema relacionado con la respuesta que he descrito al principio de este post?
EDITAR: El problema fue aclarado por el útil @ttnphns. Ver su comentario más abajo, en esta pregunta: ¿Qué significa calcular los vectores propios de una matriz de covarianza si los datos no se han centrado primero? y en esta respuesta: https://stats.stackexchange.com/a/22520/3277 . En resumen: una matriz de covarianza implica ya implícitamente el centrado de los datos. El PCA utiliza la SVD o la eigendecomposición de los datos centrados $\bf X$ y la matriz de covarianza es entonces igual a ${\bf X'X}/(n-1)$ .