【问题标题】:Showing 80% line Boxplot in r在 r 中显示 80% 线箱线图
【发布时间】:2015-09-11 02:28:01
【问题描述】:

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

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

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

1) 第二张图上面的线代表75%正确吗?如果是这样,那么我如何将 75% 更改为 80%。

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

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

【问题讨论】:

  • 上一行是哪一行?你的意思是虚线末端的胡须还是盒子顶部的胡须?将上须线绘制到 i) 1.5*IQR 或 ii) 数据限制的最小值。盒子的上边缘是上铰链。它几乎但并不总是数据的上四分位数。
  • @GavinSimpson 我指的是盒子的上边缘。在这种情况下是 40。这是否意味着整个数据集的 75% 低于 40?
  • 几乎;正如我所说,它不是上四分位数,而是上铰链。阅读?boxplot.stats,了解区别是什么,哪里不是上四分位数。
  • 如果您不确定显示的内容,请运行 quantile(yourdata, probs=0.8) 以获取 80% 分位数
  • 假设您只有一列数据:quantile(data[,1], probs=0.8) 应该可以解决问题

标签: r boxplot outliers


【解决方案1】:

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

例如,按照您的要求,在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)

这会给我们:

红线是用

添加的
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)

给予

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

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

最终产生

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

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]

【讨论】:

    【解决方案2】:

    您可以通过自己生成统计数据并使用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)])
    

    补充一点,我完全同意 Gavin 的观点,您需要向任何查看此修改后的箱线图的人解释它与通常的解释不同。

    【讨论】:

    • 由于某种原因,每当我运行bxp(myBox)时,我都会收到此错误Error in z$stats[, i] : incorrect number of dimensions
    【解决方案3】:

    答案 1:方框上方的垂直线显示第三个四分位数,它可以但不必与 75% 的分位数有很大不同(见下面的 cmets)。如果您不确定,请咨询fivenum(data[,1])quantile(data[,1])。 Nick K 和 Gavin Simpson 在他们的回答中向您展示了如何改变这一点,我同意他们的观点,如果您不了解箱线图,这样做是危险的。最标准的做法是更改boxplotrange 参数,但您需要指出这一点。

    Answer2:为了公正地处理您的数据,您应该显示两个图:第一个记录异常值,第二个记录分位数。 为了更好地表示一个图中的所有数据,您可以尝试 logscale:

    boxplot(data, log="y")
    

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

    data[which(data<= 1e-3)] = 1e-3
    boxplot(data, log="y")
    

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

    【讨论】:

    • 它不是第 75 个概率分位数在所有情况下。这取决于数据。盒子的上边缘是上铰链,这不必是第 75 个概率分位数。使用我回答中的x,比较boxplot.stats(x)$stats[4]quantile(x, probs = 3/4)fivenum(x)[4]。请注意fivenum() 的答案是boxplot.stats() 报告的答案,而不是quantile() 返回的值。
    • 感谢这个有趣的评论!事实上,箱线图显示了 Tukey 的五个数字摘要 (en.wikipedia.org/?title=Five-number_summary)。这意味着框的上一行是第三个四分位数。差异可能很明显,例如:test = c(1:75, rep(200, 25)); fivenum(test); quantile(test); 我会编辑。
    猜你喜欢
    • 2014-08-23
    • 2011-01-30
    • 2017-06-14
    • 2018-03-06
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多