为何ggplot2的faithfuld数据集density列与MASS::kde2d计算结果存在差异?
差异原因解析
ggplot2提供的faithfuld数据集里的density列,和直接用MASS::kde2d()计算的结果差异,核心来自归一化处理和参数一致性:
归一化方式不同
MASS::kde2d()默认返回的z值是核密度估计的原始结果,其对应的密度曲面下的体积等于样本数量(每个样本对应一个核函数,积分总和等于样本数)。而faithfuld的density是将这个原始结果做了全局归一化,使得整个曲面下的体积(所有网格点密度值×网格单元面积的总和)等于1,完全符合概率密度的定义(总概率为1)。网格参数需匹配
faithfuld是用kde2d(faithful$eruptions, faithful$waiting, n = 50)生成的,如果你调用kde2d时用了不同的n(网格点数)参数,也会导致结果差异。
验证代码
library(MASS) library(ggplot2) # 复刻faithfuld的计算逻辑 kde_raw <- kde2d(faithful$eruptions, faithful$waiting, n = 50) dx <- diff(kde_raw$x)[1] dy <- diff(kde_raw$y)[1] grid_area <- dx * dy # 归一化到总概率为1 normalized_density <- kde_raw$z / (sum(kde_raw$z) * grid_area) # 对比结果,会返回TRUE all.equal(faithfuld$density, as.vector(normalized_density))
内容的提问来源于stack exchange,提问作者Tenstu
相关产品推荐
相关产品推荐

