分布未知的分位数-分位数图?

机器算法验证 分布
2022-03-19 14:37:10

N=2762

N=2762

我一直在探索一个似乎经常产生这种情节的数据集。你会说这是一个与正常人口不同的人口吗?还是两个群体混淆了正态分布?

它使用了 matplotlib 和 scipy.stats:

      (x,y), (slope, inter, cor) = stats.probplot(data, dist='norm')

      osmf = x.take([0, -1])  # endpoints
      osrf = slope * osmf + inter
      self.ax.plot(x, y, ',', osmf, osrf, '-', **self.kwargs)
3个回答

有多种不同的可能性。例如,自由度在 30-40 范围内的卡方分布会产生这样的 qq 图。在 R 中:

x <- rchisq(10000, df=35)
qqnorm(x)
qqline(x)

看起来像这样:

替代文字

但是,两个具有不同方法的法线的混合并不适用。

x <- c(rnorm(10000/2, mean=0), rnorm(10000/2, mean=2))
qqnorm(x)
qqline(x)

看起来像这样:

替代文字

请注意这些点是如何穿过线的,这是一种与您观察到的不同的模式。

您的数据集显然不正常。(有了这么多数据,任何拟合优度测试都会告诉您。)但是您可以从正态概率图中读取到更多信息:

  • 通常平滑的曲率并不暗示混合结构。

  • 上尾过于伸展(与参考分布相比值太高)。

  • 下尾太压缩(值也太高)。

这表明温和的Box-Cox 变换将产生接近正常或至少对称的数据。要找到它,请考虑该图上的一些关键值:在 x 值 0 上方找到的中位数约为 0.90;+2 标准差约为 0.99;-2 标准差约为 0.825。从简单的计算中可以看出非线性 0.99 - 0.90 = 0.09 而 0.90 - 0.825 = 0.075:从中值到上尾的上升大于从下尾到中值的上升。我们可以通过尝试仅对这三个值进行一些简单的重新表达来平衡斜率。 例如,取三个关键数据值的倒数(-1 的 Box-Cox 幂)给出

1/0.825 = 1.21
1/0.90  = 1.11; 1.21 - 1.11 = 0.10 (new slope is 0.050 per SD)
1/0.99  = 1.01; 1.11 - 1.01 = 0.10 (0.050 per SD)

因为重新表达值的斜率现在相等,所以我们知道数据的倒数图将在 -2 和 +2 SD 之间近似线性。作为检查,让我们在尾部进一步选择更多点,看看倒数对它们做了什么。我估计图中的平均值为 -3 SD 的值约为 0.79,平均值 +3 SD 的值为 1.05。所讨论的两个斜率等于每个 SD 的 0.053 和 0.052:彼此足够接近,并且与 -2 和 +2 SD 之间的斜率足够接近。

我的估计——基于监视器上显示的图——是粗略的,所以你会想用实际数据重复这些(简单、快速的)计算。然而,有相当多的证据表明,当通过简单的转换适当地重新表达您的数据时,您的数据将接近正态分布。

您可能需要查看 Anderson-Darling正态性检验,该检验根据经验检验您的数据是否来自给定分布。@chl 建议查看scipy工具包,特别anderson()morestats.py用于实现。