用Python进行Chi-Squared测试

Sab*_*lfy 26 python r scipy

我已经使用以下代码R来确定观察值(例如20,20,0和0)与预期值/比率的匹配程度(例如,四个案例中每个案例的25%):

> chisq.test(c(20,20,0,0), p=c(0.25, 0.25, 0.25, 0.25))

    Chi-squared test for given probabilities

data:  c(20, 20, 0, 0)

X-squared = 40, df = 3, p-value = 1.066e-08
Run Code Online (Sandbox Code Playgroud)

我怎样才能在Python中复制它?我尝试过使用这个chisquare函数scipy但是我得到的结果非常不同; 我不确定这是否是正确使用的功能.我搜索了scipy文档,但它运行到1000多页是相当艰巨的; 该numpy文件比增加近50%.

Fre*_*Foo 35

scipy.stats.chisquare期望观察到的和预期的绝对频率,而非比率.你可以获得你想要的东西

>>> observed = np.array([20., 20., 0., 0.])
>>> expected = np.array([.25, .25, .25, .25]) * np.sum(observed)
>>> chisquare(observed, expected)
(40.0, 1.065509033425585e-08)
Run Code Online (Sandbox Code Playgroud)

虽然在期望值均匀分布在类上的情况下,您可以省略预期值的计算:

>>> chisquare(observed)
(40.0, 1.065509033425585e-08)
Run Code Online (Sandbox Code Playgroud)

第一个返回值是χ2统计量,第二个是测试值的p值.


小智 7

只是想指出虽然答案看起来在语法上是正确的,但你不应该在你的例子中使用卡方分布,因为你观察到的频率太小而无法进行准确的卡方检验.

"当每个类别的观测或预期频率太小时,此测试无效.典型的规则是所有观测和预期的频率应至少为5." 请参阅:http: //docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chisquare.html#scipy.stats.chisquare

  • 据我所知,该规则仅基于*预期的*频率,而不是基于观察到的频率,所以这个例子(预期频率都等于10)应该没问题.如果*预期*频率太小,R会发出警告......例如,http://fds.oup.com/www.oup.com/pdf/13/9780199219995.pdf; http://www.stat.sfu.ca/~cschwarz/Stat-650/Notes%/PDFbigbook-JMP/JMP-part016.pdf; http://udel.edu/~mcdonald/statsmall.html(谷歌搜索结果"卡方预计'经验法则'").我不会贬低你,因为你正确引用了(不正确的)Scipy文档...... (2认同)