You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算并绘制两个不同长度数据集对应的密度图差值

R 实现两个不等长数据集的密度差值计算与绘图

核心思路

要计算两个密度曲线的差值,首先需要将两次核密度估计对齐到完全一致的x轴采样区间与采样点数量,再对对应位置的密度值做差。

完整实现代码

# 加载绘图包(如果用基础绘图可跳过加载ggplot2)
library(ggplot2)

# 你的示例数据集
set.seed(123) # 加种子方便复现结果
df1 <- data.frame(x = rnorm(1000, 0, 2))
df2 <- data.frame(y = rnorm(500, 1, 1))

# 1. 确定统一的密度估计区间:取两个数据集的数值范围并集
range_min <- min(c(df1$x, df2$y))
range_max <- max(c(df1$x, df2$y))
n_points <- 1024 # 采样点数量,越大精度越高

# 2. 分别对两个数据集做核密度估计,用完全一致的参数
dens1 <- density(df1$x, from = range_min, to = range_max, n = n_points)
dens2 <- density(df2$y, from = range_min, to = range_max, n = n_points)

# 3. 计算密度差值,整理为数据框方便后续调用
density_diff <- data.frame(
  x = dens1$x, # 两个密度的x值完全一致,取任意一个即可
  dens1 = dens1$y,
  dens2 = dens2$y,
  diff = dens1$y - dens2$y # 这里是df1密度减df2密度,需要反过来可以交换顺序
)

# ----------------------
# 差值数值调用示例
# ----------------------
# 差值的算术均值
mean_diff <- mean(density_diff$diff)
# 密度差值的积分(近似曲线下面积总和,用梯形法计算更准确)
step <- density_diff$x[2] - density_diff$x[1] # x轴步长
total_diff_area <- sum(density_diff$diff) * step

# ----------------------
# 绘图示例1:基础绘图
# ----------------------
plot(density_diff$x, density_diff$diff, type = "l", lwd = 2, col = "blue",
     xlab = "数值", ylab = "密度差值 (df1 - df2)", main = "两个密度曲线的差值")
abline(h = 0, lty = 2, col = "red") # 0参考线,线上为df1密度更高,线下为df2密度更高

# ----------------------
# 绘图示例2:ggplot2绘图
# ----------------------
ggplot(density_diff, aes(x = x, y = diff)) +
  geom_line(linewidth = 1, color = "#2c3e50") +
  geom_hline(yintercept = 0, linetype = "dashed", color = "#e74c3c") +
  labs(x = "数值", y = "密度差值 (df1 - df2)", title = "密度差值曲线") +
  theme_minimal()

结果说明

  • density_diff数据框中diff列就是对应x轴位置的密度差值,可直接用于后续的总和、均值等统计计算
  • 如果需要计算正/负差值的单独统计量,可对diff列做筛选后计算:比如正差值总和为sum(density_diff$diff[density_diff$diff > 0]) * step

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:09:01