Uitbijters uit een dataset verwijderen

Ik heb wat multivariate gegevens over schoonheid versus leeftijd. De leeftijden variëren van 20-40 met tussenpozen van 2 (20, 22, 24….40), en voor elk gegevensrecord krijgen ze een leeftijd en een schoonheidsclassificatie van 1-5. Wanneer ik boxplots van deze gegevens maak (leeftijden over de X-as, schoonheidsclassificaties over de Y-as), zijn er enkele uitschieters buiten de snorharen van elke box.

Ik wil deze uitbijters uit het dataframe zelf verwijderen, maar ik weet niet zeker hoe R uitbijters berekent voor zijn boxplots. Hieronder ziet u een voorbeeld van hoe mijn gegevens eruit kunnen zien.


Antwoord 1, autoriteit 100%

OK, je zou zoiets als dit moeten toepassen op je dataset. Vervang & opslaan of u vernietigt uw gegevens! En trouwens, je zou (bijna) nooit uitschieters uit je gegevens moeten verwijderen:

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
}

Om het in actie te zien:

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

En nogmaals, je moet dit nooit alleen doen, uitschieters zijn gewoon bedoeld! =)

EDIT:ik heb na.rm = TRUEals standaard toegevoegd.

EDIT2:Functie quantileverwijderd, subscripting toegevoegd, waardoor de functie sneller is geworden! =)


2, Autoriteit 115%

Niemand heeft het eenvoudigste antwoord gepost:

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

Zie ook dit: http: //www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/


3, Autoriteit 25%

Gebruik outline = FALSEals een optie wanneer u de boxplot uitvoert (lees de hulp!).

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


4, Autoriteit 14%

De BOXPLOT-functie retourneert de waarden die worden gebruikt om de ploting te doen (die vervolgens wordt gedaan door 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

Ik heb opzettelijk de specifieke vraag beantwoord omdat ik de statistische wanpraktijken overweeg om “uitbijters” te verwijderen. Ik beschouw het als aanvaardbare praktijk om ze niet in een boxsplot te plotten, maar ze verwijderen, maar omdat ze een aantal standaardafwijkingen overschrijden of een aantal inter-kwartiele breedtes is een systematische en onwetende muiling van het observationele record.


5, Autoriteit 8%

Ik heb opgezocht voor pakketten gerelateerd aan het verwijderen van uitbijters, en vond dit pakket (verrassend ‘uitbijters’!): https://cran.r-project.org/web/packages/outliers/outliers.pdf

als je het doorneemt, zie je verschillende manieren om uitbijters te verwijderen en onder hen vond ik rm.outlierhet handigst om te gebruiken en zoals in de link hierboven staat:
“Als de uitbijter wordt gedetecteerd en bevestigd door statistische tests, kan deze functie deze verwijderen of vervangen door
voorbeeldgemiddelde of mediaan” en hier is ook het gebruiksgedeelte van dezelfde bron:
Gebruik

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

Argumenten
xeen dataset, meestal een vector. Als argument een dataframe is, dan is uitbijter
verwijderd uit elke kolom door saply. Hetzelfde gedrag wordt toegepast door toepassen
wanneer de matrix wordt gegeven.
fillIndien ingesteld op TRUE, wordt de mediaan of het gemiddelde geplaatst in plaats van uitbijter. Anders de
uitbijter(s) wordt/worden eenvoudig verwijderd.
mediaanIndien ingesteld op TRUE, wordt mediaan gebruikt in plaats van gemiddelde bij vervanging van uitbijters.
tegenovergestelde indien ingesteld op TRUE, geeft tegengestelde waarde (als grootste waarde maximaal verschil heeft)
van het gemiddelde geeft het de kleinste en vice versa)


Antwoord 6, autoriteit 6%

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

Ik vind het heel gemakkelijk om uitbijters te verwijderen. In het bovenstaande voorbeeld extraheer ik slechts 2 percentiel tot 98 percentiel van attribuutwaarden.


Antwoord 7, autoriteit 5%

Zou niet:

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

voltooit u deze taak vrij gemakkelijk?


Antwoord 8, autoriteit 4%

Toevoegen aan de suggestie van @sefarkas en kwantiel als afkappunten gebruiken, zou de volgende optie kunnen onderzoeken:

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

Hiermee worden de punten na het 99e kwantiel verwijderd. Er moet op worden gelet zoals aL3Xa zei over het houden van uitbijters. Het mag alleen worden verwijderd om een alternatieve conservatieve kijk op de gegevens te krijgen.


Antwoord 9, autoriteit 2%

Eén manier om dat te doen is

my.NEW.data.frame <- my.data.frame[-boxplot.stats(my.data.frame$my.column)$out, ]

of

my.high.value <- which(my.data.frame$age > 200 | my.data.frame$age < 0) 
my.NEW.data.frame <- my.data.frame[-my.high.value, ]

Antwoord 10

Probeer dit eens. Voer uw variabele in de functie in en sla de o/p op in de variabele die verwijderde uitbijters zou bevatten

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

Other episodes