You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 11:36:04