R语言中chisq.test如何读取四列单行计数数据得到正确统计量
问题根源
你之前传入chisq.test()的是1行4列的切片结果,R会默认把这个输入识别为单组、4个类别的频数分布,执行单样本拟合优度卡方检验,完全没有按照你需要的2×2列联表结构做独立性检验,因此输出结果偏差。
调整方法
不需要永久修改原有tibble的结构,只需要在传入检验函数时,临时把提取的4个频数按照列联表的维度规则,组装成2行2列的矩阵即可,核心要对齐两个规则:
- 矩阵的列依次对应primary、secondary两个教育阶段
- 矩阵的行依次对应yes RS、no RS两个RS状态
具体实现代码
因为R中matrix()函数默认按列填充元素,只要提取频数的顺序和列联表的列方向(每列的两个上下值)保持一致,就能自动匹配你需要的结构:
# 从原始tibble提取目标列的数值,按列顺序取数: # 第一列(primary)的上下值:yes RS、no RS # 第二列(secondary)的上下值:yes RS、no RS freq_vec <- as.numeric(sample[ , c( "total primary - yes RS", "total primary - no RS", "total secondary- yes rs", "total secondary- no rs" )]) # 将长度为4的向量设置为2行2列的矩阵,按列填充即可对齐列联表 dim(freq_vec) <- c(2, 2) # 执行卡方检验 chisq.test(freq_vec)
也可以把整个构造逻辑写在一行调用里,不需要中间变量:
chisq.test( matrix( as.numeric(sample[ , c( "total primary - yes RS", "total primary - no RS", "total secondary- yes rs", "total secondary- no rs" )]), nrow = 2, ncol = 2 ) )
注意事项
- 不要给
matrix()设置byrow = TRUE参数,否则会把元素按行填充,得到的矩阵第一行是138、29,第二行是6、0,完全和目标结构错位 - 构造完成的矩阵结构和你给出的列联表完全一致:
[,1] [,2] [1,] 138 6 [2,] 29 0 - 运行上述代码得到的输出会和你期望的结果完全匹配:
Pearson's Chi-squared test with Yates' continuity correction data: freq_vec X-squared = 0.31654, df = 1, p-value = 0.5737
内容的提问来源于stack exchange,提问作者user35131
相关产品推荐
相关产品推荐

