18

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

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

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

我应该把这条线改成什么?我需要一个概率分布和大量的垃圾箱。(我有 600 万个数据点)

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

频率逻辑; 如果 TRUE,直方图图形是频率的表示,结果的计数组件;如果为 FALSE,则绘制概率密度、分量密度(因此直方图的总面积为 1)。当且仅当中断是等距的(并且未指定概率)时,默认为 TRUE。

谢谢

编辑:细节

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

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

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

4

5 回答 5

42

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

h <- hist(vec, breaks = 100, plot=FALSE)
h$counts=h$counts/sum(h$counts)
plot(h)
于 2013-07-02T18:47:38.757 回答
3

在您的情况下,默认休息次数约为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 是否具有某种意义?

于 2013-07-02T03:17:03.060 回答
2

你确定吗?这对我有用:

> 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
于 2013-07-02T03:15:26.107 回答
0

我观察到,直方图 密度 = 相对频率 / 相应的 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$density

[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$density

[1] 0.02758621 0.01000000 0.01000000

d3

[1] 0.02758621 0.01000000 0.01000000
于 2015-09-05T15:15:08.063 回答
-1

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

解决方案是首先在对象上调用 unlist()。这修复了情节。 在此处输入图像描述在此处输入图像描述(我也更改了文本,数据来自http://www.electionstudies.org/studypages/anes_timeseries_2012/anes_timeseries_2012.htm

于 2015-03-15T20:46:01.997 回答