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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:50:24