2010-04-10 5 views
26

Comme vous attendez d'un DSL visant à l'analyse des données, R poignées données manquantes/incomplètes très bien, par exemple:Traitement des données manquantes/incomplètes dans R - Y a-t-il une fonction pour masquer mais pas pour supprimer les NA?

De nombreuses fonctions de R ont un na.rm drapeau lorsqu'il est réglé sur TRUE , retirez le NAs:

>>> v = mean(c(5, NA, 6, 12, NA, 87, 9, NA, 43, 67), na.rm=T) 
>>> v 
     (5, 6, 12, 87, 9, 43, 67) 

Mais si vous voulez traiter avant NAs l'appel de fonction, vous devez faire quelque chose comme ceci:

pour supprimer chaque 'NA' à partir d'un vecteur:

vx = vx[!is.na(a)] 

pour supprimer chaque 'NA' à partir d'un vecteur et le remplacer w/a '0':

ifelse(is.na(vx), 0, vx) 

pour supprimer toute chaque rangée qui contient « NA » à partir d'une trame de données:

dfx = dfx[complete.cases(dfx),] 

Toutes ces fonctions de façon permanente supprimer « NA » ou rangées avec un « NA » en eux. Cependant, ce n'est pas tout à fait ce que vous voulez - faire une copie excisée NA de la trame de données peut être nécessaire pour la prochaine étape dans le flux de travail, mais dans les étapes suivantes, vous voulez souvent ces lignes (par exemple , pour calculer une statistique colonne par colonne pour une colonne dont les lignes sont manquantes en raison d'un appel préalable à 'compléter les cas' mais cette colonne ne contient pas de valeurs 'NA'.

d'être aussi clair que possible sur ce que je cherche: python/numpy a une classe, tableau masqué, avec une méthode masque, qui vous permet cachez --mais pas remove-- NA pendant un appel de fonction. Y a-t-il une fonction analogue dans R?

Répondre

18

Que faire avec des données manquantes - qui peuvent être marquées comme NA si nous savons qu'il manque - peut différer d'un domaine à l'autre.

Pour prendre un exemple lié à des séries chronologiques, où vous pouvez sauter, ou remplir, ou interpoler, ou interpoler différemment, ... est que juste le (très utile et populaire) zoo a toutes ces fonctions liée à la manipulation NA:

zoo::na.approx zoo::na.locf  
zoo::na.spline zoo::na.trim  

permettant de rapprocher (en utilisant des algorithmes différents), report en avant ou en arrière, en utilisant une interpolation spline ou l'assiette.

Un autre exemple serait les nombreux paquets d'imputation manquants sur CRAN - fournissant souvent des solutions spécifiques au domaine. [Donc, si vous appelez R un DSL, qu'est-ce que c'est? "Solutions spécifiques aux sous-domaines pour les langages spécifiques au domaine" ou SDSSFDSL? Tout à fait une bouchée :)]

Mais pour votre question spécifique: non, je ne suis pas au courant d'un drapeau de niveau binaire dans la base R qui vous permet de marquer des observations comme «à exclure». Je suppose que la plupart des utilisateurs de R auraient recours à des fonctions comme na.omit() et al ou utiliser l'option na.rm=TRUE que vous avez mentionnée.

+1

