PyMetaAnalysis 0.1.0__tar.gz → 0.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/.github/workflows/release.yml +1 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/CHANGELOG.md +23 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/CITATION.cff +5 -3
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/PKG-INFO +31 -21
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/README.md +29 -19
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/getting-started.md +4 -3
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/guides/generic-effects.md +17 -10
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/guides/input-data.md +3 -1
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/guides/provenance-reporting.md +4 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/guides/r-interoperability.md +13 -1
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/index.md +5 -3
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/limitations.md +2 -3
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/reference/api.md +8 -2
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/releasing.md +4 -4
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/pyproject.toml +1 -1
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/_version.py +1 -1
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/api.py +85 -12
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/data.py +66 -24
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/reporting.py +7 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_api.py +84 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_documentation.py +10 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_properties.py +32 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_release_readiness.py +17 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_reporting.py +26 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_subgroups.py +26 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tools/check_release.py +1 -1
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tools/inspect_distribution.py +1 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/.github/workflows/ci.yml +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/.github/workflows/pages.yml +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/.gitignore +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/CONTRIBUTING.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/LICENSE +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/SECURITY.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/benchmarks/README.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/benchmarks/benchmark_core.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/adr/0001-optional-matplotlib.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/adr/0002-statistical-policy.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/citation.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/development.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/guides/binary-outcomes.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/guides/continuous-outcomes.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/guides/method-selection.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/guides/plotting.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/guides/sensitivity-analysis.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/guides/zero-events.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/installation.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/methods/statistical-methods.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/reference/report-schema.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/reference/results.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/stylesheets/extra.css +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/docs/validation.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/examples/README.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/examples/quickstart.ipynb +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/mkdocs.yml +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/__init__.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/binary_api.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/config.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/continuous_api.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/effect_sizes/__init__.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/effect_sizes/binary.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/effect_sizes/continuous.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/estimators/__init__.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/estimators/inverse_variance.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/estimators/mantel_haenszel.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/estimators/tau2.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/exceptions.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/heterogeneity.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/plotting/__init__.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/plotting/_utils.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/plotting/forest.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/plotting/funnel.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/plotting/subgroup_forest.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/provenance.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/py.typed +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/results.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/sensitivity.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/src/meta_analyze/subgroups.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/README.md +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/binary_input.csv +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/binary_metafor.json +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/binary_sparse_input.csv +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/continuous_input.csv +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/continuous_metafor.json +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/generate_binary_metafor.R +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/generate_continuous_metafor.R +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/generate_generic_metafor.R +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/generate_workflow_metafor.R +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/generic_input.csv +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/generic_metafor.json +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/workflow_input.csv +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/reference/workflow_metafor.json +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_binary.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_continuous.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_estimators.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_funnel_plot.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_numerical_stability.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_plotting.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_r_references.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_reference_results.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tests/test_sensitivity.py +0 -0
- {pymetaanalysis-0.1.0 → pymetaanalysis-0.2.1}/tools/execute_notebooks.py +0 -0
|
@@ -6,6 +6,29 @@ Changes planned for the next release accumulate under `Unreleased`.
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.2.1 - 2026-07-17
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- README documentation and repository links use absolute URLs so they resolve
|
|
14
|
+
correctly when the project description is rendered on PyPI.
|
|
15
|
+
|
|
16
|
+
## 0.2.0 - 2026-07-16
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- generic `meta_analysis()` accepts either sampling variances or standard
|
|
21
|
+
errors, with explicit validation and auditable conversion provenance.
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- package author metadata identifies the project maintainer directly.
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- GitHub Release creation receives explicit repository context in tag-driven
|
|
30
|
+
release jobs.
|
|
31
|
+
|
|
9
32
|
## 0.1.0 - 2026-07-15
|
|
10
33
|
|
|
11
34
|
### Added
|
|
@@ -5,9 +5,11 @@ message: >-
|
|
|
5
5
|
title: PyMetaAnalysis
|
|
6
6
|
type: software
|
|
7
7
|
authors:
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
- family-names: Ding
|
|
9
|
+
given-names: Zhaobo
|
|
10
|
+
email: ding.zb@yahoo.com
|
|
11
|
+
version: 0.2.1
|
|
12
|
+
date-released: 2026-07-17
|
|
11
13
|
repository-code: https://github.com/ZhaoboDing/PyMetaAnalysis
|
|
12
14
|
url: https://zhaoboding.github.io/PyMetaAnalysis/
|
|
13
15
|
license: MIT
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PyMetaAnalysis
|
|
3
|
-
Version: 0.1
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: A pandas-first, auditable meta-analysis library for Python
|
|
5
5
|
Project-URL: Documentation, https://zhaoboding.github.io/PyMetaAnalysis/
|
|
6
6
|
Project-URL: Source, https://github.com/ZhaoboDing/PyMetaAnalysis
|
|
7
7
|
Project-URL: Issues, https://github.com/ZhaoboDing/PyMetaAnalysis/issues
|
|
8
8
|
Project-URL: Changelog, https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/CHANGELOG.md
|
|
9
|
-
Author:
|
|
9
|
+
Author-email: Zhaobo Ding <ding.zb@yahoo.com>
|
|
10
10
|
Maintainer-email: Zhaobo Ding <ding.zb@yahoo.com>
|
|
11
11
|
License-Expression: MIT
|
|
12
12
|
License-File: LICENSE
|
|
@@ -51,7 +51,7 @@ Description-Content-Type: text/markdown
|
|
|
51
51
|
|
|
52
52
|
[](https://github.com/ZhaoboDing/PyMetaAnalysis/actions/workflows/ci.yml)
|
|
53
53
|
[](https://zhaoboding.github.io/PyMetaAnalysis/)
|
|
54
|
-
[](LICENSE)
|
|
54
|
+
[](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/LICENSE)
|
|
55
55
|
|
|
56
56
|
PyMetaAnalysis is an early-stage, pandas-first Python library for conventional
|
|
57
57
|
study-level meta-analysis. It accepts DataFrames, NumPy arrays, and ordinary
|
|
@@ -115,7 +115,7 @@ subgroup differences.
|
|
|
115
115
|
|
|
116
116
|
| Input | Effects | Pooling/models |
|
|
117
117
|
| --- | --- | --- |
|
|
118
|
-
| Effect + sampling variance | Generic | Common/random inverse variance |
|
|
118
|
+
| Effect + sampling variance or standard error | Generic | Common/random inverse variance |
|
|
119
119
|
| Two-group events + totals | OR, RR, RD | Common MH OR/RR; common/random IV |
|
|
120
120
|
| Two-group means + SDs + sizes | MD, Hedges' g | Common/random inverse variance |
|
|
121
121
|
|
|
@@ -124,6 +124,10 @@ and DerSimonian-Laird tau-squared estimators. Mean confidence intervals support
|
|
|
124
124
|
the normal default plus unmodified and safeguarded Hartung-Knapp variants.
|
|
125
125
|
Eligible random-effects fits include an HTS prediction interval.
|
|
126
126
|
|
|
127
|
+
Generic analyses accept exactly one of `variance=` or `standard_error=`.
|
|
128
|
+
Standard errors are squared internally and the conversion is recorded in the
|
|
129
|
+
result provenance.
|
|
130
|
+
|
|
127
131
|
Sparse binary behavior is explicit: study-level and Mantel-Haenszel continuity
|
|
128
132
|
corrections are separate, relative-effect double-zero/double-all rows remain
|
|
129
133
|
visible as exclusions, and RD exposes
|
|
@@ -174,18 +178,18 @@ are descriptive small-study-effect diagnostics, not proof of publication bias.
|
|
|
174
178
|
The complete documentation is published at
|
|
175
179
|
[zhaoboding.github.io/PyMetaAnalysis](https://zhaoboding.github.io/PyMetaAnalysis/).
|
|
176
180
|
|
|
177
|
-
- [Installation](
|
|
178
|
-
- [Getting started](
|
|
179
|
-
- [Input data and row decisions](
|
|
180
|
-
- [Generic](
|
|
181
|
-
- [Choosing methods](
|
|
182
|
-
- [Sensitivity analysis](
|
|
183
|
-
- [Public API](
|
|
184
|
-
- [Validation strategy](
|
|
185
|
-
- [Citation guidance](
|
|
186
|
-
- [R `meta`/`metafor` mapping](
|
|
187
|
-
|
|
188
|
-
An executable [end-to-end notebook](examples/quickstart.ipynb) uses synthetic
|
|
181
|
+
- [Installation](https://zhaoboding.github.io/PyMetaAnalysis/installation/)
|
|
182
|
+
- [Getting started](https://zhaoboding.github.io/PyMetaAnalysis/getting-started/)
|
|
183
|
+
- [Input data and row decisions](https://zhaoboding.github.io/PyMetaAnalysis/guides/input-data/)
|
|
184
|
+
- [Generic](https://zhaoboding.github.io/PyMetaAnalysis/guides/generic-effects/), [binary](https://zhaoboding.github.io/PyMetaAnalysis/guides/binary-outcomes/), and [continuous](https://zhaoboding.github.io/PyMetaAnalysis/guides/continuous-outcomes/) guides
|
|
185
|
+
- [Choosing methods](https://zhaoboding.github.io/PyMetaAnalysis/guides/method-selection/) and [statistical formulas](https://zhaoboding.github.io/PyMetaAnalysis/methods/statistical-methods/)
|
|
186
|
+
- [Sensitivity analysis](https://zhaoboding.github.io/PyMetaAnalysis/guides/sensitivity-analysis/) and [plotting](https://zhaoboding.github.io/PyMetaAnalysis/guides/plotting/)
|
|
187
|
+
- [Public API](https://zhaoboding.github.io/PyMetaAnalysis/reference/api/), [result objects](https://zhaoboding.github.io/PyMetaAnalysis/reference/results/), and [report schema](https://zhaoboding.github.io/PyMetaAnalysis/reference/report-schema/)
|
|
188
|
+
- [Validation strategy](https://zhaoboding.github.io/PyMetaAnalysis/validation/) and [scope/limitations](https://zhaoboding.github.io/PyMetaAnalysis/limitations/)
|
|
189
|
+
- [Citation guidance](https://zhaoboding.github.io/PyMetaAnalysis/citation/)
|
|
190
|
+
- [R `meta`/`metafor` mapping](https://zhaoboding.github.io/PyMetaAnalysis/guides/r-interoperability/)
|
|
191
|
+
|
|
192
|
+
An executable [end-to-end notebook](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/examples/quickstart.ipynb) uses synthetic
|
|
189
193
|
data to demonstrate analysis, provenance, reporting, sensitivity, and plotting.
|
|
190
194
|
|
|
191
195
|
Build the complete site locally with:
|
|
@@ -203,16 +207,22 @@ edge cases, and committed R `metafor` reference fixtures. CI covers Python
|
|
|
203
207
|
distribution builds.
|
|
204
208
|
|
|
205
209
|
This is independent cross-software validation, not a formal external
|
|
206
|
-
statistical audit. See
|
|
210
|
+
statistical audit. See
|
|
211
|
+
[validation](https://zhaoboding.github.io/PyMetaAnalysis/validation/) for exact
|
|
212
|
+
coverage.
|
|
207
213
|
|
|
208
214
|
## Contributing
|
|
209
215
|
|
|
210
|
-
See
|
|
211
|
-
[
|
|
216
|
+
See
|
|
217
|
+
[CONTRIBUTING.md](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/CONTRIBUTING.md)
|
|
218
|
+
and the full
|
|
219
|
+
[development guide](https://zhaoboding.github.io/PyMetaAnalysis/development/).
|
|
220
|
+
Statistical changes require formula
|
|
212
221
|
documentation, boundary tests, and an independent comparison where available.
|
|
213
222
|
|
|
214
|
-
Security-sensitive reports should follow
|
|
223
|
+
Security-sensitive reports should follow
|
|
224
|
+
[SECURITY.md](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/SECURITY.md).
|
|
215
225
|
|
|
216
226
|
## License
|
|
217
227
|
|
|
218
|
-
[MIT](LICENSE)
|
|
228
|
+
[MIT](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/LICENSE)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/ZhaoboDing/PyMetaAnalysis/actions/workflows/ci.yml)
|
|
4
4
|
[](https://zhaoboding.github.io/PyMetaAnalysis/)
|
|
5
|
-
[](LICENSE)
|
|
5
|
+
[](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/LICENSE)
|
|
6
6
|
|
|
7
7
|
PyMetaAnalysis is an early-stage, pandas-first Python library for conventional
|
|
8
8
|
study-level meta-analysis. It accepts DataFrames, NumPy arrays, and ordinary
|
|
@@ -66,7 +66,7 @@ subgroup differences.
|
|
|
66
66
|
|
|
67
67
|
| Input | Effects | Pooling/models |
|
|
68
68
|
| --- | --- | --- |
|
|
69
|
-
| Effect + sampling variance | Generic | Common/random inverse variance |
|
|
69
|
+
| Effect + sampling variance or standard error | Generic | Common/random inverse variance |
|
|
70
70
|
| Two-group events + totals | OR, RR, RD | Common MH OR/RR; common/random IV |
|
|
71
71
|
| Two-group means + SDs + sizes | MD, Hedges' g | Common/random inverse variance |
|
|
72
72
|
|
|
@@ -75,6 +75,10 @@ and DerSimonian-Laird tau-squared estimators. Mean confidence intervals support
|
|
|
75
75
|
the normal default plus unmodified and safeguarded Hartung-Knapp variants.
|
|
76
76
|
Eligible random-effects fits include an HTS prediction interval.
|
|
77
77
|
|
|
78
|
+
Generic analyses accept exactly one of `variance=` or `standard_error=`.
|
|
79
|
+
Standard errors are squared internally and the conversion is recorded in the
|
|
80
|
+
result provenance.
|
|
81
|
+
|
|
78
82
|
Sparse binary behavior is explicit: study-level and Mantel-Haenszel continuity
|
|
79
83
|
corrections are separate, relative-effect double-zero/double-all rows remain
|
|
80
84
|
visible as exclusions, and RD exposes
|
|
@@ -125,18 +129,18 @@ are descriptive small-study-effect diagnostics, not proof of publication bias.
|
|
|
125
129
|
The complete documentation is published at
|
|
126
130
|
[zhaoboding.github.io/PyMetaAnalysis](https://zhaoboding.github.io/PyMetaAnalysis/).
|
|
127
131
|
|
|
128
|
-
- [Installation](
|
|
129
|
-
- [Getting started](
|
|
130
|
-
- [Input data and row decisions](
|
|
131
|
-
- [Generic](
|
|
132
|
-
- [Choosing methods](
|
|
133
|
-
- [Sensitivity analysis](
|
|
134
|
-
- [Public API](
|
|
135
|
-
- [Validation strategy](
|
|
136
|
-
- [Citation guidance](
|
|
137
|
-
- [R `meta`/`metafor` mapping](
|
|
138
|
-
|
|
139
|
-
An executable [end-to-end notebook](examples/quickstart.ipynb) uses synthetic
|
|
132
|
+
- [Installation](https://zhaoboding.github.io/PyMetaAnalysis/installation/)
|
|
133
|
+
- [Getting started](https://zhaoboding.github.io/PyMetaAnalysis/getting-started/)
|
|
134
|
+
- [Input data and row decisions](https://zhaoboding.github.io/PyMetaAnalysis/guides/input-data/)
|
|
135
|
+
- [Generic](https://zhaoboding.github.io/PyMetaAnalysis/guides/generic-effects/), [binary](https://zhaoboding.github.io/PyMetaAnalysis/guides/binary-outcomes/), and [continuous](https://zhaoboding.github.io/PyMetaAnalysis/guides/continuous-outcomes/) guides
|
|
136
|
+
- [Choosing methods](https://zhaoboding.github.io/PyMetaAnalysis/guides/method-selection/) and [statistical formulas](https://zhaoboding.github.io/PyMetaAnalysis/methods/statistical-methods/)
|
|
137
|
+
- [Sensitivity analysis](https://zhaoboding.github.io/PyMetaAnalysis/guides/sensitivity-analysis/) and [plotting](https://zhaoboding.github.io/PyMetaAnalysis/guides/plotting/)
|
|
138
|
+
- [Public API](https://zhaoboding.github.io/PyMetaAnalysis/reference/api/), [result objects](https://zhaoboding.github.io/PyMetaAnalysis/reference/results/), and [report schema](https://zhaoboding.github.io/PyMetaAnalysis/reference/report-schema/)
|
|
139
|
+
- [Validation strategy](https://zhaoboding.github.io/PyMetaAnalysis/validation/) and [scope/limitations](https://zhaoboding.github.io/PyMetaAnalysis/limitations/)
|
|
140
|
+
- [Citation guidance](https://zhaoboding.github.io/PyMetaAnalysis/citation/)
|
|
141
|
+
- [R `meta`/`metafor` mapping](https://zhaoboding.github.io/PyMetaAnalysis/guides/r-interoperability/)
|
|
142
|
+
|
|
143
|
+
An executable [end-to-end notebook](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/examples/quickstart.ipynb) uses synthetic
|
|
140
144
|
data to demonstrate analysis, provenance, reporting, sensitivity, and plotting.
|
|
141
145
|
|
|
142
146
|
Build the complete site locally with:
|
|
@@ -154,16 +158,22 @@ edge cases, and committed R `metafor` reference fixtures. CI covers Python
|
|
|
154
158
|
distribution builds.
|
|
155
159
|
|
|
156
160
|
This is independent cross-software validation, not a formal external
|
|
157
|
-
statistical audit. See
|
|
161
|
+
statistical audit. See
|
|
162
|
+
[validation](https://zhaoboding.github.io/PyMetaAnalysis/validation/) for exact
|
|
163
|
+
coverage.
|
|
158
164
|
|
|
159
165
|
## Contributing
|
|
160
166
|
|
|
161
|
-
See
|
|
162
|
-
[
|
|
167
|
+
See
|
|
168
|
+
[CONTRIBUTING.md](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/CONTRIBUTING.md)
|
|
169
|
+
and the full
|
|
170
|
+
[development guide](https://zhaoboding.github.io/PyMetaAnalysis/development/).
|
|
171
|
+
Statistical changes require formula
|
|
163
172
|
documentation, boundary tests, and an independent comparison where available.
|
|
164
173
|
|
|
165
|
-
Security-sensitive reports should follow
|
|
174
|
+
Security-sensitive reports should follow
|
|
175
|
+
[SECURITY.md](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/SECURITY.md).
|
|
166
176
|
|
|
167
177
|
## License
|
|
168
178
|
|
|
169
|
-
[MIT](LICENSE)
|
|
179
|
+
[MIT](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/LICENSE)
|
|
@@ -20,9 +20,10 @@ See [installation](installation.md) for all extras and development checks.
|
|
|
20
20
|
|
|
21
21
|
## 2. Prepare a DataFrame
|
|
22
22
|
|
|
23
|
-
The generic API expects one effect estimate and
|
|
24
|
-
variance
|
|
25
|
-
|
|
23
|
+
The generic API expects one effect estimate and either a strictly positive
|
|
24
|
+
sampling variance or standard error per study. Supply `variance=` or
|
|
25
|
+
`standard_error=`; standard errors are squared internally and recorded in
|
|
26
|
+
provenance.
|
|
26
27
|
|
|
27
28
|
```python
|
|
28
29
|
import pandas as pd
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Generic effects
|
|
2
2
|
|
|
3
3
|
Use `meta_analysis()` when each study already has an effect estimate and its
|
|
4
|
-
sampling variance. This is the generic inverse-variance
|
|
5
|
-
calculate an outcome-specific effect size.
|
|
4
|
+
sampling variance or standard error. This is the generic inverse-variance
|
|
5
|
+
workflow; it does not calculate an outcome-specific effect size.
|
|
6
6
|
|
|
7
7
|
The pooling, tau-squared, confidence-interval, prediction-interval, and
|
|
8
8
|
heterogeneity equations are specified under
|
|
@@ -49,22 +49,29 @@ result = ma.meta_analysis(
|
|
|
49
49
|
All array-like arguments must be one-dimensional and have equal lengths.
|
|
50
50
|
Generated row labels start at zero when no study labels are supplied.
|
|
51
51
|
|
|
52
|
-
## Variance
|
|
52
|
+
## Variance or standard error
|
|
53
53
|
|
|
54
|
-
`variance=`
|
|
55
|
-
reported standard
|
|
54
|
+
Supply exactly one of `variance=` or `standard_error=`. Both must contain
|
|
55
|
+
finite, strictly positive values. A reported standard-error column can be used
|
|
56
|
+
directly:
|
|
56
57
|
|
|
57
58
|
```python
|
|
58
|
-
|
|
59
|
+
result = ma.meta_analysis(
|
|
60
|
+
data,
|
|
61
|
+
effect="yi",
|
|
62
|
+
standard_error="standard_error",
|
|
63
|
+
)
|
|
59
64
|
```
|
|
60
65
|
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
PyMetaAnalysis squares standard errors internally, retains both uncertainty
|
|
67
|
+
columns in the study table, and records the conversion in provenance. Do not
|
|
68
|
+
pass confidence-interval widths or study sample standard deviations as
|
|
69
|
+
standard errors; they describe different quantities.
|
|
63
70
|
|
|
64
71
|
## Missing values
|
|
65
72
|
|
|
66
|
-
The default `missing="raise"` rejects missing effects or
|
|
67
|
-
retain incomplete rows as structured exclusions:
|
|
73
|
+
The default `missing="raise"` rejects missing effects or values in the selected
|
|
74
|
+
uncertainty input. To retain incomplete rows as structured exclusions:
|
|
68
75
|
|
|
69
76
|
```python
|
|
70
77
|
result = ma.meta_analysis(
|
|
@@ -30,6 +30,8 @@ result = ma.meta_analysis(
|
|
|
30
30
|
|
|
31
31
|
Column names must exist. Array-like inputs may be mixed with DataFrame columns,
|
|
32
32
|
but every array must contain exactly one value for every DataFrame row.
|
|
33
|
+
Generic analyses require exactly one uncertainty input: `variance=` or
|
|
34
|
+
`standard_error=`.
|
|
33
35
|
|
|
34
36
|
## Array-like inputs
|
|
35
37
|
|
|
@@ -38,7 +40,7 @@ Lists, tuples, pandas Series, and one-dimensional NumPy arrays are accepted:
|
|
|
38
40
|
```python
|
|
39
41
|
result = ma.meta_analysis(
|
|
40
42
|
effect=[0.1, 0.3, -0.2],
|
|
41
|
-
|
|
43
|
+
standard_error=[0.14, 0.20, 0.17],
|
|
42
44
|
study=["A", "B", "C"],
|
|
43
45
|
)
|
|
44
46
|
```
|
|
@@ -38,6 +38,10 @@ document.
|
|
|
38
38
|
Each `TransformationRecord` has a stable name, resolved parameters, and the
|
|
39
39
|
original row IDs it affected.
|
|
40
40
|
|
|
41
|
+
Generic analyses supplied through `standard_error=` record a
|
|
42
|
+
`standard_error_to_variance` transformation for every non-missing standard
|
|
43
|
+
error that was squared before fitting.
|
|
44
|
+
|
|
41
45
|
Binary analyses record:
|
|
42
46
|
|
|
43
47
|
- the OR, RR, or RD effect-size transformation and its scales;
|
|
@@ -139,7 +139,19 @@ rma.uni(
|
|
|
139
139
|
```
|
|
140
140
|
|
|
141
141
|
The corresponding R `meta` configuration starts from standard errors rather
|
|
142
|
-
than variances
|
|
142
|
+
than variances. PyMetaAnalysis can accept that uncertainty column directly as
|
|
143
|
+
`standard_error=`; no manual squaring step is required:
|
|
144
|
+
|
|
145
|
+
```python
|
|
146
|
+
result = ma.meta_analysis(
|
|
147
|
+
studies,
|
|
148
|
+
effect="yi",
|
|
149
|
+
standard_error="sei",
|
|
150
|
+
model="random",
|
|
151
|
+
tau2_method="REML",
|
|
152
|
+
ci_method="hartung_knapp_adhoc",
|
|
153
|
+
)
|
|
154
|
+
```
|
|
143
155
|
|
|
144
156
|
```r
|
|
145
157
|
metagen(
|
|
@@ -82,9 +82,11 @@ lists unsupported methods explicitly.
|
|
|
82
82
|
|
|
83
83
|
## Project status
|
|
84
84
|
|
|
85
|
-
PyMetaAnalysis 0.1
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
PyMetaAnalysis 0.2.1 fixes documentation and repository links in the PyPI
|
|
86
|
+
project description. Version 0.2.0 added direct generic standard-error input
|
|
87
|
+
to the initial public analysis scope. The project has not undergone a formal
|
|
88
|
+
external statistical audit. Pin the package version for consequential work
|
|
89
|
+
and independently check important analyses. See the repository
|
|
88
90
|
[changelog](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/CHANGELOG.md)
|
|
89
91
|
and [contribution guide](development.md). For manuscripts and archived
|
|
90
92
|
analyses, see [citing PyMetaAnalysis](citation.md).
|
|
@@ -27,8 +27,7 @@ deferred functionality explicit.
|
|
|
27
27
|
- multilevel, multivariate, network, dose-response, diagnostic-accuracy, or
|
|
28
28
|
individual-participant-data meta-analysis;
|
|
29
29
|
- robust variance estimation or dependent-effect clustering;
|
|
30
|
-
- single proportions, incidence rates, correlations, survival outcomes
|
|
31
|
-
generic standard-error input helpers;
|
|
30
|
+
- single proportions, incidence rates, correlations, or survival outcomes;
|
|
32
31
|
- Knapp-Hartung variants beyond the two documented choices;
|
|
33
32
|
- alternative prediction-interval methods;
|
|
34
33
|
- formal funnel-asymmetry, trim-and-fill, selection-model, or publication-bias
|
|
@@ -70,7 +69,7 @@ workflow must version those artifacts separately.
|
|
|
70
69
|
|
|
71
70
|
## Stability and review status
|
|
72
71
|
|
|
73
|
-
The package version is currently `0.1
|
|
72
|
+
The package version is currently `0.2.1`. Public APIs and serialized schemas
|
|
74
73
|
may change during the 0.x series. Pin versions in analysis environments and
|
|
75
74
|
inspect changelog/schema updates before upgrading.
|
|
76
75
|
|
|
@@ -47,7 +47,8 @@ ma.meta_analysis(
|
|
|
47
47
|
data=None,
|
|
48
48
|
*,
|
|
49
49
|
effect,
|
|
50
|
-
variance,
|
|
50
|
+
variance=None,
|
|
51
|
+
standard_error=None,
|
|
51
52
|
study=None,
|
|
52
53
|
subgroup=None,
|
|
53
54
|
model="random",
|
|
@@ -66,7 +67,8 @@ Fits generic study effects using inverse-variance pooling.
|
|
|
66
67
|
| --- | --- |
|
|
67
68
|
| `data` | Optional DataFrame used by string-valued input selectors |
|
|
68
69
|
| `effect` | Study effect column or array on a consistent model scale |
|
|
69
|
-
| `variance` | Finite, strictly positive sampling variances
|
|
70
|
+
| `variance` | Finite, strictly positive sampling variances |
|
|
71
|
+
| `standard_error` | Finite, strictly positive standard errors, squared internally |
|
|
70
72
|
| `study` | Optional label column/array; defaults to index or row number |
|
|
71
73
|
| `subgroup` | Optional subgroup column/array |
|
|
72
74
|
| `model` | `"common"` or `"random"` |
|
|
@@ -77,6 +79,10 @@ Fits generic study effects using inverse-variance pooling.
|
|
|
77
79
|
| `atol` | Strictly positive iterative-estimator tolerance |
|
|
78
80
|
| `max_iter` | Positive iterative-estimator iteration limit |
|
|
79
81
|
|
|
82
|
+
Supply exactly one of `variance` or `standard_error`. The selected argument
|
|
83
|
+
supports the same DataFrame-column and array-like conventions as `effect`.
|
|
84
|
+
Standard-error conversion is recorded in result provenance.
|
|
85
|
+
|
|
80
86
|
## `meta_binary()`
|
|
81
87
|
|
|
82
88
|
```text
|
|
@@ -44,7 +44,7 @@ and its
|
|
|
44
44
|
`CITATION.cff`. Hatchling reads the package version dynamically from
|
|
45
45
|
`_version.py`.
|
|
46
46
|
4. Move the relevant `CHANGELOG.md` entries from `Unreleased` to a dated
|
|
47
|
-
heading such as `##
|
|
47
|
+
heading such as `## X.Y.Z - YYYY-MM-DD`.
|
|
48
48
|
5. Run the complete validation suite.
|
|
49
49
|
|
|
50
50
|
The local consistency check is:
|
|
@@ -56,7 +56,7 @@ python tools/check_release.py
|
|
|
56
56
|
For a proposed tag, add:
|
|
57
57
|
|
|
58
58
|
```console
|
|
59
|
-
python tools/check_release.py --tag
|
|
59
|
+
python tools/check_release.py --tag vX.Y.Z
|
|
60
60
|
```
|
|
61
61
|
|
|
62
62
|
The tag check rejects development versions, version mismatches, and releases
|
|
@@ -90,8 +90,8 @@ commit:
|
|
|
90
90
|
```console
|
|
91
91
|
git switch main
|
|
92
92
|
git pull --ff-only
|
|
93
|
-
git tag -a
|
|
94
|
-
git push origin
|
|
93
|
+
git tag -a vX.Y.Z -m "PyMetaAnalysis X.Y.Z"
|
|
94
|
+
git push origin vX.Y.Z
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
The release workflow then:
|
|
@@ -11,7 +11,7 @@ requires-python = ">=3.10"
|
|
|
11
11
|
license = "MIT"
|
|
12
12
|
license-files = ["LICENSE"]
|
|
13
13
|
authors = [
|
|
14
|
-
{ name = "
|
|
14
|
+
{ name = "Zhaobo Ding", email = "ding.zb@yahoo.com" },
|
|
15
15
|
]
|
|
16
16
|
maintainers = [
|
|
17
17
|
{ name = "Zhaobo Ding", email = "ding.zb@yahoo.com" },
|