【问题标题】:Force R to plot histogram as probability (relative frequency)强制 R 将直方图绘制为概率(相对频率)
【发布时间】:2013-06-29 06:45:18
【问题描述】:

我无法将直方图绘制为 pdf(概率)

我希望所有部分的总和等于一的面积,这样更容易跨数据集进行比较。出于某种原因,每当我指定中断(默认值为 4 或其他任何糟糕的值)时,它不再希望将 bin 绘制为概率,而是将 bin 绘制为频率计数。

hist(data[,1], freq = FALSE, xlim = c(-1,1), breaks = 800)

我应该将此行更改为什么?我需要一个概率分布和大量的垃圾箱。 (我有 600 万个数据点)

这在 R 帮助中,但我不知道如何覆盖它:

频率逻辑;如果为 TRUE,直方图图形是 频率,结果的计数分量;如果为假,概率 密度,组件密度,被绘制(以便直方图具有 总面积一)。当且仅当中断时默认为 TRUE 等距(并且未指定概率)。

谢谢

编辑:详细信息

嗯,所以我的情节高于 1,如果这是一个概率,这将非常令人困惑。我现在看到它与 bin 宽度有什么关系。我或多或少想让每个垃圾箱都值 1 分,同时仍然有很多垃圾箱。换句话说,任何 bin 高度都不应高于 1.0,除非它直接位于 1.0 并且所有其他 bin 均为 0.0。就目前而言,我有一个在 15.0 左右形成驼峰的垃圾箱

编辑:bin 中的 %points 高度 @Dwin:那么我如何绘制概率?我意识到由于 x 轴上的单位,积分仍然会给我 1.0,但这不是我想要的。假设我有 100 个点,其中 5 个点落入第一个箱中,那么该箱的高度应为 0.05。这就是我要的。我做错了吗,还有另一种方法吗?

我知道我有多少分。有没有办法将频率直方图中的每个 bin 计数除以这个数字?

【问题讨论】:

  • 这是一个密度,而不是概率。 (澄清一下:xf(x) 的积分在某个点上 >1.0 的事实并不意味着 f(x) 必须在所有 x 上都小于 1.0。xf 的积分(x) 在任何范围内,有限或无限都将小于或等于 1.0。)

标签: r histogram


【解决方案1】:

我观察到,在直方图中 密度 = 相对频率 / 对应的 bin 宽度

示例 1:

nums = c(10, 41, 10, 28, 22, 8, 31, 3, 9, 9)

h2 = hist(nums, plot=F)

rf2 = h2$counts / sum(h2$counts)

d2 = rf2 / diff(h2$breaks)

h2$密度

[1] 0.06 0.00 0.02 0.01 0.01

d2

[1] 0.06 0.00 0.02 0.01 0.01

示例 2:

nums = c(10, 41, 10, 28, 22, 8, 31, 3, 9, 9)

h3 = hist(nums, plot=F, breaks=c(1,30,40,50))

rf3 = h3$counts / sum(h3$counts)

d3 = rf3 / diff(h3$breaks)

h3$密度

[1] 0.02758621 0.01000000 0.01000000

d3

[1] 0.02758621 0.01000000 0.01000000

