web-dev-qa-db-fra.com

Ignorer les valeurs aberrantes dans la boîte à moustaches ggplot2

Comment pourrais-je ignorer les valeurs aberrantes dans la boîte à moustaches ggplot2? Je ne veux pas simplement qu'elles disparaissent (c'est-à-dire outlier.size = 0), mais je veux qu'elles soient ignorées, de sorte que l'axe des ordonnées indique le premier/troisième percentile. Mes valeurs aberrantes font que la "boîte" se contracte si petite que c'est pratiquement une ligne. Existe-t-il des techniques pour gérer cela?

Edit Voici un exemple:

y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")

enter image description here

113
SFun28

Voici une solution utilisant boxplot.stats

# create a dummy data frame with outliers
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))


# compute lower and upper whiskers
ylim1 = boxplot.stats(df$y)$stats[c(1, 5)]

# scale y limits based on ylim1
p1 = p0 + coord_cartesian(ylim = ylim1*1.05)
127
Ramnath

Utilisez geom_boxplot(outlier.shape = NA) pour ne pas afficher les valeurs éloignées et scale_y_continuous(limits = c(lower, upper)) pour modifier les limites d'axe.

Un exemple.

n <- 1e4L
dfr <- data.frame(
  y = exp(rlnorm(n)),  #really right-skewed variable
  f = gl(2, n / 2)
)

p <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot()
p   # big outlier causes quartiles to look too slim

p2 <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot(outlier.shape = NA) +
  scale_y_continuous(limits = quantile(dfr$y, c(0.1, 0.9)))
p2  # no outliers plotted, range shifted

En fait, comme Ramnath l'a montré dans sa réponse (et Andrie aussi dans les commentaires), il est plus logique de rogner les échelles après avoir calculé la statistique, via coord_cartesian .

coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))

(Vous aurez probablement encore besoin d'utiliser scale_y_continuous pour corriger les ruptures d'axe.)

172
Richie Cotton

J'ai eu le même problème et précalculé les valeurs pour Q1, Q2, médiane, ymin, ymax en utilisant boxplot.stats:

# Load package and generate data
library(ggplot2)
data <- rnorm(100)

# Compute boxplot statistics
stats <- boxplot.stats(data)$stats
df <- data.frame(x="label1", ymin=stats[1], lower=stats[2], middle=stats[3], 
                 upper=stats[4], ymax=stats[5])

# Create plot
p <- ggplot(df, aes(x=x, lower=lower, upper=upper, middle=middle, ymin=ymin, 
                    ymax=ymax)) + 
    geom_boxplot(stat="identity")
p

Le résultat est une boîte à moustaches sans valeurs aberrantes. enter image description here

14
Matthias Munz

Une idée serait de Winsize les données dans une procédure en deux passes:

  1. exécutez une première passe, découvrez quelles sont les limites, par exemple. coupe de au centile donné, ou N écart type au-dessus de la moyenne, ou ...

  2. dans un second passage, définissez les valeurs au-delà de la liaison donnée sur la valeur de cette liaison

Je devrais souligner que c’est une méthode à l’ancienne qui devrait être dominée par un plus grand nombre de techniques robustes modernes mais vous le rencontrez encore souvent.

9
Dirk Eddelbuettel

L'option "coef" de la fonction geom_boxplot permet de modifier le seuil des valeurs aberrantes en termes d'intervalle interquartile. Cette option est documentée pour la fonction stat_boxplot. Pour désactiver les valeurs aberrantes (en d’autres termes, elles sont traitées comme des données standard), on peut au lieu d’utiliser la valeur par défaut de 1,5 pour spécifier une valeur de seuil très élevée:

library(ggplot2)
# generate data with outliers:
df = data.frame(x=1, y = c(-10, rnorm(100), 10)) 
# generate plot with increased cutoff for outliers:
ggplot(df, aes(x, y)) + geom_boxplot(coef=1e30)
3
eckart

Ipaper :: geom_boxplot2 est exactement ce que vous voulez.

# devtools::install_github('kongdd/Ipaper')
library(Ipaper)
library(ggplot2)
p <- ggplot(mpg, aes(class, hwy))
p + geom_boxplot2(width = 0.8, width.errorbar = 0.5)

enter image description here

1
Dongdong Kong

Si vous voulez forcer les moustaches à s’étendre aux valeurs max et min, vous pouvez modifier l’argument coef. La valeur par défaut de coef est de 1,5 (la longueur par défaut des moustaches est de 1,5 fois le IQR).

# Load package and create a dummy data frame with outliers 
#(using example from Ramnath's answer above)
library(ggplot2)
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))

# create boxplot where whiskers extend to max and min values
p1 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)), coef = 500)

image of p0

image of p1

1
IggyM