PyMetaAnalysis 是一个用于传统研究层面 Meta 分析的开源 Python 库。我在开发它时坚持一个简单的原则:统计结果应该易于使用,但绝不能成为黑箱。
为什么做这个项目#
Meta 分析的数据往往已经存在 pandas DataFrame 中,但许多工作流仍要求使用者按照工具的假设重新组织数据。更重要的是,单独一个合并效应量并不足够:分析者还需要知道哪些研究被纳入、边界情况如何处理、方法如何选择,以及结果如何复现。
PyMetaAnalysis 将这些信息完整地保留在结果中。它可以直接接收 DataFrame、NumPy 数组和普通 Python 序列,并返回不可变的结果对象,其中包含单项研究效应、排除记录、权重、诊断信息、方法选择、来源记录和结构化报告。
支持的分析#
- 使用抽样方差或标准误的通用效应量
- 使用优势比、风险比和风险差的二分类结局
- 使用均数差和 Hedges’ g 的连续型结局
- 固定效应、随机效应与 Mantel–Haenszel 模型
- REML、Paule–Mandel 和 DerSimonian–Laird 异质性估计
- 亚组分析、逐一排除分析与累积 Meta 分析
- 通过可选的 Matplotlib 集成绘制森林图和漏斗图
- 面向后续处理的 JSON 与 Markdown 报告
为可审计性而设计#
因缺失数据或稀疏数据规则而被排除的行不会消失;它们仍保留稳定的标识符和明确的排除原因。标准误转换为方差等处理会记录在 provenance 中。对于比值类指标,模型尺度的数值与便于阅读的展示尺度结果都会保留。
测试体系结合了手工计算、统计不变量、数值边界案例,以及由 R metafor 生成并纳入版本控制的参考结果。持续集成覆盖 Python 3.10–3.13、严格类型检查、代码规范、文档和发行包构建。
一个简单示例#
import meta_analyze as ma
result = ma.meta_analysis(
effect=[0.12, 0.35, -0.08, 0.21],
variance=[0.04, 0.06, 0.03, 0.05],
study=["Trial A", "Trial B", "Trial C", "Trial D"],
model="random",
tau2_method="REML",
)
print(result.summary())
print(result.study_results)PyPI 发行包名为 PyMetaAnalysis,导入名为 meta_analyze。项目采用 MIT 许可证,目前仍处于早期 0.x 阶段。

