如何用ggplot2绘制分布尾部,展示var1与var2的分布尾部差异
如何展示两个正态分布的尾部差异?
你遇到的问题很典型:当两个分布的中心趋势一致,但样本量差异很大时,常规密度图会因为整体重叠而掩盖尾部的细微差异。下面给你几个实用的方法,帮你把尾部的不同清晰展示出来:
1. 聚焦尾部:调整坐标轴范围
常规密度图默认展示数据的整体范围,我们可以手动缩小x轴范围到极端值区域,直接放大尾部的细节。因为小样本(var1,n=1000)的尾部数据点更少,密度估计的波动会比大样本(var2,n=100000)更明显,放大后差异就会显现:
ggplot(data = combine) + geom_density(aes(x = value, color = variable), alpha = 0.2) + xlim(c(-4, 4)) # 可根据数据实际极端值调整范围,比如c(-5,5)
2. 用QQ图精准对比分位数
QQ图是对比分布分位数的利器,尤其适合观察尾部差异。如果两个分布完全一致,点会落在一条直线上;但小样本的尾部分位数估计更不稳定,会明显偏离直线:
# 直接用ggplot的stat_qq绘制 ggplot() + stat_qq(aes(sample = var1, color = "var1"), size = 1) + stat_qq(aes(sample = var2, color = "var2"), size = 0.5) + # 大样本点更小避免重叠 labs(title = "QQ Plot: var1 vs var2", color = "Variable") + theme_minimal()
3. 对数变换放大尾部密度
尾部的密度值通常很小,直接看很难发现差异。对y轴(密度值)做对数变换后,原本细微的尾部差异会被放大,能清晰看到小样本的尾部波动:
ggplot(data = combine) + geom_density(aes(x = value, color = variable), alpha = 0.2) + scale_y_log10(limits = c(1e-6, 1)) + # 限制范围过滤极低的噪声值 labs(title = "Log-Scaled Density Plot", y = "Log(Density)")
4. 绘制分位数差异曲线
直接计算两个变量在相同分位数上的数值差异,然后绘图,极端分位数(尾部)的差异会一目了然:
# 生成从0.001到0.999的分位数序列,聚焦尾部 quantiles <- seq(0.001, 0.999, by = 0.001) q_var1 <- quantile(var1, quantiles) q_var2 <- quantile(var2, quantiles) # 构建差异数据框 quant_diff_df <- data.frame( quantile = quantiles, diff = q_var1 - q_var2 ) # 绘制差异曲线 ggplot(quant_diff_df, aes(x = quantile, y = diff)) + geom_line(color = "#2c3e50") + geom_hline(yintercept = 0, linetype = "dashed", color = "#e74c3c") + labs(title = "Difference in Quantiles: var1 - var2", x = "Quantile", y = "Quantile Value Difference") + theme_bw()
这些方法的核心都是突出尾部的信息权重,让小样本和大样本在尾部的差异从“被掩盖”变成“可视化”。你可以根据自己的需求选择最适合的方式~
内容的提问来源于stack exchange,提问作者user3978632
相关产品推荐
相关产品推荐

