Monte Carlo Power Analysis — native Rust engine
Project description
███╗ ███╗ ██████╗ ██████╗
████╗ ████║ ██╔════╝ ██╔══██╗ ██████╗ ██╗ ██╗███████╗██████╗
██╔████╔██║ ██║ ██║ ██║██╔═══██╗██║ ██║██╔════╝██╔══██╗
██║╚██╔╝██║ ██║ ██████╔╝██║ ██║██║ █╗ ██║█████╗ ██████╔╝
██║ ╚═╝ ██║ ██║ ██╔═══╝ ██║ ██║██║███╗██║██╔══╝ ██╔══██╗
██║ ██║ ╚██████╗ ██║ ╚██████╔╝╚███╔███╔╝███████╗██║ ██║
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝
Power analysis by simulation — any design from t-test to mixed models, in your browser, on your desktop, or in Python and R.
Why MCPower?
- MCPower covers anything from ANOVA to generalized linear to mixed models. Analytical power formulas exist for a few textbook designs and are correct only when all their assumptions are met (they aren't). Monte Carlo is the ground truth they approximate.
- Fast enough to mean it. A purpose-built engine, 100–1000× faster than a hand-written R/Python simulation loop — even the most complex power analysis runs in seconds, not hours or even days for mixed models. Speed stops being the reason to avoid simulation.
- Robustness built in. Stress-tests your design against the messy, non-ideal data that formulas assume away, so you catch under-powering before you collect.
- Easy, and everywhere. A few-line API across four bindings — Python, R, desktop app, browser. Free and open source.
Install
pip install mcpower
Plotting is an optional extra: pip install mcpower[plot] (needed for save_plot() and inline Jupyter plots).
numpy and pandas are not required — they're accepted only as optional input formats for upload_data() and set_correlations() (plain Python lists and dicts work everywhere). Install them with pip install mcpower[optional] if you want to pass arrays or DataFrames.
Quickstart
from mcpower import MCPower
# Clinical trial testing a new therapy vs control.
# Research question: Does the new therapy improve patient outcomes?
# Define the model with an R-style formula.
model = MCPower("patient_outcome = treatment + baseline_score")
# Expected effect sizes (standardised).
# treatment=0.5 → therapy shifts outcomes by 0.5 SD (a medium effect).
# baseline_score=0.3 → baseline moderately predicts the outcome.
model.set_effects("treatment=0.5, baseline_score=0.3")
# Variable types — treatment is binary (0=control, 1=therapy).
model.set_variable_type("treatment=binary")
# Power at N=120, targeting the treatment test.
# One row per effect with Power, 95% CI, and a ✓/✗ marker against target power.
model.find_power(sample_size=120, target_test="treatment")
More examples
Sample size search:
from mcpower import MCPower
# Educational intervention study.
# Research question: What N do we need to detect the intervention effect?
model = MCPower("test_score = intervention + prior_knowledge + motivation")
model.set_effects("intervention=0.4, prior_knowledge=0.35, motivation=0.3")
# Variable types — intervention is binary (0=control, 1=intervention).
model.set_variable_type("intervention=binary")
# Sweep a grid and report the smallest N that reaches target power.
model.find_sample_size(target_test="intervention", from_size=30, to_size=300, by=10)
Mixed-effects / LME (clustered data):
from mcpower import MCPower
# Education study where students are nested in classrooms.
# Research question: Does a teaching method raise test scores, accounting for
# the fact that students in the same classroom are correlated?
# Declare a mixed model. The (1|classroom) term adds a random intercept per
# classroom; family="lme" fits it by maximum likelihood (MLE estimator).
model = MCPower("score = teaching_method + prior_gpa + (1|classroom)", family="lme")
model.set_variable_type("teaching_method=binary")
model.set_effects("teaching_method=0.4, prior_gpa=0.18")
# Describe the clustering: ICC=0.15 (15% of variance is between-classroom)
# across 30 classrooms. At N=300 that is 10 students per classroom.
model.set_cluster("classroom", ICC=0.15, n_clusters=30)
# Power at N=300 for the fixed effects.
model.find_power(sample_size=300, target_test="teaching_method, prior_gpa")
See examples/ (01–11) and the Python tutorial for interactions, correlations, factors/ANOVA, logistic regression, your-own-data upload, custom scenarios, and plotting.
API at a glance
Two entry points, a fluent set_* chain:
| Call | What it does |
|---|---|
MCPower("y = x1 + x2", family="ols") |
Define the model (R-style formula; family ∈ "ols"/"logit"/"lme") |
.set_effects("x1=0.5, x2=0.3") |
Standardised effect sizes |
.set_variable_type("x1=binary, g=(factor,3)") |
Predictor distributions |
.set_correlations("corr(x1, x2)=0.3") |
Correlations between predictors |
.set_cluster("group", ICC=0.2, n_clusters=20) |
Random-effects structure (family="lme") |
.set_baseline_probability(0.3) |
Event rate at reference (family="logit") |
.upload_data(df) |
Use your own data instead of synthetic |
.get_effects_from_data("y") |
Borrow starting effect sizes from uploaded data (approximate) |
.set_seed(2137) · .set_alpha(0.05) · .set_power(80) · .set_simulations(n) |
Tuning knobs |
.find_power(sample_size=200, target_test="all") |
Power at a fixed N |
.find_sample_size(target_test="x1", from_size=50, to_size=400) |
Smallest N for target power |
All set_* methods chain and return self; add scenarios=True to either find_* for optimistic/realistic/doomer robustness.
Docs
Full documentation: https://docs.mcpower.app.
Citation & License
GPL v3. If you use MCPower in research, please cite:
Lenartowicz, P. (2025). MCPower: Monte Carlo Power Analysis for Complex Statistical Models [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.16502734
@software{mcpower2025,
author = {Lenartowicz, Pawe{\l}},
title = {{MCPower}: Monte Carlo Power Analysis for Complex Statistical Models},
year = {2025},
publisher = {Zenodo},
doi = {10.5281/zenodo.16502734},
url = {https://doi.org/10.5281/zenodo.16502734}
}
Paweł Lenartowicz — Freestyler Scientist · GitHub · ORCID
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcpower-1.0.2-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: mcpower-1.0.2-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 2.4 MB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d90f337f142f84e1cbfc3644690b28836ece7f7b5bae68ee2be31d3d6e060312
|
|
| MD5 |
a6d52b74e1b31ec5e0e3a05b25ffa204
|
|
| BLAKE2b-256 |
1b0a3322b7545a086878e904f222ed930a9a6457940a1c770002c486dc8d4bff
|
Provenance
The following attestation bundles were made for mcpower-1.0.2-cp310-abi3-win_amd64.whl:
Publisher:
release-py.yml on pawlenartowicz/MCPower
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcpower-1.0.2-cp310-abi3-win_amd64.whl -
Subject digest:
d90f337f142f84e1cbfc3644690b28836ece7f7b5bae68ee2be31d3d6e060312 - Sigstore transparency entry: 1934424930
- Sigstore integration time:
-
Permalink:
pawlenartowicz/MCPower@8d2da5490cae1e2cb84c98db475fb5c5416467b9 -
Branch / Tag:
refs/tags/py-1.0.2 - Owner: https://github.com/pawlenartowicz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-py.yml@8d2da5490cae1e2cb84c98db475fb5c5416467b9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcpower-1.0.2-cp310-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: mcpower-1.0.2-cp310-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.10+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e09afceb2833fd8cfb0e3ae8498793986f3294e77ada0a490d30e89bf76d237
|
|
| MD5 |
7662dd896fdb42e7424f9c33536ef4cc
|
|
| BLAKE2b-256 |
f2dad7a8e3dc2306f011098abf55c48549f04c2bd6d997f2eed8a61569c4b082
|
Provenance
The following attestation bundles were made for mcpower-1.0.2-cp310-abi3-manylinux_2_28_x86_64.whl:
Publisher:
release-py.yml on pawlenartowicz/MCPower
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcpower-1.0.2-cp310-abi3-manylinux_2_28_x86_64.whl -
Subject digest:
7e09afceb2833fd8cfb0e3ae8498793986f3294e77ada0a490d30e89bf76d237 - Sigstore transparency entry: 1934424939
- Sigstore integration time:
-
Permalink:
pawlenartowicz/MCPower@8d2da5490cae1e2cb84c98db475fb5c5416467b9 -
Branch / Tag:
refs/tags/py-1.0.2 - Owner: https://github.com/pawlenartowicz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-py.yml@8d2da5490cae1e2cb84c98db475fb5c5416467b9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcpower-1.0.2-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: mcpower-1.0.2-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.0 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9bcfbcae43ee78f67f167066a551b17006ceaac14042c1b8bdc11f5e038ef68b
|
|
| MD5 |
8293879974ef498b37c932f8ae67bfac
|
|
| BLAKE2b-256 |
8f509a2c90d60597f828dfba3fe6a19028cfa2ab9bc231e181560b1b86977a82
|
Provenance
The following attestation bundles were made for mcpower-1.0.2-cp310-abi3-macosx_11_0_arm64.whl:
Publisher:
release-py.yml on pawlenartowicz/MCPower
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcpower-1.0.2-cp310-abi3-macosx_11_0_arm64.whl -
Subject digest:
9bcfbcae43ee78f67f167066a551b17006ceaac14042c1b8bdc11f5e038ef68b - Sigstore transparency entry: 1934424914
- Sigstore integration time:
-
Permalink:
pawlenartowicz/MCPower@8d2da5490cae1e2cb84c98db475fb5c5416467b9 -
Branch / Tag:
refs/tags/py-1.0.2 - Owner: https://github.com/pawlenartowicz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-py.yml@8d2da5490cae1e2cb84c98db475fb5c5416467b9 -
Trigger Event:
push
-
Statement type: