用Python进行Chi-Squared测试

时间:2012-02-17 14:36: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

我如何在Python中复制它?我已尝试使用chisquare中的scipy函数,但我获得的结果非常不同;我不确定这是否是正确的功能。我在scipy文档中进行了搜索,但是当它运行到1000多页时,它非常令人生畏; numpy文档几乎比那个文档多50%。

3 个答案:

答案 0 :(得分: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)

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

>>> chisquare(observed)
(40.0, 1.065509033425585e-08)

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:2)

另一种方法是从python调用你的R代码。你可以这样做:

  • 使R脚本作为命令行工具运行。有关使用Rscript从命令行运行R脚本的详细信息,请参阅this link。然后,您可以通过python使用subprocessos.system执行系统调用来运行R脚本。任何数据交换都是通过文本或二进制文件完成的。我喜欢这种方法,因为它非常简单,并且很容易调试与Python代码分开的R脚本。缺点是所有数据都通过硬盘驱动器,这可能会非常慢。
  • 使用rpyrpy2直接从python中运行R代码。通过这种方式,集成更紧凑,但这个链接也引入了自己的小怪癖。例如,根据我的经验,调试通过rpy调用的R代码有点难以调试。