我需要使用python对以下交叉表ct
执行独立性测试:
的数据
因为有一些值小于5,所以我不能执行卡方独立性检验。相反,我需要执行Fisher精确检验。
由于Fisher在Scipy上的精确测试实现仅支持2x2表,因此我实现了以下解决方案:
from scipy.stats import fisher_exact
# Combine rows and columns to create a 2x2 table
table_2x2 = np.array([[ct[1][4] + ct[2][4] + ct[1][3] + ct[2][3], ct[3][4] + ct[4][4] + ct[3][3] + ct[3][3]],
[ct[1][2] + ct[2][2] + ct[1][1] + ct[2][1], ct[3][2] + ct[4][2] + ct[3][1] + ct[4][1]]])
# Perform Fisher's exact test on the 2x2 table
odds_ratio, p_value = fisher_exact(table_2x2)
# Display the results
print(f'Odds Ratio: {odds_ratio}')
print(f'P-value: {p_value}')
字符串
这是一个有效的解决方案吗?如果不是,有没有其他建议在Python中实现它?
2条答案
按热度按时间alen0pnh1#
如果没有,有没有其他建议在Python中实现它?
如果您愿意接受随机排列检验,您可以使用
scipy.stats.permutation_test
创建自己的检验。我们将使用与scipy.stats.chi2_contingency
相同的检验统计量,但零假设将类似于Fisher精确检验。字符串
对于原始帖子中显示的列联表,与卡方检验相比,p值几乎没有差异。尽管表中的一些计数很小,但我们的随机排列检验的零分布似乎与卡方分布非常相似,具有适当的自由度:
型
的数据
有关测试背后的理论(呃,直觉)的更多信息,请参阅关于Resampling and Monte Carlo Methods,特别是2c,Correlated Sample Permuation Tests的SciPy教程。
ycggw6v22#
这是我想到的另一个答案:我们可以执行Monte Carlo测试,而不是排列测试,这在概念上更简单。
字符串
的数据
p值之间存在非常好的一致性,并且渐近检验和Monte Carlo检验的零分布似乎匹配。
假设你对小的p值感兴趣,更有用的是生存函数概率对另一个的图。这将告诉你渐近检验在显著性阈值附近是太保守还是不够保守(对于类似的列联表):
型
的
它们非常接近,所以对于这个列联表(至少),渐近卡方检验是相当安全的。