如何使用含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
相关产品推荐
相关产品推荐

