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

如何使用含Freq列的R数据框运行chisq.test()卡方检验?

带频数列的R数据框卡方检验正确做法

问题背景

现有如下汇总后的R数据框,包含分组、存活状态及对应频数:

# 数据框dput结构
structure(list(Freq = c(41L, 31L, 11L, 0L), group = structure(c(1L, 
1L, 2L, 2L), .Label = c("A", "B"), class = "factor"), Survived = structure(c(2L, 
1L, 2L, 1L), .Label = c("No", "Yes"), class = "factor")), row.names = c(NA, 
4L), class = "data.frame")

数据预览:

Freq group Survived
1   41     A      Yes
2   31     A       No
3   11     B      Yes
4    0     B       No

直接执行chisq.test(df$group, df$Survived)会忽略Freq列的频数权重,得到无意义结果:

> chisq.test(df$group, df$Survived)

    Pearson's Chi-squared test

data:  df$group and df$Survived
X-squared = 0, df = 1, p-value = 1

正确解决方案

这是频数汇总后的数据集,不是原始逐行记录,必须纳入Freq的权重才能得到正确结果,有两种常用方法:

方法1:先构建列联表再检验

用xtabs()函数基于频数列生成标准列联表,再对列联表执行卡方检验:

# 构建列联表
tab <- xtabs(Freq ~ group + Survived, data = df)
# 查看列联表
tab
# 执行卡方检验
chisq.test(tab)

方法2:直接指定weights参数

在chisq.test()中通过weights参数传入频数列,无需额外构建列联表:

chisq.test(df$group, df$Survived, weights = df$Freq)

注意事项

由于B组Survived="No"的频数为0,卡方检验会触发期望频数小于5的警告。若需更严谨的分析,可改用Fisher精确检验:

fisher.test(tab)

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:52:32