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")




for( i in match(rownames(TT),rownames(data))){
  File=paste('HNSC-',rownames(data)[i],".png",sep="")
  Name<-unlist(lapply(colnames(data),function(x) unlist(strsplit(x,"-TCGA"))[1]))
  type<-unlist(lapply(Name,function(x) unlist(strsplit(x,"-"))[2]))
  input<-data.frame(lncRNA=as.numeric(as.character(data[i,])),Name,type)
  p<-ggplot(input,aes(Name,lncRNA,fill=factor(type)))
  p<-p+geom_boxplot(outlier.shape=NA)
  max<-max(tapply(input$lncRNA,input$Name,function(x) quantile(x,0.975)))
  min<-min(tapply(input$lncRNA,input$Name,function(x) quantile(x,0)))
  p<-p+coord_flip(ylim = c(min, max))
  p
  ggsave(File)
}



Un'idea sarebbe quella di winsorize 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.




Related



Tags

r r   ggplot2