pystatistics 1.0.2__tar.gz → 1.2.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-1.2.0/CHANGELOG.md +92 -0
- pystatistics-1.2.0/CLAUDE.md +190 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/PKG-INFO +22 -3
- {pystatistics-1.0.2 → pystatistics-1.2.0}/README.md +21 -2
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pyproject.toml +1 -1
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/__init__.py +1 -1
- pystatistics-1.2.0/pystatistics/hypothesis/_design_factories.py +466 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/_p_adjust.py +2 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/backends/_chisq_test.py +11 -6
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/backends/_fisher_test.py +11 -4
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/backends/_wilcox_test.py +0 -13
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/backends/gpu.py +7 -12
- pystatistics-1.2.0/pystatistics/hypothesis/design.py +226 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/solvers.py +12 -3
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mixed/_deviance.py +3 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mixed/_pls.py +16 -9
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mixed/_satterthwaite.py +2 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mixed/solvers.py +5 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/montecarlo/backends/gpu.py +14 -34
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/montecarlo/solvers.py +11 -12
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/_objectives/base.py +17 -26
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/_objectives/cpu.py +7 -24
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/_objectives/gpu_fp32.py +25 -13
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/_objectives/gpu_fp64.py +11 -2
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/_utils.py +7 -6
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/backends/em.py +14 -5
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/mcar_test.py +19 -26
- pystatistics-1.2.0/pystatistics/regression/_formatting.py +18 -0
- pystatistics-1.2.0/pystatistics/regression/_glm.py +322 -0
- pystatistics-1.2.0/pystatistics/regression/_linear.py +309 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/regression/backends/cpu_glm.py +1 -1
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/regression/backends/gpu.py +8 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/regression/backends/gpu_glm.py +5 -4
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/regression/families.py +14 -0
- pystatistics-1.2.0/pystatistics/regression/solution.py +17 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/regression/solvers.py +40 -10
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/_km.py +1 -1
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/solution.py +64 -15
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/solvers.py +26 -2
- pystatistics-1.2.0/tests/hypothesis/test_design_split.py +126 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/montecarlo/test_gpu.py +11 -18
- pystatistics-1.2.0/tests/mvnmle/test_no_silent_fallback.py +55 -0
- pystatistics-1.2.0/tests/regression/test_module_split.py +85 -0
- pystatistics-1.2.0/tests/test_code_quality.py +39 -0
- pystatistics-1.0.2/pystatistics/hypothesis/design.py +0 -727
- pystatistics-1.0.2/pystatistics/regression/solution.py +0 -597
- {pystatistics-1.0.2 → pystatistics-1.2.0}/.github/workflows/publish.yml +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/.gitignore +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/LICENSE +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/DESIGN.md +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/Forge.md +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/Makefile +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/PYSTATSBIO_CONTEXT.md +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/ROADMAP.md +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/_static/custom.css +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/anova.rst +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/conf.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/core.rst +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/descriptive.rst +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/hypothesis.rst +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/index.rst +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/mixed.rst +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/montecarlo.rst +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/mvnmle.rst +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/regression.rst +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/docs/survival.rst +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/anova/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/anova/_common.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/anova/_contrasts.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/anova/_levene.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/anova/_posthoc.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/anova/_repeated.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/anova/_ss.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/anova/design.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/anova/solution.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/anova/solvers.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/capabilities.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/device.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/linalg/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/linalg/batched.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/linalg/cholesky.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/linalg/determinant.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/linalg/qr.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/linalg/solve.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/linalg/svd.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/optimization/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/optimization/convergence.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/precision.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/timing.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/compute/tolerances.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/datasource.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/exceptions.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/protocols.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/result.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/core/validation.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/descriptive/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/descriptive/_missing.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/descriptive/_quantile_types.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/descriptive/backends/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/descriptive/backends/cpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/descriptive/backends/gpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/descriptive/design.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/descriptive/solution.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/descriptive/solvers.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/_common.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/backends/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/backends/_ks_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/backends/_prop_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/backends/_t_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/backends/_var_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/backends/cpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/hypothesis/solution.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mixed/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mixed/_common.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mixed/_pirls.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mixed/_random_effects.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mixed/design.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mixed/solution.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/montecarlo/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/montecarlo/_ci.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/montecarlo/_common.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/montecarlo/_influence.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/montecarlo/backends/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/montecarlo/backends/cpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/montecarlo/design.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/montecarlo/solution.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/_objectives/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/_objectives/parameterizations.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/backends/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/backends/cpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/backends/gpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/datasets.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/design.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/patterns.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/solution.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/mvnmle/solvers.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/py.typed +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/regression/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/regression/backends/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/regression/backends/cpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/regression/design.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/_common.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/_cox.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/_discrete.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/_logrank.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/backends/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/backends/cpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/backends/gpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/pystatistics/survival/design.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/anova/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/anova/conftest.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/anova/test_contrasts.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/anova/test_design.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/anova/test_factorial.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/anova/test_levene.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/anova/test_oneway.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/anova/test_posthoc.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/anova/test_r_validation.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/anova/test_repeated_measures.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/benchmark_gpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/conftest.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/core/test_exceptions.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/core/test_result.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/core/test_validation.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/descriptive/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/descriptive/conftest.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/descriptive/test_cor.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/descriptive/test_cov.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/descriptive/test_describe.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/descriptive/test_gpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/descriptive/test_missing.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/descriptive/test_moments.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/descriptive/test_quantile.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/descriptive/test_r_validation.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_ancova_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_ancova_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_bonferroni_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_bonferroni_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_eta_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_eta_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_levene_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_levene_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_oneway_balanced_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_oneway_balanced_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_oneway_unbalanced_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_oneway_unbalanced_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_rm_mixed_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_rm_mixed_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_rm_within_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_rm_within_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_tukey_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_tukey_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_twoway_balanced_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_twoway_balanced_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_twoway_unbalanced_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/anova_twoway_unbalanced_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/basic_100x3.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/basic_100x3_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/basic_100x3_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/collinear_almost.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/collinear_almost_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/collinear_almost_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_basic_100x5.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_basic_100x5_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_basic_100x5_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_constant_column.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_constant_column_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_constant_column_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_extreme_values.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_extreme_values_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_extreme_values_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_large_1000x10.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_large_1000x10_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_large_1000x10_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_nan_columnwise.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_nan_columnwise_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_nan_columnwise_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_nan_scattered.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_nan_scattered_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_nan_scattered_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_negative_correlation.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_negative_correlation_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_negative_correlation_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_perfect_correlation.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_perfect_correlation_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_perfect_correlation_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_single_column.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_single_column_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_single_column_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_ties.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_ties_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/desc_ties_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/different_scales.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/different_scales_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/different_scales_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/generate_anova_fixtures.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/generate_descriptive_fixtures.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/generate_fixtures.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/generate_glm_fixtures.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/generate_hypothesis_fixtures.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/generate_mixed_fixtures.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/generate_montecarlo_fixtures.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/generate_survival_fixtures.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_balanced.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_balanced_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_balanced_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_basic.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_basic_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_basic_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_large.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_large_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_large_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_separated.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_separated_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_binomial_separated_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_gaussian_basic.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_gaussian_basic_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_gaussian_basic_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_gaussian_large.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_gaussian_large_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_gaussian_large_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_poisson_basic.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_poisson_basic_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_poisson_basic_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_poisson_large_counts.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_poisson_large_counts_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_poisson_large_counts_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_poisson_zeros.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_poisson_zeros_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/glm_poisson_zeros_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/high_noise.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/high_noise_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/high_noise_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_chisq_2x2_yates_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_chisq_2x2_yates_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_chisq_3x3_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_chisq_3x3_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_chisq_gof_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_chisq_gof_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_chisq_gof_unequal_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_chisq_gof_unequal_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_fisher_2x2_less_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_fisher_2x2_less_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_fisher_2x2_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_fisher_2x2_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_fisher_3x3_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_fisher_3x3_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_ks_onesample_norm_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_ks_onesample_norm_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_ks_twosample_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_ks_twosample_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_prop_onesample_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_prop_onesample_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_prop_twosample_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_prop_twosample_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_t_onesample_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_t_onesample_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_t_paired_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_t_paired_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_t_pooled_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_t_pooled_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_t_welch_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_t_welch_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_var_basic_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_var_basic_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_wilcox_ranksum_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_wilcox_ranksum_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_wilcox_signed_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/htest_wilcox_signed_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/ill_conditioned.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/ill_conditioned_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/ill_conditioned_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/large_coeffs.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/large_coeffs_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/large_coeffs_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_ci_90_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_ci_90_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_ci_normal_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_ci_normal_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_ci_skewed_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_ci_skewed_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_mean_balanced_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_mean_balanced_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_mean_ordinary_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_mean_ordinary_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_median_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_median_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_variance_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_boot_variance_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_perm_greater_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_perm_greater_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_perm_not_significant_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_perm_not_significant_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_perm_significant_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mc_perm_significant_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mixed/glmm_binomial.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mixed/glmm_poisson.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mixed/lmm_crossed.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mixed/lmm_intercept.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mixed/lmm_ml.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mixed/lmm_no_effect.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mixed/lmm_slope.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mixed/mixed_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/mixed/mixed_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/near_square.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/near_square_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/near_square_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/no_intercept.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/no_intercept_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/no_intercept_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/run_r_anova_validation.R +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/run_r_descriptive_validation.R +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/run_r_glm_validation.R +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/run_r_hypothesis_validation.R +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/run_r_mixed_validation.R +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/run_r_montecarlo_validation.R +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/run_r_survival_validation.R +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/run_r_validation.R +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/run_validation.sh +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/small_noise.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/small_noise_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/small_noise_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_cox_breslow_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_cox_breslow_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_cox_single_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_cox_single_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_cox_ties_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_cox_ties_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_cox_two_cov_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_cox_two_cov_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_basic_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_basic_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_heavy_cens_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_heavy_cens_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_loglog_ci_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_loglog_ci_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_no_cens_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_no_cens_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_plain_ci_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_plain_ci_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_ties_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_km_ties_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_lr_peto_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_lr_peto_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_lr_three_group_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_lr_three_group_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_lr_two_group_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/surv_lr_two_group_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/tall_skinny.csv +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/tall_skinny_meta.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/tall_skinny_r_results.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/fixtures/validate_against_r.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/conftest.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/test_chisq_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/test_fisher_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/test_gpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/test_ks_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/test_p_adjust.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/test_prop_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/test_r_validation.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/test_t_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/test_var_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/hypothesis/test_wilcox_test.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/conftest.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/test_glmm.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/test_lmm_crossed.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/test_lmm_intercept.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/test_lmm_nested.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/test_lmm_slope.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/test_pls.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/test_r_validation.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/test_random_effects.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mixed/test_satterthwaite.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/montecarlo/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/montecarlo/conftest.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/montecarlo/test_batched_solver.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/montecarlo/test_boot_ci.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/montecarlo/test_bootstrap.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/montecarlo/test_influence.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/montecarlo/test_permutation.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/montecarlo/test_r_validation.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/apple_em_reference.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/apple_reference.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/generate_em_fixtures.R +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/little_mcar_apple.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/little_mcar_complete.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/little_mcar_extreme.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/little_mcar_missvals.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/little_mcar_simple_mcar.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/little_mcar_summary.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/missvals_em_reference.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/missvals_reference.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/references/small_test_reference.json +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/test_em.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/test_gpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/mvnmle/test_mlest.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/regression/benchmark.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/regression/benchmark.r +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/regression/conftest.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/regression/test_fit.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/regression/test_glm.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/regression/test_glm_gpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/regression/test_glm_r_validation.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/regression/test_r_validation.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/regression/test_stress_gpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/survival/__init__.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/survival/conftest.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/survival/test_coxph.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/survival/test_discrete_time.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/survival/test_gpu.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/survival/test_kaplan_meier.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/survival/test_logrank.py +0 -0
- {pystatistics-1.0.2 → pystatistics-1.2.0}/tests/survival/test_r_validation.py +0 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 1.2.0
|
|
4
|
+
|
|
5
|
+
### CLAUDE.md Compliance
|
|
6
|
+
|
|
7
|
+
Full codebase audit and refactor to comply with all 7 rules in CLAUDE.md.
|
|
8
|
+
|
|
9
|
+
### Breaking Changes (by design)
|
|
10
|
+
|
|
11
|
+
- **Silent model switches are now errors.** Functions that previously fell back
|
|
12
|
+
silently to ridge regularization, LSTSQ, or CPU backends now raise
|
|
13
|
+
`NumericalError` or `RuntimeError` with descriptive messages suggesting
|
|
14
|
+
alternatives. This affects:
|
|
15
|
+
- `mvnmle.mcar_test.regularized_inverse()` — raises on ill-conditioned matrices
|
|
16
|
+
- `mvnmle.mlest()` — raises if EM encounters non-PD covariance
|
|
17
|
+
- `mvnmle` parameter extraction — raises instead of returning identity covariance
|
|
18
|
+
- `regression.fit(backend='gpu')` — raises on Cholesky failure (use `force=True`
|
|
19
|
+
to proceed with LSTSQ, or `backend='cpu'` for QR)
|
|
20
|
+
- `mixed.lmm()` / `mixed.glmm()` — raises on singular random effects covariance
|
|
21
|
+
- **`backend='gpu'` now errors when GPU is unavailable.** Previously fell back
|
|
22
|
+
to CPU silently. `backend='auto'` still falls back silently (it means
|
|
23
|
+
"best available").
|
|
24
|
+
- **GPU bootstrap/permutation raises `NotImplementedError`.** These were silently
|
|
25
|
+
running on CPU while reporting a GPU backend name. Now they honestly report
|
|
26
|
+
that GPU acceleration is not yet implemented for these operations.
|
|
27
|
+
|
|
28
|
+
### New Features
|
|
29
|
+
|
|
30
|
+
- **Reproducible Monte Carlo hypothesis tests**: `chisq_test()` and
|
|
31
|
+
`fisher_test()` now accept `seed` parameter for deterministic results
|
|
32
|
+
when `simulate_p_value=True`
|
|
33
|
+
|
|
34
|
+
### Module Structure (Rule 3/4)
|
|
35
|
+
|
|
36
|
+
- Split `regression/solution.py` into `_linear.py`, `_glm.py`, and
|
|
37
|
+
`_formatting.py` (backward-compatible re-export shim maintained)
|
|
38
|
+
- Split `hypothesis/design.py` factory methods into `_design_factories.py`
|
|
39
|
+
(classmethods still work via thin wrappers)
|
|
40
|
+
- All files now under 500 code lines (Rule 4 hard limit)
|
|
41
|
+
|
|
42
|
+
### Code Quality
|
|
43
|
+
|
|
44
|
+
- Added `# NUMERICAL GUARD:` comments to ~30 numerical stability operations
|
|
45
|
+
(clipping, clamping, floors) documenting why each exists
|
|
46
|
+
- Removed dead code (`signaltonoise` try/except in Wilcoxon test)
|
|
47
|
+
- Added per-module compliance tests:
|
|
48
|
+
- `tests/test_code_quality.py` — LOC limit enforcement
|
|
49
|
+
- `tests/regression/test_module_split.py` — split integrity + named coefficients
|
|
50
|
+
- `tests/hypothesis/test_design_split.py` — factory split + seed reproducibility
|
|
51
|
+
- `tests/mvnmle/test_no_silent_fallback.py` — hard stop verification
|
|
52
|
+
|
|
53
|
+
## 1.1.0
|
|
54
|
+
|
|
55
|
+
### New Features
|
|
56
|
+
|
|
57
|
+
- **Named coefficients**: `fit()`, `coxph()`, and `discrete_time()` accept a
|
|
58
|
+
`names=` parameter for labeled output matching R's style
|
|
59
|
+
- **`result.coef` dict property**: Access coefficients by variable name
|
|
60
|
+
(`result.coef["albumin"]`) on `LinearSolution`, `GLMSolution`,
|
|
61
|
+
`CoxSolution`, and `DiscreteTimeSolution`
|
|
62
|
+
- **`result.hr` dict property**: Access hazard ratios by name on `CoxSolution`
|
|
63
|
+
and `DiscreteTimeSolution`
|
|
64
|
+
- **Intercept auto-detection**: When `names` has one fewer element than columns
|
|
65
|
+
in X, `"(Intercept)"` is prepended automatically
|
|
66
|
+
|
|
67
|
+
### Summary Output Improvements
|
|
68
|
+
|
|
69
|
+
- **OLS**: Added residual quantiles (Min, 1Q, Median, 3Q, Max) and overall
|
|
70
|
+
F-statistic with p-value, matching R's `summary(lm())`
|
|
71
|
+
- **Cox PH**: Added hazard ratio confidence intervals table (`exp(coef)`,
|
|
72
|
+
`exp(-coef)`, `lower .95`, `upper .95`), matching R's `summary(coxph())`
|
|
73
|
+
|
|
74
|
+
### Bug Fixes
|
|
75
|
+
|
|
76
|
+
- Fixed Kaplan-Meier `summary()` printing literal `{ci_pct}` instead of the
|
|
77
|
+
actual confidence level percentage (e.g., `95`)
|
|
78
|
+
|
|
79
|
+
### Real-Data Validation
|
|
80
|
+
|
|
81
|
+
- Added PBC clinical trial integration test suite (`tests/test_pbc_analysis.py`)
|
|
82
|
+
with 22 end-to-end analyses on the Mayo Clinic PBC dataset
|
|
83
|
+
- Added R cross-validation test (`tests/test_pbc_vs_r.py`) confirming all 15
|
|
84
|
+
comparable analyses match R to `rtol=1e-10`
|
|
85
|
+
|
|
86
|
+
## 1.0.2
|
|
87
|
+
|
|
88
|
+
- Initial stable release
|
|
89
|
+
- All 8 modules complete: regression, descriptive, hypothesis, montecarlo,
|
|
90
|
+
survival, anova, mixed, mvnmle
|
|
91
|
+
- CPU backends validated against R to rtol=1e-10
|
|
92
|
+
- GPU backends validated against CPU per documented tolerance tiers
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Coding Bible
|
|
2
|
+
|
|
3
|
+
## Preamble
|
|
4
|
+
|
|
5
|
+
This document is not a style guide. It is not a set of preferences. It is not a list of
|
|
6
|
+
suggestions that can be weighed against convenience or time pressure.
|
|
7
|
+
|
|
8
|
+
Every rule in this document exists because its absence has caused real, costly, documented
|
|
9
|
+
failures in real systems — bugs that took days to trace, security holes that went undetected
|
|
10
|
+
for months, codebases that became unmaintainable within a year of being written. The rules
|
|
11
|
+
are the scar tissue. They are what you get when you ask experienced engineers what they wish
|
|
12
|
+
someone had forced them to do the first time.
|
|
13
|
+
|
|
14
|
+
When you are implementing something and a rule feels inconvenient, that feeling is a signal,
|
|
15
|
+
not a reason to deviate. Inconvenience usually means the rule is doing its job — preventing
|
|
16
|
+
the path of least resistance from becoming a future liability.
|
|
17
|
+
|
|
18
|
+
**These rules are non-negotiable and not subject to contextual override.** The following
|
|
19
|
+
exceptions are not acceptable justifications for deviation:
|
|
20
|
+
|
|
21
|
+
- "This is a prototype / MVP / quick fix." Prototypes become production. Quick fixes become
|
|
22
|
+
permanent. Code written without discipline under time pressure is the most dangerous code
|
|
23
|
+
that exists.
|
|
24
|
+
- "This is a small module that doesn't need it." Small modules grow. The time to enforce
|
|
25
|
+
structure is before the module is large enough to make restructuring painful.
|
|
26
|
+
- "The architecture requires it." If the architecture requires violating these rules, the
|
|
27
|
+
architecture is wrong. Fix the architecture.
|
|
28
|
+
- "It would take too long to do it correctly." It will take longer to fix it later. It always
|
|
29
|
+
does.
|
|
30
|
+
|
|
31
|
+
If a genuine, documented edge case exists where a rule cannot be followed, that exception
|
|
32
|
+
must be explicitly marked in a comment at the relevant location, stating which rule is being
|
|
33
|
+
waived, why, and what mitigating measures are in place. Undocumented deviations are bugs.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## The Underlying Principle
|
|
38
|
+
|
|
39
|
+
All seven rules are expressions of one idea:
|
|
40
|
+
|
|
41
|
+
**Make the wrong thing hard to do accidentally.**
|
|
42
|
+
|
|
43
|
+
Good architecture is not about making correct behavior possible. Correct behavior is always
|
|
44
|
+
possible. Good architecture is about making incorrect behavior require deliberate, visible,
|
|
45
|
+
documented effort — so that mistakes are loud, localized, and recoverable rather than silent,
|
|
46
|
+
diffuse, and permanent.
|
|
47
|
+
|
|
48
|
+
When in doubt, ask: *am I making the wrong thing easy to do accidentally?* If yes, stop and
|
|
49
|
+
apply the relevant rule before continuing.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
These rules are non-negotiable. They exist because every one of them corresponds to a
|
|
54
|
+
real failure mode with real consequences. If you think a rule doesn't apply to a specific
|
|
55
|
+
case, you are probably wrong. If you are certain it doesn't apply, document why explicitly
|
|
56
|
+
in a comment before proceeding.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 1. Fail Fast, Fail Loud, No Defaults
|
|
61
|
+
|
|
62
|
+
Do not insert default behavior that fails silently. If something breaks, the system must
|
|
63
|
+
break immediately, obviously, and traceably.
|
|
64
|
+
|
|
65
|
+
**Rules:**
|
|
66
|
+
- Raise explicit, descriptive errors. Never swallow exceptions.
|
|
67
|
+
- Never return a default value to mask a missing or invalid state.
|
|
68
|
+
- Log the failure with enough context to reproduce it.
|
|
69
|
+
|
|
70
|
+
**Corollary — No Optimistic Assumptions:**
|
|
71
|
+
Do not assume inputs are valid, dependencies are available, or external calls succeed.
|
|
72
|
+
Assert and verify. If an assumption is required, document it and enforce it with a guard.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 2. Trust Your Neighbors — Validate Input, Not Output
|
|
77
|
+
|
|
78
|
+
You own your output contract. You do not trust anyone else's input contract.
|
|
79
|
+
|
|
80
|
+
**Rules:**
|
|
81
|
+
- All external inputs (API calls, user input, file reads, environment variables) must be
|
|
82
|
+
validated at the boundary before use.
|
|
83
|
+
- Internal module output does not need re-validation by the caller — the module is
|
|
84
|
+
responsible for the correctness of what it emits.
|
|
85
|
+
|
|
86
|
+
**Corollary — Define Your Contracts:**
|
|
87
|
+
Every module must have an explicit, documented input/output contract. If a caller violates
|
|
88
|
+
the input contract, the module must fail loudly (see Rule 1), not silently compensate.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 3. UNIX Philosophy — One Module, One Job
|
|
93
|
+
|
|
94
|
+
Each module does one thing only, and does that one thing well. If a module needs to do
|
|
95
|
+
multiple things, it must be split into multiple files.
|
|
96
|
+
|
|
97
|
+
**Rules:**
|
|
98
|
+
- No file should be the sole owner of more than one domain concept.
|
|
99
|
+
- If you find yourself writing "and" when describing what a file does, split it.
|
|
100
|
+
- Tight coupling between modules is a design failure, not an implementation detail.
|
|
101
|
+
|
|
102
|
+
**Corollary — No God Files:**
|
|
103
|
+
A module that knows everything, owns everything, or touches everything is a liability.
|
|
104
|
+
If removing a module would require changes across more than two other modules, it is
|
|
105
|
+
probably doing too much.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 4. LOC Limits — No Bloated Monoliths
|
|
110
|
+
|
|
111
|
+
Files must not become monoliths. Complexity must be managed through decomposition,
|
|
112
|
+
not consolidation.
|
|
113
|
+
|
|
114
|
+
**Rules:**
|
|
115
|
+
- **Hard limit: 500 lines of code** (comments and docstrings excluded). Do not exceed this
|
|
116
|
+
under any circumstances.
|
|
117
|
+
- **Soft limit: 400 lines of code.** Above 400 lines, actively look for split opportunities.
|
|
118
|
+
- If a file "requires" more than 500 lines, that is a signal the abstraction is wrong —
|
|
119
|
+
split it into multiple focused files.
|
|
120
|
+
|
|
121
|
+
**Corollary — Splitting Is Not Optional:**
|
|
122
|
+
Exceeding the hard limit is never acceptable, even temporarily. Split first, implement after.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 5. No Hidden State — Explicit Data Flow
|
|
127
|
+
|
|
128
|
+
All state must be explicitly passed or managed through clearly defined interfaces.
|
|
129
|
+
Hidden state is a bug waiting to be discovered at the worst possible time.
|
|
130
|
+
|
|
131
|
+
**Rules:**
|
|
132
|
+
- No global variables. No module-level mutable state unless explicitly documented and
|
|
133
|
+
architecturally justified.
|
|
134
|
+
- No implicit state — if a function's behavior depends on something, that something must
|
|
135
|
+
appear in its signature or be explicitly injected.
|
|
136
|
+
- No hidden coupling between modules. If two modules share state, that relationship must
|
|
137
|
+
be visible and intentional.
|
|
138
|
+
|
|
139
|
+
**Corollary — Spooky Action at a Distance Is a Bug:**
|
|
140
|
+
If changing module A causes unexpected behavior in module B, and there is no explicit
|
|
141
|
+
interface between them, the architecture is broken. Fix the architecture, not the symptom.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 6. Deterministic Behavior by Default
|
|
146
|
+
|
|
147
|
+
All functions must be deterministic unless explicitly documented otherwise.
|
|
148
|
+
|
|
149
|
+
**Rules:**
|
|
150
|
+
- No randomness, time-dependent logic, or non-deterministic behavior without explicit
|
|
151
|
+
documentation and an injectable seed or clock interface for testing.
|
|
152
|
+
- Functions that depend on system time, random state, or external non-deterministic
|
|
153
|
+
sources must be flagged with a `# NON-DETERMINISTIC:` comment explaining why.
|
|
154
|
+
- Non-deterministic behavior must be isolatable — wrap it so the rest of the system
|
|
155
|
+
can be tested deterministically.
|
|
156
|
+
|
|
157
|
+
**Corollary — Reproducibility Is Not Optional:**
|
|
158
|
+
If a bug cannot be reliably reproduced, it cannot be reliably fixed. Non-determinism
|
|
159
|
+
is the enemy of reproducibility. Treat it like a dependency that must be explicitly
|
|
160
|
+
managed, not a feature.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 7. Tests Are First-Class Citizens
|
|
165
|
+
|
|
166
|
+
Every module must have corresponding tests. Tests are not optional, not afterthoughts,
|
|
167
|
+
and not someone else's job.
|
|
168
|
+
|
|
169
|
+
**Rules:**
|
|
170
|
+
- Every module must have a corresponding test file covering:
|
|
171
|
+
- **Normal cases** — expected inputs produce expected outputs.
|
|
172
|
+
- **Edge cases** — boundary conditions, empty inputs, maximum values, type boundaries.
|
|
173
|
+
- **Failure cases** — invalid inputs produce the correct explicit errors (see Rule 1).
|
|
174
|
+
- No module ships without tests. No exceptions.
|
|
175
|
+
- Tests must be runnable in isolation — no test should depend on the state left by
|
|
176
|
+
another test.
|
|
177
|
+
|
|
178
|
+
**Corollary — Untested Code Is Unverified Assumptions:**
|
|
179
|
+
If there is no test for a behavior, that behavior is assumed, not verified. Assumptions
|
|
180
|
+
accumulate into system failures. If you cannot write a test for something, that is a signal
|
|
181
|
+
the design is wrong.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Meta-Rule
|
|
186
|
+
|
|
187
|
+
If any of these rules feel inconvenient, that feeling is the point. These rules exist
|
|
188
|
+
precisely because the convenient path leads to the failure modes each rule was written
|
|
189
|
+
to prevent. When in doubt, ask: *am I making the wrong thing easy to do accidentally?*
|
|
190
|
+
If yes, apply the relevant rule.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pystatistics
|
|
3
|
-
Version: 1.0
|
|
3
|
+
Version: 1.2.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/
|
|
@@ -48,6 +48,23 @@ Description-Content-Type: text/markdown
|
|
|
48
48
|
|
|
49
49
|
GPU-accelerated statistical computing for Python.
|
|
50
50
|
|
|
51
|
+
## What's New in 1.2
|
|
52
|
+
|
|
53
|
+
- **No silent model switches.** PyStatistics now raises explicit errors instead of silently falling back to ridge regularization, different solvers, or CPU backends. You always know exactly what model you're running.
|
|
54
|
+
- **`backend='gpu'` is honest.** Explicitly requesting GPU now errors if GPU is unavailable or the operation has no GPU implementation. `backend='auto'` still falls back silently.
|
|
55
|
+
- **Reproducible Monte Carlo.** `chisq_test()` and `fisher_test()` accept `seed=` for deterministic Monte Carlo p-values.
|
|
56
|
+
- **Module structure.** Large files split per CLAUDE.md Rule 4 (500 code-line limit). All backward-compatible.
|
|
57
|
+
|
|
58
|
+
### What's New in 1.1
|
|
59
|
+
|
|
60
|
+
- **Named coefficients**: Pass `names=` to `fit()`, `coxph()`, and `discrete_time()` to get labeled output matching R
|
|
61
|
+
- **`result.coef` dict**: Access coefficients by name — `result.coef["albumin"]` instead of `result.coefficients[1]`
|
|
62
|
+
- **`result.hr` dict** (Cox/discrete-time): Access hazard ratios by name
|
|
63
|
+
- **Intercept auto-detection**: Pass p-1 names and `"(Intercept)"` is prepended automatically
|
|
64
|
+
- **OLS summary improvements**: Now prints residual quantiles and F-statistic, matching R's `summary(lm())`
|
|
65
|
+
- **Cox summary improvements**: Now prints hazard ratio confidence intervals, matching R's `summary(coxph())`
|
|
66
|
+
- **Bug fix**: Kaplan-Meier summary now correctly displays confidence level percentage
|
|
67
|
+
|
|
51
68
|
---
|
|
52
69
|
|
|
53
70
|
## Design Philosophy
|
|
@@ -160,8 +177,10 @@ from pystatistics.regression import fit
|
|
|
160
177
|
|
|
161
178
|
X = np.random.randn(1000, 5)
|
|
162
179
|
y = X @ [1, 2, 3, -1, 0.5] + np.random.randn(1000) * 0.1
|
|
163
|
-
result = fit(X, y)
|
|
164
|
-
print(result.summary())
|
|
180
|
+
result = fit(X, y, names=['x1', 'x2', 'x3', 'x4', 'x5'])
|
|
181
|
+
print(result.summary()) # R-style output with variable names
|
|
182
|
+
print(result.coef) # {'x1': 1.00, 'x2': 2.00, ...}
|
|
183
|
+
print(result.coef['x3']) # 3.00
|
|
165
184
|
|
|
166
185
|
# Logistic regression
|
|
167
186
|
y_binary = (X @ [1, -1, 0.5, 0, 0] + np.random.randn(1000) > 0).astype(float)
|
|
@@ -2,6 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
GPU-accelerated statistical computing for Python.
|
|
4
4
|
|
|
5
|
+
## What's New in 1.2
|
|
6
|
+
|
|
7
|
+
- **No silent model switches.** PyStatistics now raises explicit errors instead of silently falling back to ridge regularization, different solvers, or CPU backends. You always know exactly what model you're running.
|
|
8
|
+
- **`backend='gpu'` is honest.** Explicitly requesting GPU now errors if GPU is unavailable or the operation has no GPU implementation. `backend='auto'` still falls back silently.
|
|
9
|
+
- **Reproducible Monte Carlo.** `chisq_test()` and `fisher_test()` accept `seed=` for deterministic Monte Carlo p-values.
|
|
10
|
+
- **Module structure.** Large files split per CLAUDE.md Rule 4 (500 code-line limit). All backward-compatible.
|
|
11
|
+
|
|
12
|
+
### What's New in 1.1
|
|
13
|
+
|
|
14
|
+
- **Named coefficients**: Pass `names=` to `fit()`, `coxph()`, and `discrete_time()` to get labeled output matching R
|
|
15
|
+
- **`result.coef` dict**: Access coefficients by name — `result.coef["albumin"]` instead of `result.coefficients[1]`
|
|
16
|
+
- **`result.hr` dict** (Cox/discrete-time): Access hazard ratios by name
|
|
17
|
+
- **Intercept auto-detection**: Pass p-1 names and `"(Intercept)"` is prepended automatically
|
|
18
|
+
- **OLS summary improvements**: Now prints residual quantiles and F-statistic, matching R's `summary(lm())`
|
|
19
|
+
- **Cox summary improvements**: Now prints hazard ratio confidence intervals, matching R's `summary(coxph())`
|
|
20
|
+
- **Bug fix**: Kaplan-Meier summary now correctly displays confidence level percentage
|
|
21
|
+
|
|
5
22
|
---
|
|
6
23
|
|
|
7
24
|
## Design Philosophy
|
|
@@ -114,8 +131,10 @@ from pystatistics.regression import fit
|
|
|
114
131
|
|
|
115
132
|
X = np.random.randn(1000, 5)
|
|
116
133
|
y = X @ [1, 2, 3, -1, 0.5] + np.random.randn(1000) * 0.1
|
|
117
|
-
result = fit(X, y)
|
|
118
|
-
print(result.summary())
|
|
134
|
+
result = fit(X, y, names=['x1', 'x2', 'x3', 'x4', 'x5'])
|
|
135
|
+
print(result.summary()) # R-style output with variable names
|
|
136
|
+
print(result.coef) # {'x1': 1.00, 'x2': 2.00, ...}
|
|
137
|
+
print(result.coef['x3']) # 3.00
|
|
119
138
|
|
|
120
139
|
# Logistic regression
|
|
121
140
|
y_binary = (X @ [1, -1, 0.5, 0, 0] + np.random.randn(1000) > 0).astype(float)
|