如何在R中制作修剪后的直方图?

时间:2018-12-18 13:10:08

标签: r plot histogram

我想绘制一些数据的直方图。数据包含一些极端值或离群值,因此我想从绘图中排除这些极端值或离群值,以获取大量数据的有意义的图片。这是一些示例数据:

x <- c(seq(0, 1, 0.05)^2, 5)
hist(x)

由于一个异常,您看不到任何有关分布的信息。我可以手动排除异常值。

hist(x[x<2])

这本质上是我想要的,但是它要求我定义确切的截止值,如果数据不仅是x而是一些复杂的表达式,那么会带来不便。我宁愿告诉hist修整最大和最小百分之几的数据,类似于函数均值中的trim选项。

我还可以手动设置xlim和中断,但这更加尴尬。

在绘制之前是否有一种很好的内在方法来去除最极端的值?

2 个答案:

答案 0 :(得分:1)

也许编写修剪功能。此函数删除离群值,离群值被定义为大于均值的四分位数范围的1.5倍。 (这是Tukey箱形图使用的异常值的定义。)

trim <- function(x){
  x[(x > mean(x)-1.5*IQR(x)) & (x < mean(x)+1.5*IQR(x))]
}

hist(trim(x))

enter image description here

或者,按百分比修整。

trim_q <- function(x, lb, ub){
  x[(x > quantile(x, lb)) & (x < quantile(x, ub))]
}

hist(trim_q(x, 0.01, 0.99))

这会将数据修整到第一个百分点至第九十九个百分点之间。

enter image description here


编辑

第一个修整功能不太正确。我认为Tukey将其定义为第一和第三四分位数上下的四分位间距的1.5倍,而不是像我在此处所做的那样。它应该如下所示:

trim_t <- function(x){
  x[(x > quantile(x, 0.25)-1.5*IQR(x)) & (x < quantile(x, 0.75)+1.5*IQR(x))]
}

hist(trim_t(x))

enter image description here

答案 1 :(得分:0)

我知道这并非您真正想要的,但是您想要从字面上修剪直方图,您可以做到。在这种情况下,我删除了两个最极端的垃圾箱。您当然可以通过许多其他规则进行修整。

set.seed(1)
x <- rnorm(40)^3
x <- round(x, 1)*10

par(mfrow=c(2, 1), mar=c(3, 3, 0.1, 1))
h <- hist(x, main="")

h[1:4] <- lapply(h[1:4], function(y) head(y[-1], -1))
plot(h, main="")

enter image description here