2016-03-27 12 views
-1

Zum Lernen von PCA in R, habe ich princomp() -Funktion (aus MASS-Paket) auf Iris-Datensatz ausgeführt. Ich habe folgende Schritte folgen:Berechnung neuer Variablen von Hauptkomponenten - PCA in R

library(MASS) 
irispca<-princomp(iris[-5]) 
summary(irispca) 
irispca$loadings 

Um Hauptkomponenten zu berechnen, habe ich Ausgang Beladungen auf diese Weise verwendet:

iris_temp2 <- iris 
iris_temp2$Comp.1 <- with(iris_temp2,Sepal.Length*0.361+Petal.Length*0.857+Petal.Width*0.358) 
iris_temp2$Comp.2 <- with(iris_temp2,Sepal.Length*(-0.657)+Sepal.Width*(-0.73)+Petal.Length*0.173) 
iris_temp2$Comp.3 <- with(iris_temp2,Sepal.Length*(-0.582)+Sepal.Width*0.598+Petal.Width*0.546) 
iris_temp2$Comp.4 <- with(iris_temp2,Sepal.Length*0.315+Sepal.Width*(-0.32)+Petal.Length*(-0.48)+Petal.Width*0.754) 
iris_temp2 <- with(iris_temp2, iris_temp2[order(Comp.1,Comp.2,Comp.3,Comp.4),]) 

Endlich I den Datensatz sortiert. Ich habe auch erfahren, dass Scores dasselbe oben genannte Ding ergibt, d. H. Scores werden berechnet, indem skalierte Daten (auf denen Sie PCA ausführen) mit Ladungen multipliziert werden. Daher dachte ich über den Vergleich der Ausgabe von Noten und Ausgabe von iris_temp2 (mit vier Komponenten) nach.

iris_temp1 <- as.data.frame(irispca$scores) 
iris_temp1 <- with(iris_temp1, iris_temp1[order(Comp.1,Comp.2,Comp.3,Comp.4),]) 

Jedoch wenn ich tun Kopf (iris_temp1) und Kopf (iris_temp2 [, 6: 9]), werden die Ausgaben nicht übereinstimmen.

Ich möchte Sie bitten, den Grund für diese Beobachtung aufzuzeigen. Gibt es etwas, was ich falsch verstanden habe? Wenn Sie weitere Informationen von mir benötigen, lassen Sie es mich bitte wissen.

Referenzmaterialien, die ich verwendet habe, sind: http://yatani.jp/teaching/doku.php?id=hcistats:pca und https://www.youtube.com/watch?v=I5GxNzKLIoU&spfreload=5.

Dank Shankar

+0

I don‘ Ich verstehe, warum Sie versuchen, Principal Components, die Ihnen bereits von 'princomp()' übergeben wurden, manuell neu zu berechnen. – mtoto

+0

Vielen Dank für Ihre Antwort. Ich denke, ähnliche Namen schaffen hier Verwirrung. Hier ist Comp.1 nichts anderes als eine neue Variable, die im Dataset iris_temp2 mit Ladungen erzeugt wird. In diesem Fall werden die lispca $ loadings die erforderlichen Ladungen ausgeben, dh Ladungen: Comp.1 Comp.2 Comp.3 Comp.4 Sepal.Length 0.361 -0.657 -0.583 0.315 Sepal.Width -0.730 0,598 -0,320 Petal. Länge 0.857 0.173 -0.480 Petal.Width 0.358 0.546 0.754 – skumar

+0

Wie es jetzt klar wäre, sind beide Comp.1 verschieden. Hoffe das hilft. Bitte lassen Sie mich wissen, wenn Sie noch Fragen haben. – skumar

Antwort

1

princomp neu ordnet die Daten nicht, wird jede Zeile mit den Noten umgewandelt, so gibt es keine Notwendigkeit, die Daten neu zu ordnen beim Vergleich. Die Scores beinhalten sowohl eine Erniedrigung der Daten als auch eine Veränderung der Basis durch die Eigenwertmatrix.

Was dies bedeutet, ist, dass erstens müssen Sie Ihre Daten demean, dh

library(MASS) 
irispca<-princomp(iris[-5]) 

iris2 <- as.matrix(iris[-5]) 
iris2 <- sweep(iris2, MARGIN=2, irispca$center, FUN="-") 

Dann ist es wichtig, dass das Druckverfahren für princomp Objekte für die Anzeige Zweck

irispca$loadings 

Loadings: 
      Comp.1 Comp.2 Comp.3 Comp.4 
Sepal.Length 0.361 -0.657 0.582 0.315 
Sepal.Width   -0.730 -0.598 -0.320 
Petal.Length 0.857 0.173  -0.480 
Petal.Width 0.358  -0.546 0.754 

rundet Werte zu realisieren Aber wenn wir tatsächlich eine der Komponenten prüfen, sehen wir ihre vollen Werte

irispca$loadings[,1] 

Sepal.Length Sepal.Width Petal.Length Petal.Width 
    0.36138659 -0.08452251 0.85667061 0.35828920 

dies unter Berücksichtigung wir haben

is1 <- list() 
is1$Comp.1 <- iris2 %*% irispca$loadings[,1] 
is1$Comp.2 <- iris2 %*% irispca$loadings[,2] 
is1$Comp.3 <- iris2 %*% irispca$loadings[,3] 
is1$Comp.4 <- iris2 %*% irispca$loadings[,4] 
score1 <- as.data.frame(is1) 

die

head(score1, 2) 

Comp.1  Comp.2  Comp.3  Comp.4 
-2.684126 -0.3193972 0.02791483 0.002262437 
2.714142 0.1770012 0.21046427 0.099026550 


head(irispca$scores, 2) 
     Comp.1  Comp.2  Comp.3  Comp.4 
[1,] -2.684126 -0.3193972 0.02791483 0.002262437 
[2,] -2.714142 0.1770012 0.21046427 0.099026550 

Eine letzte Sache zu beachten, was dazu führen kann, wurde nicht gefragt, gibt aber oft Verwirrung, ist, dass, wenn v ist eine Hauptkomponente als -1 * v ist auch eine Hauptkomponente. Viele Algorithmen zu deren Bestimmung geben nicht explizit eine Orientierung vor. Von der docs

Die Zeichen der Spalten der Belastungen und Partituren willkürlich sind, und so kann zwischen verschiedenen Programmen für PCA unterscheiden und sogar zwischen verschiedenen Builds von R.

+0

Vielen Dank für diese ausführliche Antwort. Es ist sehr hilfreich. Ich glaube, der Fehler, den ich gemacht habe, war, dass ich die Mittelwerte nicht von den Werten subtrahiere, wie Sie es oben mit sweep() getan haben. Ich würde eine Notiz behalten, dass princomp die Reihenfolge nicht neu anordnet und dass die Druckmethode für princomp-Objekte Werte für den Zweck der Anzeige rundet. Danke nochmal. – skumar

+0

Ich frage mich nur - was bedeutet irispca $ Maßstab? Es gibt 1 für alle 4 Variablen aus. Was würde passieren, wenn die Skalenwerte von 1 abweichen würden? Muss in diesem Fall auch die Daten entkalkt werden? Bitte teilen Sie Ihre Eingaben auch in diesen Punkten. – skumar

+0

Betrachtet man den Quellcode von 'stats ::: princomp.default', so erscheint dies als Standardabweichung für die Skalierung, wenn 'cor = TRUE', ansonsten ist das 1. Wenn die obige Antwort Ihre Frage löste, sollten Sie sie akzeptieren. – mgilbert