为了账号安全,请及时绑定邮箱和手机立即绑定

使用 scipy 进行卡方计算

使用 scipy 进行卡方计算

喵喔喔 2022-10-05 16:26:03
我尝试使用 scipy 进行卡方检验,如下所示import numpy as npimport scipyvals = 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.22306p 值 = 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_valuevals = np.array([[70, 20],                 [50, 60]])x2, p_value = Chi2_test(vals)print('x2 :', x2)print('p-value :', p_value)x2:21.548821548821547p值:3.449345362777984e-06我不知道怎么了。
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

没有什么是错的!您看到的差异是因为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


查看完整回答
反对 回复 2022-10-05
  • 1 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号