Sélection des composants PCA qui séparent les groupes


13

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

  1. dans quelle mesure cela est raisonnable / justifiable, et
  2. 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".R2

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].

entrez la description de l'image ici

Nous pouvons trier les composants par pour trouver ceux avec lesquels afficher ; les trois premiers composants sont 2, 1 et 7.r2order( lm.r2, decreasing= TRUE )

pca3d( pca, components= c( 1, 2, 7 ), group= metabo[,1] )

Voici l'intrigue:

entrez la description de l'image ici

(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,

  1. 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
  2. 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.


2
Je voudrais seulement faire deux commentaires sur votre question intéressante. 1) Décrivez en mots votre approche en plus de montrer son code (rappelez-vous que les gens ici utilisent divers logiciels, pas nécessairement R). 2) Le nuage de points n'est pas très convaincant sans pointes à son étage. De plus, si vous avez des doutes spécifiques sur votre approche, veuillez les exprimer pour rendre la question plus ciblée.
ttnphns du

1
édité: Pour clarifier, vous effectuez d'abord une ACP et essayez ensuite d'isoler les principaux composants qui sont mieux expliqués par une variable particulière? Les validez-vous de manière croisée avec un tracé d'éboulis? Il se peut que certains x que vous choisissez dans votre ensemble de données expliquent en grande partie la variance dans un composant principal, mais je ne suis pas sûr que cela signifie quelque chose si la variance est très faible le long de ce composant principal.
shadowtalker

1
@ssdecontrol Eh bien, je fais une mauvaise randomisation de l'homme pour voir si le calculé est bien au-dessus du bruit de fond. Quant à savoir si cela signifie quelque chose - le fait est que c'est généralement le cas, en fait. Comme je fais de toute façon tous les ensembles d'analyses classiques et / ou d'apprentissage automatique supervisé, chaque fois que je vois que PCX est expliqué en grande partie par un classificateur, je vais (i) trouver plusieurs variables qui diffèrent entre les groupes de ce classificateur et ( ii) que je peux former avec succès un SML. R2
janvier

2
to find out what share of the overall variance in the data matrix is explained by a given classificationSi 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)/SStotaloù SSwithin est la somme des carrés regroupés au sein du groupe.
ttnphns

