pystatistics 3.4.0__tar.gz → 3.5.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-3.5.0/.release/UNRELEASED.md +39 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/CHANGELOG.md +39 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/PKG-INFO +24 -2
- {pystatistics-3.4.0 → pystatistics-3.5.0}/README.md +23 -1
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pyproject.toml +1 -1
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/__init__.py +1 -1
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/_chain.py +15 -16
- pystatistics-3.5.0/pystatistics/mice/_encode.py +73 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/backends/gpu.py +12 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/design.py +91 -16
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/__init__.py +3 -0
- pystatistics-3.5.0/pystatistics/mice/methods/_draw.py +72 -0
- pystatistics-3.5.0/pystatistics/mice/methods/logreg.py +85 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/pmm.py +32 -11
- pystatistics-3.5.0/pystatistics/mice/methods/polr.py +85 -0
- pystatistics-3.5.0/pystatistics/mice/methods/polyreg.py +74 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/solution.py +10 -0
- pystatistics-3.5.0/tests/mice/references/generate_categorical_fixtures.R +75 -0
- pystatistics-3.5.0/tests/mice/references/mice_categorical_data.csv +601 -0
- pystatistics-3.5.0/tests/mice/references/mice_categorical_reference.json +21 -0
- pystatistics-3.5.0/tests/mice/test_categorical.py +270 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_design.py +10 -2
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_methods.py +29 -0
- pystatistics-3.5.0/tests/mice/test_r_validation_categorical.py +71 -0
- pystatistics-3.4.0/.release/UNRELEASED.md +0 -29
- {pystatistics-3.4.0 → pystatistics-3.5.0}/.github/workflows/publish.yml +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/.github/workflows/trigger-docs-rebuild.yml +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/.gitignore +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/.release/CHECKLIST.md +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/.release/release.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/CLAUDE.md +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/LICENSE +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/benchmarks/mvnmle_bench.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/DESIGN.md +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/Forge.md +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/GPU_BACKEND_NOTES.md +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/Makefile +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/PYSTATSBIO_CONTEXT.md +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/ROADMAP.md +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/_static/custom.css +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/anova.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/conf.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/core.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/descriptive.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/gam.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/hypothesis.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/index.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/mixed.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/montecarlo.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/multinomial.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/multivariate.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/mvnmle.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/ordinal.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/regression.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/survival.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/timeseries.rst +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/GPU_BACKEND_CONVENTION.md +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_common.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_contrasts.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_levene.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_posthoc.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_repeated.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_ss.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/design.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/solvers.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/capabilities.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/device.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/batched.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/cholesky.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/determinant.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/qr.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/solve.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/svd.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/optimization/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/optimization/convergence.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/precision.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/timing.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/tolerances.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/torch_interop.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/datasource.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/encoding.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/exceptions.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/protocols.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/result.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/_missing.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/_quantile_types.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/backends/cpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/backends/gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/design.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/solvers.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_basis.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_common.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_fit.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_gam.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_gcv.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_smooth.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/backends/_gpu_family.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/backends/gpu_pirls.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/_common.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/_design_factories.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/_p_adjust.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_chisq_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_fisher_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_ks_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_prop_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_t_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_var_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_wilcox_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/cpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/design.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/solvers.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/_rng.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/_visit.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/backends/_gpu_linreg.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/backends/_gpu_methods.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/backends/cpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/datasets.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/_linreg.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/base.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/norm.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/registry.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/pooling.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/solvers.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_common.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_deviance.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_pirls.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_pls.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_random_effects.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_satterthwaite.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/design.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/solvers.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/_ci.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/_common.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/_influence.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/backends/cpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/backends/gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/design.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/solvers.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/_common.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/_likelihood.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/_solver.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/backends/gpu_likelihood.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/_common.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/_factor.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/_pca.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/_rotation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/backends/gpu_pca.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_monotone.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/base.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/cpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/gpu_fp32.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/gpu_fp64.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/parameterizations.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_utils.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/_em_batched.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/_em_batched_np.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/_em_batched_patterns.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/_em_batched_torch.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/_squarem.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/cpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/em.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/datasets.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/design.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/mcar_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/patterns.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/solvers.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/_common.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/_likelihood.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/_solver.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/backends/gpu_likelihood.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/py.typed +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/_formatting.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/_glm.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/_linear.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/_nb_theta.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/backends/cpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/backends/cpu_glm.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/backends/gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/backends/gpu_glm.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/design.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/families.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/solvers.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/terms.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/_common.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/_cox.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/_discrete.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/_km.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/_logrank.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/backends/cpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/backends/gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/design.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/solution.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/solvers.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_acf.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_batch.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_factored.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_fit.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_forecast.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_kalman.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_likelihood.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_order.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_common.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_decomposition.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_differencing.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_ets_fit.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_ets_forecast.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_ets_models.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_stationarity.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_whittle.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/backends/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/backends/whittle_batch_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/backends/whittle_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/conftest.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_contrasts.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_design.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_factorial.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_levene.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_oneway.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_posthoc.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_r_validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_repeated_measures.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/benchmark_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/conftest.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/core/test_datasource.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/core/test_exceptions.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/core/test_result.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/core/test_torch_interop.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/core/test_validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/conftest.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_cor.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_cov.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_describe.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_missing.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_moments.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_quantile.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_r_validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_ancova_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_ancova_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_bonferroni_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_bonferroni_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_eta_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_eta_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_levene_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_levene_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_oneway_balanced_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_oneway_balanced_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_oneway_unbalanced_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_oneway_unbalanced_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_rm_mixed_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_rm_mixed_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_rm_within_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_rm_within_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_tukey_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_tukey_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_twoway_balanced_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_twoway_balanced_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_twoway_unbalanced_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_twoway_unbalanced_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/basic_100x3.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/basic_100x3_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/basic_100x3_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/collinear_almost.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/collinear_almost_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/collinear_almost_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_basic_100x5.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_basic_100x5_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_basic_100x5_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_constant_column.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_constant_column_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_constant_column_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_extreme_values.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_extreme_values_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_extreme_values_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_large_1000x10.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_large_1000x10_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_large_1000x10_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_columnwise.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_columnwise_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_columnwise_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_scattered.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_scattered_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_scattered_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_negative_correlation.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_negative_correlation_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_negative_correlation_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_perfect_correlation.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_perfect_correlation_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_perfect_correlation_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_single_column.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_single_column_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_single_column_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_ties.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_ties_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_ties_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/different_scales.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/different_scales_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/different_scales_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_anova_fixtures.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_descriptive_fixtures.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_fixtures.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_glm_fixtures.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_hypothesis_fixtures.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_mixed_fixtures.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_montecarlo_fixtures.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_survival_fixtures.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_balanced.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_balanced_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_balanced_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_basic.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_basic_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_basic_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_large.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_large_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_large_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_separated.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_separated_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_separated_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_basic.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_basic_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_basic_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_large.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_large_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_large_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_basic.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_basic_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_basic_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_large_counts.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_large_counts_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_large_counts_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_zeros.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_zeros_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_zeros_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/high_noise.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/high_noise_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/high_noise_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_2x2_yates_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_2x2_yates_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_3x3_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_3x3_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_gof_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_gof_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_gof_unequal_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_gof_unequal_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_2x2_less_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_2x2_less_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_2x2_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_2x2_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_3x3_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_3x3_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_ks_onesample_norm_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_ks_onesample_norm_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_ks_twosample_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_ks_twosample_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_prop_onesample_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_prop_onesample_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_prop_twosample_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_prop_twosample_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_onesample_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_onesample_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_paired_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_paired_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_pooled_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_pooled_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_welch_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_welch_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_var_basic_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_var_basic_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_wilcox_ranksum_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_wilcox_ranksum_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_wilcox_signed_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_wilcox_signed_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/ill_conditioned.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/ill_conditioned_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/ill_conditioned_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/large_coeffs.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/large_coeffs_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/large_coeffs_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_90_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_90_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_normal_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_normal_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_skewed_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_skewed_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_mean_balanced_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_mean_balanced_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_mean_ordinary_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_mean_ordinary_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_median_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_median_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_variance_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_variance_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_greater_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_greater_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_not_significant_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_not_significant_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_significant_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_significant_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/glmm_binomial.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/glmm_poisson.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/lmm_crossed.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/lmm_intercept.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/lmm_ml.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/lmm_no_effect.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/lmm_slope.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/mixed_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/mixed_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/near_square.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/near_square_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/near_square_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/no_intercept.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/no_intercept_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/no_intercept_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_anova_validation.R +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_descriptive_validation.R +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_glm_validation.R +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_hypothesis_validation.R +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_mixed_validation.R +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_montecarlo_validation.R +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_survival_validation.R +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_validation.R +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_validation.sh +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/small_noise.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/small_noise_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/small_noise_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_breslow_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_breslow_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_single_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_single_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_ties_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_ties_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_two_cov_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_two_cov_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_basic_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_basic_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_heavy_cens_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_heavy_cens_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_loglog_ci_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_loglog_ci_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_no_cens_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_no_cens_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_plain_ci_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_plain_ci_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_ties_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_ties_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_peto_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_peto_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_three_group_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_three_group_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_two_group_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_two_group_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/tall_skinny.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/tall_skinny_meta.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/tall_skinny_r_results.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/validate_against_r.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/gam/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/gam/test_gam.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/conftest.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_chisq_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_design_split.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_fisher_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_ks_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_p_adjust.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_prop_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_r_validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_t_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_var_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_wilcox_test.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/references/generate_mice_fixtures.R +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/references/mice_reference.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/references/mice_validation_complete.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/references/mice_validation_data.csv +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_datasets.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_mice.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_pooling.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_r_validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_rng.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_visit.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/conftest.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_glmm.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_lmm_crossed.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_lmm_intercept.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_lmm_nested.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_lmm_slope.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_pls.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_r_validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_random_effects.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_satterthwaite.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/conftest.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_batched_solver.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_boot_ci.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_bootstrap.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_influence.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_permutation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_r_validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/multinomial/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/multinomial/test_multinom.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/multivariate/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/multivariate/test_multivariate.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/apple_em_reference.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/apple_reference.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/generate_em_fixtures.R +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_apple.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_complete.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_extreme.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_missvals.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_simple_mcar.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_summary.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/missvals_em_reference.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/missvals_reference.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/small_test_reference.json +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_em.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_mcar.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_mlest.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_monotone.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_no_silent_fallback.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_squarem.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/ordinal/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/ordinal/test_ordinal.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/benchmark.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/benchmark.r +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/conftest.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_fit.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_gamma_nb.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_glm.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_glm_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_glm_r_validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_module_split.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_r_validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_stress_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_terms.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_terms_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/conftest.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_coxph.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_discrete_time.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_gpu.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_kaplan_meier.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_logrank.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_r_validation.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/test_code_quality.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/timeseries/__init__.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/timeseries/test_acf_stationarity.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/timeseries/test_arima.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/timeseries/test_decomposition.py +0 -0
- {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/timeseries/test_ets.py +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Unreleased Changes
|
|
2
|
+
|
|
3
|
+
> This file tracks all changes since the last stable release.
|
|
4
|
+
> Updated by whoever makes a change, on whatever machine.
|
|
5
|
+
> Synced via git so all sessions (Mac, Linux, etc.) see the same state.
|
|
6
|
+
>
|
|
7
|
+
> When ready to release, run: `python .release/release.py --status`
|
|
8
|
+
> and follow the manual release flow in the script docstring.
|
|
9
|
+
|
|
10
|
+
## Changes
|
|
11
|
+
|
|
12
|
+
- Categorical imputation for `mice`. Columns can now be declared
|
|
13
|
+
`binary` / `categorical` (unordered) / `ordered` via `column_kinds`, and are
|
|
14
|
+
imputed with the matching R-mice method: `logreg` (Bayesian logistic),
|
|
15
|
+
`polyreg` (multinomial logit, reusing the `multinomial` module), and `polr`
|
|
16
|
+
(proportional odds, reusing the `ordinal` module). Each draws its parameters
|
|
17
|
+
from the posterior normal approximation, predicts class probabilities for the
|
|
18
|
+
missing rows, and samples a category.
|
|
19
|
+
- `method='auto'` (new default) picks the R-default method per column kind
|
|
20
|
+
(numeric->pmm, binary->logreg, categorical->polyreg, ordered->polr). An
|
|
21
|
+
explicit method name still applies to all incomplete columns. Categorical
|
|
22
|
+
columns must be encoded as integer category codes.
|
|
23
|
+
- Categorical predictors are treatment-dummy-encoded in the sweep
|
|
24
|
+
(`pystatistics/mice/_encode.py`); the numeric-only path keeps a fast slice so
|
|
25
|
+
its performance is unchanged. The chain maps categorical targets to/from
|
|
26
|
+
consecutive `0..K-1` class indices.
|
|
27
|
+
- Validated distributionally against R `mice` 3.19.0: imputed category marginal
|
|
28
|
+
proportions for logreg/polyreg/polr match R within ~0.015 on a shared
|
|
29
|
+
mixed-type dataset (`tests/mice/references/`).
|
|
30
|
+
- Robustness: if a categorical model fit fails to converge on an awkward
|
|
31
|
+
intermediate sweep state, the method falls back to a marginal draw for that
|
|
32
|
+
step with a visible `UserWarning` (matching how R wraps MASS::polr), retrying
|
|
33
|
+
the full conditional model on the next iteration. Observed ~0.1% of fits.
|
|
34
|
+
- The GPU backend now explicitly refuses data with any categorical column
|
|
35
|
+
(categorical imputation is CPU-only); previously only the target method was
|
|
36
|
+
checked.
|
|
37
|
+
- Added a public `vcov` property to the multinomial solution
|
|
38
|
+
(`pystatistics/multinomial/solution.py`) for parity with the ordinal module,
|
|
39
|
+
so the imputation method reads only public surfaces.
|
|
@@ -1,5 +1,44 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.5.0
|
|
4
|
+
|
|
5
|
+
Categorical imputation for MICE.
|
|
6
|
+
|
|
7
|
+
- **`mice` now imputes categorical columns**, not just numeric ones. Declare a
|
|
8
|
+
column's kind with `column_kinds` — `'binary'`, `'categorical'` (unordered),
|
|
9
|
+
or `'ordered'` — and it is imputed with the matching method: logistic
|
|
10
|
+
regression for binary columns, multinomial logistic for unordered factors, and
|
|
11
|
+
proportional-odds (ordinal logistic) for ordered factors. These mirror R
|
|
12
|
+
`mice`'s `logreg`, `polyreg`, and `polr`. Categorical columns are given as
|
|
13
|
+
integer category codes.
|
|
14
|
+
- **`method='auto'` is the new default** and picks the appropriate method for
|
|
15
|
+
each column's kind (predictive mean matching for numeric, logistic for binary,
|
|
16
|
+
multinomial for unordered, proportional odds for ordered). Passing an explicit
|
|
17
|
+
method name still applies it to every incomplete column.
|
|
18
|
+
- Categorical columns are handled correctly as predictors too (dummy-encoded),
|
|
19
|
+
so mixed numeric/categorical datasets impute coherently. Validated against R
|
|
20
|
+
`mice`: imputed category proportions match closely for all three methods.
|
|
21
|
+
- If a categorical model cannot be fit for a particular step during the
|
|
22
|
+
iterations, that step falls back to a draw from the observed category
|
|
23
|
+
distribution (with a warning) and the full model is retried next iteration.
|
|
24
|
+
- GPU acceleration remains numeric-only; running `backend='gpu'` on data with
|
|
25
|
+
categorical columns raises a clear error (use the CPU backend).
|
|
26
|
+
|
|
27
|
+
## 3.4.1
|
|
28
|
+
|
|
29
|
+
Performance: CPU predictive mean matching now scales to large datasets.
|
|
30
|
+
|
|
31
|
+
- The CPU PMM donor search no longer builds a dense distance matrix between
|
|
32
|
+
every missing and every observed value. It sorts the observed predictions
|
|
33
|
+
once and searches a small window around each missing value (the same approach
|
|
34
|
+
R's `mice` uses), reducing both time and memory from quadratic in the number
|
|
35
|
+
of rows to roughly `n log n`. In practice CPU PMM at n=3000 dropped from ~25s
|
|
36
|
+
to under 1s, and large problems (n=20000) that were effectively unusable now
|
|
37
|
+
finish in seconds.
|
|
38
|
+
- Results are unchanged statistically — the donor pool and all imputation
|
|
39
|
+
distributions are identical, and validation against R's `mice` still passes.
|
|
40
|
+
Exact per-seed imputed values can differ slightly from 3.4.0.
|
|
41
|
+
|
|
3
42
|
## 3.4.0
|
|
4
43
|
|
|
5
44
|
GPU acceleration for MICE.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pystatistics
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.5.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/
|
|
@@ -86,7 +86,7 @@ PyStatistics maintains two parallel computational paths with distinct goals:
|
|
|
86
86
|
| `multivariate/` | Complete | PCA and maximum likelihood factor analysis with varimax/promax rotation |
|
|
87
87
|
| `timeseries/` | Complete | ACF, PACF, ADF, KPSS, ETS, ARIMA, SARIMA, auto_arima, decompose, STL |
|
|
88
88
|
| `gam/` | Complete | Generalized additive models with penalized regression splines matching R mgcv::gam |
|
|
89
|
-
| `mice/` |
|
|
89
|
+
| `mice/` | Complete | Multiple imputation by chained equations: numeric (PMM, Bayesian regression) and categorical (logistic, multinomial, proportional-odds), Rubin's-rules pooling, validated against R mice; CUDA GPU backend for numeric |
|
|
90
90
|
|
|
91
91
|
See [docs/ROADMAP.md](docs/ROADMAP.md) for detailed scope, GPU applicability, and implementation priority for each module.
|
|
92
92
|
|
|
@@ -413,6 +413,28 @@ pip install pystatistics[dev]
|
|
|
413
413
|
|
|
414
414
|
## What's New
|
|
415
415
|
|
|
416
|
+
### 3.5.0 — Categorical imputation for MICE
|
|
417
|
+
|
|
418
|
+
- `mice` now imputes categorical columns, not only numeric ones. Declare each
|
|
419
|
+
column's kind via `column_kinds` (`'binary'`, `'categorical'`, `'ordered'`)
|
|
420
|
+
and it is imputed with logistic, multinomial, or proportional-odds regression
|
|
421
|
+
respectively — mirroring R `mice`'s `logreg`/`polyreg`/`polr`. Categorical
|
|
422
|
+
columns are integer category codes.
|
|
423
|
+
- `method='auto'` (the new default) selects the right method per column kind;
|
|
424
|
+
mixed numeric/categorical datasets impute coherently (categorical predictors
|
|
425
|
+
are dummy-encoded). Imputed category proportions are validated against R
|
|
426
|
+
`mice`.
|
|
427
|
+
- GPU acceleration stays numeric-only; categorical imputation runs on the CPU.
|
|
428
|
+
|
|
429
|
+
### 3.4.1 — Faster CPU predictive mean matching
|
|
430
|
+
|
|
431
|
+
- CPU PMM in `mice` now scales to large datasets: the donor search sorts the
|
|
432
|
+
observed predictions and scans a small window per missing value (as R's
|
|
433
|
+
`mice` does) instead of forming a full distance matrix, cutting time and
|
|
434
|
+
memory from quadratic to roughly `n log n`. Large problems that were
|
|
435
|
+
effectively unusable on the CPU now finish in seconds. Results are
|
|
436
|
+
statistically unchanged.
|
|
437
|
+
|
|
416
438
|
### 3.4.0 — GPU acceleration for MICE
|
|
417
439
|
|
|
418
440
|
- `mice(..., backend='gpu')` runs the imputation chains on a CUDA GPU, batching
|
|
@@ -39,7 +39,7 @@ PyStatistics maintains two parallel computational paths with distinct goals:
|
|
|
39
39
|
| `multivariate/` | Complete | PCA and maximum likelihood factor analysis with varimax/promax rotation |
|
|
40
40
|
| `timeseries/` | Complete | ACF, PACF, ADF, KPSS, ETS, ARIMA, SARIMA, auto_arima, decompose, STL |
|
|
41
41
|
| `gam/` | Complete | Generalized additive models with penalized regression splines matching R mgcv::gam |
|
|
42
|
-
| `mice/` |
|
|
42
|
+
| `mice/` | Complete | Multiple imputation by chained equations: numeric (PMM, Bayesian regression) and categorical (logistic, multinomial, proportional-odds), Rubin's-rules pooling, validated against R mice; CUDA GPU backend for numeric |
|
|
43
43
|
|
|
44
44
|
See [docs/ROADMAP.md](docs/ROADMAP.md) for detailed scope, GPU applicability, and implementation priority for each module.
|
|
45
45
|
|
|
@@ -366,6 +366,28 @@ pip install pystatistics[dev]
|
|
|
366
366
|
|
|
367
367
|
## What's New
|
|
368
368
|
|
|
369
|
+
### 3.5.0 — Categorical imputation for MICE
|
|
370
|
+
|
|
371
|
+
- `mice` now imputes categorical columns, not only numeric ones. Declare each
|
|
372
|
+
column's kind via `column_kinds` (`'binary'`, `'categorical'`, `'ordered'`)
|
|
373
|
+
and it is imputed with logistic, multinomial, or proportional-odds regression
|
|
374
|
+
respectively — mirroring R `mice`'s `logreg`/`polyreg`/`polr`. Categorical
|
|
375
|
+
columns are integer category codes.
|
|
376
|
+
- `method='auto'` (the new default) selects the right method per column kind;
|
|
377
|
+
mixed numeric/categorical datasets impute coherently (categorical predictors
|
|
378
|
+
are dummy-encoded). Imputed category proportions are validated against R
|
|
379
|
+
`mice`.
|
|
380
|
+
- GPU acceleration stays numeric-only; categorical imputation runs on the CPU.
|
|
381
|
+
|
|
382
|
+
### 3.4.1 — Faster CPU predictive mean matching
|
|
383
|
+
|
|
384
|
+
- CPU PMM in `mice` now scales to large datasets: the donor search sorts the
|
|
385
|
+
observed predictions and scans a small window per missing value (as R's
|
|
386
|
+
`mice` does) instead of forming a full distance matrix, cutting time and
|
|
387
|
+
memory from quadratic to roughly `n log n`. Large problems that were
|
|
388
|
+
effectively unusable on the CPU now finish in seconds. Results are
|
|
389
|
+
statistically unchanged.
|
|
390
|
+
|
|
369
391
|
### 3.4.0 — GPU acceleration for MICE
|
|
370
392
|
|
|
371
393
|
- `mice(..., backend='gpu')` runs the imputation chains on a CUDA GPU, batching
|
|
@@ -25,6 +25,11 @@ from dataclasses import dataclass
|
|
|
25
25
|
|
|
26
26
|
import numpy as np
|
|
27
27
|
|
|
28
|
+
from pystatistics.mice._encode import (
|
|
29
|
+
build_predictor_matrix,
|
|
30
|
+
codes_to_indices,
|
|
31
|
+
indices_to_codes,
|
|
32
|
+
)
|
|
28
33
|
from pystatistics.mice.design import MICEDesign
|
|
29
34
|
from pystatistics.mice.methods import get_method
|
|
30
35
|
|
|
@@ -48,7 +53,6 @@ def run_chain(
|
|
|
48
53
|
"""Run one chained-equations chain. See module docstring."""
|
|
49
54
|
data = design.data.copy()
|
|
50
55
|
mask = design.missing_mask
|
|
51
|
-
p = design.p
|
|
52
56
|
incomplete = design.incomplete_columns
|
|
53
57
|
|
|
54
58
|
_initialise(data, mask, incomplete, rng)
|
|
@@ -62,14 +66,21 @@ def run_chain(
|
|
|
62
66
|
mis_rows = mask[:, j]
|
|
63
67
|
obs_rows = ~mis_rows
|
|
64
68
|
|
|
65
|
-
predictors =
|
|
69
|
+
predictors = build_predictor_matrix(data, j, design)
|
|
66
70
|
X_obs = predictors[obs_rows]
|
|
67
71
|
X_mis = predictors[mis_rows]
|
|
68
72
|
y_obs = data[obs_rows, j]
|
|
69
73
|
|
|
70
74
|
method = get_method(design.method_for(j))
|
|
71
|
-
|
|
72
|
-
|
|
75
|
+
if design.is_categorical(j):
|
|
76
|
+
# Methods speak in consecutive 0..K-1 class indices; the chain
|
|
77
|
+
# translates to/from the column's stored category codes.
|
|
78
|
+
levels = design.levels_for(j)
|
|
79
|
+
y_idx = codes_to_indices(y_obs, levels)
|
|
80
|
+
imputed_idx = method.impute(y_idx, X_obs, X_mis, rng)
|
|
81
|
+
data[mis_rows, j] = indices_to_codes(imputed_idx, levels)
|
|
82
|
+
else:
|
|
83
|
+
data[mis_rows, j] = method.impute(y_obs, X_obs, X_mis, rng)
|
|
73
84
|
|
|
74
85
|
# Trace: summarise this iteration's imputed cells per incomplete column.
|
|
75
86
|
for j in incomplete:
|
|
@@ -99,15 +110,3 @@ def _initialise(
|
|
|
99
110
|
observed = data[~mis_rows, j]
|
|
100
111
|
n_missing = int(np.count_nonzero(mis_rows))
|
|
101
112
|
data[mis_rows, j] = rng.choice(observed, size=n_missing, replace=True)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def _predictor_columns(data: np.ndarray, j: int, p: int) -> np.ndarray:
|
|
105
|
-
"""All columns except ``j`` (the current target), as a 2D predictor matrix.
|
|
106
|
-
|
|
107
|
-
Columns are fully populated at this point (initialised on entry, kept
|
|
108
|
-
complete by every visit), so the returned matrix is finite. Fancy-indexing
|
|
109
|
-
with a list always yields a 2D matrix, including the single-predictor
|
|
110
|
-
(p == 2) case.
|
|
111
|
-
"""
|
|
112
|
-
cols = [c for c in range(p) if c != j]
|
|
113
|
-
return data[:, cols]
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Predictor encoding and category-code mapping for the chained-equations sweep.
|
|
3
|
+
|
|
4
|
+
When a column is imputed, the other columns serve as predictors. Numeric columns
|
|
5
|
+
enter the model as-is, but a *categorical* predictor must be dummy-encoded — its
|
|
6
|
+
integer codes are labels, not magnitudes, so feeding the raw codes would impose a
|
|
7
|
+
spurious linear order. This module builds the encoded predictor matrix and maps
|
|
8
|
+
categorical target values between their stored codes and the consecutive
|
|
9
|
+
``0..K-1`` class indices the categorical methods expect.
|
|
10
|
+
|
|
11
|
+
Contrast choice: categorical predictors use treatment (drop-first) dummies. For
|
|
12
|
+
a model's *predictions* this is equivalent to any other full-rank contrast
|
|
13
|
+
(treatment, polynomial, …) — they span the same column space — so this matches
|
|
14
|
+
R's model matrix for imputation purposes regardless of which contrast R picks.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
from numpy.typing import NDArray
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def build_predictor_matrix(data: NDArray, j: int, design) -> NDArray:
|
|
24
|
+
"""Predictor matrix for imputing column ``j``: every other column, with
|
|
25
|
+
categorical columns treatment-dummy-encoded. No intercept column (methods
|
|
26
|
+
add one where they need it).
|
|
27
|
+
|
|
28
|
+
Fast path: when no column is categorical this is a plain column slice, so the
|
|
29
|
+
all-numeric sweep keeps its original cost.
|
|
30
|
+
"""
|
|
31
|
+
p = design.p
|
|
32
|
+
if not design.has_categorical:
|
|
33
|
+
cols = [c for c in range(p) if c != j]
|
|
34
|
+
return data[:, cols]
|
|
35
|
+
|
|
36
|
+
blocks = []
|
|
37
|
+
for c in range(p):
|
|
38
|
+
if c == j:
|
|
39
|
+
continue
|
|
40
|
+
if design.is_categorical(c):
|
|
41
|
+
blocks.append(_treatment_dummies(data[:, c], design.levels_for(c)))
|
|
42
|
+
else:
|
|
43
|
+
blocks.append(data[:, c].reshape(-1, 1))
|
|
44
|
+
if not blocks:
|
|
45
|
+
return np.empty((data.shape[0], 0), dtype=np.float64)
|
|
46
|
+
return np.hstack(blocks)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _treatment_dummies(col: NDArray, levels: NDArray) -> NDArray:
|
|
50
|
+
"""One-hot encode ``col`` against ``levels``, dropping the first level as the
|
|
51
|
+
reference. Returns (n, len(levels)-1). Values are exact category codes (drawn
|
|
52
|
+
from observed values or imputed back as codes), so equality is exact."""
|
|
53
|
+
# Columns for levels[1:]; the reference level maps to an all-zero row.
|
|
54
|
+
return (col[:, None] == levels[None, 1:]).astype(np.float64)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def codes_to_indices(values: NDArray, levels: NDArray) -> NDArray:
|
|
58
|
+
"""Map category codes to consecutive ``0..K-1`` indices (levels are sorted)."""
|
|
59
|
+
return np.searchsorted(levels, values).astype(np.intp)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def indices_to_codes(indices: NDArray, levels: NDArray) -> NDArray:
|
|
63
|
+
"""Map ``0..K-1`` class indices back to the stored category codes."""
|
|
64
|
+
return levels[np.asarray(indices, dtype=np.intp)]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def add_intercept(X: NDArray) -> NDArray:
|
|
68
|
+
"""Prepend a column of ones (for models that carry an explicit intercept)."""
|
|
69
|
+
X = np.asarray(X, dtype=np.float64)
|
|
70
|
+
if X.ndim == 1:
|
|
71
|
+
X = X.reshape(-1, 1)
|
|
72
|
+
ones = np.ones((X.shape[0], 1), dtype=np.float64)
|
|
73
|
+
return np.hstack([ones, X])
|
|
@@ -59,6 +59,18 @@ class GPUMiceBackend:
|
|
|
59
59
|
) -> Result[MICEParams]:
|
|
60
60
|
import torch
|
|
61
61
|
|
|
62
|
+
# The GPU backend handles fully numeric problems only: categorical
|
|
63
|
+
# columns need dummy-encoding / categorical model fits that this batched
|
|
64
|
+
# path does not implement. Refuse rather than impute them wrong (a
|
|
65
|
+
# categorical column can be a *predictor* even when the target is
|
|
66
|
+
# numeric, so this checks every column, not just the targets).
|
|
67
|
+
if design.has_categorical:
|
|
68
|
+
raise ValidationError(
|
|
69
|
+
"backend='gpu' supports numeric columns only. This data has "
|
|
70
|
+
"categorical columns; use backend='cpu' (categorical imputation "
|
|
71
|
+
"is CPU-only)."
|
|
72
|
+
)
|
|
73
|
+
|
|
62
74
|
# Validate that every incomplete column's method has a GPU kernel before
|
|
63
75
|
# touching the device (fail loud at the boundary, Rule 2).
|
|
64
76
|
for j in design.incomplete_columns:
|
|
@@ -28,10 +28,23 @@ from numpy.typing import NDArray
|
|
|
28
28
|
from pystatistics.core.exceptions import ValidationError
|
|
29
29
|
from pystatistics.mice.methods import get_method, is_registered
|
|
30
30
|
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
_SUPPORTED_KINDS = ("numeric",)
|
|
34
|
-
|
|
31
|
+
# Statistical kinds a column can have. Numeric columns are imputed with
|
|
32
|
+
# regression methods (pmm/norm); the others are categorical.
|
|
33
|
+
_SUPPORTED_KINDS = ("numeric", "binary", "categorical", "ordered")
|
|
34
|
+
|
|
35
|
+
# Kinds whose values are category codes (integers) rather than measurements.
|
|
36
|
+
_CATEGORICAL_KINDS = ("binary", "categorical", "ordered")
|
|
37
|
+
|
|
38
|
+
# Default imputation method per kind, mirroring R mice's defaults: PMM for
|
|
39
|
+
# numeric, logistic for binary, multinomial for unordered factors, proportional
|
|
40
|
+
# odds for ordered factors. Used when ``method='auto'`` (the default).
|
|
41
|
+
_DEFAULT_METHOD_BY_KIND = {
|
|
42
|
+
"numeric": "pmm",
|
|
43
|
+
"binary": "logreg",
|
|
44
|
+
"categorical": "polyreg",
|
|
45
|
+
"ordered": "polr",
|
|
46
|
+
}
|
|
47
|
+
_AUTO_METHOD = "auto"
|
|
35
48
|
|
|
36
49
|
|
|
37
50
|
@dataclass(frozen=True)
|
|
@@ -43,6 +56,10 @@ class MICEDesign:
|
|
|
43
56
|
_col_names: tuple[str, ...]
|
|
44
57
|
_col_kinds: tuple[str, ...]
|
|
45
58
|
_methods: tuple[str, ...] # per column; '' for fully observed columns
|
|
59
|
+
# Per column: sorted unique category codes for categorical columns, or None
|
|
60
|
+
# for numeric columns. Drives dummy-encoding of categorical predictors and
|
|
61
|
+
# code<->index mapping for categorical targets.
|
|
62
|
+
_levels: tuple[NDArray[np.floating[Any]] | None, ...]
|
|
46
63
|
_n: int
|
|
47
64
|
_p: int
|
|
48
65
|
|
|
@@ -52,7 +69,7 @@ class MICEDesign:
|
|
|
52
69
|
cls,
|
|
53
70
|
data,
|
|
54
71
|
*,
|
|
55
|
-
method: str =
|
|
72
|
+
method: str = _AUTO_METHOD,
|
|
56
73
|
methods: Mapping[Any, str] | Sequence[str] | None = None,
|
|
57
74
|
column_names: Sequence[str] | None = None,
|
|
58
75
|
column_kinds: Sequence[str] | None = None,
|
|
@@ -64,10 +81,13 @@ class MICEDesign:
|
|
|
64
81
|
data : array-like
|
|
65
82
|
2D matrix (observations x variables); NaN marks missing entries.
|
|
66
83
|
Accepts numpy arrays and anything with a ``.values`` attribute
|
|
67
|
-
(e.g. pandas DataFrame).
|
|
84
|
+
(e.g. pandas DataFrame). Categorical columns must be encoded as
|
|
85
|
+
integer category codes (declare them via ``column_kinds``).
|
|
68
86
|
method : str
|
|
69
|
-
Default imputation method
|
|
70
|
-
|
|
87
|
+
Default imputation method. ``'auto'`` (default) picks the R-default
|
|
88
|
+
method for each incomplete column's kind (pmm/logreg/polyreg/polr).
|
|
89
|
+
An explicit method name is applied to every incomplete column.
|
|
90
|
+
Overridden per-column by ``methods``.
|
|
71
91
|
methods : mapping or sequence, optional
|
|
72
92
|
Per-column method override. Either a mapping ``{name_or_index:
|
|
73
93
|
method}`` or a length-``p`` sequence. Entries for fully observed
|
|
@@ -93,7 +113,7 @@ class MICEDesign:
|
|
|
93
113
|
source,
|
|
94
114
|
*,
|
|
95
115
|
columns: Sequence[str] | None = None,
|
|
96
|
-
method: str =
|
|
116
|
+
method: str = _AUTO_METHOD,
|
|
97
117
|
methods: Mapping[Any, str] | Sequence[str] | None = None,
|
|
98
118
|
) -> "MICEDesign":
|
|
99
119
|
"""Build a MICEDesign from a DataSource (selected columns, in order)."""
|
|
@@ -177,6 +197,7 @@ class MICEDesign:
|
|
|
177
197
|
|
|
178
198
|
names = _resolve_names(column_names, p)
|
|
179
199
|
kinds = _resolve_kinds(column_kinds, p)
|
|
200
|
+
levels = _resolve_levels(data, missing_mask, kinds, names, p)
|
|
180
201
|
per_col_methods = _resolve_methods(
|
|
181
202
|
method, methods, names, kinds, has_missing_per_col, p
|
|
182
203
|
)
|
|
@@ -187,6 +208,7 @@ class MICEDesign:
|
|
|
187
208
|
_col_names=names,
|
|
188
209
|
_col_kinds=kinds,
|
|
189
210
|
_methods=per_col_methods,
|
|
211
|
+
_levels=levels,
|
|
190
212
|
_n=n,
|
|
191
213
|
_p=p,
|
|
192
214
|
)
|
|
@@ -244,6 +266,23 @@ class MICEDesign:
|
|
|
244
266
|
"""Method name assigned to column ``col`` ('' if fully observed)."""
|
|
245
267
|
return self._methods[col]
|
|
246
268
|
|
|
269
|
+
def kind_for(self, col: int) -> str:
|
|
270
|
+
"""Statistical kind of column ``col``."""
|
|
271
|
+
return self._col_kinds[col]
|
|
272
|
+
|
|
273
|
+
def is_categorical(self, col: int) -> bool:
|
|
274
|
+
"""Whether column ``col`` holds category codes (not measurements)."""
|
|
275
|
+
return self._col_kinds[col] in _CATEGORICAL_KINDS
|
|
276
|
+
|
|
277
|
+
def levels_for(self, col: int):
|
|
278
|
+
"""Sorted unique category codes for column ``col`` (None if numeric)."""
|
|
279
|
+
return self._levels[col]
|
|
280
|
+
|
|
281
|
+
@property
|
|
282
|
+
def has_categorical(self) -> bool:
|
|
283
|
+
"""Whether any column is categorical."""
|
|
284
|
+
return any(k in _CATEGORICAL_KINDS for k in self._col_kinds)
|
|
285
|
+
|
|
247
286
|
def __repr__(self) -> str:
|
|
248
287
|
return (
|
|
249
288
|
f"MICEDesign(n={self._n}, p={self._p}, "
|
|
@@ -288,18 +327,48 @@ def _resolve_kinds(column_kinds, p: int) -> tuple[str, ...]:
|
|
|
288
327
|
raise ValidationError(
|
|
289
328
|
f"column_kinds has length {len(kinds)}, expected {p}"
|
|
290
329
|
)
|
|
291
|
-
# Stage-1 numeric-only guard — the single point where the restriction lives.
|
|
292
330
|
bad = [(j, k) for j, k in enumerate(kinds) if k not in _SUPPORTED_KINDS]
|
|
293
331
|
if bad:
|
|
294
332
|
j, k = bad[0]
|
|
295
333
|
raise ValidationError(
|
|
296
|
-
f"Column {j} has kind {k!r}
|
|
297
|
-
f"numeric columns {_SUPPORTED_KINDS}. Categorical methods "
|
|
298
|
-
f"(binary/categorical/ordered) are planned for a later release."
|
|
334
|
+
f"Column {j} has kind {k!r}. Supported kinds: {_SUPPORTED_KINDS}."
|
|
299
335
|
)
|
|
300
336
|
return tuple(kinds)
|
|
301
337
|
|
|
302
338
|
|
|
339
|
+
def _resolve_levels(data, missing_mask, kinds, names, p):
|
|
340
|
+
"""Compute and validate category codes for each categorical column.
|
|
341
|
+
|
|
342
|
+
For a categorical column the observed values must be integer category codes;
|
|
343
|
+
the level set is their sorted unique values. Numeric columns get ``None``.
|
|
344
|
+
Binary columns must have exactly two levels; categorical/ordered need >= 2.
|
|
345
|
+
"""
|
|
346
|
+
levels: list = []
|
|
347
|
+
for j in range(p):
|
|
348
|
+
if kinds[j] not in _CATEGORICAL_KINDS:
|
|
349
|
+
levels.append(None)
|
|
350
|
+
continue
|
|
351
|
+
observed = data[~missing_mask[:, j], j]
|
|
352
|
+
if not np.all(observed == np.floor(observed)):
|
|
353
|
+
raise ValidationError(
|
|
354
|
+
f"Column {names[j]!r} is {kinds[j]!r} but has non-integer "
|
|
355
|
+
f"values; categorical columns must be integer category codes."
|
|
356
|
+
)
|
|
357
|
+
uniq = np.unique(observed)
|
|
358
|
+
if kinds[j] == "binary" and uniq.size != 2:
|
|
359
|
+
raise ValidationError(
|
|
360
|
+
f"Column {names[j]!r} is 'binary' but has {uniq.size} observed "
|
|
361
|
+
f"levels {uniq.tolist()}; binary columns need exactly 2."
|
|
362
|
+
)
|
|
363
|
+
if uniq.size < 2:
|
|
364
|
+
raise ValidationError(
|
|
365
|
+
f"Column {names[j]!r} is {kinds[j]!r} but has only "
|
|
366
|
+
f"{uniq.size} observed level; need at least 2 to impute."
|
|
367
|
+
)
|
|
368
|
+
levels.append(uniq.astype(np.float64))
|
|
369
|
+
return tuple(levels)
|
|
370
|
+
|
|
371
|
+
|
|
303
372
|
def _resolve_methods(
|
|
304
373
|
method: str,
|
|
305
374
|
methods,
|
|
@@ -308,9 +377,15 @@ def _resolve_methods(
|
|
|
308
377
|
has_missing_per_col: NDArray[np.bool_],
|
|
309
378
|
p: int,
|
|
310
379
|
) -> tuple[str, ...]:
|
|
311
|
-
"""Assign a validated method name to each column (per-column override).
|
|
312
|
-
|
|
313
|
-
|
|
380
|
+
"""Assign a validated method name to each column (per-column override).
|
|
381
|
+
|
|
382
|
+
``method='auto'`` resolves to the R-default method for each column's kind;
|
|
383
|
+
an explicit method name is applied to every column.
|
|
384
|
+
"""
|
|
385
|
+
if method == _AUTO_METHOD:
|
|
386
|
+
resolved = [_DEFAULT_METHOD_BY_KIND[kinds[j]] for j in range(p)]
|
|
387
|
+
else:
|
|
388
|
+
resolved = [method] * p
|
|
314
389
|
|
|
315
390
|
if methods is not None:
|
|
316
391
|
if isinstance(methods, Mapping):
|
|
@@ -17,6 +17,9 @@ from pystatistics.mice.methods.registry import (
|
|
|
17
17
|
# Side-effect imports: each module registers its method on import.
|
|
18
18
|
from pystatistics.mice.methods import norm as _norm # noqa: F401
|
|
19
19
|
from pystatistics.mice.methods import pmm as _pmm # noqa: F401
|
|
20
|
+
from pystatistics.mice.methods import logreg as _logreg # noqa: F401
|
|
21
|
+
from pystatistics.mice.methods import polyreg as _polyreg # noqa: F401
|
|
22
|
+
from pystatistics.mice.methods import polr as _polr # noqa: F401
|
|
20
23
|
|
|
21
24
|
__all__ = [
|
|
22
25
|
"ImputationMethod",
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Shared multivariate-normal posterior draw for the categorical methods.
|
|
3
|
+
|
|
4
|
+
The categorical imputation methods (logreg, polyreg, polr) all follow the same
|
|
5
|
+
Bayesian recipe R's ``mice`` uses: fit the model, then draw the parameter vector
|
|
6
|
+
once from its asymptotic posterior ``N(theta_hat, V)`` before predicting and
|
|
7
|
+
sampling. Drawing the parameters — rather than reusing the point estimate —
|
|
8
|
+
injects the between-imputation variability that makes multiple imputation
|
|
9
|
+
produce valid standard errors.
|
|
10
|
+
|
|
11
|
+
``V`` is a covariance (or inverse-information) matrix, positive definite in
|
|
12
|
+
theory but occasionally marginally indefinite in finite precision, so the
|
|
13
|
+
Cholesky factor is taken with the same jittered, eigenvalue-clipped fallback as
|
|
14
|
+
the numeric path (reused from ``_linreg``).
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
|
|
21
|
+
from pystatistics.mice.methods._linreg import _safe_cholesky
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def mvn_draw(mean: np.ndarray, cov: np.ndarray, rng: np.random.Generator) -> np.ndarray:
|
|
25
|
+
"""Draw one sample from ``N(mean, cov)`` via its Cholesky factor.
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
mean : (d,) array
|
|
30
|
+
Posterior mean (the point estimate).
|
|
31
|
+
cov : (d, d) array
|
|
32
|
+
Posterior covariance of the estimate.
|
|
33
|
+
rng : numpy.random.Generator
|
|
34
|
+
Sole randomness source.
|
|
35
|
+
"""
|
|
36
|
+
mean = np.asarray(mean, dtype=np.float64).ravel()
|
|
37
|
+
L = _safe_cholesky(np.asarray(cov, dtype=np.float64))
|
|
38
|
+
return mean + L @ rng.standard_normal(mean.shape[0])
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def sample_categories(probs: np.ndarray, rng: np.random.Generator) -> np.ndarray:
|
|
42
|
+
"""Sample one class index per row from a (n, K) matrix of class probabilities.
|
|
43
|
+
|
|
44
|
+
Robust to small negative probabilities (which can arise, e.g., from drawn
|
|
45
|
+
ordinal thresholds that are not perfectly ordered): negatives are clipped and
|
|
46
|
+
each row renormalised before inverse-CDF sampling.
|
|
47
|
+
"""
|
|
48
|
+
probs = np.clip(np.asarray(probs, dtype=np.float64), 0.0, None)
|
|
49
|
+
row_sums = probs.sum(axis=1, keepdims=True)
|
|
50
|
+
# Degenerate rows (all-zero) fall back to uniform.
|
|
51
|
+
row_sums = np.where(row_sums > 0, row_sums, 1.0)
|
|
52
|
+
probs = probs / row_sums
|
|
53
|
+
|
|
54
|
+
cdf = np.cumsum(probs, axis=1)
|
|
55
|
+
u = rng.random(probs.shape[0])
|
|
56
|
+
# Smallest index whose cumulative probability reaches u.
|
|
57
|
+
return (cdf >= u[:, None]).argmax(axis=1).astype(np.intp)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def marginal_indices(
|
|
61
|
+
y_obs: np.ndarray, n_mis: int, rng: np.random.Generator
|
|
62
|
+
) -> np.ndarray:
|
|
63
|
+
"""Sample ``n_mis`` class indices from the observed empirical distribution.
|
|
64
|
+
|
|
65
|
+
Used as the documented fallback when a categorical model fit fails to
|
|
66
|
+
converge mid-sweep (see the categorical methods). It preserves the observed
|
|
67
|
+
marginal distribution of the column; the next iteration retries the full
|
|
68
|
+
conditional model, so the fallback is local and self-correcting.
|
|
69
|
+
"""
|
|
70
|
+
return rng.choice(
|
|
71
|
+
np.asarray(y_obs, dtype=np.intp), size=int(n_mis), replace=True
|
|
72
|
+
)
|