Base R的cdplot与ggplot的geom_density同数据绘图曲线差异问题
cdplot与geom_density(position='fill')绘图差异的原因及选择建议
差异产生的核心原因
两者的本质差异在于条件概率的计算与归一化逻辑不同:
- Base R的cdplot:直接以条件概率 ( P(c | a) ) 为核心,先对联合分布做密度估计,再拆分得到每个类别在对应x值下的条件概率,确保每个x位置的各类别概率之和严格为1。它的设计目标就是精准展示分类变量相对于连续变量的条件分布。
- ggplot2的geom_density(position='fill'):先分别计算每个类别的边缘密度 ( f(a | c) ),再将每个x位置的各类别密度值做归一化(即每个类别密度除以所有类别密度之和)。这种方式本质上是用边缘密度的相对占比近似条件概率,但因为是先单独估计密度再归一化,在数据稀疏区域(比如你例子中x≈45000的位置,数据点极少),密度估计的波动会被放大,导致结果偏差。
另外,两者默认的密度估计带宽虽然都是nrd0,但由于计算顺序不同,最终的平滑效果也会有细微差别,进一步加剧了稀疏区域的差异。
结果采信建议
如果你的核心需求是准确判断条件概率是否达到0.5,优先选择cdplot()的结果:
- 它是专门为条件概率可视化设计的工具,逻辑更贴合条件概率的定义,在数据稀疏区域的估计稳定性更强。
geom_density(position='fill')更适合用于直观对比不同类别在连续变量上的密度分布趋势,但不能作为严格的条件概率估计依据,尤其是在数据点少的区间,结果偏差较大。
你可以通过手动指定相同带宽来验证这一点,比如在两种绘图中都设置bw = "nrd0",会发现差异有所缩小,但核心逻辑的不同依然会导致稀疏区域的结果偏差。
内容的提问来源于stack exchange,提问作者Reader 123
相关产品推荐
相关产品推荐