【讨论】:

    【解决方案2】:

    R 有错误或其他问题。如果您在 data.frame(1 列)中有离散数据,并在其上调用 hist(DF,freq=FALSE),则相对密度将是错误的(总和 > 1)。据我所知,这不应该发生。

    解决方案是先在对象上调用 unlist()。这修复了情节。 (我也改了文字,数据来自http://www.electionstudies.org/studypages/anes_timeseries_2012/anes_timeseries_2012.htm

    【讨论】:

    • 我强烈怀疑这不是错误,而是垃圾箱的宽度 sum(dens)*delta,而不仅仅是sum(dens)
    • 例如:x <- rep(1:10,1:10); h1 <- hist(x,freq=FALSE); sum(h1$density) 为 1。如果使用 h2 <- hist(x,freq=FALSE,breaks=50),则需要 sum(h2$density*diff(h2$mids)[1]) 而不是 sum(h2$density)
    • bin 的宽度
    • 我声称这不是错误,这是您对hist() 的误解。 prop.table(table(x)) 怎么样?
    • 因为你已经加载了Hmisc 包,它加载了一个单独的hist.data.frame S3 方法;它以与基础 R 中的hist.default 不同的方式选择 bin 的数量。(这已经到了真正应该作为一个新问题提出的地步。)
    【解决方案3】:

    要回答绘制概率而不是密度的请求:

    h <- hist(vec, breaks = 100, plot=FALSE)
    h$counts=h$counts/sum(h$counts)
    plot(h)
    

    【讨论】:

    • 太棒了!我不知道您可以将直方图放入这样的变量中,然后进行计数。
    • +1 不错。关键是 R 不会立即生成 相对频率(概率)直方图。
    • 但是,如果您自己指定了中断,尤其是非均匀中断,则 R 默认显示 DENSITY,而不是 COUNTS(频率)。要解决此问题,您需要在绘图前使用另一行:plot(h, freq=TRUE)。建议将此添加到您的答案中以使其完全通用。
    • 如果我正确阅读了您的建议,它似乎概述了另一种方法。如果它确实有用,那么也许您应该编写自己的答案来证明其价值。 (目前在我看来它不会成功。)
    【解决方案4】:

    默认中断数约为log2(N),在您的情况下,N 为 600 万,因此应该为 22。如果您只看到 4 个中断,那可能是因为您的通话中有 xlim。这不会改变底层直方图,它只会影响绘制的部分。如果你这样做了

    h <- hist(data[,1], freq=FALSE, breaks=800)
    sum(h$density * diff(h$breaks))
    

    你应该得到 1 的结果。


    数据的密度与其测量单位有关;因此,您要确保“bin 高度不应高于 1.0”实际上是有意义的。例如,假设我们有一堆以英尺为单位的测量值。我们将测量值的直方图绘制为密度。然后我们将所有测量值转换为英寸(乘以 12)并制作另一个密度直方图。即使数据基本相同,密度的高度也将是原始的 1/12。同样,您可以通过将所有数字乘以 15 来使您的 bin 高度都小于 1。

    值 1.0 是否有某种意义?

    【讨论】:

    • 是的,1.0 很有意义。我想查看一个 bin 并查看该 bin 中点的百分比。问题是手动设置中断会破坏 hist() 的 freq=FALSE 部分:通常会使其成为我的 % 直方图的部分。我的不同情节必须首先在概率图中,否则比例不匹配,无法比较它们
    【解决方案5】:

    你确定吗?这对我有用:

    > vec <- rnorm(6000000)
    > 
    > h <- hist(vec, breaks = 800, freq = FALSE)
    > sum(h$density)
    [1] 100
    > unique(zapsmall(diff(h$breaks)))
    [1] 0.01
    

    将最后两个结果相乘,得到概率密度和为 1。请记住,此处的 bin 宽度很重要。

    这是与

    > sessionInfo()
    R version 3.0.1 RC (2013-05-11 r62732)
    Platform: x86_64-unknown-linux-gnu (64-bit)
    
    locale:
     [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C              
     [3] LC_TIME=en_GB.UTF-8        LC_COLLATE=en_GB.UTF-8    
     [5] LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
     [7] LC_PAPER=C                 LC_NAME=C                 
     [9] LC_ADDRESS=C               LC_TELEPHONE=C            
    [11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    loaded via a namespace (and not attached):
    [1] tools_3.0.1
    

    【讨论】:

    • 嗯,所以我的情节高于 1,如果这是一个概率,这将非常令人困惑。我现在看到它与 bin 宽度有什么关系。我或多或少想让每个垃圾箱都值 1 分,同时仍然有很多垃圾箱。换句话说,任何 bin 都不应高于 1.0,除非它直接位于 1.0 并且所有其他 bin 都是 0.0
    • 错了。这不是概率。考虑到它被询问的次数,这可能应该提升为常见问题解答。
    • +1 表示 DWin 的评论。 DWin 所说的密度通常称为概率密度,或者更严格地说,密度估计是针对变量的概率密度函数。如果您想了解更多信息,请阅读 Wikipedia 上的 Density EstimationProbability Density Function
    • @Dwin :那么我如何绘制概率?我意识到由于 x 轴上的单位,积分仍然会给我 1.0,但这不是我想要的。假设我有 100 个点,其中 5 个点落入第一个箱中,那么该箱的高度应为 0.05。这就是我要的。我做错了吗,还有另一种方法吗?
    • 在处理连续函数时,不能谈论“f(x) 在 x=2 处的概率”,因为从 2 到 2 的积分永远为 0。只能谈论概率在非零长度间隔上。对于累积概率函数,您可以绘制 cumsum(f(x))/sum(f(x) 在您选择的特定 x 序列上进行评估。对于选定间隔内的概率,您可以使用cx &lt;- cut(x, breaks)table(cx) 并将该矩阵除以sum(table(cx))
    猜你喜欢
    • 2013-02-05
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多