1
Je ne vois aucun problème avec la façon dont vous exploitez PCA, mais je ne comprends pas pourquoi vous en avez vraiment besoin. (Juste parce que vous l'aimez peut-être?) Parce que je ne vois pas votre objectif précis, je ne peux rien dire pour vous Is there anything better?.
ttnphns

Réponses:


8

La réponse à votre question n ° 1 est oui, votre solution revient à draguer des données. La réponse à votre question n ° 2 est oui, il existe des méthodes supérieures dans la littérature.

n<<p

Vous exécutez une analyse qui ressemble à la régression des composants principaux, sauf que vous avez échangé vos variables indépendantes et dépendantes, ce qui entraîne une grande analyse de régression multivariée (par opposition à multiple ). La régression multivariée nécessite que la taille de votre échantillon soit supérieure au nombre de variables dépendantes, une exigence que vous violez complètement dans votre exemple.

Si vous êtes vraiment déterminé à exécuter PCA sur vos données, puis à utiliser la régression multivariée, vous devez utiliser une méthode appropriée. Par exemple, examinez MRCE et les méthodes connexes [1].

Cependant, malgré quelques commentaires déroutants que vous avez faits, tout dans votre analyse telle que présentée actuellement suggère que votre objectif ultime est d'identifier les relations entre un grand ensemble de variables continues (metabo [, - 1]) et une seule variable catégorielle (metabo [ ,1]). L'ACP est une mauvaise façon d'y parvenir. Il existe deux classes générales de solutions à ce problème dans le cas des dimensions élevées: premièrement, les solutions qui supposent une rareté et les solutions qui supposent une structure factorielle.

Les solutions basées sur la rareté supposent généralement que seule une très faible proportion de variables est en fait liée à la variable catégorielle d'intérêt, et tentent de trouver ce petit sous-ensemble; voir par exemple DALASS [2]. Les méthodes basées sur la structure factorielle supposent que vos variables discriminantes sont des manifestations de variables latentes sous-jacentes ayant une véritable relation avec la variable catégorielle. Un exemple de cette classe de méthodes est DLDA [3].

Notez que je ne recommande pas nécessairement les méthodes que j'ai mentionnées pour vos données; vous devez soigneusement considérer vos objectifs et une connaissance a priori du problème lors du choix d'une méthode appropriée.

[1] Rothman, Levina, Zhu (2010). Régression multivariée clairsemée avec estimation de covariance. Journal of Computational and Graphical Statistics, Volume 19, Numéro 4, Pages 947–962.

[2] Nickolay T. Trendafilov, Ian T. Jolliffe, DALASS: Variable selection in discriminant analysis via the LASSO, Computational Statistics & Data Analysis, Volume 51, Numéro 8, 1er mai 2007, Pages 3718-3736.

[3] Yu, Yang (2001). Un algorithme LDA direct pour les données de grande dimension avec application à la reconnaissance faciale. Reconnaissance de formes 34, 2067-2070.


2
J'ai commencé une nouvelle prime pour attribuer cette réponse.
janvier

1
@January: Ceci est une bonne réponse, mais je voudrais souligner que "LDA direct" est au mieux un algorithme très étrange , voir Gao et Davis, 2005, Why direct LDA n'est pas équivalent à LDA : "nous le démontrons. .. D-LDA peut imposer une limitation de performances significative dans les applications générales ", soyez donc prudent.
amibe dit Réintégrer Monica

@amoeba Merci pour cette citation. Cela fait un moment que je m'inquiète pour DLDA, car il n'y a aucune justification pour sélectionner des composants de cette manière particulière. Je le vois comme une solution très spécifique au problème qui ne se généralise pas nécessairement au-delà des problèmes de discrimination, bien qu'elle puisse être facilement adaptée à n'importe quel problème avec une certaine connaissance des composants les plus utiles pour la discrimination. Chaque solution mettant en œuvre une discrimination de grande dimension avec une structure de facteur supposée souffre de problèmes ... avez-vous trouvé de meilleures approches? Je suis intéressé par votre avis ici.
ahfoss

nk

4

@ahfoss vous a déjà indiqué LDA comme analogon de classification de PCA. En fait, ces deux méthodes sont liées l'une à l'autre et également au PLS:

nature of dependent variable (for supervised)     unsupervised    supervised
or structure of data (unsupervised)
continuous                                        PCA             PLS
factor/groups/classes                                             LDA

II

np

Le PLS peut être considéré comme une régularisation comme le LASSO, et un PLS clairsemé est également disponible (même si je ne l'ai pas utilisé: mes données sont plus adaptées au PLS normal, qui ne suppose pas la rareté). Pour une discussion intéressante sur les différentes méthodes de régularisation, voir par exemple les éléments de l'apprentissage statistique .

np

T=X×W
L=X×B


L(n×k1)=T(n×m)B(m×k1)
L(n×k1)=X(n×p)W(p×m)B(m×k1)
L(n×k1)=X(n×p)B(p×k1)
LBBB

Note pratique: si vous travaillez en R, j'ai un package en cours de développement qui fournit des modèles PLS-LDA et PCA-LDA. Faites-moi savoir si vous souhaitez essayer.


Afin d'éviter le dragage de données, vous devez valider votre modèle final (= mesurer ses performances) avec des données indépendantes.

Indépendant signifie ici que ce cas (patient?) N'a en aucune façon contribué à l'ajustement du modèle . En particulier,

  • n'a saisi aucun type de prétraitement impliquant plusieurs cas, comme le centrage ou la normalisation
  • n'a pas saisi le calcul PCA / PLS / ....
  • n'a pas été utilisé pour l'estimation d'hyperparamètre.

Comme vous n'avez que peu de cas, une stratégie de rééchantillonnage serait appropriée. Dans cette situation, il est probablement préférable de corriger tout hyperparamètre (comme le nombre de variables latentes PC ou PLS, ou lié à LASSO) par des connaissances externes afin d'éviter une deuxième division interne de vos données d'entraînement pour l'optimisation de l'hyperparamètre.


+1 pour les modèles à validation croisée. Extrêmement important. Cependant, j'aimerais entendre OP @January, qui a déclaré qu'il n'était pas intéressé par la discrimination, bien que son problème semble très bien adapté à l'analyse de la discrimination / classification.
ahfoss

Je ne suis pas d'accord avec votre affirmation selon laquelle les k-means / PCA / etc appartiennent à la même famille. Cela implique qu'il s'agit de cas particuliers du même modèle ou algorithme, ce qui n'est pas vrai. L'algorithme PCA est un calcul matriciel simple, tandis que k-means est un algorithme itératif qui a été comparé à l'algorithme EM (pas techniquement correct car il n'y a pas de fonction de vraisemblance, mais toujours une comparaison utile à certains égards à mon humble avis).
ahfoss

1
Faites-vous référence à la fonction plsgenomics :: pls.lda? Sinon, comment votre package est-il différent / amélioré? Je ferai également remarquer aux lecteurs intéressés que PLS-LDA en général est supérieur à une technique couramment utilisée consistant simplement à exécuter PLS avec une variable de résultat codée fictivement. Bien que cette dernière approche ne soit pas nécessairement incorrecte, elle est certainement maladroite, notamment parce que vous pouvez obtenir des probabilités prédites inférieures à zéro ou supérieures à un!
ahfoss

@ahfoss: Je ne parlais pas des algorithmes, car le même modèle sous-jacent pouvait être calculé par différents algorithmes. Par exemple, pour PCA, vous pouvez utiliser des algorithmes itératifs (NIPALS, POWER) ou non itératifs (EVD, SVD). Peut-être un meilleur terme au lieu de k-means aurait été "analyse de cluster minimisant la somme des carrés intra-cluster, pour laquelle par exemple k-means est une approximation heuristique". Je n'ai pas le temps maintenant, je vérifierai la réponse plus tard ou nous pourrions nous rencontrer dans le salon de discussion et trouver une meilleure description.
cbeleites prend en charge Monica le

1
... Une différence technique est que j'utilise pls::plsrpour les pls (ce qui permet de choisir parmi différents algorithmes). Et j'ai un tas de fonctions de post-traitement, par exemple pour retourner et faire pivoter le modèle, ce qui est parfois utile pour l'interprétation.
cbeleites prend en charge Monica le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.