Ignora i valori anomali nel boxplot di ggplot2


Answers

Usa geom_boxplot(outlier.shape = NA) per non visualizzare i scale_y_continuous(limits = c(lower, upper)) anomali e scale_y_continuous(limits = c(lower, upper)) per modificare i limiti dell'asse.

Un esempio.

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

In realtà, come Ramnath ha mostrato nella sua risposta (e anche Andrie nei commenti), ha più senso ritagliare le scale dopo aver calcolato la statistica, tramite coord_cartesian .

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

(Probabilmente dovrai ancora utilizzare scale_y_continuous per correggere le interruzioni dell'asse.)

Question

Come ignorerei i valori anomali nel boxplot di ggplot2? Non voglio semplicemente che scompaiano (es. Outlier.size = 0), ma voglio che vengano ignorati in modo tale che l'asse y si riduca a mostrare il 1/3 percentile. I miei valori anomali stanno facendo sì che la "scatola" si restringa in modo così piccolo che praticamente è una linea. Ci sono alcune tecniche per affrontare questo?

Modifica Ecco un esempio:

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




L'opzione "coef" della funzione geom_boxplot consente di modificare il valore di soglia in termini di intervalli interquartili. Questa opzione è documentata per la funzione stat_boxplot. Per disattivare i valori anomali (in altre parole vengono considerati dati regolari), anziché utilizzare il valore predefinito di 1.5, è possibile specificare un valore di taglio molto elevato:

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)



Un'idea sarebbe quella di ottenere i risultati in una procedura in due passaggi:

  1. eseguire una prima passata, imparare quali sono i limiti, ad es. taglio di un dato percentile, o N deviazione standard sopra la media, o ...

  2. in un secondo passaggio, imposta i valori oltre il limite dato al valore di tale limite

Dovrei sottolineare che questo è un metodo vecchio stile che dovrebbe essere dominato da tecniche più moderne e robuste, ma lo si incontra ancora molto.