You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 × 样本量)

验证第二组数据的第一个密度值:

  1. 样本量:length(airquality$Temp)结果为153
  2. 组宽:60-55=5
  3. 计算:8/(5×153) ≈ 0.01045752,和输出的0.0105完全一致。

第一组代码中你设置了freq=FALSE,直方图展示的是密度分布;第二组代码默认freq=TRUE,直方图展示的是频数,但函数内部依然会按照统一逻辑计算并返回density值,只是你之前的计算遗漏了样本量这一因子。


内容的提问来源于stack exchange,提问作者MK Huda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:25:21