在r中显示80%的行Boxplot

时间:2015-06-24 18:23:23

标签: r boxplot outliers

我有一个只有数字的大型数据集(25,00条记录),我想知道它的80%阈值。每当我尝试在其上运行boxplot(data)时,结果都不清楚,因为我有很多值:

Unclear

我试图绕过它并提出boxplot(data, outline = FALSE),结果如下:

Clear

所以基本上我想知道两件事:

1)第二张图中的上面一行代表75%是否正确?如果是这样,那我怎么能把75%改为80%。

2)我不显示异常值的方式是否正确?或者可能有更简单的方法来显示80%的阈值?

很抱歉没有提供可重复的示例,但如果有必要,我会进行编辑。

3 个答案:

答案 0 :(得分:4)

并非我建议您这样做,但您可以更改用于绘制箱线图的统计摘要,并用您自己的统计信息替换任何统计信息。

例如,要按照你的要求进行操作,并在x(而不是上铰链)分布的0.8分位数处绘制框的上限,那么我们就可以这样做:

set.seed(10)
x <- rnorm(1000)
bps <- boxplot(x, plot = FALSE)

bps现在包含:

> bps
$stats
             [,1]
[1,] -2.643849768
[2,] -0.677466940
[3,] -0.003001333
[4,]  0.728515646
[5,]  2.700636623

$n
[1] 1000

$conf
            [,1]
[1,] -0.07324983
[2,]  0.06724716

$out
[1] -3.001431  3.541140  3.012906 -3.012164

$group
[1] 1 1 1 1

$names
[1] "1"

是我们要更改的stats组件

## Replace the 4th statistic (upper box)
bps$stats[4, 1] <- quantile(x, probs = 0.8)

现在我们使用bxp()函数进行绘图 - boxplot()在内部使用此函数,所以我们在这里没有做任何不同的事情

bxp(bps)

这会给我们:

enter image description here

使用

添加红线
abline(h = fivenum(x)[4], col = "red", lty = "dashed", lwd = 2)

并且是上铰链,即boxplot()将绘制框的上边缘。

我之所以说我不建议你这样做是因为它改变了人们所期望的情节解释。如果您确实修改了箱线图,则需要向显示该图表的人员解释您的新约定。

如果我们对此更加谨慎,我们现在也会将胡须推得更远,因为盒子的大小已经增加了。这将取代下胡须和上胡须

bps$stats[c(1,5), 1] <- bps$stats[c(2,4), 1] + 
    (c(-1,1) * (1.5 * diff(bps$stats[c(2,4), 1])))

并重新绘制:

bxp(bps)
abline(h = fivenum(x)[4], col = "red", lty = "dashed", lwd = 2)

给出

enter image description here

虽然现在你有异常值的问题。所以我们也应该解决这个问题

ind <- bps$out > bps$stats[1,1] & bps$out < bps$stats[5,1]
bps$out <- bps$out[!ind]
bps$group <- bps$group[!ind]

最终产生

enter image description here

把所有这些放在一起我们有:

set.seed(10)
x <- rnorm(1000)
bps <- boxplot(x, plot = FALSE)
bps$stats[4, 1] <- quantile(x, probs = 0.8)
bps$stats[c(1,5), 1] <- bps$stats[c(2,4), 1] + 
    (c(-1,1) * (1.5 * diff(bps$stats[c(2,4), 1])))
ind <- bps$out > bps$stats[1,1] & bps$out < bps$stats[5,1]
bps$out <- bps$out[!ind]
bps$group <- bps$group[!ind]

答案 1 :(得分:3)

您可以通过自己生成统计数据并使用bxp绘制它来实现此目的。

x <- rnorm(1000)
myBox <- list(stats = matrix(quantile(x, c(0, 0.2, 0.5, 0.8, 1), ncol = 1)), n = 1000)
bxp(myBox)

这将在第20和第80百分位以及最小和最大的胡须处具有铰链。对于您的数据,您可能需要替代的胡须,您可以使用替代分位数或相对于第20和第80百分位数之间的范围创建一些距离。对于后者,你可以这样做:

myBox2 <- list(stats = matrix(quantile(x, c(0, 0.2, 0.5, 0.8, 1), ncol = 1)), n = 1000)
myBox2$stats[c(1, 5)] <- myBox2$stats[c(2, 4)] + seq(-1, 1, 2) * diff(llmyBox2$stats[c(2, 4)])

只是补充一下,我完全同意加文的意见,你需要向任何看过这个修改后的箱图的人解释它与通常的解释不同。

答案 2 :(得分:1)

答案1:方框的上方垂直线显示第3个四分位数,它可以但不必与75%的分位数非常不同(见下面的评论)。如果您不确定,请查看fivenum(data[,1])quantile(data[,1])。 Nick K和Gavin Simpson在答案中向您展示了如何改变这一点,我同意他们的观点,如果您不知道箱形图,这样做很危险。最标准的做法是更改range的{​​{1}}参数,但您需要指出这一点。

答案2:为了公正你的数据你应该显示两个图:第一个文件是异常值,第二个是你的分位数。 为了更好地表示一个图中的所有数据,您可以尝试logscale:

boxplot

这会给你一个0值的错误(你可能有),所以你可以先修改你的数据:

boxplot(data, log="y")

你必须检查你的数据,如果这给你一个很好的情节。