为何R语言chisq.test函数未执行Yates校正?
关于R中chisq.test未执行Yates校正的疑问与解释
问题背景
我在R中尝试使用chisq.test()对以下数据进行卡方检验:
原始数据
x <- c("1", "1", "1", "1", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "2", "1", "1", "1", "1", "2", "2", "2", "1", "1", "1", "2", "1", "2", "1", "1", "1", "2", "2", "2", "1", "2", "1", "1", "2", "1", "1", "1", "1", "1", "2", "1", "1", "1", "2", "1", "1", "1", "2", "1", "1", "1", "2", "2", "1", "1", "1", "1", "2", "1", "1", "1", "1", "2", "1", "2", "1", "1", "1", "2", "1", "2", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "2", "1", "2", "1", "2", "3", "1", "2", "1", "1", "3", "2", "2", "1", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "1", "1", "1", "2") y <- c("1", "1", "1", "1", "2", "2", "1", "1", "1", "1", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "2", "1", "1", "1", "2", "1", "2", "1", "2", "1", "2", "2", "1", "1", "2", "1", "2", "2", "1", "1", "1", "1", "1", "1", "2", "1", "2", "1", "1", "1", "1", "1", "2", "1", "1", "1", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "1", "1", "1", "2", "2", "2", "1", NA, "2", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "2", "2", "1", "1", "2", "2", "1", "2", "2", "2", "2", "1", "1", "1", NA, "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "1", "1", "1", "1", "2", "1", "1", "1", "1")
频数分布
x 1 2 3 121 35 2 y 1 2 NA 120 36 2
卡方检验输出
我已知chisq.test()默认参数correct=T,且当单元格频数n<5时应执行带Yates校正的Pearson卡方检验,但实际运行后仅得到常规Pearson卡方检验结果:
Warning: Chi-squared approximation may be incorrect Pearson's Chi-squared test data: df$eq_5d_movilidad and df$eq_5d_mov_fin X-squared = 34.842, df = 2, p-value = 2.718e-08
补充说明:列联表(gmodels包生成)
我已将向量水平设置为("1","2","3"),并使用gmodels生成列联表:
Cell Contents |-------------------------| | N | | Chi-square contribution | | N / Row Total | | N / Col Total | | N / Table Total | |-------------------------| Total Observations in Table: 158 | y x | 1 | 2 | Row Total | -------------|-----------|-----------|-----------| 1 | 106 | 15 | 121 | | 1.691 | 5.731 | | | 0.876 | 0.124 | 0.766 | | 0.869 | 0.417 | | | 0.671 | 0.095 | | -------------|-----------|-----------|-----------| 2 | 16 | 19 | 35 | | 4.498 | 15.243 | | | 0.457 | 0.543 | 0.222 | | 0.131 | 0.528 | | | 0.101 | 0.120 | | -------------|-----------|-----------|-----------| 3 | 0 | 2 | 2 | | 1.544 | 5.233 | | | 0.000 | 1.000 | 0.013 | | 0.000 | 0.056 | | | 0.000 | 0.013 | | -------------|-----------|-----------|-----------| Column Total | 122 | 36 | 158 | | 0.772 | 0.228 | | -------------|-----------|-----------|-----------|
疑问
为何未执行Yates校正?这一情况该如何解释?
解释
Yates校正仅针对2×2的列联表,这是R中chisq.test()的内置逻辑:当列联表维度是2行2列时,correct=T才会自动应用Yates连续性校正;而你的列联表是3×2的(x有3个水平,y有2个有效水平),因此即使存在单元格频数<5的情况,也不会触发Yates校正。
另外,输出的警告Chi-squared approximation may be incorrect已经提示,列联表中存在期望频数过低的单元格(比如x=3、y=1的单元格观测频数为0,期望频数必然也很低),此时卡方检验的近似效果不佳,更适合使用Fisher精确检验(通过fisher.test()执行),或者合并低频数的类别后再做卡方检验。
这一规则在chisq.test()的官方文档中有明确说明:correct参数仅在2×2表时生效。
内容的提问来源于stack exchange,提问作者Jorge A
相关产品推荐
相关产品推荐

