Como remover outliers de um dataset

Eu tenho alguns dados multivariados de beleza versus idades. As idades variam de 20-40 em intervalos de 2 (20, 22, 24 … 40), e para cada registro de dados, eles recebem uma idade e uma sorting de beleza de 1-5. Quando faço boxplots desses dados (idades ao longo do eixo X, classificações de beleza em todo o eixo Y), há alguns outliers plotados fora dos bigodes de cada checkbox.

Eu quero remover esses valores discrepantes do próprio quadro de dados, mas não tenho certeza de como o R calcula outliers para seus charts de checkbox. Abaixo está um exemplo de como meus dados podem ser. insira a descrição da imagem aqui

OK, você deve aplicar algo assim ao seu dataset. Não substitua e poupe ou você destruirá seus dados! E, a propósito, você nunca deve (quase) remover valores discrepantes de seus dados:

 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 } 

Para vê-lo em ação:

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

E mais uma vez, você nunca deve fazer isso sozinho, os outliers são apenas para ser! =)

EDIT: Eu adicionei na.rm = TRUE como padrão.

EDIT2: Removida function quantile , adicionado subscripting, portanto, tornou a function mais rápida! =)

insira a descrição da imagem aqui

Ninguém postou a resposta mais simples:

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

Veja também: http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/

Use outline = FALSE como opção quando fizer o boxplot (leia a ajuda!).

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

insira a descrição da imagem aqui

A function boxplot retorna os valores usados ​​para fazer a plotagem (o que, na verdade, é feito por 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 

Eu propositalmente não respondi a pergunta específica porque considero uma má prática estatística remover "outliers". Eu considero uma prática aceitável não plotá-los em um boxplot, mas removê-los é uma fragmentação sistemática e injustificada do registro observacional.

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

Acho isso muito fácil de remover os outliers. No exemplo acima, estou apenas extraindo 2% para 98% dos valores de atributo.

Procurei por pacotes relacionados à remoção de valores discrepantes e encontrei este pacote (surpreendentemente chamado de “outliers”!): https://cran.r-project.org/web/packages/outliers/outliers.pdf
se você passar por isso você vê diferentes maneiras de remover outliers e entre eles achei rm.outlier mais conveniente de usar e como diz no link acima: “Se o outlier é detectado e confirmado por testes estatísticos, esta function pode remover ou substitua por média de amostra ou mediana “e também aqui está a parte de uso da mesma fonte:
Uso

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

Argumentos
x um dataset, mais freqüentemente um vetor. Se o argumento for um dataframe, então o valor discrepante será removido de cada coluna pelo sapply. O mesmo comportamento é aplicado por aplicar quando a matriz é dada.
fill Se definido como TRUE, a mediana ou média será colocada em vez de outlier. Caso contrário, os outliers são simplesmente removidos.
median Se definido como TRUE, a mediana é usada em vez da média na substituição outlier. oposto se definido como TRUE, dá valor oposto (se o maior valor tiver diferença máxima da média, ele dá menor e vice-versa) ”

Adicionando a sugestão de @sefarkas e usando o quantile como pontos de corte, pode-se explorar a seguinte opção:

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

Isso removerá os pontos além do 99º quantil. Cuidado deve ser tomado como o que aL3Xa estava dizendo sobre manter os outliers. Ele deve ser removido apenas para obter uma visão conservadora alternativa dos dados.

Não seria:

 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 

realizar essa tarefa com bastante facilidade?

Intereting Posts