R语言中分类数据的组间与组内选项选择差异分析问题
问题解决与分析实现
一、报错原因说明
你之前的代码逻辑错误:group_by(diagnosis, Q1) 会将数据拆分为「单个诊断组+单个Q1选项」的细分组,此时调用 count(Q1) 是对单个字符值调用计数函数,不符合count()的使用规则(它需要作用于数据框)。正确的做法是先构建诊断组与选项的列联表,再执行卡方检验。
二、组间差异分析(诊断组vs健康组,单题目选项分布差异)
针对每个题目,检验两组在选项选择上的分布差异,步骤如下:
1. 数据格式转换(宽转长)
先将多列题目转为长格式,方便批量处理:
library(tidyverse) library(broom) # 用于整理统计检验结果 # 宽转长,同时处理缺失值(将NA转为明确类别) long_df <- mydf %>% pivot_longer(cols = starts_with("Q"), names_to = "question", values_to = "option") %>% mutate(option = replace_na(option, "Missing"))
2. 批量卡方检验(含校正)
按题目分组,每组构建诊断组与选项的列联表,执行卡方检验,并做多重检验校正:
group_comparison <- long_df %>% group_by(question) %>% summarise(tidy(chisq.test(table(diagnosis, option)))) %>% # 30题需做多重检验校正,这里用Bonferroni方法 mutate(p_adjusted = p.adjust(p.value, method = "bonferroni")) # 查看结果 print(group_comparison)
替代方案:Fisher精确检验
如果列联表存在单元格期望频数<5的情况,卡方检验可靠性下降,可替换为Fisher精确检验:
group_comparison_fisher <- long_df %>% group_by(question) %>% summarise(tidy(fisher.test(table(diagnosis, option)))) %>% mutate(p_adjusted = p.adjust(p.value, method = "bonferroni"))
三、组内差异分析(同一诊断组内,不同题目选项分布差异)
针对每个诊断组,检验组内不同题目间的选项选择是否存在分布差异:
within_group_comparison <- long_df %>% group_by(diagnosis) %>% summarise(tidy(chisq.test(table(question, option)))) # 查看结果 print(within_group_comparison)
四、完整可运行代码示例
library(tidyverse) library(broom) # 模拟你的数据框(可替换为真实数据) mydf <- tibble( ID = c("x", "y", "z", "ad", "tgfg", "gfgh", "asj", "gh", "sdf", "asdgz"), diagnosis = c("yes", "no", "yes", "yes", "yes", "no", "yes", "no", "no", "no"), Q1 = c("A", "B", "A", NA, "C", "C", "D", "A", "B", "D"), Q2 = c("D", "D", "D", "C", "E", NA, "A", "A", "A", "A"), Q3 = c("B", "B", "C", "A", NA, "A", "B", "D", "E", "B"), Q4 = c("B", "A", "C", "C", "C", "C", "D", "B", NA, "A") ) # 数据预处理 long_df <- mydf %>% pivot_longer(cols = starts_with("Q"), names_to = "question", values_to = "option") %>% mutate(option = replace_na(option, "Missing")) # 组间差异分析 group_comparison <- long_df %>% group_by(question) %>% summarise(tidy(chisq.test(table(diagnosis, option)))) %>% mutate(p_adjusted = p.adjust(p.value, method = "bonferroni")) cat("=== 组间差异分析结果 ===\n") print(group_comparison) # 组内差异分析 within_group_comparison <- long_df %>% group_by(diagnosis) %>% summarise(tidy(chisq.test(table(question, option)))) cat("\n=== 组内差异分析结果 ===\n") print(within_group_comparison)
内容的提问来源于stack exchange,提问作者dplyr
相关产品推荐
相关产品推荐

