You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

在R语言中基于高斯核密度估计结果求解CDF值并绘图的方法

从核密度估计到CDF的计算与可视化

嘿,这个需求很常见!既然你已经用R的density()完成了高斯核密度估计,要得到对应的CDF(累积分布函数)并绘图其实只需要两步:对密度曲线做数值积分,然后把积分结果可视化就行。下面给你具体的操作步骤和代码示例:

步骤1:准备你的核密度估计结果

首先假设你已经有了自己的数据集,或者我们用模拟数据来演示:

# 生成模拟数据(比如1000个正态分布样本)
set.seed(123)  # 设置随机种子保证结果可复现
x <- rnorm(1000, mean = 0, sd = 1)

# 用高斯核做密度估计
dens <- density(x, kernel = "gaussian")

这里dens就是density()返回的对象,里面包含了两个关键向量:dens$x是密度曲线的横坐标点,dens$y是对应的密度值。

步骤2:计算CDF数值

CDF的本质是密度函数从负无穷到当前x点的积分。因为density()返回的x是等间距的,我们可以用累积求和+区间宽度来近似计算积分:

# 计算每个区间的宽度(所有区间宽度一致,取第一个即可)
bin_width <- diff(dens$x)[1]

# 计算CDF:每个点的CDF值是前面所有密度值乘以区间宽度的累积和
cdf_vals <- cumsum(dens$y) * bin_width

这样cdf_vals就和dens$x一一对应,每个值就是对应x点的累积概率。

步骤3:绘制CDF图形

用基础绘图工具就能轻松画出平滑的CDF曲线:

# 绘制CDF曲线
plot(dens$x, cdf_vals, 
     type = "l",  # 绘制折线
     lwd = 2,     # 线条粗细
     col = "#2E86AB",  # 自定义颜色
     xlab = "变量值", 
     ylab = "累积概率 (CDF)",
     main = "基于高斯核密度估计的CDF")

# 添加参考线(y=0和y=1)
abline(h = c(0, 1), col = "gray50", lty = 2)

# 添加网格线
grid()

如果你想用ggplot2绘图,代码也很简单:

library(ggplot2)
# 把数据转成数据框
df <- data.frame(x = dens$x, cdf = cdf_vals)

ggplot(df, aes(x = x, y = cdf)) +
  geom_line(color = "#2E86AB", linewidth = 1.2) +
  geom_hline(yintercept = c(0,1), color = "gray50", linetype = "dashed") +
  labs(x = "变量值", y = "累积概率 (CDF)", title = "基于高斯核密度估计的CDF") +
  theme_minimal()

额外小提示

  • 如果你的密度估计结果不是等间距的(虽然density()默认是等距的),可以用approxfun()先把密度函数转为插值函数,再用integrate()逐个计算积分,但对于density()的输出,用cumsum的方法已经足够高效和准确。
  • 你可以通过调整density()n参数(默认是512)来增加横坐标点的数量,让CDF曲线更平滑。

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

火山引擎 最新活动