Skip to main content
███╗   ███╗  ██████╗ ██████╗ 
████╗ ████║ ██╔════╝ ██╔══██╗ ██████╗ ██╗    ██╗███████╗██████╗ 
██╔████╔██║ ██║      ██║  ██║██╔═══██╗██║    ██║██╔════╝██╔══██╗
██║╚██╔╝██║ ██║      ██████╔╝██║   ██║██║ █╗ ██║█████╗  ██████╔╝
██║ ╚═╝ ██║ ██║      ██╔═══╝ ██║   ██║██║███╗██║██╔══╝  ██╔══██╗
██║     ██║ ╚██████╗ ██║     ╚██████╔╝╚███╔███╔╝███████╗██║  ██║
╚═╝     ╚═╝  ╚═════╝ ╚═╝      ╚═════╝  ╚══╝╚══╝ ╚══════╝╚═╝  ╚═╝

Power analysis by simulation — any design from t-test to mixed models, in your browser, on your desktop, or in Python and R.

PyPI License: GPL v3 DOI

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, hundreds to thousands of times faster per fit than simr, simglm, or Superpower, and 60–1,200× faster than a hand-optimized R/Python loop — a full sample-size search (ten candidate n × 10,000 simulations) 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"/"probit"/"poisson"/"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ł LenartowiczFreestyler Scientist · GitHub · ORCID

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

mcpower-1.4.0-cp310-abi3-win_amd64.whl (2.8 MB view details)

Uploaded CPython 3.10+Windows x86-64

mcpower-1.4.0-cp310-abi3-manylinux_2_28_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ x86-64

mcpower-1.4.0-cp310-abi3-macosx_11_0_arm64.whl (2.4 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file mcpower-1.4.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: mcpower-1.4.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 2.8 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for mcpower-1.4.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 bd336e5df02866d830b681623f0cf911d11636ce9bc39502fc1cc204861121c1
MD5 20a00abc9023a146504e6eadaf51a658
BLAKE2b-256 9f908db01982c44887995c6871b52670fc878b79bf57e2bd449c8cae327555e7

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcpower-1.4.0-cp310-abi3-win_amd64.whl:

Publisher: release-py.yml on pawlenartowicz/MCPower

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mcpower-1.4.0-cp310-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mcpower-1.4.0-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 539134013a43a5c61e8c09cbbfd3dc3013ca12d6853f83376f60241eab0dc4ba
MD5 21e3af281779380b28f3b67d2f0b62da
BLAKE2b-256 5a67248e3e424809fea53d0b690b6251bf5a52af5420dc89240cfb7334db22e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcpower-1.4.0-cp310-abi3-manylinux_2_28_x86_64.whl:

Publisher: release-py.yml on pawlenartowicz/MCPower

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mcpower-1.4.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mcpower-1.4.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0ace369e47ad8373014b9cb0803963c4ae20c7fa83a076ba9426900bb7e5a7c7
MD5 93265ad3abcda6a722a24fdb0daa6964
BLAKE2b-256 4ddce966e942ada257adc23d2ab28b589cc34412c184b68b4af12298e6373865

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcpower-1.4.0-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: release-py.yml on pawlenartowicz/MCPower

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

1.4.0 This release

3 files

1.3.0

3 files

1.1.2

3 files

1.1.1

3 files

1.0.3

3 files

1.0.2

3 files

1.0.0

3 files

0.6.1

21 files

0.6.0

21 files

0.5.4

21 files

0.5.3

21 files

0.5.2

17 files

0.5.1

17 files

0.5.0

17 files

0.4.2

17 files

0.4.1

17 files

0.4.0

17 files

0.3.3

10 files

0.3.2

10 files

0.3.1

10 files

0.3.0

10 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page