p 值的非均匀分布

机器算法验证 分布 p 值 拟合优度 kolmogorov-smirnov 测试
2022-04-07 07:34:10

我正在运行 Monte Carlo 模拟,以检查我的模型生成的分布是否符合预定义的目标分布,其中目标分布的参数是根据数据估计的。

我针对目标分布对我的模拟输出进行了 KS 测试并检查了 p 值,它们始终很高(p~1),表明拟合确实很好。

就像一个感觉检查一样,我生成了 ~10^3 个样本来检查这些 p 值的分布。根据我在相同分布的零假设下的理解,这些 p 值应该是均匀分布的。

然而,奇怪的是,p 值的分布偏向 1(请参见下面的 p 值分布)——似乎过多的样本与目标分布非常吻合。

我正在努力理解如何解释这一点。显然,如果它偏向 0,则很明显样本不符合目标。应该如何解释所描述的相反情况?

KS 检验 p 值的分布

编辑:添加了在拟合过程中估计的参数。这似乎可以解释偏斜。

1个回答

正如whuber 所评论的:Kolmogorov-Smirnov 检验仅在与完全指定的分布进行比较时才有效您不能使用它来比较观察到的分布与根据您观察到的样本估计参数的分布。如果这样做,您的 p 值将不会在原假设下均匀分布,但会显示您观察到的确切模式。

不幸的是,这是一个非常常见的错误,您可以在在线教程中经常找到它。

作为一个小例子,让我们模拟一下x1,,x20N(0,1),然后首先针对完全指定的对象运行 KS 测试 N(0,1)分布,然后根据估计 N(μ^,σ^2)分布,其中μ^σ^2估计基于x1,,x20. 记录p价值。这样做 10,000 次。下面是直方图p价值观:

科尔莫哥洛夫-斯米尔诺夫

如您所见,p针对完全指定分布的测试值是均匀分布的,因为它们应该是均匀分布的,但来自拟合分布的值却不是。

n_sims <- 1e4
nn <- 20

pp_estimated <- pp_specified <- rep(NA,n_sims)
pb <- winProgressBar(max=n_sims)
    for ( ii in 1:n_sims ) {
        setWinProgressBar(pb,ii,paste(ii,"of",n_sims))
        set.seed(ii)
        sim <- rnorm(nn)
        pp_specified[ii] <- ks.test(sim,y="pnorm",mean=0,sd=1)$p
		pp_estimated[ii] <- ks.test(sim,y="pnorm",mean=mean(sim),sd=sd(sim))$p
    }
close(pb)

opar <- par(mfrow=c(1,2))
    hist(pp_specified,main="Parameters specified",xlab="",col="lightgray")
    hist(pp_estimated,main="Parameters estimated",xlab="",col="lightgray")
par(opar)

如果您假设的参考分布是正态的,但您需要估计均值和方差,则 Lilliefors 检验将是合适的。其他方法可能适用于其他分布类型。您可能想针对您感兴趣的分发类型提出特定问题。

我不知道一般框架拟合分布的检验。(作为一个极端的例子,你总是可以使用你观察到的数据的经验分布。当然,拟合会很完美。但这也可能不会提供很多信息。)

编辑-我只是在这里问了一般性问题:拟合分布的拟合优度