【问题标题】:chi squared computation using scipy使用 scipy 进行卡方计算
【发布时间】:2020-04-14 06:27:14
【问题描述】:

我尝试使用 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

我不知道怎么了。

【问题讨论】:

    标签: python numpy scipy statistics


    【解决方案1】:

    没有错!您看到的差异是因为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]: x2
    Out[14]: 21.54882154882155
    
    In [15]: p
    Out[15]: 3.449345750127958e-06
    

    【讨论】:

    • 谢谢!这里,修正是指耶茨对连续性的修正?我不知道,所以你帮了我很多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多