J'ai fréquemment utilisé pour diagnostiquer mes données multivariées à l'aide de l'ACP (données omiques avec des centaines de milliers de variables et des dizaines ou des centaines d'échantillons). Les données proviennent souvent d'expériences avec plusieurs variables indépendantes catégorielles définissant certains groupes, et je dois souvent passer par quelques composants avant de pouvoir trouver ceux qui montrent une séparation entre les groupes d'intérêt. J'ai trouvé une façon plutôt primitive de trouver de tels composants discriminants, et je me demande
- dans quelle mesure cela est raisonnable / justifiable, et
- s'il existe de meilleures façons d'y parvenir.
Notez que ceci est exploratoire. Avant de convaincre quelqu'un d'autre, je veux me convaincre. Si je vois qu'il y a des composants qui distinguent clairement les groupes d'intérêt (par exemple, contrôle vs traitement), même s'ils sont responsables d'une petite partie de la variance des réponses, je lui fais plus confiance que le résultat, disons, d'une machine supervisée apprentissage.
Voici mon approche. Je vais utiliser l'exemple de jeu de données "metabo" de pca3d dans R.
L'idée est d'évaluer dans quelle mesure la variance de chacun des composants peut être expliquée par la variable indépendante. Pour cela, je calcule un modèle simple pour chaque composant et utilise comme métrique pour classer les composants de "plus intéressant" à "moins intéressant".
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 )
Voici le résultat. Le graphique montre le pourcentage de variance de chaque composant expliqué par la variable indépendante dans metabo[,1]
.
Nous pouvons trier les composants par pour trouver ceux avec lesquels afficher ; les trois premiers composants sont 2, 1 et 7.order( lm.r2, decreasing= TRUE )
pca3d( pca, components= c( 1, 2, 7 ), group= metabo[,1] )
Voici l'intrigue:
(Les catégories rouge et verte sont deux groupes de sujets qui ne sont pas des patients, et il faut s'attendre à ce qu'ils ne puissent pas être distingués.)
Pour reformuler mes questions,
- Cette approche a-t-elle un sens pour vous? Mon problème est qu'il ressemble trop au dragage de données. Aussi, intuitivement, je pense que je devrais peut-être tourner la table et demander quelle partie de la variance dans la variable indépendante est expliquée par chaque variable? Enfin, je suis (presque) sûr que je réinvente mal la roue, donc ma deuxième question est
- Y a-t-il quelque chose de mieux?
Notez que je ne veux pas passer aux moindres carrés partiels ou à quelque chose de similaire à ce stade; Je veux juste diagnostiquer l'APC dans le contexte de ma classification.
to find out what share of the overall variance in the data matrix is explained by a given classification
Si vous voulez savoir cela, vous n'avez pas besoin de PCA. Calculez simplement la proportion de la somme des carrés entre les groupes par rapport à la somme des carrés totale: (SStotal-SSwithin)/SStotal
où SSwithin est la somme des carrés regroupés au sein du groupe.
Is there anything better?
.