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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:26:26