Ich habe meine multivariaten Daten häufig mit PCA diagnostiziert (Omics-Daten mit Hunderttausenden von Variablen und Dutzenden oder Hunderten von Stichproben). Die Daten stammen oft aus Experimenten mit mehreren kategorialen unabhängigen Variablen, die einige Gruppen definieren, und ich muss oft einige Komponenten durchgehen, bevor ich diejenigen finden kann, die eine Trennung zwischen den interessierenden Gruppen aufweisen. Ich habe einen ziemlich primitiven Weg gefunden, solche diskriminierenden Komponenten zu finden, und ich frage mich
- inwieweit dies angemessen / gerechtfertigt ist und
- ob es bessere Möglichkeiten gibt, dasselbe zu erreichen.
Beachten Sie, dass dies nur zur Erläuterung dient. Bevor ich jemanden überzeugen kann, möchte ich mich selbst überzeugen. Wenn ich sehe, dass es Komponenten gibt, die die interessierenden Gruppen klar voneinander unterscheiden (z. B. Kontrolle oder Behandlung), auch wenn sie für einen geringen Teil der Varianz der Reaktionen verantwortlich sind, vertraue ich dem eher als dem Ergebnis einer beispielsweise überwachten Maschine Lernen.
Hier ist mein Ansatz. Ich werde den Beispieldatensatz "metabo" von pca3d in R verwenden.
Die Idee ist zu bewerten, wie viel Varianz jeder Komponente durch die unabhängige Variable erklärt werden kann. Dazu berechne ich für jede Komponente ein einfaches Modell und ordne anhand von die Komponenten von "am interessantesten" nach "am wenigsten interessant".
require( pca3d )
# data on metabolic profiles of TB patients and controls
data( metabo )
# first column is the independent variable
pca <- prcomp( metabo[,-1], scale.= T )
# create a model for each component
lm.m <- lm( pca$x ~ metabo[,1] )
lm.s <- summary( lm.m )
lm.r2 <- sapply( lm.s, function( x ) x$r.squared )
plot( lm.r2, type= "l" )
text( 1:length( lm.r2 ), lm.r2, 1:length( lm.r2 ), pos= 3 )
Hier ist das Ergebnis. Das Diagramm zeigt den Prozentsatz der Varianz jeder Komponente, erklärt durch die unabhängige Variable in metabo[,1]
.
Wir können die Komponenten nach sortieren , um herauszufinden, mit welchen sie angezeigt werden sollen order( lm.r2, decreasing= TRUE )
. Die ersten drei Komponenten sind 2, 1 und 7.
pca3d( pca, components= c( 1, 2, 7 ), group= metabo[,1] )
Hier ist die Handlung:
(Die rote und die grüne Kategorie sind zwei Gruppen von Probanden, die keine Patienten sind, und es ist zu erwarten, dass sie nicht unterschieden werden können.)
Um meine Fragen neu zu formulieren,
- Ist dieser Ansatz für Sie sinnvoll? Mein Problem ist, dass es zu sehr nach Datenbaggern aussieht. Ich denke auch, ich sollte intuitiv den Spieß umdrehen und fragen, welcher Teil der Varianz in der unabhängigen Variablen durch jede Variable erklärt wird. Schließlich bin ich (fast) sicher, dass ich das Rad schlecht erfinden werde, also ist meine zweite Frage
- Gibt es etwas Besseres?
Beachten Sie, dass ich zu diesem Zeitpunkt nicht auf partielle kleinste Quadrate oder ähnliches wechseln möchte. Ich möchte nur die PCA im Rahmen meiner Klassifizierung diagnostizieren.
to find out what share of the overall variance in the data matrix is explained by a given classification
Wenn Sie genau das wissen möchten, benötigen Sie keine PCA. Berechnen Sie einfach das Verhältnis der Quadratsumme zwischen den Gruppen zur Gesamtsumme der Quadrate: (SStotal-SSwithin)/SStotal
wobei SSwithin die gepoolte Quadratsumme innerhalb der Gruppe ist.
Is there anything better?
.