geom_density的scale与geom_density_2d的level含义及数值差异问题
geom_density() 中 scale 参数含义 geom_density() 底层调用 stat_density() 完成核密度计算,scale 是该统计层的参数,仅在分组绘制密度图时生效,三个可选取值的逻辑如下:
scale = "area":默认取值,所有分组的密度曲线下面积均归一化为1,符合标准概率密度定义,适合跨组比较分布形状scale = "count":将归一化后的密度值乘以对应分组的有效样本量,此时曲线下面积等于该组的观测总数,曲线高度同时反映组内分布集中程度和组间样本量差异scale = "width":不做面积归一化,缩放后所有分组的密度曲线峰值高度保持一致,仅适合跨组比较峰值位置,数值本身不具备概率或计数含义
geom_density_2d() 中 level 参数含义 geom_density_2d() 基于二维核密度估计结果绘制等高线,level 对应等高线的最高密度区域累计概率阈值:
- 默认参数下生成的9条等高线,对应的level值从高到低分别对应覆盖10%、20%……90%样本的最高密度区域边界
- 单条level对应的等高线围合的区域,就是所有密度值高于该阈值、累计概率等于对应level值的样本分布范围
- 手动传入
levels = c(0.5, 0.95)这类数值向量,即可自定义绘制覆盖50%、95%样本最高密度范围的等高线 - 注意level是概率分位值,和密度本身的绝对数值、量纲没有关系
密度值大小差异的核心原因
很多人会混淆概率密度和概率的定义,这是造成数值困惑的核心原因:
概率的取值固定在[0,1]区间,但概率密度没有取值范围限制,它的绝对大小完全由分析变量的坐标轴量纲、取值区间宽度决定,唯一约束是全区间上密度的积分值等于1。
举个直观的验证例子:
- 若分析变量是取值范围为1.51.9m的成人身高,密度曲线宽度约0.4,峰值密度通常在23之间,积分后面积为1
- 若把身高单位换成mm,取值范围变为15001900mm,同样分布的峰值密度会降到0.0020.003
- 若分析变量是取值范围仅为0.003的高精度微小测量误差,峰值密度完全可以达到300甚至更高,只要积分结果为1就符合核密度估计的计算逻辑
公开示例大多使用取值范围在个位数、十位数区间的演示数据,因此密度值普遍偏小;自有数据密度峰值达到300,本质是对应变量的取值区间非常窄,不属于计算错误。可提取密度计算结果做数值积分验证,只要全区间积分结果为1,结果就是准确的。
内容的提问来源于stack exchange,提问作者cmic91290
相关产品推荐
相关产品推荐

