density 是 R 语言基础包 stats 里面自带的核心函数 作用是对一维数值向量做核密度估计 也就是估算连续数据的概率密度曲线 简单理解就是把离散样本数据平滑成一条连续概率密度曲线 用来观察数据分布形态 是否偏态 是否多峰 有没有异常聚集 它和直方图思路接近 但是直方图是分箱柱状图 density 输出是连续平滑曲线 这个函数是做分布可视化 探索性数据分析最常用工具 很多新手容易混淆 它不是计算物理密度 也不是单纯统计频数 核心是概率密度估计 输出结果是一个列表对象 包含 x 坐标 y 坐标 带宽 样本点数 核函数类型这些信息 可以直接传入 plot 绘制曲线
一 函数基础信息
| 项目 | 内容 |
|---|---|
| 所属包 | stats 基础包 不需要额外安装 |
| 函数名 | density |
| 输入 | 一维数值向量 x |
| 输出 | 列表类 density 对象 |
| 核心原理 | 核密度估计 KDE |
| 主要用途 | 分布可视化 对比组分布 平滑直方图 |
二 核心参数深度说明
x 输入数值向量 必须是数值型 不能是字符或者因子
bw 带宽 也就是平滑参数 这个参数最重要 带宽太小曲线抖动锯齿多 带宽太大会过度平滑 把真实峰值抹平 默认是 nrd 自动选择带宽
kernel 核函数类型 可选 gaussian 高斯核 默认 还有 epanechnikov rectangular triangular 等 绝大多数场景直接使用默认高斯核
n 生成网格点数量 默认是 512 数值越大曲线越细腻
from to 限定计算密度的取值区间 默认覆盖数据最小值到最大值
三 详细使用步骤
第一步 基础调用
编写代码 res <- density (x)
x 替换成你的数值向量 执行之后 res 就是 density 返回对象
查看 res 里面元素 输入 names (res) 可以看到 x y bw n kernel call 这些字段
其中 resy 是对应的概率密度数值
第二步 绘制密度曲线
基础绘图代码 plot (res, main="密度曲线")
也可以和直方图叠加 使用 hist (x, freq=FALSE) 然后 lines (res)
freq=FALSE 代表直方图改成概率密度尺度 这样直方图和 density 曲线纵轴单位一致 可以叠加对比
第三步 分组对比密度曲线
多组数据分别调用 density 再用 lines 叠加不同颜色曲线
典型场景 实验组对照组分布对比 医学 金融 统计分析经常用到
第四步 提取密度数值做后续计算
可以根据 resy 查找峰值位置 也就是密度最大值对应的 x 值 还可以做积分 计算区间概率 或者做双峰检验
四 重要原理补充
核密度估计本质是在原始每个数据点上面放置一个小核函数 再把所有核函数叠加求和 得到整体平滑密度曲线
带宽 bw 是最关键影响因素 调参是使用 density 的重点 自动带宽适合大多数情况 如果曲线形状不符合预期 优先调整 bw 不要随便更换核函数
注意 density 输出纵轴是概率密度 不是频数 曲线下总面积等于 1 这个和直方图 freq=TRUE 的频数纵轴不一样 很多新手在这里出错
五 最终总结
density 在 R 语言里就是核密度估计函数 用来估算一维连续数据的概率密度 输出列表对象 可以绘图 叠加直方图 做多组分布对比 核心掌握输入向量 带宽参数 输出 x 和 y 字段 绘图时记得直方图设置 freq=FALSE 保证纵轴尺度统一
【常见问题】
问题 1 density 在 r 语言中的意义 为什么 density 画出来曲线和直方图对不上
回答 1 density 在 r 语言中的意义是概率密度估计 如果直方图默认 freq=TRUE 显示频数 纵轴单位和 density 概率密度不一样 就会对不上 解决办法 hist 设置 freq=FALSE 转换成概率密度尺度 就可以和 density 曲线叠加对齐
问题 2 density 在 r 语言中的意义 带宽 bw 调大之后曲线会发生什么变化
回答 1 density 在 r 语言中的意义是核密度平滑估计 bw 带宽调大之后平滑程度更高 曲线更加平缓 容易掩盖局部峰值 bw 太小曲线会出现锯齿波动 噪声变多 调参的时候需要在平滑和保留真实分布特征之间平衡
问题 3 density 在 r 语言中的意义 能不能对二维数据使用 density 函数
回答 1 density 在 r 语言中的意义是一维核密度估计 基础 density 函数只支持一维向量 如果需要二维核密度估计 需要使用 KernSmooth 包里面的 bkde2D 函数 不能直接把矩阵传给基础 density
【免责申明】
本文为 density 在 r 语言中的意义学习参考 函数参数和行为会随 R 版本更新微调 复杂统计场景建议参考 R 官方帮助文档 本文不替代专业统计课程 因代码参数误用造成分析结果错误由使用者自行承担


