我在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%。
答案 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代码。你可以这样做: