Frage

Ich habe einige multivariate Daten von Schönheit und Alter. Das Alter reicht von 20 bis 40 in Intervallen von 2 (20, 22, 24 .... 40), und für jede Datenaufzeichnung erhalten sie von 1 bis 5 ein Alter und eine Schönheitsbewertung. Wenn ich Boxplots dieser Daten mache (Alter über die X-Achse, Schönheitsbewertungen über die Y-Achse), gibt es einige Ausreißer außerhalb der Schnurrhaarer jeder Box.

Ich möchte diese Ausreißer aus dem Datenrahmen selbst entfernen, aber ich bin mir nicht sicher, wie R Ausreißer für seine Boxplots berechnet. Unten finden Sie ein Beispiel dafür, wie meine Daten aussehen könnten.enter image description here

War es hilfreich?

Lösung

Ok, Sie sollten so etwas in Ihrem Datensatz anwenden. Ersetzen und speichern Sie nicht oder Sie werden Ihre Daten zerstören! Und übrigens sollten Sie (fast) Ausreißer niemals aus Ihren Daten entfernen:

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
}

Um es in Aktion zu sehen:

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

Und noch einmal, Sie sollten dies niemals alleine tun, Ausreiser sollen nur sein! =))

BEARBEITEN: Ich fügte hinzu na.rm = TRUE als Standard.

Edit2: ENTFERNT quantile Funktion, zusätzliches Abonnement hinzugefügt, machte die Funktion daher schneller! =))

enter image description here

Andere Tipps

Niemand hat die einfachste Antwort gepostet:

x[!x %in% boxplot.stats(x)$out]

Sehen Sie auch Folgendes: http://www.r-statistics.com/2011/01/how-to-label-all-the-outlier-in-a-boxplot/

Verwenden outline = FALSE Option, wenn Sie den Boxplot machen (lesen Sie die Hilfe!).

> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)

enter image description here

Die Boxplot -Funktion gibt die für das Plotten verwendeten Werte zurück (die dann tatsächlich von BXP () ausgeführt wird:

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

Ich habe die spezifische Frage absichtlich nicht beantwortet, weil ich es für statistische Fehlverhalten betrachte, um "Ausreißer" zu entfernen. Ich halte es für eine akzeptable Praxis, sie nicht in einem Boxplot zu zeichnen, sondern sie zu entfernen, nur weil sie eine Reihe von Standardabweichungen oder eine Reihe von Inter-Quartil-Breiten überschreiten, ist ein systematischer und unwissenschaftlicher Mangling der Beobachtungsdatenzüge.

x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]

Ich finde das sehr leicht zu entfernen. Im obigen Beispiel extrahiere ich nur 2 Perzentil auf 98 Perzentil der Attributwerte.

Ich habe nach Paketen nach dem Entfernen von Ausreißern nachgeschlagen und dieses Paket gefunden (überraschend "Ausreißer"!): https://cran.r-project.org/web/packages/outliers/outliers.pdf
Wenn Sie es durchgehen, sehen Sie verschiedene Möglichkeiten, Ausreißer zu entfernen, und unter ihnen habe ich gefunden rm.outlier Am bequemsten zu verwenden und wie in der obigen Link: "Wenn der Ausreißer durch statistische Tests erkannt und bestätigt wird, kann diese Funktion sie entfernen oder durch Stichprobenmittelwert oder Median ersetzen" und hier ist auch der Verwendungsteil aus derselben Quelle aus derselben Quelle, :
"Verwendungszweck

rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)

Argumente
x Ein Datensatz, am häufigsten ein Vektor. Wenn Argument ein Datenrahmen ist, wird der Ausreißer von jeder Spalte von Sapply entfernt. Das gleiche Verhalten wird angewendet, wenn die Matrix angegeben wird.
füllen Wenn auf wahr eingestellt, wird der Median oder Mittelwert anstelle von Ausreißer platziert. Andernfalls werden die Ausreißer (s) einfach entfernt/werden einfach entfernt.
Median Wenn sie auf True gesetzt sind, wird der Median anstelle des Mittelwerts im Ausreißerersatz verwendet. Entgegengesetzt, wenn auf True eingestellt ist, gibt es den entgegengesetzten Wert (wenn der größte Wert eine maximale Differenz vom Mittelwert hat, er gibt kleinste und umgekehrt) "

Würde nicht:

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

Diese Aufgabe ganz einfach erfüllen?

Hinzu kommt, dass @Sefarkas Vorschlag und Verwendung von Quantile als Cut-Offs verwendet werden können, die folgende Option untersuchen:

newdata <- subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) ) 

Dadurch werden die Punkte über das 99. Quantil hinaus entfernt. Es sollte darauf geachtet werden, wie AL3XA über die Aufrechterhaltung von Ausreißern sagte. Es sollte nur entfernt werden, um eine alternative konservative Sicht auf die Daten zu erhalten.

Versuche dies. Füttern Sie Ihre Variable in der Funktion und speichern Sie die O/P in der Variablen, die entfernte Ausreißer enthalten würde

              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)
              }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top