如何计算并绘制两个不同长度数据集对应的密度图差值
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
相关产品推荐
相关产品推荐

