首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用stats.chi2_contingency()运行卡方检验的异常结果

用stats.chi2_contingency()运行卡方检验的异常结果
EN

Stack Overflow用户
提问于 2022-09-30 20:22:49
回答 1查看 99关注 0票数 0

我正在对一些与种族有关的分类值进行一次卡方检验,以及不同种族群体是否参加了一个诊所。由于这个数据中有十几个不同的种族,我把它们分成“白色”、“黑色”和“其他”,只是为了测试(因为相关性表明大多数活动发生在“白人”和“黑人”之间)。然而,使用Python的.chi2_contingency()方法,我得到的结果看起来很不寻常。下表如下:

代码语言:javascript
复制
    Appointment Status    No    Yes

Black                    9170   33372
White                    15137  152307
Other                    8864   56165

Python方法返回以下内容:

代码语言:javascript
复制
X^2: 5207.16
p-value: 0.0
df: 2
expected values array:  array([[  5131.21350472,  37410.78649528],
                               [  7843.48838791,  57185.51161209],
                               [ 20196.29810738, 147247.70189262]]))

df是好的,但卡方值和p值似乎都不正确。有没有人能看到,我在方法上做的事情可能产生了这些值,或者在Python中有什么东西在幕后做着这样的事情?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-10-01 08:39:00

测试统计和p值是正确的(也许也是可以理解的)。让我逐步解释一下结果。在维基百科(https://en.wikipedia.org/wiki/Chi-squared_test#Example_chi-squared_test_for_categorical_data)上,题为“维基百科”(https://en.wikipedia.org/wiki/Chi-squared_test#Example_chi-squared_test_for_categorical_data)中的分类数据的“类数据”的样本检验的章节(https://en.wikipedia.org/wiki/Chi-squared_test#Example_chi-squared_test_for_categorical_data)也可能会有所帮助。

  • ,期望计数是如果我们假设独立的话,最终会出现在表中的一个给定单元格中的观测数。黑和黑的分数分别为0.15468974和0.12061524。在独立的情况下,我们期望样本中的observations).
  • All观测值被标记为Black和No (注: 275015是0.15468974x0.12061524x275015=5131.21350472的总数,其他期望计数是相似的)。请注意,期望计数和观察计数(即表中的数字)之间的差异相当大。这应该是独立的空假设可能是错误的第一个指示。
  • 计算测试统计量,对单元格中的每个元素计算(Obs)^2/Exp,并对表中的所有元素进行求和。其结果确实是5207.162302393083 (参见下面的代码)。在空假设下,这个检验统计量是由2df分布的chi2 (正如您已经提到的)。与此分布相比,值5207.162302393083确实处于分布的尾部,因此很难在独立性为零的情况下观察到此结果。因此p值等于零。

下面发布的代码复制了所有的数字,并以2自由度绘制了chi2发行版的PDF。我希望这能帮到你。

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import chi2

# Data and properties
TrueCounts = np.array( [ [9170,33372],[15137,152307],[8864,56165] ])
Datadimension = TrueCounts.shape
TotalCounts = np.sum(TrueCounts)
print(TotalCounts)

# Fractions
fracAnswer = np.sum(TrueCounts, axis=0)/TotalCounts
fracRace = np.sum(TrueCounts, axis=1)/TotalCounts

# Caculate expected counts
ExpCounts = np.zeros(np.shape(TrueCounts))
for iter1 in range(Datadimension[0]):
    for iter2 in range(Datadimension[1]):
        ExpCounts[iter1, iter2] = fracRace[iter1]*fracAnswer[iter2]*TotalCounts


print('=== True and expected counts ===')
print(fracAnswer)
print(fracRace)

print('=== True and expected counts ===')
print(TrueCounts)
print(ExpCounts)

print('=== Test summary ===')
TestStat = np.sum( (TrueCounts-ExpCounts)**2/ExpCounts )
print(TestStat)

# Make ch2 plot for comparison
x = np.arange(0, 20, 0.05)
plt.plot(x, chi2.pdf(x, df=2))
plt.show()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73913631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档