以下是对上述 3 种方法如何工作的一般描述。
卡方方法通过将 bin 中的观察数量与基于分布的 bin 中预期的数量进行比较来工作。对于离散分布,bin 通常是离散的可能性或这些可能性的组合。对于连续分布,您可以选择切割点来创建 bin。许多实现此功能的函数将自动创建 bin,但如果您想在特定区域进行比较,您应该能够创建自己的 bin。这种方法的缺点是不会检测到理论分布和仍然将值放在同一个 bin 中的经验数据之间的差异,例如四舍五入,如果理论上应该将 2 和 3 之间的数字分布在整个范围内(我们希望看到像 2.34296 这样的值),
KS 检验统计量是被比较的 2 个累积分布函数之间的最大距离(通常是理论和经验)。如果 2 个概率分布只有 1 个交点,则 1 减去最大距离是 2 个概率分布之间的重叠区域(这有助于某些人可视化正在测量的内容)。考虑在同一个图上绘制理论分布函数和 EDF,然后测量两条“曲线”之间的距离,最大的差异是测试统计量,当空值为真时,它与值的分布进行比较。这捕获差异是分布的形状或 1 个分布与另一个相比发生偏移或拉伸。1n. 此测试取决于您了解参考分布的参数,而不是从数据中估计它们(您的情况在这里似乎很好)。如果您从相同的数据估计参数,那么您仍然可以通过与您自己的模拟而不是标准参考分布进行比较来获得有效的测试。
Anderson-Darling 测试也像 KS 测试一样使用 CDF 曲线之间的差异,但它不是使用最大差异,而是使用两条曲线之间总面积的函数(它实际上是对差异进行平方,对它们进行加权,因此尾部有更大的影响,然后在分布的域上集成)。与 KS 相比,这给离群值更多的权重,并且如果存在一些小的差异(与 KS 强调的 1 个大差异相比),也会赋予更大的权重。这可能最终会压倒测试以找到您认为不重要的差异(温和的四舍五入等)。与 KS 测试一样,这假设您没有从数据中估计参数。
这是一个图表,显示了最后 2 个的一般想法:
基于此 R 代码:
set.seed(1)
tmp <- rnorm(25)
edf <- approxfun( sort(tmp), (0:24)/25, method='constant',
yleft=0, yright=1, f=1 )
par(mfrow=c(3,1), mar=c(4,4,0,0)+.1)
curve( edf, from=-3, to=3, n=1000, col='green' )
curve( pnorm, from=-3, to=3, col='blue', add=TRUE)
tmp.x <- seq(-3, 3, length=1000)
ediff <- function(x) pnorm(x) - edf(x)
m.x <- tmp.x[ which.max( abs( ediff(tmp.x) ) ) ]
ediff( m.x ) # KS stat
segments( m.x, edf(m.x), m.x, pnorm(m.x), col='red' ) # KS stat
curve( ediff, from=-3, to=3, n=1000 )
abline(h=0, col='lightgrey')
ediff2 <- function(x) (pnorm(x) - edf(x))^2/( pnorm(x)*(1-pnorm(x)) )*dnorm(x)
curve( ediff2, from=-3, to=3, n=1000 )
abline(h=0)
上图显示了来自标准法线的样本的 EDF 与标准法线的 CDF 的比较,其中一条线显示了 KS 统计数据。然后中间的图表显示了 2 条曲线的差异(您可以看到 KS 统计数据出现的位置)。然后底部是平方的加权差,AD测试基于该曲线下的面积(假设我一切都正确)。
其他测试查看 qqplot 中的相关性,查看 qqplot 中的斜率,比较均值、var 和基于矩的其他统计数据。