如何从数据集中删除exception值
我有一些美丽与年龄的多元数据。 年龄在20-40之间,间隔为2(20,22,24 …. 40),并且对于每个logging的数据,给予1-5岁的年龄和美容等级。 当我做这些数据(年龄横跨X轴,Y轴上的美女等级)的箱型图时,每个盒子的胡须外面都绘制了一些exception值。
我想从数据框本身中删除这些exception值,但是我不确定R如何计算它的盒子图中的exception值。 以下是我的数据可能看起来像的一个例子。
好的,你应该像这样应用到你的数据集。 不要replace和保存,否则你会破坏你的数据! 而且,顺便说一句,你应该(几乎)不会从你的数据中删除exception值:
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 }
要看到它的行动:
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()
再一次,你不应该自己做这件事,离群值只是为了! =)
编辑:我添加na.rm = TRUE
作为默认值。
编辑2:删除quantile
function,添加了下标,从而使function更快! =)
没有人发布最简单的答案:
x[!x %in% boxplot.stats(x)$out]
另请参阅: http : //www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/
使用outline = FALSE
作为一个选项,当你做boxplot(阅读帮助!)。
> m <- c(rnorm(10),5,10) > bp <- boxplot(m, outline = FALSE)
boxplot函数返回用于绘图的值(实际上是由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
我故意没有回答具体的问题,因为我认为这是统计上的弊端,以消除“exception值”。 我认为可以接受的做法是不要把它们放在一个盒子里,但是去除它们是观测logging的系统性和不合理的结果。
x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99)) data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]
我觉得这很容易删除exception值。 在上面的例子中,我只是提取了2个百分点到98个百分点的属性值。
我查找与删除exception值有关的软件包,并发现这个软件包(令人惊讶地称为“exception值”): https : //cran.r-project.org/web/packages/outliers/outliers.pdf
如果通过它,你会看到不同的方法去除exception值,其中我发现rm.outlier
最方便的一个,正如它在上面的链接中所说的:“如果exception值被统计检测和确认,这个函数可以删除它或取代平均或中位数“,这里也是来自同一来源的使用部分:
“ 用法
rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)
参数
x数据集,最经常是一个向量。 如果参数是一个数据框,则通过sapply从每列中删除exception值。 在matrix给出时,应用相同的行为。
填充如果设置为TRUE,则置位中值或平均值而不是exception值。 否则,exception值将被简单地删除。
中位数如果设置为TRUE,则在离群值replace中使用中位数而不是平均值。 相反,如果设置为TRUE,则给出相反的值(如果最大值与平均值有最大差异,则给出最小值,反之亦然)“
添加@sefarkas的build议并使用分位数作为截止点,可以探索以下选项:
newdata <- subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .91))[1]) )
这将删除第99个分位数以外的点数。 应该注意像aL3Xa关于保持exception值的说法。 它应该被删除只是为了获得一个替代的保守观点的数据。
岂不:
z <- df[df$x > quantile(df$x, .25) - 1.5*IQR(df$x) & df$x < quantile(df$x, .75) + 1.5*IQR(df$x)]
很容易完成这个任务?