
在数据分析和科学研究中,我们经常需要对多组配对数据进行统计比较,以评估它们之间是否存在显著差异。例如,在医学影像分析中,可能需要比较不同脑区(如mcp、pct、gcc等)在两种不同处理(如hc和tw)下的测量值。当需要进行比较的配对数量庞大时(如本例中提及的48个区域,共144个向量),手动为每一对编写统计检验代码不仅效率低下,而且极易出错,难以维护。
以Wilcoxon符号秩检验为例,这是一种非参数检验,用于比较两个相关样本(即配对样本)的总体中位数是否存在差异。其基本用法是scipy.stats.wilcoxon(x, y),其中x和y是配对的数值向量。为了解决重复性操作的问题,核心在于如何有效地组织数据,并利用Python的循环结构来自动化这一过程。
实现统计比较自动化的第一步是合理地组织原始数据。原始数据通常以独立的变量形式存在,例如:
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_xxx 向量 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_xxx 向量
为了在循环中便捷地访问这些配对向量,我们可以采用以下两种常见且高效的数据组织方式:
将属于同一组的所有向量分别收集到各自的列表中。关键是确保在这些列表中,对应进行比较的向量(例如hc_mcp和tw_mcp)位于相同的索引位置。
立即学习“Python免费学习笔记(深入)”;
# 示例数据(为简洁起见,只列出部分) 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] 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] # 将对应的数据向量放入各自的列表中,并确保顺序一致 hc_data_list = [hc_mcp, hc_pct, hc_gcc] tw_data_list = [tw_mcp, tw_pct, tw_gcc]
当数据对具有明确的标识符(如'mcp', 'pct')时,使用字典来组织数据可以提供更强的可读性和灵活性。每个字典的键对应于一个标识符,值则为该标识符下的数据向量。
# 示例数据(为简洁起见,只列出部分)
hc_data_dict = {
'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]
}
tw_data_dict = {
'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]
}数据组织完成后,就可以利用Python的for循环和zip函数(或字典的keys()/items()方法)来自动化统计检验。
首先,需要从scipy.stats模块导入wilcoxon函数。
from scipy.stats import wilcoxon
这是最直接的实现方式,利用zip函数同时迭代两个列表,每次取出对应的一对向量进行检验。
ri_hc_pvals = [] # 用于存储所有p值的列表
for hc_vec, tw_vec in zip(hc_data_list, tw_data_list):
# 执行Wilcoxon符号秩检验
# `zero_method='wilcox'` 是默认值,处理零差值的方式
# `correction=False` 通常用于小样本,此处为默认
stat, p_value = wilcoxon(hc_vec, tw_vec)
ri_hc_pvals.append(p_value)
print("基于并行列表的P值结果:", ri_hc_pvals)如果使用字典组织数据,可以通过遍历一个字典的键,然后用这些键从两个字典中取出对应的向量。
ri_hc_pvals_dict = {} # 用于存储结果的字典,键为区域名,值为p值
# 假设两个字典的键集合是相同的
for roi_name in hc_data_dict.keys():
hc_vec = hc_data_dict[roi_name]
tw_vec = tw_data_dict[roi_name]
stat, p_value = wilcoxon(hc_vec, tw_vec)
ri_hc_pvals_dict[roi_name] = p_value
print("基于字典的P值结果:", ri_hc_pvals_dict)下面是一个包含数据定义、组织、统计检验和结果存储的完整示例:
from scipy.stats import 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_data_list = [hc_mcp, hc_pct, hc_gcc, hc_bcc, hc_scc]
tw_data_list = [tw_mcp, tw_pct, tw_gcc, tw_bcc, tw_scc]
roi_names = ['mcp', 'pct', 'gcc', 'bcc', 'scc'] # 可选:用于结果标识
# 存储P值结果
p_values_list = []
test_stats_list = [] # 也可以存储检验统计量
print("--- 基于并行列表的Wilcoxon检验结果 ---")
for i, (hc_vec, tw_vec) in enumerate(zip(hc_data_list, tw_data_list)):
stat, p_value = wilcoxon(hc_vec, tw_vec)
p_values_list.append(p_value)
test_stats_list.append(stat)
print(f"区域 {roi_names[i]}: 检验统计量 = {stat:.4f}, P值 = {p_value:.4f}")
print("\n所有P值 (列表形式):", p_values_list)
# 方式二:使用字典组织数据
hc_data_dict = {
'mcp': hc_mcp, 'pct': hc_pct, 'gcc': hc_gcc, 'bcc': hc_bcc, 'scc': hc_scc
}
tw_data_dict = {
'mcp': tw_mcp, 'pct': tw_pct, 'gcc': tw_gcc, 'bcc': tw_bcc, 'scc': tw_scc
}
p_values_dict = {} # 存储P值结果,键为区域名
print("\n--- 基于字典的Wilcoxon检验结果 ---")
for roi_name in sorted(hc_data_dict.keys()): # 确保按一致顺序遍历
hc_vec = hc_data_dict[roi_name]
tw_vec = tw_data_dict[roi_name]
stat, p_value = wilcoxon(hc_vec, tw_vec)
p_values_dict[roi_name] = p_value
print(f"区域 {roi_name}: 检验统计量 = {stat:.4f}, P值 = {p_value:.4f}")
print("\n所有P值 (字典形式):", p_values_dict)通过本教程,我们学习了如何在Python中利用循环结构自动化多组配对数据的统计比较。核心在于将原始数据进行结构化(例如,使用并行列表或字典),然后结合scipy.stats库中的统计检验函数(如wilcoxon),在循环中对每对数据执行分析。这种方法不仅极大地提高了代码的效率和可维护性,也为处理大规模数据集的重复性统计任务提供了一个健壮且灵活的解决方案。在实际应用中,根据数据的特点和
以上就是Python中批量执行配对统计比较的循环方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号