許多 p 值的均勻分佈是否提供了 H0 為真的統計證據?
單個統計檢驗可以證明原假設 (H0) 為假,因此備擇假設 (H1) 為真。但它不能用來證明 H0 是真的,因為沒有拒絕 H0 並不意味著 H0 是真的。
但是讓我們假設您有可能進行多次統計測試,因為您有許多數據集,它們彼此獨立。所有數據集都是同一過程的結果,您希望對過程本身進行一些陳述(H0/H1),並且對每個測試的結果不感興趣。然後,您收集所有生成的 p 值,並碰巧通過直方圖看到 p 值明顯均勻分佈。
我現在的推理是,只有當 H0 為真時才會發生這種情況——否則 p 值的分佈會不同。因此,這是否足以證明 H0 為真?還是我在這裡遺漏了一些重要的東西,因為我花了很多意志力來寫“結論 H0 是真的”,這在我的腦海中聽起來非常錯誤。
我喜歡你的問題,但不幸的是我的回答是否定的,這並不能證明 $ H_0 $ . 原因很簡單。你怎麼知道 p 值的分佈是均勻的?您可能必須運行一致性測試,這將返回您自己的 p 值,並且您最終會遇到與您試圖避免的相同類型的推理問題,僅一步之遙。而不是查看原始的 p 值 $ H_0 $ , 現在你看看另一個的 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()