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

相同数据在Python与R中执行Kruskal检验得到不同p值的原因排查

Python与R中Kruskal检验结果差异的原因

你遇到的差异核心原因是R代码的调用方式错误,导致函数对输入数据的分组逻辑完全理解错了:

  • Python的scipy.stats.kruskal支持直接传入多个独立样本向量(每个向量对应一个组),你的Python代码正确传递了3个组(x、y、z各14个观测值),因此计算出的结果是正确的。
  • R的kruskal.test函数不支持直接传入多个独立样本向量作为参数。你原有的R代码kruskal.test(x,y,z)被函数误解为:将14个位置上的x、y、z值视为14个独立组(每组3个观测值),而非3个组(每组14个观测值)。这就导致计算时自由度为14-1=13,完全偏离了你的分析需求,最终得到错误的p值。

正确的R调用方式

需要先将数据整理为长格式(一个数值向量+一个分组因子),再用公式形式传入函数:

library(stats)
x <- c(22.293, 23.621, 25.536, 27.322, 28.872, 30.385, 32.621, 35.111, 37.418, 39.607, 41.381, 43.107, 44.747, 46.602)
y <- c(29.989, 30.184, 29.567, 28.403, 28.166, 28.815, 30.083, 31.520, 32.786, 33.954, 35.105, 35.959, 36.590, 37.173)
z <- c(19.416, 19.798, 19.493, 18.797, 19.024, 19.031, 19.547, 20.246, 21.474, 22.908, 24.534, 26.458, 28.344, 30.222)

# 整理成长格式数据框
df <- data.frame(
  value = c(x, y, z),
  group = rep(c("x", "y", "z"), each = length(x))
)

# 执行Kruskal检验
kruskal.test(value ~ group, data = df)

运行这段代码后,得到的结果会和Python一致:统计量约为21.43,p值约为2.22e-05。

内容的提问来源于stack exchange,提问作者Joseph_Wesleyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:01:06