R语言hist()函数直方图密度值计算方法疑问及求解
直方图密度值计算问题与解答
问题
我理解第一组数据的密度值计算方式,比如密度0.69是通过公式 counts/(bin width×样本量) 计算得到的:3448/(0.5×10000)=0.6896,对吗?
对应R代码及输出如下:
set.seed(1234) h <- hist(rbinom(10000, 10, 0.1), freq=FALSE) str(h) #List of 6 # $ breaks : num [1:11] 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 ... # $ counts : int [1:10] 3448 3930 0 1910 0 588 0 112 0 12 # $ density : num [1:10] 0.69 0.786 0 0.382 0 ... # $ mids : num [1:10] 0.25 0.75 1.25 1.75 2.25 2.75 3.25 3.75 4.25 4.75 # $ xname : chr "rbinom(10000, 10, 0.1)" # $ equidist: logi TRUE # - attr(*, "class")= chr "histogram"
但使用R内置数据集airquality$Temp时,得到如下结果:
Temperature <- airquality$Temp h = hist(Temperature) str(h) List of 6 $ breaks : int [1:10] 55 60 65 70 75 80 85 90 95 100 $ counts : int [1:9] 8 10 15 19 33 34 20 12 2 $ density : num [1:9] 0.0105 0.0131 0.0196 0.0248 0.0431 ... $ mids : num [1:9] 57.5 62.5 67.5 72.5 77.5 82.5 87.5 92.5 97.5 $ xname : chr "Temperature" $ equidist: logi TRUE - attr(*, "class")= chr "histogram"
用之前的方法计算,比如counts/组宽=8/5=1.6,和得到的密度值0.0105不符,请问该如何计算此直方图中的密度值?
解答
核心问题是你计算时漏掉了除以样本量的步骤,R中hist()函数返回的density值,无论是否设置freq=FALSE,计算逻辑统一为:密度值 = counts / (bin width × 样本量)
验证第二组数据的第一个密度值:
- 样本量:
length(airquality$Temp)结果为153 - 组宽:
60-55=5 - 计算:
8/(5×153) ≈ 0.01045752,和输出的0.0105完全一致。
第一组代码中你设置了freq=FALSE,直方图展示的是密度分布;第二组代码默认freq=TRUE,直方图展示的是频数,但函数内部依然会按照统一逻辑计算并返回density值,只是你之前的计算遗漏了样本量这一因子。
内容的提问来源于stack exchange,提问作者MK Huda
相关产品推荐
相关产品推荐

