比较和可视化高度偏斜的分布

机器算法验证 数据可视化 偏度 直方图
2022-04-07 05:22:28

我正在使用的数据高度偏斜,绝大多数数据集中在 0。似乎很难突出这些分布之间的差异:

gamma1 <- rgamma(10000, shape=0.05, rate=1)
gamma2 <- rgamma(10000, shape=0.055, rate=0.98)
gamma3 <- rgamma(10000, shape=0.06, rate=0.95)

c(mean(gamma1), mean(gamma2), mean(gamma3))

[1] 0.04845668 0.05253655 0.05797983

ks.test(gamma1, gamma2)

 Two-sample Kolmogorov-Smirnov test

  data:  gamma1 and gamma2  
  D = 0.0433, p-value = 1.44e-08  
  alternative hypothesis: two-sided

ks.test(gamma2, gamma3)

 Two-sample Kolmogorov-Smirnov test

 data:  gamma2 and gamma3  
 D = 0.0456, p-value = 1.864e-09  
 alternative hypothesis: two-sided  

ks.test(gamma1, gamma3)

Two-sample Kolmogorov-Smirnov test

 data:  gamma1 and gamma3  
 D = 0.0798, p-value < 2.2e-16  
 alternative hypothesis: two-sided

由于大多数数据为 0,直方图对于查看分布之间的差异不是很有帮助(更不用说在 R 中绘制具有多个分布的直方图似乎不是一种方便的方法,请参阅https: //github.com/hadley/ggplot2/issues/1081):

直方图

小提琴图似乎歪曲了分布的形状(它们看起来比实际更正常),并且由于平均值非常低,这些框几乎是不可见的:

小提琴情节

由于这些图并没有真正显示出任何有用的东西,我想知道是否有更好的方法来可视化偏态分布?

1个回答

请注意,您的伽马数据不为零,它们接近于零,因此您可以使用对数。如果您的实际数据确实包含零,并且您只使用倾斜的伽马在此处创建示例,则可以将数据移动一个小的以使其为正,然后获取日志。ϵ

set.seed(1)
gamma1 <- rgamma(10000, shape=0.05, rate=1)
gamma2 <- rgamma(10000, shape=0.055, rate=0.98)
gamma3 <- rgamma(10000, shape=0.06, rate=0.95)

我看到了两种可能性。您可以将 beanplots 与记录的数据一起使用,并通过ylim参数对齐它们。

library(beanplot)
opar <- par(mfrow=c(1,3))
    beanplot(gamma1,what=c(1,1,0,0),log="y",ylim=range(c(gamma1,gamma2,gamma3)),col="grey")
    beanplot(gamma2,what=c(1,1,0,0),log="y",ylim=range(c(gamma1,gamma2,gamma3)),col="grey")
    beanplot(gamma3,what=c(1,1,0,0),log="y",ylim=range(c(gamma1,gamma2,gamma3)),col="grey")
par(opar)

豆图

或者,如果你真的想比较你的三个分布,你可以在对数尺度上做成对的qq 图:

pairs(cbind(sort(gamma1),sort(gamma2),sort(gamma3)),log="xy",
  panel=function(x,y,...){points(x,y,pch=19,cex=0.2,...); abline(a=0,b=1)})

成对 qq 图

beanplot 强调所有三个数据集的极端偏度(注意日志),而成对的 qq 图强调数据集不同的,同时失去了偏度。