[英]The distribution of p-values is not uniform when applying t-test to random coin flips from Python's random.randint(0,1)
理論上,p 值在 null 假設下均勻分布。
因此,當我使用 Python 的random.randint(0,1)
將其應用於一些隨機硬幣翻轉模擬時,我希望 G 檢驗或卡方檢驗的 p 值能夠檢驗相等的比例以提供均勻分布的 p 值,這應該是無偏隨機硬幣,即伯努利 (0.5)。
同樣,如果 n*p 足夠大,t 檢驗背后的假設就變得合理,我們希望 t 檢驗也能給出均勻分布的 p 值。
然而,這不是我憑經驗看到的。
I plot 樣本大小為 20k 的重復實驗的 p 值直方圖,使用以下代碼段:
from scipy import stats
from matplotlib import pyplot as plt
ps = []
for i in range(5000):
heads = [random.randint(0,1) for _ in range(20000)]
tails = [1-x for x in heads]
p = stats.ttest_ind(heads, tails).pvalue
ps.append(p)
plt.hist(ps, 100)
這導致以下 p 值分布,這似乎比預期更頻繁地給出接近 0 的 p 值。 請注意,這不是由於 t 檢驗的近似值,因為我在插入卡方檢驗或 G 檢驗時發現了類似的 p 值分布。
我在這里遇到的情況是 Python 的偽隨機數生成器(基於 Mersenne Twister 算法)根本沒有足夠好的統計特性並且隨機性不夠嗎? 還是我在這里還缺少其他東西?
正如 Sam Mason 在評論中指出的那樣,雙分布 t 應該具有獨立樣本。 給定運行中正面和反面的數量呈負相關,因此您的程序並沒有測量您認為的結果。
以下代碼生成相對均勻的直方圖。 考慮到涉及的數量,在我的筆記本電腦上需要幾分鍾的時間。
from scipy import stats
from matplotlib import pyplot as plt
ps = []
for i in range(5000):
heads = stats.bernoulli.rvs(0.5, size=2000000)
p = stats.ttest_1samp(heads, popmean=0.5).pvalue
ps.append(p)
plt.hist(ps, 50)
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.