强制R将直方图绘制为概率(相对频率)

时间:2013-07-02 02:22:04

标签: r histogram

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

我希望所有部分的总和等于1的面积,这样就可以更容易地比较数据集。出于某种原因,每当我指定中断(默认值为4或其他任何可怕的内容)时,它不再希望将箱子绘制为概率,而是将箱子绘制为频率计数。

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

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

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

  

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

由于

编辑:详情

嗯,所以我的情节超过1,如果这是一个概率,这是非常令人困惑的。我现在看看它与bin宽度有什么关系。我或多或少想要让每个垃圾箱价值1点,同时仍然有很多垃圾箱。换句话说,除非直接在1.0并且所有其他箱都是0.0,否则箱高度不应高于1.0。就像现在一样,我有一个箱子可以在15.0左右形成一个驼峰

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

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

5 个答案:

答案 0 :(得分:39)

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

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

答案 1 :(得分: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.请记住,箱宽在这里很重要。

这是

> 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

答案 2 :(得分:2)

默认的休息时间是log2(N),其中N是600万,所以应该是22.如果你只看到4次休息,那可能是因为你有xlim个你的来电。这不会改变基础直方图,它只会影响它的哪一部分被绘制。如果你这样做

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

你应该得到1的结果。


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

值1.0是否具有某种意义?

答案 3 :(得分:0)

我在直方图中观察到了这一点    密度=相对频率/相应的箱宽

示例1:

  

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

     

h2 = hist(nums,plot = F)

     

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

     

d2 = rf2 / diff(h2 $ break)

     

H 2 $密度

[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 $ count / sum(h3 $ counts)

     

d3 = rf3 / diff(h3 $ break)

     

H3 $密度

[1] 0.02758621 0.01000000 0.01000000

  

D3

[1] 0.02758621 0.01000000 0.01000000

答案 4 :(得分:-1)

R有一个错误或什么的。如果你在data.frame(有1列)中有离散数据,并且在其上调用hist(DF,freq = FALSE),则相对密度将是错误的(总和为&gt; 1)。就我所知,这不应该发生。

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