Imputation des valeurs manquantes pour l'ACP

23

J'ai utilisé la prcomp()fonction pour effectuer une PCA (analyse des composants principaux) dans R. Cependant, il y a un bogue dans cette fonction, de sorte que le na.actionparamètre ne fonctionne pas. J'ai demandé de l'aide sur stackoverflow ; deux utilisateurs y ont proposé deux manières différentes de gérer les NAvaleurs. Cependant, le problème avec les deux solutions est que lorsqu'il existe une NAvaleur, cette ligne est supprimée et n'est pas prise en compte dans l'analyse PCA. Mon véritable ensemble de données est une matrice de 100 x 100 et je ne veux pas perdre une ligne entière simplement parce qu'elle contient une seule NAvaleur.

L'exemple suivant montre que la prcomp()fonction ne renvoie aucun composant principal pour la ligne 5 car elle contient une NAvaleur.

d       <- data.frame(V1 = sample(1:100, 10), V2 = sample(1:100, 10), 
                      V3 = sample(1:100, 10))
result  <- prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x                                # $
d$V1[5] <- NA                           # $
result  <- prcomp(~V1+V2, data=d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x

Je me demandais si je pouvais définir les NAvaleurs à une valeur numérique spécifique quand centeret si elles scalesont définies pour TRUEque la prcomp()fonction fonctionne et ne supprime pas les lignes contenant NAdes, mais n'influence pas non plus le résultat de l'analyse PCA.

J'ai pensé à remplacer les NAvaleurs par la valeur médiane sur une seule colonne, ou par une valeur très proche de 0. Cependant, je ne sais pas comment cela influence l'analyse PCA.

Quelqu'un peut-il penser à une bonne façon de résoudre ce problème?

user969113
la source
8
Votre problème n'est pas un problème PCA mais un problème plus large de traitement des valeurs manquantes . Si vous ne le connaissez pas, lisez-le un peu. Vous avez de nombreuses opportunités: (1) supprimer les cas par liste ou (2) par paire, ou (3) remplacer les manquants par la moyenne ou la médiane. Ou (4) remplacer par un choix aléatoire de valeurs valides (approche hot-deck). Ou imputer les manquements par (5) approche de régression mutuelle (avec ou sans ajout de bruit) ou par une meilleure approche (6) EM.
ttnphns
Comme le montrent les commentaires et les réponses, la clé pour obtenir une bonne réponse est d'expliquer ce que signifient les NAvaleurs : quelle est la cause du "manque"?
whuber
2
Je pense que le package "pcaMethods" peut résoudre votre problème ( ici )
ToNoY

Réponses:

22

Il existe en fait un moyen bien documenté de gérer les matrices gappy - vous pouvez décomposer une matrice de covariance construite à partir de vos données , qui est mise à l'échelle par le nombre de valeurs partagées :X n C = 1CXn

C=1nXTX,                Cjl=X.jOui.l¯

puis développez les coefficients principaux via un ajustement par moindres carrés (comme le mentionne @ user969113). Voici un exemple .

Cependant, cette méthode pose plusieurs problèmes liés au fait que la matrice de covariance n'est plus définie semi-positive et que les valeurs propres / singulières ont tendance à être gonflées. Une bonne revue de ces problèmes peut être trouvée dans Beckers et Rixen (2003) , où ils proposent également une méthode d'interpolation optimale des lacunes manquantes - DINEOF (Data Interpolating Empirical Orthogonal Functions). J'ai récemment écrit une fonction qui exécute DINEOF , et cela semble vraiment être une bien meilleure façon de procéder. Vous pouvez exécuter DINEOF sur votre ensemble de données directement, puis utiliser l'ensemble de données interpolé comme entrée dans .Xprcomp

Mise à jour

Une autre option pour la réalisation de l'ACP sur un ensemble de données gappy est «Fonctions orthogonales empiriques soustraites récursivement» (Taylor et al. 2013). Il corrige également certains des problèmes de l'approche des moindres carrés et est beaucoup plus rapide sur le plan informatique que DINEOF. Cet article compare les trois approches en termes de précision de la reconstruction des données à l'aide des PC.

Les références

Beckers, Jean-Marie et M. Rixen. "Calculs EOF et remplissage de données à partir de jeux de données océanographiques incomplets." Journal of Atmospheric and Oceanic Technology 20.12 (2003): 1839-1856.

Taylor, M., Losch, M., Wenzel, M. et Schröter, J. (2013). Sur la sensibilité de la reconstruction et de la prédiction sur le terrain à l'aide de fonctions orthogonales empiriques dérivées de données gappy. Journal of Climate, 26 (22), 9194-9205.

Marc dans la boîte
la source
(+1) Cela me semble une précieuse contribution, car c'est une idée nouvelle. J'ai posé il y a longtemps une question similaire qui est étonnamment similaire: comment estimez-vous une matrice de covariance lorsque les données sont censurées (au lieu de manquer)? Si vous avez des réflexions sur cette situation, je serais heureux d'une réponse!
whuber
Merci @whuber - je crois que cette méthode a aussi beaucoup de mérite. Même si vous n'êtes pas intéressé par les valeurs interpolées, la méthode est bien meilleure que la description des EOF / PC pour l'ensemble de données - par exemple, l'erreur entre les données reconstruites et l'original est minimisée grâce à l'algorithme.
Marc dans la boite
@whuber - Concernant les données censurées - Cela sort de mon domaine d'expertise et, fait intéressant, j'ai posé une question dans ce sens il y a quelques semaines (que vous avez commentée!) . Mon intuition est que l'on devrait remplir les zéros avec des valeurs aléatoires inférieures à la limite de détection, qui se rapprochent de la distribution des valeurs observées. Je vais examiner une partie de la littérature citée de votre article - c'est un sujet très intéressant en effet.
Marc dans la boite
@whuber - Vous pouvez être intéressé par l'article suivant décrivant une procédure d'ajustement de matrice de covariance itérative similaire à des données éparses: Bien, Jacob et Robert J. Tibshirani. "Estimation clairsemée d'une matrice de covariance." Biometrika 98,4 (2011): 807-820.
Marc dans la boîte
Merci @Marc. Malheureusement, la censure et la parcimonie sont deux choses différentes avec des préoccupations différentes.
whuber
6

Ma suggestion dépend de la quantité de données manquantes et de la raison pour laquelle elles sont manquantes. Mais cela n'a rien à voir avec PCA, vraiment. S'il manque très peu de données, peu importe ce que vous faites. Remplacer par la médiane n'est pas idéal, mais s'il ne manque pas grand-chose, ce ne sera pas très différent d'une meilleure solution. Vous pouvez essayer de faire l'ACP avec un remplacement médian et une suppression par liste et voir s'il y a des différences majeures dans les résultats.

Ensuite, s'il manque plus de données, vous devez déterminer si elles manquent complètement au hasard, manquent au hasard ou ne manquent pas au hasard. Je suggérerais l'imputation multiple dans les deux premiers cas et parfois dans le troisième cas - à moins que les données ne soient fortement déformées par leur statut NMAR, je pense que l'imputation multiple sera meilleure que la suppression par liste (Joe Schafer de Penn State a fait un beaucoup de travail sur les données manquantes - je me souviens de certains de ses travaux montrant que l'imputation multiple fonctionnait assez bien même dans certains cas NMAR). Cependant, si les données sont MCAR ou MAR, les propriétés de l'imputation multiple peuvent être prouvées.

