R语言kruskal.test两种调用方式结果差异的原因咨询
Kruskal-Wallis检验两种调用方式的差异解析
核心结论
不能用kruskal.test(a,b,c,d,e)这种方式执行Kruskal-Wallis检验,这种调用实际执行的是Friedman配对秩和检验,和Kruskal-Wallis的适用场景完全不同,这就是结果差异巨大的原因。
两种调用的本质区别
公式格式调用(纵向数据)
当你用kruskal.test(Response~Group, data = data)时,函数针对的是独立样本设计:Response是所有组的响应值,Group是对应的分组标签,检验的是多个独立组的总体分布是否存在差异,这正是Kruskal-Wallis检验的标准用法,你得到的p=0.018是正确的独立样本检验结果。直接传入多列(宽格式数据)
当你直接传入多列kruskal.test(a,b,c,d,e)时,R会自动将这些列视为配对样本(即每一行代表同一个观测对象在不同条件下的重复测量值),此时执行的是Friedman秩和检验——这种检验用于分析配对设计下多个相关组的分布差异,和Kruskal-Wallis的独立样本假设完全冲突,所以得到的p=0.48是配对检验的结果,和你想要的Kruskal-Wallis无关。
宽格式数据正确执行Kruskal-Wallis的方法
如果你的数据是宽格式(每列对应一个独立组),有两种正确方式调用Kruskal-Wallis检验:
- 方法1:转成纵向格式
用tidyr包的pivot_longer函数将宽格式转成响应值+分组标签的纵向格式,再用公式接口:library(tidyr) # 假设宽格式数据名为data_wide,列是A-E data_long <- pivot_longer(data_wide, cols = A:E, names_to = "Group", values_to = "Response") kruskal.test(Response~Group, data = data_long) - 方法2:传入列表
将每一组的数据放进一个列表中,直接传入kruskal.test:kruskal.test(list(data_wide$A, data_wide$B, data_wide$C, data_wide$D, data_wide$E))
以上两种方法得到的结果会和纵向格式的公式调用一致,都是正确的Kruskal-Wallis检验结果。
内容的提问来源于stack exchange,提问作者BrisketsBestie
相关产品推荐
相关产品推荐

