在数据分析和科学研究中,我们经常需要对多组数据进行相似的统计比较。例如,可能需要对多个配对样本(如治疗前后、不同区域的测量值)进行非参数检验。当数据集数量庞大时,手动为每一对数据编写统计测试代码将变得极其繁琐且容易出错。本文将介绍如何利用python的循环结构和数据组织策略,高效地实现这一目标。
场景描述假设我们有两组相关的数值向量,每组包含多个子类别。例如,hc_mcp, hc_pct, ..., 和 tw_mcp, tw_pct, ...。我们希望对每个对应的向量对(如 hc_mcp 与 tw_mcp,hc_pct 与 tw_pct 等)执行Wilcoxon符号秩检验,并收集每个测试的P值。
原始数据示例如下:
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]
如果采用手动方式,代码会是这样:
from scipy.stats import wilcoxon # 手动执行,代码冗余 # res_mcp = wilcoxon(hc_mcp, tw_mcp) # p_mcp = res_mcp.pvalue # res_pct = wilcoxon(hc_pct, tw_pct) # p_pct = res_pct.pvalue # ...以此类推,当有几十甚至上百对数据时,这种方式不可取。解决方案:使用列表组织数据并循环
最直接且推荐的方法是将相关的向量组织到列表中。关键在于确保在不同的列表中,对应进行比较的向量位于相同的索引位置。
-
导入必要的库: 我们将使用scipy.stats中的wilcoxon函数。
from scipy.stats import wilcoxon
-
组织数据向量: 将属于同一组(例如所有hc_开头的向量)的向量放入一个列表,另一组(所有tw_开头的向量)放入另一个列表。确保它们的顺序是对应的。
# 假设这些向量已经定义如上 # hc_mcp, hc_pct, ..., tw_mcp, tw_pct, ... list_hc = [hc_mcp, hc_pct, hc_gcc, hc_bcc, hc_scc] list_tw = [tw_mcp, tw_pct, tw_gcc, tw_bcc, tw_scc]
-
循环进行统计比较: 使用for循环遍历列表的索引,每次迭代取出对应位置的两个向量进行统计测试。
PIA
全面的AI聚合平台,一站式访问所有顶级AI模型
226 查看详情
# 用于存储P值的列表 p_values = [] statistic_values = [] # 可以同时存储统计量 # 遍历列表索引 for i in range(len(list_hc)): # 从两个列表中取出对应的向量 data_hc = list_hc[i] data_tw = list_tw[i] # 执行Wilcoxon符号秩检验 result = wilcoxon(data_hc, data_tw) # 存储P值和统计量 p_values.append(result.pvalue) statistic_values.append(result.statistic) print("计算得到的P值列表:", p_values) print("计算得到的统计量列表:", statistic_values)
这种方法的核心优势在于其简洁性和可扩展性。即使有上百对向量,代码结构也保持不变,只需确保初始列表的正确构建。
进阶:使用字典进行更灵活的数据管理如果数据对的命名规则更复杂,或者需要根据名称而不是严格的顺序来匹配数据,可以使用字典来组织数据。这提供了更大的灵活性。
-
组织数据向量到字典: 使用一个共同的标识符(如'mcp', 'pct'等)作为字典的键。
data_hc_dict = { 'mcp': hc_mcp, 'pct': hc_pct, 'gcc': hc_gcc, 'bcc': hc_bcc, 'scc': hc_scc } data_tw_dict = { 'mcp': tw_mcp, 'pct': tw_pct, 'gcc': tw_gcc, 'bcc': tw_bcc, 'scc': tw_scc }
-
循环进行统计比较: 遍历其中一个字典的键,然后使用这些键从两个字典中提取对应的向量。
p_values_dict = {} # 存储P值的字典,键为子类别名称 for key in data_hc_dict.keys(): if key in data_tw_dict: # 确保在另一个字典中也存在对应的键 data_hc = data_hc_dict[key] data_tw = data_tw_dict[key] result = wilcoxon(data_hc, data_tw) p_values_dict[key] = result.pvalue else: print(f"警告: '{key}' 在 data_tw_dict 中未找到对应数据。") print("计算得到的P值字典:", p_values_dict)
字典方法在数据项不总是按固定顺序排列,或需要更明确的命名关联时特别有用。
- 数据对齐的准确性: 无论是使用列表的索引还是字典的键,确保进行比较的两个向量确实是逻辑上配对的,这是统计分析有效性的基石。
- 变量命名与动态访问: 避免使用字符串格式化(如 globals()['hc_%s' % rois])来动态访问全局变量。这种做法通常被认为是糟糕的编程习惯,因为它降低了代码的可读性、可维护性,并可能引入安全风险。将数据组织到列表或字典中是更Pythonic且安全高效的解决方案。
- 统计测试的选择: 本教程以Wilcoxon符号秩检验为例,但原理适用于任何需要对配对数据进行操作的统计函数(如scipy.stats.ttest_rel进行配对t检验)。请根据您的数据特性和研究问题选择合适的统计方法。
- 结果存储与后续分析: 将P值或其他统计结果存储在列表或字典中,便于后续的数据处理、多重比较校正(如Bonferroni校正、FDR校正)和结果报告。
通过将相关的数值向量组织成列表或字典,并结合Python的循环结构,我们可以优雅且高效地处理大量配对数据的统计比较任务。这种方法不仅避免了冗余代码,提高了开发效率,还增强了代码的可读性和可维护性,是进行大规模数据统计分析的推荐实践。正确的数据组织是实现自动化和可扩展统计分析的关键。
以上就是Python中循环内高效执行统计比较的方法的详细内容,更多请关注知识资源分享宝库其它相关文章!
相关标签: python app 排列 Python scipy for 子类 标识符 全局变量 字符串 循环 数据分析 自动化 大家都在看: Python怎么获取CPU核心数_os与multiprocessing获取CPU核心数 python人马兽系列 python人马兽系列的主要内容 Python怎么创建虚拟环境_Python虚拟环境创建与管理教程 python如何计算列表的长度_python使用len()函数获取列表长度 python怎么判断一个变量的类型_python变量类型判断方法
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。