Si vous décidez d'aller avec MI, une note doit être prudente car les signes des composants dans PCA sont arbitraires, et un petit changement dans les données peut retourner un signe. Ensuite, lorsque vous effectuez l'APC, vous obtenez un non-sens. Il y a longtemps, j'ai élaboré une solution en SAS - ce n'est pas difficile, mais c'est quelque chose à faire attention.

Peter Flom - Réintégrer Monica
la source
1

Il n'y a pas de solution correcte au problème. Chaque coordonnée dans le vecteur doit être spécifiée pour obtenir le bon ensemble de composants principaux. Si une coordonnée est manquante et remplacée par une valeur imputée, vous obtiendrez un résultat, mais cela dépendra de la valeur imputée. donc s'il y a deux choix raisonnables pour la valeur imputée, les différents choix donneront des réponses différentes.

Michael R. Chernick
la source
3
Je viens de googler pour l'APC et les données manquantes et j'ai constaté que: 4.2 Comment SIMCA gère-t-il les données manquantes? En termes simples, l'algorithme NIPALS interpole le point manquant en utilisant un ajustement par moindres carrés mais ne donne aucune influence aux données manquantes sur le modèle. Les itérations successives affinent la valeur manquante en multipliant simplement le score et le chargement pour ce point. Il existe de nombreuses méthodes différentes pour les données manquantes, telles que l'estimation, mais elles convergent généralement vers la même solution. Les données manquantes sont acceptables si elles sont distribuées au hasard. Les blocs systématiques de données manquantes posent problème.
user969113
1
Je ne sais pas ce que vous entendez par aucune influence sur le modèle. Tout choix de valeur manquante pour la coordonnée affectera les composants principaux.
Michael R. Chernick
1

Un article récent qui passe en revue les approches pour traiter les valeurs manquantes dans les analyses de l'ACP est «Analyse en composantes principales avec valeurs manquantes: une étude comparative des méthodes» par Dray et Josse (2015) . L'algorithme NIPALS, implémenté dans la nipalsfonction du ade4package, et le PCA itératif (Ipca ou EM-PCA), implémenté dans la imputePCAfonction du missMDApackage, sont deux des méthodes les plus connues des méthodes PCA qui permettent les valeurs manquantes . Le document concluait que la méthode Ipca donnait les meilleurs résultats dans le plus large éventail de conditions.

Pour votre exemple de syntaxe:

Pour NIPALS:

library(ade4)
nipals(d[,c(1,2)])

Pour Ipca:

library(missMDA)
imputePCA(d[,c(1,2)],method="EM",ncp=1)
Tom Wenseleers
la source