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

如何在Python的for循环中批量执行Wilcoxon符号秩检验?

问题描述

我有多组数值向量,示例如下:

hc_mcp = [0.45, 0.43, 0.46, 0.46, 0.45, 0.39, 0.48, 0.47, 0.50, 0.45, 0.47, 0.47, 0.46]
hc_pct = [0.44, 0.48, 0.45, 0.46, 0.47, 0.37, 0.56, 0.46, 0.49, 0.53, 0.46, 0.47, 0.48]
hc_gcc = [0.51, 0.56, 0.57, 0.54, 0.55, 0.58, 0.51, 0.54, 0.55, 0.54, 0.55, 0.53, 0.54]
hc_bcc = [0.56, 0.62, 0.64, 0.63, 0.60, 0.65, 0.60, 0.64, 0.64, 0.61, 0.63, 0.58, 0.63]
hc_scc = [0.68, 0.73, 0.74, 0.71, 0.72, 0.73, 0.70, 0.72, 0.72, 0.72, 0.71, 0.67, 0.73]

tw_mcp = [0.47, 0.46, 0.44, 0.48, 0.45, 0.45, 0.46, 0.44, 0.47, 0.46, 0.50, 0.49, 0.48]
tw_pct = [0.46, 0.48, 0.45, 0.48, 0.47, 0.45, 0.46, 0.43, 0.43, 0.49, 0.49, 0.47, 0.44]
tw_gcc = [0.56, 0.56, 0.55, 0.57, 0.52, 0.56, 0.53, 0.55, 0.55, 0.55, 0.56, 0.55, 0.56]
tw_bcc = [0.62, 0.63, 0.60, 0.63, 0.61, 0.63, 0.62, 0.63, 0.63, 0.62, 0.63, 0.61, 0.65]
tw_scc = [0.71, 0.70, 0.70, 0.71, 0.68, 0.74, 0.72, 0.73, 0.70, 0.68, 0.69, 0.70, 0.71]

需要为每一组对应名称的向量(如hc_mcp与tw_mcp、hc_pct与tw_pct等)计算Wilcoxon符号秩检验。由于向量数量较多(每组48个,共3组,总计144个),不想重复编写如下代码:

res = wilcoxon(hc_mcp, tw_mcp)
p = res.pvalue

res = wilcoxon(hc_pct, tw_pct)
p = res.pvalue

我尝试了类似的for循环写法,但知道是错误的,希望得到正确实现:

for rois in roi_jhu:
res = wilcoxon(ri_%s, hc_%s) %(rois)
p = res.pvalue
ri_hc_pvals.append(p)
解决方案

方法1:用字典组织数据(推荐)

先把所有向量按类别和名称整理到字典里,遍历起来更清晰,也避免直接操作全局变量:

from scipy.stats import wilcoxon

# 整理hc组数据
hc_data = {
    'mcp': [0.45, 0.43, 0.46, 0.46, 0.45, 0.39, 0.48, 0.47, 0.50, 0.45, 0.47, 0.47, 0.46],
    'pct': [0.44, 0.48, 0.45, 0.46, 0.47, 0.37, 0.56, 0.46, 0.49, 0.53, 0.46, 0.47, 0.48],
    'gcc': [0.51, 0.56, 0.57, 0.54, 0.55, 0.58, 0.51, 0.54, 0.55, 0.54, 0.55, 0.53, 0.54],
    'bcc': [0.56, 0.62, 0.64, 0.63, 0.60, 0.65, 0.60, 0.64, 0.64, 0.61, 0.63, 0.58, 0.63],
    'scc': [0.68, 0.73, 0.74, 0.71, 0.72, 0.73, 0.70, 0.72, 0.72, 0.72, 0.71, 0.67, 0.73]
}

# 整理tw组数据
tw_data = {
    'mcp': [0.47, 0.46, 0.44, 0.48, 0.45, 0.45, 0.46, 0.44, 0.47, 0.46, 0.50, 0.49, 0.48],
    'pct': [0.46, 0.48, 0.45, 0.48, 0.47, 0.45, 0.46, 0.43, 0.43, 0.49, 0.49, 0.47, 0.44],
    'gcc': [0.56, 0.56, 0.55, 0.57, 0.52, 0.56, 0.53, 0.55, 0.55, 0.55, 0.56, 0.55, 0.56],
    'bcc': [0.62, 0.63, 0.60, 0.63, 0.61, 0.63, 0.62, 0.63, 0.63, 0.62, 0.63, 0.61, 0.65],
    'scc': [0.71, 0.70, 0.70, 0.71, 0.68, 0.74, 0.72, 0.73, 0.70, 0.68, 0.69, 0.70, 0.71]
}

# 存储p值的列表
ri_hc_pvals = []
# 定义要处理的roi列表(与字典键对应)
roi_jhu = ['mcp', 'pct', 'gcc', 'bcc', 'scc']

for roi in roi_jhu:
    # 获取对应的数据向量
    hc_vec = hc_data[roi]
    tw_vec = tw_data[roi]
    # 执行Wilcoxon符号秩检验
    res = wilcoxon(hc_vec, tw_vec)
    # 保存p值
    ri_hc_pvals.append(res.pvalue)

# 输出结果
print(ri_hc_pvals)

方法2:通过全局变量获取(适合已定义好变量的场景)

如果已经提前定义了所有hc_*和tw_*变量,可以用globals()函数获取全局变量字典,动态取出对应向量:

from scipy.stats import wilcoxon

# 假设已定义好所有hc_mcp、tw_mcp等变量
ri_hc_pvals = []
roi_jhu = ['mcp', 'pct', 'gcc', 'bcc', 'scc']

for roi in roi_jhu:
    # 从全局变量中取出对应向量
    hc_vec = globals()[f'hc_{roi}']
    tw_vec = globals()[f'tw_{roi}']
    # 执行检验
    res = wilcoxon(hc_vec, tw_vec)
    ri_hc_pvals.append(res.pvalue)

print(ri_hc_pvals)

注意事项

  • 方法1的字典组织方式更清晰易维护,避免了全局变量的潜在问题,优先推荐。
  • 确保roi_jhu中的每个元素都能对应到存在的向量名称,否则会抛出KeyError。
  • 需要提前导入scipy.stats中的wilcoxon函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:36:00