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

为何调整binwidth后ggplot2可正确绘制离散数据经验概率?

ggplot2绘制离散数据经验概率的疑问解答

背景说明

在教学中引导学生绘制离散数据的经验概率时,原本通过手动计算table(x)/length(x)得到概率后用geom_col绘图,目的是让学生理解stats::density的核密度平滑仅适用于连续数据,不适用于离散场景。但实际操作中发现,将geom_histogram的binwidth设置为离散数据的间隔(如示例中的1),结合after_stat(density)可以得到和手动计算完全一致的经验概率图。

以下是示例代码:

library(ggplot2)
x <- c(1,1,2,2,3,4,5,5,5)

# 手动计算经验概率并使用geom_col绘图
x_factor <- factor(x, 1:5) # 转换为因子以指定支持集
df <- data.frame(x = as.numeric(names(table(x_factor))),
                 p = as.numeric(table(x_factor))/length(x_factor))

ggplot(data = df) + 
  geom_col(aes(x = x, y = p)) 
# 使用stats::density绘制(统计角度不正确,因stats::density适用于连续变量)
ggplot(data = data.frame(x = x)) + 
  geom_histogram(aes(x = x , y = after_stat(density)))
# 调整binwidth后可正确绘制经验概率
ggplot(data = data.frame(x = x)) + 
  geom_histogram(aes(x = x, y = after_stat(density)), binwidth = 1)

疑问解答

1. 为何调整binwidth的代码能正确生成经验概率图?

离散数据的取值间隔固定(示例中为1),当设置binwidth=1时,每个直方图的bin刚好对应一个离散取值的范围(比如取值1对应[0.5,1.5)),每个bin内的样本计数就是该离散值的出现次数。

而after_stat(density)的计算逻辑为:
density = 计数 / (总样本量 × binwidth)
当binwidth=1时,公式简化为计数/总样本量,这正是离散数据的经验概率,因此最终绘图结果和手动计算完全一致。

2. 该示例中geom_histogram()与after_stat(density)的组合如何工作?

  • geom_histogram默认以**计数(count)**为y轴绘图,当在aes中指定y = after_stat(density)时,会触发ggplot的统计变换,计算每个bin的密度值。
  • 这里的density统计量核心公式是:density = count / (sum(count) * binwidth),其中sum(count)是总样本量,binwidth是每个bin的宽度。
  • 离散场景下,当binwidth等于离散值的间隔时,每个bin仅包含单个离散取值的所有样本,此时count就是该取值的出现次数,代入公式后直接得到经验概率。
  • 若不指定binwidth,ggplot会自动划分bin,可能出现单个bin包含多个离散值的情况,此时计算出的density不符合离散数据的经验概率逻辑,这也是stats::density不适合离散数据的原因——核密度本质是对连续数据的平滑估计。

3. 如何复现ggplot内部的计算过程?

可以手动模拟ggplot的统计变换步骤,完全复现其计算逻辑:

x <- c(1,1,2,2,3,4,5,5,5)
binwidth <- 1

# 步骤1:按照binwidth划分区间,每个离散值对应一个bin
bins <- cut(x, breaks = seq(min(x)-0.5, max(x)+0.5, by = binwidth), include.lowest = TRUE)

# 步骤2:统计每个bin内的样本计数
counts <- table(bins)

# 步骤3:按照density公式计算值
total_samples <- length(x)
density_vals <- as.numeric(counts) / (total_samples * binwidth)

# 查看结果,和手动计算的经验概率一致
density_vals
# 输出:0.2222222 0.2222222 0.1111111 0.1111111 0.3333333

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:25:53