【问题标题】:R Hist : relationship between 'breaks' value and number/size of binsR Hist:'breaks'值和bin的数量/大小之间的关系
【发布时间】:2018-10-12 00:55:43
【问题描述】:

关于 R/ 中的 HIST/hist() 函数,谁能帮我找到:

一个非常简单的定义来解释'breaks'的指定值与直方图中产生的bin数之间的关系?

例如,我使用R工具提供的基本数据集:

data(mtcars)
hist(mtcars$mpg, break=3) --> will draw 3 bins (really??? weird!)
hist(mtcars$mpg, break=4) --> will draw 5 bins 
hist(mtcars$mpg, break=5) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=6) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=7) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=8) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=9) --> will draw 11 bins (why???)

为什么breaks = 4,5,6,7,8 会导致相同的垃圾箱数,而breaks=3 会导致只有4 个垃圾箱,...?

您可以在 ?hist 或以下链接中找到 R 文档: http://localhost//library/graphics/html/hist.html

并没有真正帮助,我试图在“breaks=”中指定的值、bin 的大小和 bin 的数量之间建立任何联系,但我找不到一个简单或简单的公式或解释来扣除这样的“链接”。

我只是不明白“breaks=3”是什么意思? 它是指“3 次休息”还是“每隔 3 个单位休息一次”或完全不同的意思?

我真的很感激任何提示、帮助、任何形式的指针。

谢谢。

【问题讨论】:

    标签: r histogram


    【解决方案1】:

    hist 的文档说,当您将中断指定为单个数字(如您所做的那样)时

    这个数字只是一个建议;因为断点将设置为 漂亮的价值观

    如果您点击pretty 的文档链接,它会显示

    选择的值是 10 的 1、2 或 5 倍。

    您不能在 1、2、5 或 10 的 4 个均匀间隔的倍数中跨越 10 和 35 之间的间隙,因此它选择了 5 个箱(6 个断点)。如果你真的想要四个均匀间隔的箱子,你可以使用

    hist(mtcars$mpg, seq(10,35, length.out=5))
    

    请注意,您需要使用 length.out=5 来获得四个 bin(四个起点加上一个额外的端点)。当然,这并没有给出“漂亮”的值。

    如果您不喜欢 x 轴上的刻度不与 bin 对齐,(我不喜欢),您可以在 hist 中省略轴并自行添加。

    H = hist(mtcars$mpg, seq(10,35, length.out=5), axes=FALSE, ylim=c(0,14))
    axis(side=1, at=seq(10,35, length.out=5))
    axis(side=2, pretty(0:14))
    

    进一步解释breaks

    文档?hist 在中断下说有 5 种类型的值可以用于中断。您正在使用的是:

    给出直方图单元格数量的单个数字

    但如上所述,文档添加:

    这个数字只是一个建议;断点将设置为漂亮的值。

    所以当你给hist 参数breaks=4 时,它知道你想要 4 个箱子,但它也会坚持使用“漂亮”值作为边界,即均匀间隔1,2 的倍数,10 的 5 次方。端点上也可能存在限制。

    让我们研究一下它对您的 mtcars$mpg 数据的作用。 通过保存返回值,您可以获得很多关于hist 正在做什么的信息。我还将抑制直方图的实际绘制,因为现在我只对值感兴趣。

    HV = hist(mtcars$mpg, 4, plot=FALSE)
    

    你可以打印出HV,看到有很多信息 关于直方图。我们在这里关心的所有内容都存储在breaks

    HV$breaks
    [1] 10 15 20 25 30 35
    

    这给出了 bin 的 6 个边界值(需要 5 个 bin 6 个边界值)。但是我们要了 4 个箱子,而不是 5 个!如果你分开 范围 10-35 分为四个箱子,你得到了边界 10、16.25、22.5、28.75 和 35。这些不是“漂亮”的边界值。 相反,hist 使用pretty 函数来找到更好的边界值,但这意味着它必须放弃使用 4 个 bin。

    对于一系列中断值,我们得到多少个中断点? 让我们尝试 2 次中断,最多 20 次中断。

    sapply(2:20, function(n) 
        length(hist(mtcars$mpg, n, plot=FALSE)$breaks))
     [1]  4  4  6  6  6  6  6 13 13 13 13 13 13 13 13 25 25 25 25
    

    再次注意:4 个断点意味着 3 个 bin。 6 个断点意味着 5 个 bin。只有四种不同 创建的拆分。它们是什么?

    unique(lapply(2:20, function(n) hist(mtcars$mpg, n, plot=FALSE)$breaks))
    [[1]]
    [1] 10 20 30 40
    [[2]]
    [1] 10 15 20 25 30 35
    [[3]]
     [1] 10 12 14 16 18 20 22 24 26 28 30 32 34
    [[4]]
     [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
    

    边界变化 10、5 2 或 1 - 漂亮的边界。

    如果你想拥有更多的控制权,你需要能够指定 你想要的边界。这就是我在上面的例子中所做的。指定breaks 的其他选项之一是:

    给出直方图单元格之间断点的向量

    这是我在指定seq(10,35, length.out=5) 时使用的。 但请注意这些值:

    seq(10,35, length.out=5)
    [1] 10.00 16.25 22.50 28.75 35.00
    

    不漂亮。

    所以你可以轻松漂亮,但没有很好的控制 超过垃圾箱的数量,或者您可以控制数量 以更多的工作和更丑陋的边界为代价的垃圾箱。

    【讨论】:

    • 哇,非常感谢您的精彩解释。另外,我想问一下:breaks=n 的真正含义是什么?这是否意味着我“希望获得”n 个突破点(BP)?为什么在我的情况下 breaks=3 导致 4 BP 而 breaks=9 导致 13 BP ?真的有算法来计算和找到这些吗?
    • 添加回答。
    • 非常感谢您的精彩回答!这是我在 SOF 上得到或看到的最好和最完整的答案。你显然是一个 R 专家,你也有一个艺术来解释事情。我觉得您的答案比 ?hist 帮助页面好得多。我认为您使用返回的计算值与 plot = FALSE 以及您使用这些提供的演示是最有帮助的。
    • 很高兴这个答案对您有所帮助。
    • 根据R (R version 3.3.2) help: ?histThe default for breaks is "Sturges"。应该有破解数据的方法。
    猜你喜欢
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2018-03-15
    相关资源
    最近更新 更多