Votre lien au zoo est cassé. [Ici] (http://cran.r-project.org/web/packages/zoo/zoo.pdf) est un lien vers la dernière documentation que j'ai pu trouver (avertissement .pdf), et [ici] (http://cran.r-project.org/web/packages/zoo/index.html) est un lien vers ce que je pense être le dernier résumé du zoo. – deadstump

+1

Mauvais pluriel 's' dans l'URL tel qu'il est 'package = ...', pas 'packages = ...'. Maintenant corrigé, merci. –

15

C'est une bonne pratique de regarder les données, donc déduire sur le type de valeurs manquantes: est-ce MCAR (manquant complet et aléatoire), MAR (manquant au hasard) ou MNAR (manquant pas au hasard)? Sur la base de ces trois types, vous pouvez étudier la structure sous-jacente des valeurs manquantes et conclure que l'imputation est applicable (vous avez de la chance si ce n'est pas MNAR, car dans ce cas, les valeurs manquantes sont considérées comme non ignorables lié à une influence sous-jacente inconnue, un facteur, un processus, une variable, etc.).

Chapitre 3. "Graphics Interactive et dynamique pour analyste de données avec R et ggobi" par Di Cook, et Deborah Swayne est une grande référence en ce qui concerne ce sujet.

Vous verrez le package norm en action dans ce chapitre, mais le package Hmisc comporte des routines d'imputation de données. Voir également Amelia, cat (pour l'imputation des manquements catégoriels), mi, mitools, VIM, vmv (pour la visualisation des données manquantes). Honnêtement, je ne comprends toujours pas votre question sur les statistiques, ou sur R capacités d'imputation des données manquantes? Je pense que j'ai fourni de bonnes références sur le second, et sur le premier: vous pouvez remplacer vos NA avec une tendance centrale (moyenne, médiane ou similaire), donc réduire la variabilité, ou avec une constante aléatoire "arrachée" des cas observés (enregistrés), ou vous pouvez appliquer une analyse de régression avec une variable contenant des NA comme critères, et d'autres variables comme prédicteurs, puis attribuer des résidus aux NA ... c'est une façon élégante de traiter avec NA, mais très souvent Allez-y doucement sur votre CPU (j'ai Celeron sur 1.1GHz, donc je dois être gentil).

Ceci est un problème d'optimisation ... il n'y a pas de réponse définitive, vous devriez décider quoi/pourquoi vous tenez à une méthode. Mais c'est toujours une bonne pratique de regarder les données! =) Assurez-vous de cocher Cook & Swayne - c'est un guide excellent et habilement écrit. "Modèles linéaires avec R" par Le document contient également un chapitre sur les valeurs manquantes.

Donc là.

Bonne chance! =)

8

La fonction na.exclude() ressemble à ce que vous voulez, bien que ce ne soit qu'une option pour certaines fonctions (importantes).

Dans le cadre du montage et de travailler avec des modèles, R a une famille de fonctions génériques pour traiter NAs: na.fail(), na.pass(), na.omit() et na.exclude(). Ce sont, à leur tour, des arguments pour certaines des principales fonctions de modélisation de R, telles que lm(), glm(), et nls() ainsi que des fonctions dans MASS, Rpart, et les paquets de survie.

Les quatre fonctions génériques agissent essentiellement comme des filtres. na.fail() ne transmettra les données que s'il n'y a pas de NA, sinon il échoue. na.pass() passe tous les cas à travers. na.omit() et na.exclude() omettront tous deux les cas avec NA et passeront les autres cas. Mais na.exclude() a un attribut différent qui indique aux fonctions traitant l'objet résultant de prendre en compte les NA. Vous pouvez voir cet attribut si vous l'avez fait attributes(na.exclude(some_data_frame)).Voici une démonstration de la façon dont na.exclude() modifie le comportement de predict() dans le contexte d'un modèle linéaire.

fakedata <- data.frame(x = c(1, 2, 3, 4), y = c(0, 10, NA, 40)) 

## We can tell the modeling function how to handle the NAs 
r_omitted <- lm(x~y, na.action="na.omit", data=fakedata) 
r_excluded <- lm(x~y, na.action="na.exclude", data=fakedata) 

predict(r_omitted) 
#  1  2  4 
# 1.115385 1.846154 4.038462 
predict(r_excluded) 
#  1  2  3  4 
# 1.115385 1.846154  NA 4.038462 

Votre na.action par défaut, par ailleurs, est déterminée par options("na.action") et commence comme na.omit() mais vous pouvez le régler.

Questions connexes