如何在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
相关产品推荐
相关产品推荐

