2013-06-01 3 views
6

Mi piacerebbe essere in grado di costruire i punteggi di un'analisi di componenti principali utilizzando i suoi loadings, ma non riesco a capire cosa sta facendo effettivamente la funzione princomp quando calcola i punteggi di un set di dati. Un esempio di esempio:Costruire i punteggi dei caricamenti delle stampanti in R

cc <- matrix(1:24,ncol=4) 
PCAcc <- princomp(cc,scores=T,cor=T) 
PCAcc$loadings 

Loadings: 
    Comp.1 Comp.2 Comp.3 Comp.4 
[1,] 0.500 0.866    
[2,] 0.500 -0.289 0.816  
[3,] 0.500 -0.289 -0.408 -0.707 
[4,] 0.500 -0.289 -0.408 0.707 

PCAcc$scores 

     Comp.1  Comp.2  Comp.3 Comp.4 
[1,] -2.92770 -6.661338e-16 -3.330669e-16  0 
[2,] -1.75662 -4.440892e-16 -2.220446e-16  0 
[3,] -0.58554 -1.110223e-16 -6.938894e-17  0 
[4,] 0.58554 1.110223e-16 6.938894e-17  0 
[5,] 1.75662 4.440892e-16 2.220446e-16  0 
[6,] 2.92770 6.661338e-16 3.330669e-16  0 

La mia comprensione è che i punteggi sono una combinazione lineare dei caricamenti e dei dati originali riscalati. Tentando in "mano":

rescaled <- t(t(cc)-apply(cc,2,mean)) 
rescaled%*%PCAcc$loadings 

    Comp.1  Comp.2  Comp.3 Comp.4 
[1,]  -5 -1.332268e-15 -4.440892e-16  0 
[2,]  -3 -6.661338e-16 -3.330669e-16  0 
[3,]  -1 -2.220446e-16 -1.110223e-16  0 
[4,]  1 2.220446e-16 1.110223e-16  0 
[5,]  3 6.661338e-16 3.330669e-16  0 
[6,]  5 1.332268e-15 4.440892e-16  0 

Le colonne sono fuori di un fattore 1,707,825 mila, 2, e 1,333,333 mila, rispettivamente. Perchè è questo? Poiché la matrice dei dati giocattolo ha la stessa varianza in ogni colonna, la normalizzazione non dovrebbe essere necessaria qui. Qualsiasi aiuto è molto apprezzato.

Grazie!

+1

In una nota separata, forse questo non è i dati di esempio migliore scelto per un PCA dal tuo centrato ('scala (cc)') punti sono tutti sulla stessa linea. Quindi PC1 catturerà tutta la varianza e gli altri PC saranno inutili (probabilmente spazzatura calcolata dal rumore). Si manifesta anche che i tuoi punteggi non sono zero per PC1 solo. – flodel

risposta

4

È necessario

scale(cc,PCAcc$center,PCAcc$scale)%*%PCAcc$loadings 

o più facile

predict(PCAcc,newdata=cc) 
+0

Grazie, non sapevo della funzione di scala. Speravo di ottenere una migliore comprensione del perché "princomp" è in scala di un fattore di 1.707825 in primo luogo. Da dove viene? Avrebbe senso se quella fosse la deviazione standard di una colonna, ma non lo è. – Escotch