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.
Files changed (598) hide show
  1. pystatistics-3.5.0/.release/UNRELEASED.md +39 -0
  2. {pystatistics-3.4.0 → pystatistics-3.5.0}/CHANGELOG.md +39 -0
  3. {pystatistics-3.4.0 → pystatistics-3.5.0}/PKG-INFO +24 -2
  4. {pystatistics-3.4.0 → pystatistics-3.5.0}/README.md +23 -1
  5. {pystatistics-3.4.0 → pystatistics-3.5.0}/pyproject.toml +1 -1
  6. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/__init__.py +1 -1
  7. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/_chain.py +15 -16
  8. pystatistics-3.5.0/pystatistics/mice/_encode.py +73 -0
  9. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/backends/gpu.py +12 -0
  10. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/design.py +91 -16
  11. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/__init__.py +3 -0
  12. pystatistics-3.5.0/pystatistics/mice/methods/_draw.py +72 -0
  13. pystatistics-3.5.0/pystatistics/mice/methods/logreg.py +85 -0
  14. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/pmm.py +32 -11
  15. pystatistics-3.5.0/pystatistics/mice/methods/polr.py +85 -0
  16. pystatistics-3.5.0/pystatistics/mice/methods/polyreg.py +74 -0
  17. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/solution.py +10 -0
  18. pystatistics-3.5.0/tests/mice/references/generate_categorical_fixtures.R +75 -0
  19. pystatistics-3.5.0/tests/mice/references/mice_categorical_data.csv +601 -0
  20. pystatistics-3.5.0/tests/mice/references/mice_categorical_reference.json +21 -0
  21. pystatistics-3.5.0/tests/mice/test_categorical.py +270 -0
  22. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_design.py +10 -2
  23. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_methods.py +29 -0
  24. pystatistics-3.5.0/tests/mice/test_r_validation_categorical.py +71 -0
  25. pystatistics-3.4.0/.release/UNRELEASED.md +0 -29
  26. {pystatistics-3.4.0 → pystatistics-3.5.0}/.github/workflows/publish.yml +0 -0
  27. {pystatistics-3.4.0 → pystatistics-3.5.0}/.github/workflows/trigger-docs-rebuild.yml +0 -0
  28. {pystatistics-3.4.0 → pystatistics-3.5.0}/.gitignore +0 -0
  29. {pystatistics-3.4.0 → pystatistics-3.5.0}/.release/CHECKLIST.md +0 -0
  30. {pystatistics-3.4.0 → pystatistics-3.5.0}/.release/release.py +0 -0
  31. {pystatistics-3.4.0 → pystatistics-3.5.0}/CLAUDE.md +0 -0
  32. {pystatistics-3.4.0 → pystatistics-3.5.0}/LICENSE +0 -0
  33. {pystatistics-3.4.0 → pystatistics-3.5.0}/benchmarks/mvnmle_bench.py +0 -0
  34. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/DESIGN.md +0 -0
  35. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/Forge.md +0 -0
  36. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/GPU_BACKEND_NOTES.md +0 -0
  37. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/Makefile +0 -0
  38. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/PYSTATSBIO_CONTEXT.md +0 -0
  39. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/ROADMAP.md +0 -0
  40. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/_static/custom.css +0 -0
  41. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/anova.rst +0 -0
  42. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/conf.py +0 -0
  43. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/core.rst +0 -0
  44. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/descriptive.rst +0 -0
  45. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/gam.rst +0 -0
  46. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/hypothesis.rst +0 -0
  47. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/index.rst +0 -0
  48. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/mixed.rst +0 -0
  49. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/montecarlo.rst +0 -0
  50. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/multinomial.rst +0 -0
  51. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/multivariate.rst +0 -0
  52. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/mvnmle.rst +0 -0
  53. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/ordinal.rst +0 -0
  54. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/regression.rst +0 -0
  55. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/survival.rst +0 -0
  56. {pystatistics-3.4.0 → pystatistics-3.5.0}/docs/timeseries.rst +0 -0
  57. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/GPU_BACKEND_CONVENTION.md +0 -0
  58. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/__init__.py +0 -0
  59. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_common.py +0 -0
  60. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_contrasts.py +0 -0
  61. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_levene.py +0 -0
  62. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_posthoc.py +0 -0
  63. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_repeated.py +0 -0
  64. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/_ss.py +0 -0
  65. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/design.py +0 -0
  66. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/solution.py +0 -0
  67. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/anova/solvers.py +0 -0
  68. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/__init__.py +0 -0
  69. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/capabilities.py +0 -0
  70. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/__init__.py +0 -0
  71. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/device.py +0 -0
  72. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/__init__.py +0 -0
  73. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/batched.py +0 -0
  74. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/cholesky.py +0 -0
  75. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/determinant.py +0 -0
  76. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/qr.py +0 -0
  77. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/solve.py +0 -0
  78. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/linalg/svd.py +0 -0
  79. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/optimization/__init__.py +0 -0
  80. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/optimization/convergence.py +0 -0
  81. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/precision.py +0 -0
  82. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/timing.py +0 -0
  83. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/tolerances.py +0 -0
  84. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/compute/torch_interop.py +0 -0
  85. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/datasource.py +0 -0
  86. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/encoding.py +0 -0
  87. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/exceptions.py +0 -0
  88. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/protocols.py +0 -0
  89. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/result.py +0 -0
  90. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/core/validation.py +0 -0
  91. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/__init__.py +0 -0
  92. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/_missing.py +0 -0
  93. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/_quantile_types.py +0 -0
  94. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/backends/__init__.py +0 -0
  95. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/backends/cpu.py +0 -0
  96. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/backends/gpu.py +0 -0
  97. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/design.py +0 -0
  98. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/solution.py +0 -0
  99. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/descriptive/solvers.py +0 -0
  100. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/__init__.py +0 -0
  101. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_basis.py +0 -0
  102. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_common.py +0 -0
  103. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_fit.py +0 -0
  104. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_gam.py +0 -0
  105. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_gcv.py +0 -0
  106. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/_smooth.py +0 -0
  107. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/backends/__init__.py +0 -0
  108. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/backends/_gpu_family.py +0 -0
  109. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/backends/gpu_pirls.py +0 -0
  110. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/gam/solution.py +0 -0
  111. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/__init__.py +0 -0
  112. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/_common.py +0 -0
  113. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/_design_factories.py +0 -0
  114. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/_p_adjust.py +0 -0
  115. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/__init__.py +0 -0
  116. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_chisq_test.py +0 -0
  117. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_fisher_test.py +0 -0
  118. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_ks_test.py +0 -0
  119. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_prop_test.py +0 -0
  120. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_t_test.py +0 -0
  121. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_var_test.py +0 -0
  122. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/_wilcox_test.py +0 -0
  123. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/cpu.py +0 -0
  124. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/backends/gpu.py +0 -0
  125. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/design.py +0 -0
  126. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/solution.py +0 -0
  127. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/hypothesis/solvers.py +0 -0
  128. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/__init__.py +0 -0
  129. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/_rng.py +0 -0
  130. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/_visit.py +0 -0
  131. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/backends/__init__.py +0 -0
  132. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/backends/_gpu_linreg.py +0 -0
  133. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/backends/_gpu_methods.py +0 -0
  134. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/backends/cpu.py +0 -0
  135. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/datasets.py +0 -0
  136. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/_linreg.py +0 -0
  137. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/base.py +0 -0
  138. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/norm.py +0 -0
  139. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/methods/registry.py +0 -0
  140. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/pooling.py +0 -0
  141. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/solution.py +0 -0
  142. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mice/solvers.py +0 -0
  143. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/__init__.py +0 -0
  144. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_common.py +0 -0
  145. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_deviance.py +0 -0
  146. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_pirls.py +0 -0
  147. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_pls.py +0 -0
  148. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_random_effects.py +0 -0
  149. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/_satterthwaite.py +0 -0
  150. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/design.py +0 -0
  151. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/solution.py +0 -0
  152. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mixed/solvers.py +0 -0
  153. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/__init__.py +0 -0
  154. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/_ci.py +0 -0
  155. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/_common.py +0 -0
  156. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/_influence.py +0 -0
  157. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/backends/__init__.py +0 -0
  158. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/backends/cpu.py +0 -0
  159. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/backends/gpu.py +0 -0
  160. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/design.py +0 -0
  161. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/solution.py +0 -0
  162. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/montecarlo/solvers.py +0 -0
  163. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/__init__.py +0 -0
  164. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/_common.py +0 -0
  165. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/_likelihood.py +0 -0
  166. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/_solver.py +0 -0
  167. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/backends/__init__.py +0 -0
  168. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multinomial/backends/gpu_likelihood.py +0 -0
  169. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/__init__.py +0 -0
  170. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/_common.py +0 -0
  171. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/_factor.py +0 -0
  172. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/_pca.py +0 -0
  173. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/_rotation.py +0 -0
  174. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/backends/__init__.py +0 -0
  175. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/multivariate/backends/gpu_pca.py +0 -0
  176. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/__init__.py +0 -0
  177. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_monotone.py +0 -0
  178. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/__init__.py +0 -0
  179. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/base.py +0 -0
  180. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/cpu.py +0 -0
  181. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/gpu_fp32.py +0 -0
  182. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/gpu_fp64.py +0 -0
  183. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_objectives/parameterizations.py +0 -0
  184. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/_utils.py +0 -0
  185. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/__init__.py +0 -0
  186. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/_em_batched.py +0 -0
  187. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/_em_batched_np.py +0 -0
  188. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/_em_batched_patterns.py +0 -0
  189. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/_em_batched_torch.py +0 -0
  190. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/_squarem.py +0 -0
  191. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/cpu.py +0 -0
  192. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/em.py +0 -0
  193. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/backends/gpu.py +0 -0
  194. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/datasets.py +0 -0
  195. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/design.py +0 -0
  196. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/mcar_test.py +0 -0
  197. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/patterns.py +0 -0
  198. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/solution.py +0 -0
  199. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/mvnmle/solvers.py +0 -0
  200. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/__init__.py +0 -0
  201. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/_common.py +0 -0
  202. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/_likelihood.py +0 -0
  203. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/_solver.py +0 -0
  204. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/backends/__init__.py +0 -0
  205. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/backends/gpu_likelihood.py +0 -0
  206. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/ordinal/solution.py +0 -0
  207. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/py.typed +0 -0
  208. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/__init__.py +0 -0
  209. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/_formatting.py +0 -0
  210. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/_glm.py +0 -0
  211. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/_linear.py +0 -0
  212. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/_nb_theta.py +0 -0
  213. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/backends/__init__.py +0 -0
  214. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/backends/cpu.py +0 -0
  215. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/backends/cpu_glm.py +0 -0
  216. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/backends/gpu.py +0 -0
  217. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/backends/gpu_glm.py +0 -0
  218. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/design.py +0 -0
  219. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/families.py +0 -0
  220. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/solution.py +0 -0
  221. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/solvers.py +0 -0
  222. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/regression/terms.py +0 -0
  223. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/__init__.py +0 -0
  224. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/_common.py +0 -0
  225. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/_cox.py +0 -0
  226. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/_discrete.py +0 -0
  227. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/_km.py +0 -0
  228. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/_logrank.py +0 -0
  229. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/backends/__init__.py +0 -0
  230. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/backends/cpu.py +0 -0
  231. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/backends/gpu.py +0 -0
  232. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/design.py +0 -0
  233. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/solution.py +0 -0
  234. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/survival/solvers.py +0 -0
  235. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/__init__.py +0 -0
  236. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_acf.py +0 -0
  237. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_batch.py +0 -0
  238. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_factored.py +0 -0
  239. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_fit.py +0 -0
  240. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_forecast.py +0 -0
  241. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_kalman.py +0 -0
  242. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_likelihood.py +0 -0
  243. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_arima_order.py +0 -0
  244. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_common.py +0 -0
  245. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_decomposition.py +0 -0
  246. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_differencing.py +0 -0
  247. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_ets_fit.py +0 -0
  248. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_ets_forecast.py +0 -0
  249. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_ets_models.py +0 -0
  250. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_stationarity.py +0 -0
  251. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/_whittle.py +0 -0
  252. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/backends/__init__.py +0 -0
  253. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/backends/whittle_batch_gpu.py +0 -0
  254. {pystatistics-3.4.0 → pystatistics-3.5.0}/pystatistics/timeseries/backends/whittle_gpu.py +0 -0
  255. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/__init__.py +0 -0
  256. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/conftest.py +0 -0
  257. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_contrasts.py +0 -0
  258. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_design.py +0 -0
  259. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_factorial.py +0 -0
  260. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_levene.py +0 -0
  261. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_oneway.py +0 -0
  262. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_posthoc.py +0 -0
  263. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_r_validation.py +0 -0
  264. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/anova/test_repeated_measures.py +0 -0
  265. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/benchmark_gpu.py +0 -0
  266. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/conftest.py +0 -0
  267. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/core/test_datasource.py +0 -0
  268. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/core/test_exceptions.py +0 -0
  269. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/core/test_result.py +0 -0
  270. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/core/test_torch_interop.py +0 -0
  271. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/core/test_validation.py +0 -0
  272. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/__init__.py +0 -0
  273. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/conftest.py +0 -0
  274. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_cor.py +0 -0
  275. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_cov.py +0 -0
  276. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_describe.py +0 -0
  277. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_gpu.py +0 -0
  278. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_missing.py +0 -0
  279. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_moments.py +0 -0
  280. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_quantile.py +0 -0
  281. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/descriptive/test_r_validation.py +0 -0
  282. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_ancova_meta.json +0 -0
  283. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_ancova_r_results.json +0 -0
  284. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_bonferroni_meta.json +0 -0
  285. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_bonferroni_r_results.json +0 -0
  286. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_eta_meta.json +0 -0
  287. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_eta_r_results.json +0 -0
  288. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_levene_meta.json +0 -0
  289. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_levene_r_results.json +0 -0
  290. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_oneway_balanced_meta.json +0 -0
  291. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_oneway_balanced_r_results.json +0 -0
  292. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_oneway_unbalanced_meta.json +0 -0
  293. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_oneway_unbalanced_r_results.json +0 -0
  294. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_rm_mixed_meta.json +0 -0
  295. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_rm_mixed_r_results.json +0 -0
  296. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_rm_within_meta.json +0 -0
  297. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_rm_within_r_results.json +0 -0
  298. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_tukey_meta.json +0 -0
  299. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_tukey_r_results.json +0 -0
  300. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_twoway_balanced_meta.json +0 -0
  301. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_twoway_balanced_r_results.json +0 -0
  302. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_twoway_unbalanced_meta.json +0 -0
  303. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/anova_twoway_unbalanced_r_results.json +0 -0
  304. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/basic_100x3.csv +0 -0
  305. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/basic_100x3_meta.json +0 -0
  306. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/basic_100x3_r_results.json +0 -0
  307. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/collinear_almost.csv +0 -0
  308. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/collinear_almost_meta.json +0 -0
  309. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/collinear_almost_r_results.json +0 -0
  310. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_basic_100x5.csv +0 -0
  311. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_basic_100x5_meta.json +0 -0
  312. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_basic_100x5_r_results.json +0 -0
  313. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_constant_column.csv +0 -0
  314. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_constant_column_meta.json +0 -0
  315. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_constant_column_r_results.json +0 -0
  316. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_extreme_values.csv +0 -0
  317. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_extreme_values_meta.json +0 -0
  318. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_extreme_values_r_results.json +0 -0
  319. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_large_1000x10.csv +0 -0
  320. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_large_1000x10_meta.json +0 -0
  321. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_large_1000x10_r_results.json +0 -0
  322. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_columnwise.csv +0 -0
  323. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_columnwise_meta.json +0 -0
  324. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_columnwise_r_results.json +0 -0
  325. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_scattered.csv +0 -0
  326. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_scattered_meta.json +0 -0
  327. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_nan_scattered_r_results.json +0 -0
  328. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_negative_correlation.csv +0 -0
  329. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_negative_correlation_meta.json +0 -0
  330. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_negative_correlation_r_results.json +0 -0
  331. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_perfect_correlation.csv +0 -0
  332. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_perfect_correlation_meta.json +0 -0
  333. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_perfect_correlation_r_results.json +0 -0
  334. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_single_column.csv +0 -0
  335. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_single_column_meta.json +0 -0
  336. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_single_column_r_results.json +0 -0
  337. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_ties.csv +0 -0
  338. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_ties_meta.json +0 -0
  339. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/desc_ties_r_results.json +0 -0
  340. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/different_scales.csv +0 -0
  341. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/different_scales_meta.json +0 -0
  342. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/different_scales_r_results.json +0 -0
  343. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_anova_fixtures.py +0 -0
  344. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_descriptive_fixtures.py +0 -0
  345. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_fixtures.py +0 -0
  346. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_glm_fixtures.py +0 -0
  347. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_hypothesis_fixtures.py +0 -0
  348. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_mixed_fixtures.py +0 -0
  349. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_montecarlo_fixtures.py +0 -0
  350. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/generate_survival_fixtures.py +0 -0
  351. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_balanced.csv +0 -0
  352. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_balanced_meta.json +0 -0
  353. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_balanced_r_results.json +0 -0
  354. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_basic.csv +0 -0
  355. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_basic_meta.json +0 -0
  356. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_basic_r_results.json +0 -0
  357. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_large.csv +0 -0
  358. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_large_meta.json +0 -0
  359. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_large_r_results.json +0 -0
  360. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_separated.csv +0 -0
  361. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_separated_meta.json +0 -0
  362. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_binomial_separated_r_results.json +0 -0
  363. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_basic.csv +0 -0
  364. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_basic_meta.json +0 -0
  365. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_basic_r_results.json +0 -0
  366. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_large.csv +0 -0
  367. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_large_meta.json +0 -0
  368. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_gaussian_large_r_results.json +0 -0
  369. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_basic.csv +0 -0
  370. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_basic_meta.json +0 -0
  371. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_basic_r_results.json +0 -0
  372. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_large_counts.csv +0 -0
  373. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_large_counts_meta.json +0 -0
  374. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_large_counts_r_results.json +0 -0
  375. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_zeros.csv +0 -0
  376. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_zeros_meta.json +0 -0
  377. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/glm_poisson_zeros_r_results.json +0 -0
  378. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/high_noise.csv +0 -0
  379. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/high_noise_meta.json +0 -0
  380. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/high_noise_r_results.json +0 -0
  381. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_2x2_yates_meta.json +0 -0
  382. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_2x2_yates_r_results.json +0 -0
  383. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_3x3_meta.json +0 -0
  384. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_3x3_r_results.json +0 -0
  385. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_gof_meta.json +0 -0
  386. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_gof_r_results.json +0 -0
  387. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_gof_unequal_meta.json +0 -0
  388. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_chisq_gof_unequal_r_results.json +0 -0
  389. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_2x2_less_meta.json +0 -0
  390. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_2x2_less_r_results.json +0 -0
  391. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_2x2_meta.json +0 -0
  392. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_2x2_r_results.json +0 -0
  393. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_3x3_meta.json +0 -0
  394. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_fisher_3x3_r_results.json +0 -0
  395. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_ks_onesample_norm_meta.json +0 -0
  396. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_ks_onesample_norm_r_results.json +0 -0
  397. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_ks_twosample_meta.json +0 -0
  398. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_ks_twosample_r_results.json +0 -0
  399. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_prop_onesample_meta.json +0 -0
  400. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_prop_onesample_r_results.json +0 -0
  401. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_prop_twosample_meta.json +0 -0
  402. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_prop_twosample_r_results.json +0 -0
  403. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_onesample_meta.json +0 -0
  404. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_onesample_r_results.json +0 -0
  405. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_paired_meta.json +0 -0
  406. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_paired_r_results.json +0 -0
  407. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_pooled_meta.json +0 -0
  408. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_pooled_r_results.json +0 -0
  409. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_welch_meta.json +0 -0
  410. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_t_welch_r_results.json +0 -0
  411. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_var_basic_meta.json +0 -0
  412. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_var_basic_r_results.json +0 -0
  413. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_wilcox_ranksum_meta.json +0 -0
  414. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_wilcox_ranksum_r_results.json +0 -0
  415. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_wilcox_signed_meta.json +0 -0
  416. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/htest_wilcox_signed_r_results.json +0 -0
  417. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/ill_conditioned.csv +0 -0
  418. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/ill_conditioned_meta.json +0 -0
  419. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/ill_conditioned_r_results.json +0 -0
  420. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/large_coeffs.csv +0 -0
  421. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/large_coeffs_meta.json +0 -0
  422. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/large_coeffs_r_results.json +0 -0
  423. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_90_meta.json +0 -0
  424. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_90_r_results.json +0 -0
  425. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_normal_meta.json +0 -0
  426. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_normal_r_results.json +0 -0
  427. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_skewed_meta.json +0 -0
  428. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_ci_skewed_r_results.json +0 -0
  429. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_mean_balanced_meta.json +0 -0
  430. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_mean_balanced_r_results.json +0 -0
  431. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_mean_ordinary_meta.json +0 -0
  432. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_mean_ordinary_r_results.json +0 -0
  433. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_median_meta.json +0 -0
  434. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_median_r_results.json +0 -0
  435. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_variance_meta.json +0 -0
  436. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_boot_variance_r_results.json +0 -0
  437. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_greater_meta.json +0 -0
  438. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_greater_r_results.json +0 -0
  439. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_not_significant_meta.json +0 -0
  440. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_not_significant_r_results.json +0 -0
  441. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_significant_meta.json +0 -0
  442. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mc_perm_significant_r_results.json +0 -0
  443. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/glmm_binomial.csv +0 -0
  444. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/glmm_poisson.csv +0 -0
  445. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/lmm_crossed.csv +0 -0
  446. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/lmm_intercept.csv +0 -0
  447. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/lmm_ml.csv +0 -0
  448. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/lmm_no_effect.csv +0 -0
  449. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/lmm_slope.csv +0 -0
  450. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/mixed_meta.json +0 -0
  451. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/mixed/mixed_r_results.json +0 -0
  452. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/near_square.csv +0 -0
  453. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/near_square_meta.json +0 -0
  454. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/near_square_r_results.json +0 -0
  455. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/no_intercept.csv +0 -0
  456. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/no_intercept_meta.json +0 -0
  457. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/no_intercept_r_results.json +0 -0
  458. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_anova_validation.R +0 -0
  459. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_descriptive_validation.R +0 -0
  460. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_glm_validation.R +0 -0
  461. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_hypothesis_validation.R +0 -0
  462. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_mixed_validation.R +0 -0
  463. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_montecarlo_validation.R +0 -0
  464. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_survival_validation.R +0 -0
  465. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_r_validation.R +0 -0
  466. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/run_validation.sh +0 -0
  467. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/small_noise.csv +0 -0
  468. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/small_noise_meta.json +0 -0
  469. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/small_noise_r_results.json +0 -0
  470. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_breslow_meta.json +0 -0
  471. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_breslow_r_results.json +0 -0
  472. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_single_meta.json +0 -0
  473. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_single_r_results.json +0 -0
  474. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_ties_meta.json +0 -0
  475. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_ties_r_results.json +0 -0
  476. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_two_cov_meta.json +0 -0
  477. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_cox_two_cov_r_results.json +0 -0
  478. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_basic_meta.json +0 -0
  479. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_basic_r_results.json +0 -0
  480. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_heavy_cens_meta.json +0 -0
  481. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_heavy_cens_r_results.json +0 -0
  482. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_loglog_ci_meta.json +0 -0
  483. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_loglog_ci_r_results.json +0 -0
  484. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_no_cens_meta.json +0 -0
  485. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_no_cens_r_results.json +0 -0
  486. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_plain_ci_meta.json +0 -0
  487. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_plain_ci_r_results.json +0 -0
  488. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_ties_meta.json +0 -0
  489. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_km_ties_r_results.json +0 -0
  490. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_peto_meta.json +0 -0
  491. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_peto_r_results.json +0 -0
  492. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_three_group_meta.json +0 -0
  493. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_three_group_r_results.json +0 -0
  494. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_two_group_meta.json +0 -0
  495. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/surv_lr_two_group_r_results.json +0 -0
  496. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/tall_skinny.csv +0 -0
  497. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/tall_skinny_meta.json +0 -0
  498. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/tall_skinny_r_results.json +0 -0
  499. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/fixtures/validate_against_r.py +0 -0
  500. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/gam/__init__.py +0 -0
  501. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/gam/test_gam.py +0 -0
  502. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/__init__.py +0 -0
  503. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/conftest.py +0 -0
  504. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_chisq_test.py +0 -0
  505. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_design_split.py +0 -0
  506. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_fisher_test.py +0 -0
  507. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_gpu.py +0 -0
  508. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_ks_test.py +0 -0
  509. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_p_adjust.py +0 -0
  510. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_prop_test.py +0 -0
  511. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_r_validation.py +0 -0
  512. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_t_test.py +0 -0
  513. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_var_test.py +0 -0
  514. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/hypothesis/test_wilcox_test.py +0 -0
  515. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/__init__.py +0 -0
  516. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/references/generate_mice_fixtures.R +0 -0
  517. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/references/mice_reference.json +0 -0
  518. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/references/mice_validation_complete.csv +0 -0
  519. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/references/mice_validation_data.csv +0 -0
  520. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_datasets.py +0 -0
  521. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_gpu.py +0 -0
  522. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_mice.py +0 -0
  523. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_pooling.py +0 -0
  524. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_r_validation.py +0 -0
  525. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_rng.py +0 -0
  526. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mice/test_visit.py +0 -0
  527. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/__init__.py +0 -0
  528. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/conftest.py +0 -0
  529. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_glmm.py +0 -0
  530. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_lmm_crossed.py +0 -0
  531. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_lmm_intercept.py +0 -0
  532. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_lmm_nested.py +0 -0
  533. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_lmm_slope.py +0 -0
  534. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_pls.py +0 -0
  535. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_r_validation.py +0 -0
  536. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_random_effects.py +0 -0
  537. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mixed/test_satterthwaite.py +0 -0
  538. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/__init__.py +0 -0
  539. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/conftest.py +0 -0
  540. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_batched_solver.py +0 -0
  541. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_boot_ci.py +0 -0
  542. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_bootstrap.py +0 -0
  543. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_gpu.py +0 -0
  544. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_influence.py +0 -0
  545. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_permutation.py +0 -0
  546. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/montecarlo/test_r_validation.py +0 -0
  547. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/multinomial/__init__.py +0 -0
  548. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/multinomial/test_multinom.py +0 -0
  549. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/multivariate/__init__.py +0 -0
  550. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/multivariate/test_multivariate.py +0 -0
  551. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/apple_em_reference.json +0 -0
  552. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/apple_reference.json +0 -0
  553. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/generate_em_fixtures.R +0 -0
  554. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_apple.json +0 -0
  555. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_complete.json +0 -0
  556. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_extreme.json +0 -0
  557. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_missvals.json +0 -0
  558. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_simple_mcar.json +0 -0
  559. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/little_mcar_summary.json +0 -0
  560. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/missvals_em_reference.json +0 -0
  561. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/missvals_reference.json +0 -0
  562. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/references/small_test_reference.json +0 -0
  563. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_em.py +0 -0
  564. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_gpu.py +0 -0
  565. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_mcar.py +0 -0
  566. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_mlest.py +0 -0
  567. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_monotone.py +0 -0
  568. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_no_silent_fallback.py +0 -0
  569. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/mvnmle/test_squarem.py +0 -0
  570. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/ordinal/__init__.py +0 -0
  571. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/ordinal/test_ordinal.py +0 -0
  572. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/benchmark.py +0 -0
  573. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/benchmark.r +0 -0
  574. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/conftest.py +0 -0
  575. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_fit.py +0 -0
  576. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_gamma_nb.py +0 -0
  577. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_glm.py +0 -0
  578. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_glm_gpu.py +0 -0
  579. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_glm_r_validation.py +0 -0
  580. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_module_split.py +0 -0
  581. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_r_validation.py +0 -0
  582. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_stress_gpu.py +0 -0
  583. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_terms.py +0 -0
  584. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/regression/test_terms_gpu.py +0 -0
  585. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/__init__.py +0 -0
  586. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/conftest.py +0 -0
  587. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_coxph.py +0 -0
  588. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_discrete_time.py +0 -0
  589. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_gpu.py +0 -0
  590. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_kaplan_meier.py +0 -0
  591. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_logrank.py +0 -0
  592. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/survival/test_r_validation.py +0 -0
  593. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/test_code_quality.py +0 -0
  594. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/timeseries/__init__.py +0 -0
  595. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/timeseries/test_acf_stationarity.py +0 -0
  596. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/timeseries/test_arima.py +0 -0
  597. {pystatistics-3.4.0 → pystatistics-3.5.0}/tests/timeseries/test_decomposition.py +0 -0
  598. {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.4.0
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/` | Numeric | Multiple imputation by chained equations: PMM and Bayesian linear regression, Rubin's-rules pooling, validated against R mice; CUDA GPU backend |
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/` | Numeric | Multiple imputation by chained equations: PMM and Bayesian linear regression, Rubin's-rules pooling, validated against R mice; CUDA GPU backend |
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pystatistics"
7
- version = "3.4.0"
7
+ version = "3.5.0"
8
8
  description = "GPU-accelerated statistical computing for Python"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -16,7 +16,7 @@ Usage:
16
16
  result = fit(design)
17
17
  """
18
18
 
19
- __version__ = "3.4.0"
19
+ __version__ = "3.5.0"
20
20
  __author__ = "Hai-Shuo"
21
21
  __email__ = "contact@sgcx.org"
22
22
 
@@ -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 = _predictor_columns(data, j, p)
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
- imputed = method.impute(y_obs, X_obs, X_mis, rng)
72
- data[mis_rows, j] = imputed
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
- # Stage 1 supports numeric columns only. This single constant + the guard in
32
- # ``_resolve_kinds`` is the entire "numeric-only" restriction; Stage 3 widens it.
33
- _SUPPORTED_KINDS = ("numeric",)
34
- _DEFAULT_METHOD = "pmm"
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 = _DEFAULT_METHOD,
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 for every incomplete column (R default
70
- ``'pmm'``). Overridden per-column by ``methods``.
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 = _DEFAULT_METHOD,
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}, but this release supports only "
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
- # Start with the default for every column.
313
- resolved = [method] * p
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
+ )