Question:
Existe-t-il un package R avec une jolie fonction qui peut traiter efficacement les valeurs aberrantes?
xiaodai
2011-06-06 11:57:07 UTC
view on stackexchange narkive permalink

L'un des ensembles de données que je traite est assez étrange. L'entrepôt de données à partir duquel j'ai téléchargé les données a beaucoup de valeurs 999999999 dans l'une des variables. Apparemment, le système informatique sur lequel se trouve l'entrepôt de données ne prend pas en charge le stockage de valeurs nulles. Ils utilisent donc 999999999 comme valeur «nulle». Maintenant, si je lance simplement pretty dans R sur la variable, cela donne des plages non sensées.

  • Existe-t-il un package avec une version de pretty qui peut traiter les valeurs aberrantes en les plaçant dans la plage par exemple (100, High)?
Pourquoi ne pas simplement supprimer les valeurs 999999999?
ou marquez-les comme `NA`:` foo [foo == 999999999] <- NA`
Je ne peux pas les supprimer car il y a 1000 variables dans l'ensemble de données et il est difficile de savoir quelles variables ont quelle valeur par défaut. De même, si vous êtes confronté à un nouvel ensemble de données, la même chose doit être faite. Parfois, la valeur par défaut est 99999990 par exemple. Il est donc préférable d'avoir un algorithme général capable de gérer cela
Deux réponses:
#1
+18
chl
2011-06-06 15:51:04 UTC
view on stackexchange narkive permalink

Si vous importez vos données avec une commande comme, par exemple,

  read.table ('yourfile.txt', header = TRUE, ...)  

vous pouvez indiquer quelles valeurs doivent être considérées comme des valeurs "nulles" ou NA , en spécifiant na.strings = "999999999" . Nous pouvons également considérer différentes valeurs pour indiquer les valeurs NA . Considérez le fichier suivant ( fake.txt ) où nous voulons traiter "." et "999999999" comme valeurs NA:

  1 2 .3 999999999 45 6 7  

alors dans R nous ferions:

  > a <- read.table ("fake.txt", na.strings = c (".", "999999999")) > a V1 V2 V31 1 2 NA2 3 NA 43 5 6 7  

Sinon, vous pouvez toujours filtrer vos données comme indiqué par @Sacha dans son commentaire. Ici, cela pourrait être quelque chose comme

  a [a == "." | a == 999999999] <- NA  

Modifier

Au cas où il y aurait plusieurs valeurs anormales qui peuvent éventuellement être observées dans différentes colonnes avec des valeurs différentes, mais vous connaissez la plage probable de valeurs admissibles , vous pouvez appliquer une fonction à chaque colonne. Par exemple, définissez le filtre suivant:

  my.filter <- function (x, threshold = 100) ifelse (x > threshold, NA, x)  

puis

  a.filt <- apply (a, 2, my.filter)  

remplacera chaque valeur> 100 par NA dans la matrice a.

Exemple :

  > a <- répliquer (10, rnorm (10)) > a [1,3] <- 99999999> a [5,6] <- 99999999> a [8,10] <- 99999990> résumé (a [, 3]) Min. 1er qu. Médiane Moyenne 3e Qu. Max. -1e + 00 0e + 00 0e + 00 1e + 07 1e + 00 1e + 08 > af <- apply (a, 2, my.filter) > summary (af [, 3]) Min. 1er qu. Médiane Moyenne 3e Qu. Max. NA -1,4640 -0,2680 0,4671 -0,0418 0,4981 0,7444 1,0000  

Il peut être vectoriel bien sûr:

  > summary (my.filter (a [, 3], 500)) Min. 1er qu. Médiane Moyenne 3e Qu. Max. NA -1,4640 -0,2680 0,4671 -0,0418 0,4981 0,7444 1,0000  
Vous ne savez pas toujours à l'avance quelles sont les valeurs spéciales, surtout si vous voyez l'ensemble de données pour la première fois! J'espérais qu'il y aurait une fonction cut2 ou quelque chose qui traite déjà de cela.
@xiaodai Oui, il y a une fonction `cut ()` dans R mais elle ne fait probablement pas ce que vous voulez. Je mettrai à jour ma réponse.
#2
+1
IrishStat
2011-06-07 00:23:01 UTC
view on stackexchange narkive permalink

Je rencontre ce problème assez fréquemment lorsque je traite les données de séries chronologiques quotidiennes des clients. Il semble que de nombreux systèmes comptables IGNORENT les données quotidiennes qui ne se sont pas produites, c'est-à-dire qu'aucune transaction n'a été enregistrée pour ce jour (intervalle de temps / compartiment) et ne remplissent pas un nombre «0». Étant donné que l'analyse des séries chronologiques nécessite une lecture pour chaque intervalle / bucket, nous devons injecter un "0" pour l'observation omise. La détection d'intervention est essentiellement un schéma permettant de détecter l'anomalie et de la remplacer par une valeur attendue basée sur un profil / signal / prédiction identifié. S'il y en a beaucoup "manquant" valeurs "le système peut tomber en panne Le problème devient un peu plus complexe lorsqu'il y a un fort profil de jour de la semaine dans les données historiques et qu'un" patch séquentiel de valeurs "n'est pas enregistré, suggérant que les valeurs de remplacement soient obtenues par calcul moyennes quotidiennes locales comme précurseur pour affiner ces valeurs.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...