簡體   English   中英

將 t 檢驗應用於來自 Python 的 random.randint(0,1) 的隨機硬幣翻轉時,p 值的分布不均勻

[英]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()

顯示均勻性的 p 值直方圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM