转换数据集计算配对样本Wilcoxon符号秩检验:代码正确性及格式疑问
问题分析与解决方案
首先明确你的核心需求:比较服用Drug_1和Drug_2的独立人群的得分差值(Difference),这属于独立样本的非参数检验场景,你的原代码存在参数误用问题,以下是具体说明和修正方案:
原代码的错误点
你使用了paired = TRUE参数,但这个参数仅适用于配对样本(比如同一患者的前后测数据、配对的受试者组)。而你的数据中,Drug_1和Drug_2是互斥的独立人群(每个患者只服用一种药物),因此配对检验完全不适用,必须去掉这个参数。
无需转长格式的直接解法
你的数据当前是宽格式,已经可以直接用于分析:Drug_1列的1代表服用Drug_1的患者,0代表服用Drug_2的患者(因为两列互斥)。直接用非配对的Wilcoxon秩和检验(即Mann-Whitney U检验)即可:
wilcox.test(Difference ~ Drug_1, data = dt, paired = FALSE)
paired = FALSE是默认值,也可以省略不写,效果一致。
转长格式的优化解法(可选)
虽然宽格式能直接分析,但转成长格式可以让分组逻辑更直观,避免0/1变量的歧义。用tidyr包转换后,数据结构会更清晰:
library(tidyr) # 转换为长格式,筛选出实际服用的药物 dt_long <- dt %>% pivot_longer(cols = c(Drug_1, Drug_2), names_to = "Drug_Type", values_to = "Taken") %>% filter(Taken == 1) %>% select(-Taken) # 执行检验 wilcox.test(Difference ~ Drug_Type, data = dt_long)
转换后的dt_long中,Drug_Type列直接显示每个患者服用的药物,代码可读性更强,检验结果和宽格式的解法完全一致。
总结
- 原代码的关键错误是误用
paired = TRUE,必须移除该参数; - 宽格式可以直接完成分析,转长格式不是必须,但能提升代码的可读性和直观性;
- 两种解法的统计检验逻辑完全相同,都是比较两组独立样本的差值分布差异。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

