我有一些关于年龄与美丽的多元数据。年龄范围为20至40,间隔为2(20,22,24 .... 40),对于每条数据记录,年龄和美容等级均为1-5。当我对这些数据进行箱形图绘制(X轴上的年龄,Y轴上的美容等级)时,每个框的晶须外都绘制了一些离群值。
我想从数据框中删除这些离群值,但是我不确定R如何计算其箱形图的离群值。以下是我的数据可能显示的示例。
我有一些关于年龄与美丽的多元数据。年龄范围为20至40,间隔为2(20,22,24 .... 40),对于每条数据记录,年龄和美容等级均为1-5。当我对这些数据进行箱形图绘制(X轴上的年龄,Y轴上的美容等级)时,每个框的晶须外都绘制了一些离群值。
我想从数据框中删除这些离群值,但是我不确定R如何计算其箱形图的离群值。以下是我的数据可能显示的示例。
Answers:
好的,您应该对数据集应用类似的方法。请勿替换并保存,否则将破坏您的数据!而且,顺便说一句,您(几乎)永远不要从数据中删除异常值:
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
默认添加。
EDIT2:删除了quantile
功能,添加了下标,因此使功能更快!=)
boxplot
。这是可以管理的,既然已经回答了您的问题,那么您应该标记@Prasad的答案。如果要使用“异常值规则”排除异常值q +/- (1.5 * H)
,请运行一些分析,然后使用此功能。顺便说一句,我是从头开始的,没有谷歌搜索,所以我有可能用我的这个功能重新发明了轮子……
没有人发布最简单的答案:
x[!x %in% boxplot.stats(x)$out]
另请参阅:http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/
result = x[!x %in% boxplot.stats(x)$out]
使用outline = FALSE
时,你做的箱线图作为一个选项(阅读帮助!)。
> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)
out
和group
项目)。
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
我故意不回答具体问题,因为我认为删除“异常值”是一种统计错误。我认为不将它们绘制在箱线图中而是可以接受的做法是,仅由于它们超出了一些标准偏差或一定数量的四分位数宽度而将其删除是对观测记录的系统性和不科学的处理。
我抬起头,对相关移除离群包,发现这个包(令人惊讶的叫“异常值”!):https://cran.r-project.org/web/packages/outliers/outliers.pdf
如果你通过它,你看到了消除异常值的不同方法,其中找到了rm.outlier
最方便的一种使用方法,正如上面链接中所述:“如果通过统计检验检测到并确认了异常值,则此功能可以将其删除或替换为样本均值或中位数”这也是来自同一来源的用法部分:
“ 用法
rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)
参数
x 数据集,最常见的是向量。如果参数是一个数据框,则通过应用从每列中移除异常值。给定矩阵时,通过apply应用相同的行为。
fill 如果设置为TRUE,则放置中位数或均值而不是离群值。否则,将异常值简单地删除。
中位数 如果设置为TRUE,则使用中位数代替异常值替换中的均值。相反,如果设置为TRUE,则给出相反的值(如果最大值与均值之差最大,则给出最小值,反之亦然)“
x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]
我发现这非常容易消除异常值。在上面的示例中,我只是提取2%到98%的属性值。
除了@sefarkas的建议并使用分位数作为临界值,人们可以探索以下选项:
newdata <- subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) )
这将删除超出第99个分位数的点。应该像aL3Xa所说的保持异常值一样小心。仅应将其删除才能获得另一种保守的数据视图。
0.91
还是0.99
?如在mydata$var < quantile(mydata$var, probs=c(.01, .91))[1])
或mydata$var < quantile(mydata$var, probs=c(.01, .99))[1])
my.NEW.data.frame <- my.data.frame[-boxplot.stats(my.data.frame$my.column)$out, ]
my.high.value <- which(my.data.frame$age > 200 | my.data.frame$age < 0)
my.NEW.data.frame <- my.data.frame[-my.high.value, ]
试试这个。将变量输入函数中,然后将o / p保存在包含已删除异常值的变量中
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)
}
boxplot
函数不可见地返回异常值(以及其他统计信息)。尝试foo <- boxplot(...); foo
阅读?boxplot
以了解输出。