pystatistics 2.1.0__tar.gz → 2.3.0__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.
- {pystatistics-2.1.0 → pystatistics-2.3.0}/CHANGELOG.md +140 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/PKG-INFO +69 -1
- {pystatistics-2.1.0 → pystatistics-2.3.0}/README.md +66 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pyproject.toml +7 -1
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/__init__.py +1 -1
- pystatistics-2.3.0/pystatistics/mvnmle/backends/_em_batched.py +44 -0
- pystatistics-2.3.0/pystatistics/mvnmle/backends/_em_batched_np.py +416 -0
- pystatistics-2.3.0/pystatistics/mvnmle/backends/_em_batched_patterns.py +112 -0
- pystatistics-2.3.0/pystatistics/mvnmle/backends/_em_batched_torch.py +381 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/backends/em.py +54 -6
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/mcar_test.py +12 -2
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/solvers.py +9 -3
- pystatistics-2.3.0/pystatistics/nonparametric_mcar/__init__.py +45 -0
- pystatistics-2.3.0/pystatistics/nonparametric_mcar/hsic.py +237 -0
- pystatistics-2.3.0/pystatistics/nonparametric_mcar/missmech.py +254 -0
- pystatistics-2.3.0/pystatistics/nonparametric_mcar/propensity.py +285 -0
- pystatistics-2.3.0/pystatistics/nonparametric_mcar/result.py +67 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/test_mcar.py +6 -1
- pystatistics-2.3.0/tests/nonparametric_mcar/test_hsic.py +112 -0
- pystatistics-2.3.0/tests/nonparametric_mcar/test_missmech.py +110 -0
- pystatistics-2.3.0/tests/nonparametric_mcar/test_propensity.py +145 -0
- pystatistics-2.3.0/tests/timeseries/__init__.py +0 -0
- pystatistics-2.1.0/pystatistics/mvnmle/backends/_em_batched.py +0 -795
- {pystatistics-2.1.0 → pystatistics-2.3.0}/.github/workflows/publish.yml +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/.github/workflows/trigger-docs-rebuild.yml +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/.gitignore +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/.release/CHECKLIST.md +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/.release/UNRELEASED.md +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/.release/release.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/CLAUDE.md +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/LICENSE +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/benchmarks/mvnmle_bench.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/DESIGN.md +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/Forge.md +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/GPU_BACKEND_NOTES.md +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/Makefile +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/PYSTATSBIO_CONTEXT.md +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/ROADMAP.md +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/_static/custom.css +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/anova.rst +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/conf.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/core.rst +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/descriptive.rst +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/hypothesis.rst +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/index.rst +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/mixed.rst +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/montecarlo.rst +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/mvnmle.rst +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/regression.rst +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/docs/survival.rst +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/GPU_BACKEND_CONVENTION.md +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/anova/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/anova/_common.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/anova/_contrasts.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/anova/_levene.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/anova/_posthoc.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/anova/_repeated.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/anova/_ss.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/anova/design.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/anova/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/anova/solvers.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/capabilities.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/device.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/linalg/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/linalg/batched.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/linalg/cholesky.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/linalg/determinant.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/linalg/qr.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/linalg/solve.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/linalg/svd.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/optimization/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/optimization/convergence.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/precision.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/timing.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/compute/tolerances.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/datasource.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/exceptions.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/protocols.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/result.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/core/validation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/descriptive/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/descriptive/_missing.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/descriptive/_quantile_types.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/descriptive/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/descriptive/backends/cpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/descriptive/backends/gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/descriptive/design.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/descriptive/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/descriptive/solvers.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/_basis.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/_common.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/_fit.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/_gam.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/_gcv.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/_smooth.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/backends/_gpu_family.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/backends/gpu_pirls.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/gam/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/_common.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/_design_factories.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/_p_adjust.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/backends/_chisq_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/backends/_fisher_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/backends/_ks_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/backends/_prop_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/backends/_t_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/backends/_var_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/backends/_wilcox_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/backends/cpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/backends/gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/design.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/hypothesis/solvers.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mixed/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mixed/_common.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mixed/_deviance.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mixed/_pirls.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mixed/_pls.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mixed/_random_effects.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mixed/_satterthwaite.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mixed/design.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mixed/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mixed/solvers.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/montecarlo/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/montecarlo/_ci.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/montecarlo/_common.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/montecarlo/_influence.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/montecarlo/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/montecarlo/backends/cpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/montecarlo/backends/gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/montecarlo/design.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/montecarlo/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/montecarlo/solvers.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multinomial/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multinomial/_common.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multinomial/_likelihood.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multinomial/_solver.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multinomial/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multinomial/backends/gpu_likelihood.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multinomial/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multivariate/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multivariate/_common.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multivariate/_factor.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multivariate/_pca.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multivariate/_rotation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multivariate/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/multivariate/backends/gpu_pca.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/_monotone.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/_objectives/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/_objectives/base.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/_objectives/cpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/_objectives/gpu_fp32.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/_objectives/gpu_fp64.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/_objectives/parameterizations.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/_utils.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/backends/_squarem.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/backends/cpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/backends/gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/datasets.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/design.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/patterns.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/mvnmle/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/ordinal/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/ordinal/_common.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/ordinal/_likelihood.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/ordinal/_solver.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/ordinal/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/ordinal/backends/gpu_likelihood.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/ordinal/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/py.typed +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/_formatting.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/_glm.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/_linear.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/_nb_theta.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/backends/cpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/backends/cpu_glm.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/backends/gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/backends/gpu_glm.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/design.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/families.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/regression/solvers.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/_common.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/_cox.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/_discrete.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/_km.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/_logrank.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/backends/cpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/backends/gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/design.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/solution.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/survival/solvers.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_acf.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_arima_batch.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_arima_factored.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_arima_fit.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_arima_forecast.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_arima_kalman.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_arima_likelihood.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_arima_order.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_common.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_decomposition.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_differencing.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_ets_fit.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_ets_forecast.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_ets_models.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_stationarity.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/_whittle.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/backends/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/backends/whittle_batch_gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/pystatistics/timeseries/backends/whittle_gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/anova/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/anova/conftest.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/anova/test_contrasts.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/anova/test_design.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/anova/test_factorial.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/anova/test_levene.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/anova/test_oneway.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/anova/test_posthoc.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/anova/test_r_validation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/anova/test_repeated_measures.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/benchmark_gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/conftest.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/core/test_datasource.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/core/test_exceptions.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/core/test_result.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/core/test_validation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/descriptive/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/descriptive/conftest.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/descriptive/test_cor.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/descriptive/test_cov.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/descriptive/test_describe.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/descriptive/test_gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/descriptive/test_missing.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/descriptive/test_moments.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/descriptive/test_quantile.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/descriptive/test_r_validation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_ancova_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_ancova_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_bonferroni_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_bonferroni_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_eta_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_eta_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_levene_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_levene_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_oneway_balanced_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_oneway_balanced_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_oneway_unbalanced_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_oneway_unbalanced_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_rm_mixed_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_rm_mixed_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_rm_within_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_rm_within_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_tukey_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_tukey_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_twoway_balanced_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_twoway_balanced_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_twoway_unbalanced_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/anova_twoway_unbalanced_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/basic_100x3.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/basic_100x3_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/basic_100x3_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/collinear_almost.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/collinear_almost_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/collinear_almost_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_basic_100x5.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_basic_100x5_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_basic_100x5_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_constant_column.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_constant_column_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_constant_column_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_extreme_values.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_extreme_values_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_extreme_values_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_large_1000x10.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_large_1000x10_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_large_1000x10_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_nan_columnwise.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_nan_columnwise_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_nan_columnwise_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_nan_scattered.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_nan_scattered_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_nan_scattered_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_negative_correlation.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_negative_correlation_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_negative_correlation_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_perfect_correlation.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_perfect_correlation_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_perfect_correlation_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_single_column.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_single_column_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_single_column_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_ties.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_ties_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/desc_ties_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/different_scales.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/different_scales_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/different_scales_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/generate_anova_fixtures.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/generate_descriptive_fixtures.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/generate_fixtures.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/generate_glm_fixtures.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/generate_hypothesis_fixtures.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/generate_mixed_fixtures.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/generate_montecarlo_fixtures.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/generate_survival_fixtures.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_balanced.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_balanced_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_balanced_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_basic.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_basic_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_basic_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_large.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_large_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_large_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_separated.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_separated_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_binomial_separated_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_gaussian_basic.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_gaussian_basic_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_gaussian_basic_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_gaussian_large.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_gaussian_large_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_gaussian_large_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_poisson_basic.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_poisson_basic_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_poisson_basic_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_poisson_large_counts.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_poisson_large_counts_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_poisson_large_counts_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_poisson_zeros.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_poisson_zeros_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/glm_poisson_zeros_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/high_noise.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/high_noise_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/high_noise_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_chisq_2x2_yates_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_chisq_2x2_yates_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_chisq_3x3_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_chisq_3x3_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_chisq_gof_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_chisq_gof_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_chisq_gof_unequal_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_chisq_gof_unequal_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_fisher_2x2_less_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_fisher_2x2_less_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_fisher_2x2_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_fisher_2x2_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_fisher_3x3_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_fisher_3x3_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_ks_onesample_norm_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_ks_onesample_norm_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_ks_twosample_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_ks_twosample_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_prop_onesample_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_prop_onesample_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_prop_twosample_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_prop_twosample_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_t_onesample_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_t_onesample_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_t_paired_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_t_paired_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_t_pooled_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_t_pooled_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_t_welch_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_t_welch_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_var_basic_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_var_basic_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_wilcox_ranksum_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_wilcox_ranksum_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_wilcox_signed_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/htest_wilcox_signed_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/ill_conditioned.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/ill_conditioned_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/ill_conditioned_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/large_coeffs.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/large_coeffs_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/large_coeffs_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_ci_90_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_ci_90_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_ci_normal_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_ci_normal_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_ci_skewed_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_ci_skewed_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_mean_balanced_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_mean_balanced_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_mean_ordinary_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_mean_ordinary_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_median_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_median_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_variance_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_boot_variance_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_perm_greater_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_perm_greater_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_perm_not_significant_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_perm_not_significant_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_perm_significant_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mc_perm_significant_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mixed/glmm_binomial.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mixed/glmm_poisson.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mixed/lmm_crossed.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mixed/lmm_intercept.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mixed/lmm_ml.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mixed/lmm_no_effect.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mixed/lmm_slope.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mixed/mixed_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/mixed/mixed_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/near_square.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/near_square_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/near_square_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/no_intercept.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/no_intercept_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/no_intercept_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/run_r_anova_validation.R +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/run_r_descriptive_validation.R +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/run_r_glm_validation.R +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/run_r_hypothesis_validation.R +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/run_r_mixed_validation.R +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/run_r_montecarlo_validation.R +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/run_r_survival_validation.R +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/run_r_validation.R +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/run_validation.sh +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/small_noise.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/small_noise_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/small_noise_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_cox_breslow_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_cox_breslow_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_cox_single_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_cox_single_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_cox_ties_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_cox_ties_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_cox_two_cov_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_cox_two_cov_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_basic_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_basic_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_heavy_cens_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_heavy_cens_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_loglog_ci_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_loglog_ci_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_no_cens_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_no_cens_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_plain_ci_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_plain_ci_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_ties_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_km_ties_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_lr_peto_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_lr_peto_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_lr_three_group_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_lr_three_group_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_lr_two_group_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/surv_lr_two_group_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/tall_skinny.csv +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/tall_skinny_meta.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/tall_skinny_r_results.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/fixtures/validate_against_r.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/gam/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/gam/test_gam.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/conftest.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_chisq_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_design_split.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_fisher_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_ks_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_p_adjust.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_prop_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_r_validation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_t_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_var_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/hypothesis/test_wilcox_test.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/conftest.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/test_glmm.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/test_lmm_crossed.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/test_lmm_intercept.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/test_lmm_nested.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/test_lmm_slope.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/test_pls.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/test_r_validation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/test_random_effects.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mixed/test_satterthwaite.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/montecarlo/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/montecarlo/conftest.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/montecarlo/test_batched_solver.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/montecarlo/test_boot_ci.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/montecarlo/test_bootstrap.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/montecarlo/test_gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/montecarlo/test_influence.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/montecarlo/test_permutation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/montecarlo/test_r_validation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/multinomial/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/multinomial/test_multinom.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/multivariate/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/multivariate/test_multivariate.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/apple_em_reference.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/apple_reference.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/generate_em_fixtures.R +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/little_mcar_apple.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/little_mcar_complete.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/little_mcar_extreme.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/little_mcar_missvals.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/little_mcar_simple_mcar.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/little_mcar_summary.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/missvals_em_reference.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/missvals_reference.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/references/small_test_reference.json +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/test_em.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/test_gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/test_mlest.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/test_mom_mcar.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/test_monotone.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/test_no_silent_fallback.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/mvnmle/test_squarem.py +0 -0
- {pystatistics-2.1.0/tests/ordinal → pystatistics-2.3.0/tests/nonparametric_mcar}/__init__.py +0 -0
- {pystatistics-2.1.0/tests/survival → pystatistics-2.3.0/tests/ordinal}/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/ordinal/test_ordinal.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/benchmark.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/benchmark.r +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/conftest.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/test_fit.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/test_gamma_nb.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/test_glm.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/test_glm_gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/test_glm_r_validation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/test_module_split.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/test_r_validation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/regression/test_stress_gpu.py +0 -0
- {pystatistics-2.1.0/tests/timeseries → pystatistics-2.3.0/tests/survival}/__init__.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/survival/conftest.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/survival/test_coxph.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/survival/test_discrete_time.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/survival/test_gpu.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/survival/test_kaplan_meier.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/survival/test_logrank.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/survival/test_r_validation.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/test_code_quality.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/timeseries/test_acf_stationarity.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/timeseries/test_arima.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/timeseries/test_decomposition.py +0 -0
- {pystatistics-2.1.0 → pystatistics-2.3.0}/tests/timeseries/test_ets.py +0 -0
|
@@ -1,5 +1,145 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.3.0
|
|
4
|
+
|
|
5
|
+
- **New subpackage `pystatistics.nonparametric_mcar`** for distribution-
|
|
6
|
+
free MCAR tests, motivated by the Lacuna ablation finding that the
|
|
7
|
+
MVN-based Little's MCAR feature (MLE or MoM plug-in) does not help
|
|
8
|
+
mechanism classification on heavy-tailed / categorical tabular data.
|
|
9
|
+
|
|
10
|
+
- Added `propensity_mcar_test(data, *, model='rf'|'gbm', cv_folds=5,
|
|
11
|
+
n_permutations=199, seed=0, alpha=0.05)`. Fits a sklearn
|
|
12
|
+
`RandomForestClassifier` or `GradientBoostingClassifier` to predict
|
|
13
|
+
each column's missingness indicator from the other columns
|
|
14
|
+
(mean-imputed + per-column missing-indicator features), computes
|
|
15
|
+
out-of-fold AUC, and calibrates against a permutation null. Returns
|
|
16
|
+
a `NonparametricMCARResult` with `statistic = mean_auc - 0.5` and
|
|
17
|
+
permutation-smoothed `p_value`. scikit-learn is an optional extra:
|
|
18
|
+
`pip install pystatistics[nonparametric_mcar]`.
|
|
19
|
+
|
|
20
|
+
- Added `NonparametricMCARResult` dataclass (statistic, p_value,
|
|
21
|
+
rejected, alpha, method, n_observations, n_variables,
|
|
22
|
+
n_missing_cells, extra). Intentionally narrower than the MVN-based
|
|
23
|
+
`MCARTestResult` — no df / ml_mean / ml_cov / patterns, because
|
|
24
|
+
nonparametric tests don't produce those.
|
|
25
|
+
|
|
26
|
+
- Tests: 11 in `tests/nonparametric_mcar/test_propensity.py` covering
|
|
27
|
+
normal cases (MCAR non-rejection, MAR rejection, reproducibility
|
|
28
|
+
under fixed seed, GBM option), edge cases (fully-observed column
|
|
29
|
+
ignored), and failure cases (1D input, too few rows/columns, no
|
|
30
|
+
missingness, invalid hyperparameters).
|
|
31
|
+
|
|
32
|
+
- Added `hsic_mcar_test(data, *, alpha=0.05, n_permutations=199,
|
|
33
|
+
seed=0)`. Hilbert-Schmidt Independence Criterion (Gretton et al.
|
|
34
|
+
2005/2008) between stochastically-imputed observed values and the
|
|
35
|
+
missingness-indicator matrix, with Gaussian RBF kernel and
|
|
36
|
+
median-heuristic bandwidth. Biased HSIC estimator, permutation null
|
|
37
|
+
for calibration. Uses **stochastic** (column-mean + column-std
|
|
38
|
+
noise) imputation rather than plain mean imputation — pure
|
|
39
|
+
mean-imputation pulls heavy-missing rows toward the column
|
|
40
|
+
centroid, which creates a systematic X-R coupling and rejects MCAR
|
|
41
|
+
spuriously on MCAR-generated data. Pure numpy; no sklearn dep.
|
|
42
|
+
|
|
43
|
+
- Added `missmech_mcar_test(data, *, alpha=0.05, n_permutations=199,
|
|
44
|
+
n_neighbors=5, min_pattern_size=6, seed=0)`. Jamshidian-Jalal-style
|
|
45
|
+
test of homogeneity of means across missingness-pattern groups,
|
|
46
|
+
after k-NN imputation (via `sklearn.impute.KNNImputer`). Statistic
|
|
47
|
+
is the between-pattern weighted sum of squared mean differences
|
|
48
|
+
(Σ_p n_p ||μ_p − μ||²), calibrated against a pattern-label
|
|
49
|
+
permutation null — equivalent in hypothesis to Jamshidian & Jalal
|
|
50
|
+
(2010)'s bootstrap, but faster for the cached-scalar use case.
|
|
51
|
+
Requires the same `nonparametric_mcar` extra for sklearn.
|
|
52
|
+
|
|
53
|
+
- Tests: 9 in `test_hsic.py`, 10 in `test_missmech.py` — both
|
|
54
|
+
covering MCAR non-rejection, MAR rejection, reproducibility under
|
|
55
|
+
seed, and the same failure-case matrix as propensity.
|
|
56
|
+
|
|
57
|
+
- Suite: 156/156 across `tests/nonparametric_mcar/` and `tests/mvnmle/`
|
|
58
|
+
pass; no mvnmle regressions from the new subpackage.
|
|
59
|
+
|
|
60
|
+
- **Split `pystatistics/mvnmle/backends/_em_batched.py`** (501 SLOC →
|
|
61
|
+
over the Rule 4 hard limit of 500) into three focused files plus a
|
|
62
|
+
compatibility shim:
|
|
63
|
+
- `_em_batched_patterns.py` (63 SLOC) — `_BatchedPatternIndex`
|
|
64
|
+
dataclass, `_pattern_n`, `build_pattern_index`.
|
|
65
|
+
- `_em_batched_np.py` (203 SLOC) — NumPy CPU backend
|
|
66
|
+
(`compute_conditional_parameters_np`, `e_step_full_batched_np`,
|
|
67
|
+
`compute_loglik_batched_np`, `chi_square_mcar_batched_np`).
|
|
68
|
+
- `_em_batched_torch.py` (239 SLOC) — Torch GPU backend
|
|
69
|
+
(`_e_step_full_torch`, `_loglik_full_torch`,
|
|
70
|
+
`chi_square_mcar_batched_torch`, `compute_conditional_parameters_torch`).
|
|
71
|
+
- `_em_batched.py` (30 SLOC) — thin shim re-exporting every
|
|
72
|
+
symbol so existing importers in `em.py`, `solvers.py`, and
|
|
73
|
+
`mcar_test.py` need no changes.
|
|
74
|
+
The 157-test suite across `tests/test_code_quality.py`,
|
|
75
|
+
`tests/mvnmle/`, and `tests/nonparametric_mcar/` passes after the
|
|
76
|
+
split; `test_no_file_exceeds_500_code_lines` now passes.
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
## 2.2.0
|
|
80
|
+
|
|
81
|
+
- Fixed a `torch._C._LinAlgError` crash in `chi_square_mcar_batched_torch`
|
|
82
|
+
(`pystatistics/mvnmle/backends/_em_batched.py`) on GPU FP32. The batched
|
|
83
|
+
MoM fast path selected `cholesky_solve` when the SVD-based condition
|
|
84
|
+
number was below threshold, but Cholesky requires positive-definiteness,
|
|
85
|
+
which is strictly stronger than good conditioning. On GPU FP32, real
|
|
86
|
+
tabular data (e.g. `lacuna_tabular_110` applied to UCI/OpenML datasets)
|
|
87
|
+
can produce `sigma_oo` with good cond number but tiny negative eigenvalues
|
|
88
|
+
from roundoff, making Cholesky fail. Fix: wrap the fast path in
|
|
89
|
+
`try/except torch._C._LinAlgError`; on failure, fall back to
|
|
90
|
+
`torch.linalg.pinv` for the batch (honouring the `regularize` flag —
|
|
91
|
+
`regularize=False` still raises). Surfaced by dogfooding via Project
|
|
92
|
+
Lacuna on 3,080 (dataset × generator) pairs across the 110-generator
|
|
93
|
+
tabular registry; previously `mom_mcar_test` crashed on the first batch
|
|
94
|
+
containing breast_cancer / wine / credit_card_default.
|
|
95
|
+
|
|
96
|
+
- Fixed an exception-type leak in `little_mcar_test`
|
|
97
|
+
(`pystatistics/mvnmle/mcar_test.py:~250`). The ML-estimation try/except
|
|
98
|
+
wrapped *every* exception — including `PyStatisticsError` subclasses
|
|
99
|
+
like `NumericalError` — as a bare `RuntimeError`, breaking the
|
|
100
|
+
documented `except PyStatisticsError:` pattern downstream and losing
|
|
101
|
+
the original exception chain. Fix: explicitly re-raise
|
|
102
|
+
`PyStatisticsError`, and use `raise ... from e` for anything else so
|
|
103
|
+
the chain is preserved. Surfaced by Project Lacuna's cache builder,
|
|
104
|
+
which catches `PyStatisticsError` to fall back to a sentinel entry
|
|
105
|
+
when Little's test is numerically unfit for a particular
|
|
106
|
+
(dataset, generator) pair; MLE failures were leaking past the catch
|
|
107
|
+
and killing the whole build.
|
|
108
|
+
|
|
109
|
+
- Added ridge-fallback to the batched Cholesky sites inside the EM
|
|
110
|
+
E-step / log-likelihood
|
|
111
|
+
(`pystatistics/mvnmle/backends/_em_batched.py`):
|
|
112
|
+
`e_step_full_batched_np` (line ~361), `_e_step_full_torch` (~680), and
|
|
113
|
+
`_loglik_full_batched_torch` (~797). These compute per-pattern
|
|
114
|
+
Cholesky of sigma_oo sub-blocks; real tabular data can produce
|
|
115
|
+
individual sub-blocks that are numerically indefinite even when the
|
|
116
|
+
global sigma is PD (integer-encoded categoricals with heavy
|
|
117
|
+
collinearity in the intersection of a given missingness pattern's
|
|
118
|
+
observed variables). Fix: wrap each site in `try/except LinAlgError`
|
|
119
|
+
with a `ridge·I` retry (ridge = 1e-10 at pattern scale; statistically
|
|
120
|
+
invisible). Also removed a dead Cholesky call in `e_step_batched_np`
|
|
121
|
+
whose result was never used — it was only a crash liability.
|
|
122
|
+
`np.linalg.solve` at that same site now has a pinv fallback for
|
|
123
|
+
singular sub-blocks.
|
|
124
|
+
|
|
125
|
+
- Added `regularize: bool = True` to `mlest`, `_solve_em`, and
|
|
126
|
+
`EMBackend.solve`, mirroring the existing convention on
|
|
127
|
+
`mom_mcar_test` / `little_mcar_test`. When True (new default),
|
|
128
|
+
`EMBackend._ensure_pd` applies a small diagonal ridge
|
|
129
|
+
(`max(0, 1e-10 - min_eig) + 1e-12`) to the M-step sigma whenever its
|
|
130
|
+
smallest eigenvalue falls below the PD threshold, rather than raising
|
|
131
|
+
`NumericalError` outright. The ridge is vanishingly small relative to
|
|
132
|
+
any real data scale — the typical case the old path rejected had
|
|
133
|
+
min_eig ≈ 1e-13 from pure FP64 roundoff — and a UserWarning makes the
|
|
134
|
+
event visible in logs. Call sites that need strict bit-for-bit
|
|
135
|
+
behaviour pass `regularize=False`. Motivated by Project Lacuna
|
|
136
|
+
dogfooding: applying real missingness generators to real UCI datasets
|
|
137
|
+
(credit_card_default × MNAR-NonLinSocial produced min_eig ≈ -0.66) was
|
|
138
|
+
hard-raising and killing the full cache build; the ridge fallback
|
|
139
|
+
keeps the test numerically well-defined with negligible statistical
|
|
140
|
+
impact, and the build proceeds.
|
|
141
|
+
|
|
142
|
+
|
|
3
143
|
## 2.1.0
|
|
4
144
|
|
|
5
145
|
- **`mom_mcar_test`: new method-of-moments MCAR test**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pystatistics
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: GPU-accelerated statistical computing for Python
|
|
5
5
|
Project-URL: Homepage, https://sgcx.org/technology/pystatistics/
|
|
6
6
|
Project-URL: Documentation, https://sgcx.org/docs/pystatistics/
|
|
@@ -43,6 +43,8 @@ Requires-Dist: furo; extra == 'docs'
|
|
|
43
43
|
Requires-Dist: sphinx>=6.0; extra == 'docs'
|
|
44
44
|
Provides-Extra: gpu
|
|
45
45
|
Requires-Dist: torch>=2.0; extra == 'gpu'
|
|
46
|
+
Provides-Extra: nonparametric-mcar
|
|
47
|
+
Requires-Dist: scikit-learn>=1.3; extra == 'nonparametric-mcar'
|
|
46
48
|
Description-Content-Type: text/markdown
|
|
47
49
|
|
|
48
50
|
# PyStatistics
|
|
@@ -51,6 +53,72 @@ GPU-accelerated statistical computing for Python.
|
|
|
51
53
|
|
|
52
54
|
## What's New
|
|
53
55
|
|
|
56
|
+
### 2.3.0 — Nonparametric MCAR tests for heavy-tailed tabular data
|
|
57
|
+
|
|
58
|
+
Little's MCAR test (1988) and the method-of-moments variant both assume
|
|
59
|
+
multivariate normality of the observed values. On realistic tabular
|
|
60
|
+
data — heavy-tailed, skewed, integer-encoded categoricals — MVN is
|
|
61
|
+
badly violated, and Project Lacuna's 2026-04 ablation study found that
|
|
62
|
+
cached Little's features add nothing to mechanism classification.
|
|
63
|
+
This release ships three distribution-free alternatives in a new
|
|
64
|
+
`pystatistics.nonparametric_mcar` subpackage so downstream projects
|
|
65
|
+
can test which family (if any) provides useful MCAR-detection signal
|
|
66
|
+
when MVN fails.
|
|
67
|
+
|
|
68
|
+
**`propensity_mcar_test`** fits a random forest (or gradient boosting)
|
|
69
|
+
classifier to predict each column's missingness indicator from the
|
|
70
|
+
other columns (mean-imputed + per-column missing-indicator features),
|
|
71
|
+
computes out-of-fold AUC, and calibrates against a permutation null.
|
|
72
|
+
Native mixed-type handling, nonlinear; deterministic under a seed.
|
|
73
|
+
Exposes `statistic = mean_observed_auc − 0.5` (clipped to [0, 0.5])
|
|
74
|
+
and a permutation-smoothed p-value. Optional scikit-learn dependency:
|
|
75
|
+
`pip install pystatistics[nonparametric_mcar]`.
|
|
76
|
+
|
|
77
|
+
**`hsic_mcar_test`** is a Hilbert-Schmidt Independence Criterion test
|
|
78
|
+
(Gretton et al. 2005/2008) between stochastically-imputed observed
|
|
79
|
+
values and the missingness-indicator matrix, with a Gaussian RBF
|
|
80
|
+
kernel and median-heuristic bandwidth. Pure numpy, no sklearn. Uses
|
|
81
|
+
**stochastic** imputation rather than plain mean imputation — the
|
|
82
|
+
latter pulls heavy-missing rows toward the column centroid, which
|
|
83
|
+
creates a systematic X-R coupling that rejects MCAR spuriously on
|
|
84
|
+
MCAR-generated data.
|
|
85
|
+
|
|
86
|
+
**`missmech_mcar_test`** is a Jamshidian-Jalal-style (2010)
|
|
87
|
+
nonparametric test of homogeneity of means across missingness
|
|
88
|
+
patterns. Groups rows by pattern, k-NN imputes to full columns, and
|
|
89
|
+
calibrates a between-pattern weighted sum-of-squared-mean-differences
|
|
90
|
+
statistic against a permutation null over the pattern labels.
|
|
91
|
+
Equivalent in hypothesis to Jamshidian & Jalal's bootstrap but faster
|
|
92
|
+
for the cached-scalar use case.
|
|
93
|
+
|
|
94
|
+
All three return a shared `NonparametricMCARResult` dataclass
|
|
95
|
+
(statistic, p_value, rejected, alpha, method, n_observations,
|
|
96
|
+
n_variables, n_missing_cells, extra) — intentionally narrower than
|
|
97
|
+
the MVN-based `MCARTestResult` from `mvnmle`, since concepts like
|
|
98
|
+
`df` / `ml_mean` / `ml_cov` / `patterns` don't apply to
|
|
99
|
+
distribution-free tests. 30 new tests across propensity, HSIC, and
|
|
100
|
+
MissMech; no mvnmle regressions.
|
|
101
|
+
|
|
102
|
+
**Internal refactor.** Split
|
|
103
|
+
`pystatistics/mvnmle/backends/_em_batched.py` (501 SLOC, over the
|
|
104
|
+
Rule 4 hard limit) into three focused modules — patterns,
|
|
105
|
+
NumPy backend, Torch backend — plus a compatibility shim that
|
|
106
|
+
re-exports every symbol so no importer needs to change. Code-quality
|
|
107
|
+
suite now reports zero files over 500 SLOC.
|
|
108
|
+
|
|
109
|
+
### 2.2.0 — Real-data robustness from Project Lacuna dogfooding
|
|
110
|
+
|
|
111
|
+
Four classes of numerical failure on realistic tabular data — Cholesky
|
|
112
|
+
fast-path crash on GPU FP32 roundoff, bare-`RuntimeError` wrapping
|
|
113
|
+
breaking `PyStatisticsError` catch patterns, M-step sigma PD-check
|
|
114
|
+
false negatives from FP64 roundoff, and per-pattern Cholesky on
|
|
115
|
+
indefinite sub-blocks — all fixed in this release with a unified
|
|
116
|
+
`regularize=True` opt-out-to-strict convention across `mlest`,
|
|
117
|
+
`mom_mcar_test`, `little_mcar_test`, and the batched E-step. The
|
|
118
|
+
Project Lacuna cache build on 3,080 (dataset × generator) pairs went
|
|
119
|
+
from crashing on the first batch to completing in a single pass at
|
|
120
|
+
0.9% MoM / 16.4% MLE sentinel rates. No API breaks.
|
|
121
|
+
|
|
54
122
|
### 2.1.0 — Real-data EM speedup + monotone closed-form MLE
|
|
55
123
|
|
|
56
124
|
Dogfooding via Project Lacuna surfaced that ``little_mcar_test`` on
|
|
@@ -4,6 +4,72 @@ GPU-accelerated statistical computing for Python.
|
|
|
4
4
|
|
|
5
5
|
## What's New
|
|
6
6
|
|
|
7
|
+
### 2.3.0 — Nonparametric MCAR tests for heavy-tailed tabular data
|
|
8
|
+
|
|
9
|
+
Little's MCAR test (1988) and the method-of-moments variant both assume
|
|
10
|
+
multivariate normality of the observed values. On realistic tabular
|
|
11
|
+
data — heavy-tailed, skewed, integer-encoded categoricals — MVN is
|
|
12
|
+
badly violated, and Project Lacuna's 2026-04 ablation study found that
|
|
13
|
+
cached Little's features add nothing to mechanism classification.
|
|
14
|
+
This release ships three distribution-free alternatives in a new
|
|
15
|
+
`pystatistics.nonparametric_mcar` subpackage so downstream projects
|
|
16
|
+
can test which family (if any) provides useful MCAR-detection signal
|
|
17
|
+
when MVN fails.
|
|
18
|
+
|
|
19
|
+
**`propensity_mcar_test`** fits a random forest (or gradient boosting)
|
|
20
|
+
classifier to predict each column's missingness indicator from the
|
|
21
|
+
other columns (mean-imputed + per-column missing-indicator features),
|
|
22
|
+
computes out-of-fold AUC, and calibrates against a permutation null.
|
|
23
|
+
Native mixed-type handling, nonlinear; deterministic under a seed.
|
|
24
|
+
Exposes `statistic = mean_observed_auc − 0.5` (clipped to [0, 0.5])
|
|
25
|
+
and a permutation-smoothed p-value. Optional scikit-learn dependency:
|
|
26
|
+
`pip install pystatistics[nonparametric_mcar]`.
|
|
27
|
+
|
|
28
|
+
**`hsic_mcar_test`** is a Hilbert-Schmidt Independence Criterion test
|
|
29
|
+
(Gretton et al. 2005/2008) between stochastically-imputed observed
|
|
30
|
+
values and the missingness-indicator matrix, with a Gaussian RBF
|
|
31
|
+
kernel and median-heuristic bandwidth. Pure numpy, no sklearn. Uses
|
|
32
|
+
**stochastic** imputation rather than plain mean imputation — the
|
|
33
|
+
latter pulls heavy-missing rows toward the column centroid, which
|
|
34
|
+
creates a systematic X-R coupling that rejects MCAR spuriously on
|
|
35
|
+
MCAR-generated data.
|
|
36
|
+
|
|
37
|
+
**`missmech_mcar_test`** is a Jamshidian-Jalal-style (2010)
|
|
38
|
+
nonparametric test of homogeneity of means across missingness
|
|
39
|
+
patterns. Groups rows by pattern, k-NN imputes to full columns, and
|
|
40
|
+
calibrates a between-pattern weighted sum-of-squared-mean-differences
|
|
41
|
+
statistic against a permutation null over the pattern labels.
|
|
42
|
+
Equivalent in hypothesis to Jamshidian & Jalal's bootstrap but faster
|
|
43
|
+
for the cached-scalar use case.
|
|
44
|
+
|
|
45
|
+
All three return a shared `NonparametricMCARResult` dataclass
|
|
46
|
+
(statistic, p_value, rejected, alpha, method, n_observations,
|
|
47
|
+
n_variables, n_missing_cells, extra) — intentionally narrower than
|
|
48
|
+
the MVN-based `MCARTestResult` from `mvnmle`, since concepts like
|
|
49
|
+
`df` / `ml_mean` / `ml_cov` / `patterns` don't apply to
|
|
50
|
+
distribution-free tests. 30 new tests across propensity, HSIC, and
|
|
51
|
+
MissMech; no mvnmle regressions.
|
|
52
|
+
|
|
53
|
+
**Internal refactor.** Split
|
|
54
|
+
`pystatistics/mvnmle/backends/_em_batched.py` (501 SLOC, over the
|
|
55
|
+
Rule 4 hard limit) into three focused modules — patterns,
|
|
56
|
+
NumPy backend, Torch backend — plus a compatibility shim that
|
|
57
|
+
re-exports every symbol so no importer needs to change. Code-quality
|
|
58
|
+
suite now reports zero files over 500 SLOC.
|
|
59
|
+
|
|
60
|
+
### 2.2.0 — Real-data robustness from Project Lacuna dogfooding
|
|
61
|
+
|
|
62
|
+
Four classes of numerical failure on realistic tabular data — Cholesky
|
|
63
|
+
fast-path crash on GPU FP32 roundoff, bare-`RuntimeError` wrapping
|
|
64
|
+
breaking `PyStatisticsError` catch patterns, M-step sigma PD-check
|
|
65
|
+
false negatives from FP64 roundoff, and per-pattern Cholesky on
|
|
66
|
+
indefinite sub-blocks — all fixed in this release with a unified
|
|
67
|
+
`regularize=True` opt-out-to-strict convention across `mlest`,
|
|
68
|
+
`mom_mcar_test`, `little_mcar_test`, and the batched E-step. The
|
|
69
|
+
Project Lacuna cache build on 3,080 (dataset × generator) pairs went
|
|
70
|
+
from crashing on the first batch to completing in a single pass at
|
|
71
|
+
0.9% MoM / 16.4% MLE sentinel rates. No API breaks.
|
|
72
|
+
|
|
7
73
|
### 2.1.0 — Real-data EM speedup + monotone closed-form MLE
|
|
8
74
|
|
|
9
75
|
Dogfooding via Project Lacuna surfaced that ``little_mcar_test`` on
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pystatistics"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.3.0"
|
|
8
8
|
description = "GPU-accelerated statistical computing for Python"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -48,6 +48,12 @@ dependencies = [
|
|
|
48
48
|
gpu = [
|
|
49
49
|
"torch>=2.0",
|
|
50
50
|
]
|
|
51
|
+
nonparametric_mcar = [
|
|
52
|
+
# scikit-learn for propensity_mcar_test (RandomForestClassifier /
|
|
53
|
+
# GradientBoostingClassifier). HSIC and MissMech in the same subpackage
|
|
54
|
+
# are pure numpy/scipy and do not need sklearn.
|
|
55
|
+
"scikit-learn>=1.3",
|
|
56
|
+
]
|
|
51
57
|
dev = [
|
|
52
58
|
"pytest>=7.0",
|
|
53
59
|
"pytest-cov>=4.0",
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Compatibility shim for the batched EM/MCAR building blocks.
|
|
2
|
+
|
|
3
|
+
The implementation was split into three modules on 2026-04-20 to stay
|
|
4
|
+
under the 500-SLOC file limit (Coding Bible rule 4):
|
|
5
|
+
|
|
6
|
+
* ``_em_batched_patterns`` — pattern-index dataclass + ``build_pattern_index``
|
|
7
|
+
* ``_em_batched_np`` — NumPy backend (CPU)
|
|
8
|
+
* ``_em_batched_torch`` — Torch backend (GPU + CPU torch)
|
|
9
|
+
|
|
10
|
+
This module continues to expose every name that callers imported
|
|
11
|
+
pre-split, so no call-site changes were required. New code may import
|
|
12
|
+
from the specific backend module directly.
|
|
13
|
+
"""
|
|
14
|
+
from pystatistics.mvnmle.backends._em_batched_patterns import (
|
|
15
|
+
_BatchedPatternIndex,
|
|
16
|
+
_pattern_n,
|
|
17
|
+
build_pattern_index,
|
|
18
|
+
)
|
|
19
|
+
from pystatistics.mvnmle.backends._em_batched_np import (
|
|
20
|
+
chi_square_mcar_batched_np,
|
|
21
|
+
compute_conditional_parameters_np,
|
|
22
|
+
compute_loglik_batched_np,
|
|
23
|
+
e_step_full_batched_np,
|
|
24
|
+
)
|
|
25
|
+
from pystatistics.mvnmle.backends._em_batched_torch import (
|
|
26
|
+
_e_step_full_torch,
|
|
27
|
+
_loglik_full_torch,
|
|
28
|
+
chi_square_mcar_batched_torch,
|
|
29
|
+
compute_conditional_parameters_torch,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
__all__ = [
|
|
33
|
+
"_BatchedPatternIndex",
|
|
34
|
+
"_pattern_n",
|
|
35
|
+
"build_pattern_index",
|
|
36
|
+
"chi_square_mcar_batched_np",
|
|
37
|
+
"compute_conditional_parameters_np",
|
|
38
|
+
"compute_loglik_batched_np",
|
|
39
|
+
"e_step_full_batched_np",
|
|
40
|
+
"_e_step_full_torch",
|
|
41
|
+
"_loglik_full_torch",
|
|
42
|
+
"chi_square_mcar_batched_torch",
|
|
43
|
+
"compute_conditional_parameters_torch",
|
|
44
|
+
]
|