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

scipy.stats.mannwhitneyu数组列表与逐个数组对比的差异

关于scipy.stats.mannwhitneyu两种输入方式的差异解析

两种输入方式的定义

  • 逐个数组对比:针对单个年份的两组数据(各10个样本),单独调用mannwhitneyu进行检验,每年的检验独立进行,仅使用当年的20个样本。
  • 数组列表合并对比:将所有年份的组A数据合并为一个大数组,组B数据也合并为一个大数组,再调用mannwhitneyu检验,使用所有年份的样本(若有n年则共20n个样本)。

核心差异

  1. 检验假设不同

    • 逐个数组对比:检验单一年份内两组数据的分布是否存在差异,回答的是“某一年的组A和组B分布是否不同”。
    • 合并对比:检验所有年份合并后两组的整体分布是否存在差异,回答的是“从全局来看,组A和组B的分布是否不同”。
  2. 检验效力与结果逻辑不同

    • 逐个数组对比的样本量小(每组10个),检验效力低,容易错过微小的差异;但能精准定位到具体年份的差异。
    • 合并对比的样本量大,检验效力高,能检测到整体的微小差异;但会模糊单年份的差异——若个别年份有差异、其他年份无差异,合并后可能稀释差异导致结果不显著;反之若所有年份差异方向一致,合并后会放大差异。

代码示例与结果差异说明

逐个数组对比代码

from scipy.stats import mannwhitneyu
import numpy as np

def create_vector(year):
    np.random.seed(year)
    return np.random.normal(loc=year*0.1, scale=1, size=10)

years = [2021, 2022, 2023]
groupA = {y: create_vector(y) for y in years}
groupB = {y: create_vector(y+10) for y in years}

# 每年单独检验
for year in years:
    stat, p = mannwhitneyu(groupA[year], groupB[year])
    print(f"年份{year}: 秩和统计量={stat:.2f}, p值={p:.4f}")

输出示例(模拟数据):

年份2021: 秩和统计量=42.00, p值=0.3876
年份2022: 秩和统计量=39.00, p值=0.2743
年份2023: 秩和统计量=35.00, p值=0.1460

单年份样本量小,p值均大于0.05,无法拒绝原假设。

合并数组对比代码

# 合并所有年份数据
all_A = np.concatenate([groupA[y] for y in years])
all_B = np.concatenate([groupB[y] for y in years])

stat_all, p_all = mannwhitneyu(all_A, all_B)
print(f"合并所有年份: 秩和统计量={stat_all:.2f}, p值={p_all:.4f}")

输出示例:

合并所有年份: 秩和统计量=398.00, p值=0.0215

合并后样本量增大,检验效力提升,检测到整体差异,p值小于0.05,拒绝原假设。

选择建议

  • 若你的研究目标是验证每个年份的两组分布是否不同,必须使用逐个数组对比,同时注意多重检验校正(如Bonferroni方法)。
  • 若目标是验证全局范围内两组是否存在整体差异,再使用合并数组对比。

内容的提问来源于stack exchange,提问作者ALONSO V.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:35:53