我嘗試使用 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
添加回答
舉報
0/150
提交
取消