Ho usato spesso per diagnosticare i miei dati multivariati usando PCA (dati omici con centinaia di migliaia di variabili e dozzine o centinaia di campioni). I dati provengono spesso da esperimenti con diverse variabili categoriali indipendenti che definiscono alcuni gruppi e spesso devo passare attraverso alcuni componenti prima di poter trovare quelli che mostrano una separazione tra i gruppi di interesse. Ho trovato un modo piuttosto primitivo di trovare componenti così discriminanti, e mi chiedo
- in che misura ciò sia ragionevole / giustificabile e
- se ci sono modi migliori per ottenere lo stesso.
Si noti che questo è esplorativo. Prima di convincere qualcun altro, voglio convincere me stesso. Se vedo che ci sono componenti che distinguono chiaramente i gruppi di interesse (ad es. Controllo vs trattamento), anche se sono responsabili di una piccola parte della varianza delle risposte, mi fido più di un risultato, per esempio, di una macchina supervisionata apprendimento.
Ecco il mio approccio. Userò il set di dati di esempio "metabo" da pca3d in R.
L'idea è di valutare quanta varianza di ciascun componente può essere spiegata dalla variabile indipendente. Per questo, calcolo un modello semplice per ogni componente e uso come metrica per ordinare i componenti da "più interessante" a "meno interessante".
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 )
Ecco il risultato. Il grafico mostra la percentuale di varianza di ciascun componente spiegata dalla variabile indipendente in metabo[,1]
.
Possiamo ordinare i componenti per per scoprire con quali visualizzare ; i primi tre componenti sono 2, 1 e 7.order( lm.r2, decreasing= TRUE )
pca3d( pca, components= c( 1, 2, 7 ), group= metabo[,1] )
Ecco la trama:
(Le categorie rossa e verde sono due gruppi di soggetti che non sono pazienti e si prevede che non possano essere distinti.)
Per riformulare le mie domande,
- Questo approccio ha senso per te? Il mio problema è che sembra troppo un dragaggio di dati. Inoltre, intuitivamente penso che forse dovrei girare la tabella e chiedere quale parte della varianza nella variabile indipendente è spiegata da ciascuna variabile? Infine, sono (quasi) sicuro che sto reinventando la ruota, male, quindi la mia seconda domanda è
- C'è qualcosa di meglio?
Si noti che non voglio passare a minimi quadrati parziali o qualcosa di simile in questa fase; Voglio solo diagnosticare il PCA nel contesto della mia classificazione.
to find out what share of the overall variance in the data matrix is explained by a given classification
Se vuoi sapere solo questo non hai bisogno di PCA. Calcola semplicemente la proporzione della somma dei quadrati tra i gruppi rispetto alla somma dei quadrati totale: (SStotal-SSwithin)/SStotal
dove SSwithin è la somma dei quadrati all'interno del gruppo.
Is there anything better?
.