使用 scipy 进行卡方计算

我尝试使用 scipy 进行卡方检验,如下所示


import numpy as np

import scipy

vals = np.array([[70, 20], [50, 60]])

x2, p, dof, expected = scipy.stats.chi2_contingency(vals)


print('x2 = {:.5f}'.format(x2))

print('p-value = {}'.format(p))

print(expected)

a = scipy.stats.chisquare(f_obs= vals,   # Array of observed counts

                f_exp= expected)

我有

  • x2 = 20.22306

  • p 值 = 6.8917007718498866e-06

  • [[54。36.] [66. 44.]]

但是,这个结果与我的实现不同。

def Chi2_test(vals, k=1):

    r, c = vals.shape

    a_sum = vals.sum(axis=0)

    b_sum = vals.sum(axis=1)

    S = vals.sum()


    Pa= a_sum / S

    Pb = b_sum / S


    Pa = np.tile(Pa, c).reshape(r, c)

    Pb = np.repeat(Pb, c).reshape(r, c)


    Pab = Pa * Pb

    E = Pab * S


    x2 = np.sum(((vals - E) ** 2) / E)


    # chi square -> p value

    # Gamma function

    def Gamma(x):

        if x == 1:

            return 1

        elif x == 0.5:

            return np.sqrt(np.pi)

        else:

            return (x - 1) * Gamma(x - 1)


    # chi square   

    def Chi2(x, k):

        return (x ** (k / 2 - 1)) * (np.exp(- x / 2)) / ((2 ** (k / 2)) * Gamma(k / 2))


    p_value = integrate.quad(lambda x: Chi2(x, k=k), x2, np.inf)[0]


    return x2, p_value


vals = np.array([[70, 20],

                 [50, 60]])


x2, p_value = Chi2_test(vals)

print('x2 :', x2)

print('p-value :', p_value)

x2:21.548821548821547

p值:3.449345362777984e-06

我不知道怎么了。


喵喔喔
浏览 164回答 1
1回答

幕布斯6054654

没有什么是错的!您看到的差异是因为scipy.stats.chi2_contingency当输入数组为 2x2 时应用了“连续性校正”。您可以通过传入参数来禁用此更正correction=False。有了这个,输出匹配你的计算:In [12]: vals = np.array([[70, 20], [50, 60]])In [13]: x2, p, dof, expected = scipy.stats.chi2_contingency(vals, correction=False)In [14]: x2Out[14]: 21.54882154882155In [15]: pOut[15]: 3.449345750127958e-06
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python