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. entrer image description ici

Était-ce utile?

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! =)

entrer image description ici

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)

entrer image description ici

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)
              }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top