我喜欢你的问题,但不幸的是我的回答是否定的,这并不能证明H0. 原因很简单。你怎么知道 p 值的分布是均匀的?您可能必须运行一致性测试,这将返回您自己的 p 值,并且您最终会遇到与您试图避免的相同类型的推理问题,仅一步之遥。而不是查看原始的 p 值H0, 现在你看看另一个的 p 值H′0关于原始 p 值分布的均匀性。
更新
这是演示。我从高斯和泊松分布中生成 100 个观测值的 100 个样本,然后为每个样本的正态性检验获得 100 个 p 值。因此,问题的前提是,如果 p 值来自均匀分布,则证明原假设是正确的,这比统计推断中通常的“无法拒绝”要强。问题在于“p 值来自统一”本身就是一个假设,您必须以某种方式对其进行测试。
在下面的图片(第一行)中,我显示了来自高斯和泊松样本的正态性检验的 p 值直方图,您可以看到很难说一个是否比另一个更均匀。这是我的主要观点。
第二行显示来自每个分布的样本之一。样本相对较小,因此您确实不能拥有太多垃圾箱。实际上,这个特殊的高斯样本在直方图上看起来一点也不像高斯。
在第三行中,我在直方图上显示每个分布的 10,000 个观测值的组合样本。在这里,您可以拥有更多的 bin,并且形状更加明显。
最后,我运行相同的正态性检验并获得组合样本的 p 值,它拒绝泊松的正态性,而拒绝高斯的正态性。p 值为:[0.45348631] [0.]
当然,这不是证明,而是证明您最好在组合样本上运行相同的测试,而不是尝试分析子样本中 p 值的分布。
这是Python代码:
import numpy as np
from scipy import stats
from matplotlib import pyplot as plt
def pvs(x):
pn = x.shape[1]
pvals = np.zeros(pn)
for i in range(pn):
pvals[i] = stats.jarque_bera(x[:,i])[1]
return pvals
n = 100
pn = 100
mu, sigma = 1, 2
np.random.seed(0)
x = np.random.normal(mu, sigma, size=(n,pn))
x2 = np.random.poisson(15, size=(n,pn))
print(x[1,1])
pvals = pvs(x)
pvals2 = pvs(x2)
x_f = x.reshape((n*pn,1))
pvals_f = pvs(x_f)
x2_f = x2.reshape((n*pn,1))
pvals2_f = pvs(x2_f)
print(pvals_f,pvals2_f)
print(x_f.shape,x_f[:,0])
#print(pvals)
plt.figure(figsize=(9,9))
plt.subplot(3,2,1)
plt.hist(pvals)
plt.gca().set_title('True Normal')
plt.gca().set_ylabel('p-value')
plt.subplot(3,2,2)
plt.hist(pvals2)
plt.gca().set_title('Poisson')
plt.gca().set_ylabel('p-value')
plt.subplot(3,2,3)
plt.hist(x[:,0])
plt.gca().set_title('a small sample')
plt.gca().set_ylabel('x')
plt.subplot(3,2,4)
plt.hist(x2[:,0])
plt.gca().set_title('a small Sample')
plt.gca().set_ylabel('x')
plt.subplot(3,2,5)
plt.hist(x_f[:,0],100)
plt.gca().set_title('Full Sample')
plt.gca().set_ylabel('x')
plt.subplot(3,2,6)
plt.hist(x2_f[:,0],100)
plt.gca().set_title('Full Sample')
plt.gca().set_ylabel('x')
plt.show()