Comment faire pour supprimer les valeurs aberrantes d'un ensemble de données
-
24-10-2019 - |
Question
J'ai des données à plusieurs variables de la beauté contre les âges. Les âges vont 20-40 à des intervalles de 2 (20, 22, 24 .... 40), et pour chaque enregistrement de données, on leur donne un âge et une note de beauté de l'1-5. Quand je fais boxplots de ces données (âges à travers l'axe X, les cotes de beauté à travers l'axe Y), il y a quelques valeurs aberrantes en dehors des tracés favoris de chaque boîte.
Je veux supprimer ces valeurs aberrantes de la trame de données elle-même, mais je ne sais pas comment R calcule les valeurs aberrantes pour ses boîtes à moustaches. Ci-dessous un exemple de ce qui pourrait ressembler à mes données.
La solution
OK, vous devez appliquer quelque chose comme ceci à votre ensemble de données. Ne pas remplacer et enregistrer ou vous détruira vos données! Et, d'ailleurs, vous devriez (presque) jamais enlever les valeurs aberrantes de vos données:
remove_outliers <- function(x, na.rm = TRUE, ...) {
qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
H <- 1.5 * IQR(x, na.rm = na.rm)
y <- x
y[x < (qnt[1] - H)] <- NA
y[x > (qnt[2] + H)] <- NA
y
}
Pour le voir en action:
set.seed(1)
x <- rnorm(100)
x <- c(-10, x, 10)
y <- remove_outliers(x)
## png()
par(mfrow = c(1, 2))
boxplot(x)
boxplot(y)
## dev.off()
Et encore une fois, vous ne devriez jamais faire vous-même, les valeurs aberrantes sont tout simplement censé être! =)
EDIT: J'ajouté na.rm = TRUE
par défaut
EDIT2: Removed fonction quantile
, a ajouté subscripting, donc plus vite fait la fonction! =)
Autres conseils
Personne n'a posté la réponse la plus simple:
x[!x %in% boxplot.stats(x)$out]
Voir aussi ceci: http: //www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/
Utilisez outline = FALSE
comme option lorsque vous faites le boxplot (lire l'aide!).
> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)
La fonction retourne boxplot les valeurs utilisées pour faire le traçantes (qui est en fait alors fait par bxp ():
bstats <- boxplot(count ~ spray, data = InsectSprays, col = "lightgray")
#need to "waste" this plot
bstats$out <- NULL
bstats$group <- NULL
bxp(bstats) # this will plot without any outlier points
Je ne répondait pas à dessein la question spécifique parce que je considère comme faute professionnelle statistique pour éliminer les « valeurs aberrantes ». Je considère qu'il pratique acceptable de ne pas les tracer dans une boîte à moustaches, mais les supprimer simplement parce qu'ils dépassent un certain nombre d'écarts types ou un nombre de largeurs interquartiles est une mangling systématique et non scientifique du dossier d'observation.
x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]
Je trouve cela très facile à enlever les valeurs aberrantes. Dans l'exemple ci-dessus, je suis juste extrais 2 percentile à 98 percentile des valeurs d'attribut.
J'ai regardé pour les paquets liés à l'élimination des valeurs aberrantes, et a trouvé ce paquet (étonnamment disant « valeurs aberrantes »!): https://cran.r-project.org/web/packages/outliers/outliers.pdf
si vous passez par ce que vous voyez les différentes façons d'éliminer les valeurs aberrantes et parmi eux je l'ai trouvé rm.outlier
plus commode à utiliser et comme il est dit dans le lien ci-dessus:
« Si la valeur aberrante est détectée et confirmée par des tests statistiques, cette fonction peut supprimer ou remplacer par
échantillon moyenne ou médiane » et est ici aussi la partie d'utilisation de la même source:
« Utilisation
rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)
Arguments
x un jeu de données, le plus souvent un vecteur. Si l'argument est une trame de données, puis est aberrant
retiré de chaque colonne par sapply. Le même comportement est appliqué en appl
lorsque la matrice est donnée.
fill Si vrai, la médiane ou moyenne est placé au lieu de valeurs aberrantes. Dans le cas contraire, la
valeurs aberrantes (s) est / sont simplement enlevés.
médian Si vrai, la médiane est utilisée à la place de la moyenne en valeur aberrante remplacement.
opposé Si vrai, donne une valeur opposée (si la plus grande valeur a différence maximale
de la moyenne, il donne le plus petit et vice-versa)
«
ne serait pas:
z <- df[df$x > quantile(df$x, .25) - 1.5*IQR(df$x) &
df$x < quantile(df$x, .75) + 1.5*IQR(df$x), ] #rows
accomplir cette tâche facilement?
Ajout à la suggestion de @sefarkas et en utilisant quantile comme seuils, on pourrait envisager l'option suivante:
newdata <- subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) )
Cela supprimera les points de points au-delà du quantile 99e. Il faut prendre soin comme ce aL3Xa a dit au sujet des valeurs aberrantes de maintien. Il doit être retiré que pour obtenir une vision conservatrice de remplacement des données.
Essayez ceci. Nourrissez votre variable dans la fonction et enregistrer l'o / p dans la variable qui contiendrait des valeurs aberrantes supprimées
outliers<-function(variable){
iqr<-IQR(variable)
q1<-as.numeric(quantile(variable,0.25))
q3<-as.numeric(quantile(variable,0.75))
mild_low<-q1-(1.5*iqr)
mild_high<-q3+(1.5*iqr)
new_variable<-variable[variable>mild_low & variable<mild_high]
return(new_variable)
}