pystatistics 2.2.0__tar.gz → 3.0.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 (544) hide show
  1. {pystatistics-2.2.0 → pystatistics-3.0.0}/CHANGELOG.md +232 -0
  2. {pystatistics-2.2.0 → pystatistics-3.0.0}/CLAUDE.md +39 -0
  3. {pystatistics-2.2.0 → pystatistics-3.0.0}/PKG-INFO +123 -86
  4. {pystatistics-2.2.0 → pystatistics-3.0.0}/README.md +120 -85
  5. {pystatistics-2.2.0 → pystatistics-3.0.0}/pyproject.toml +7 -1
  6. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/__init__.py +1 -1
  7. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/backends/gpu_pirls.py +86 -3
  8. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/__init__.py +0 -2
  9. pystatistics-3.0.0/pystatistics/mvnmle/backends/_em_batched.py +45 -0
  10. pystatistics-3.0.0/pystatistics/mvnmle/backends/_em_batched_np.py +304 -0
  11. pystatistics-3.0.0/pystatistics/mvnmle/backends/_em_batched_patterns.py +112 -0
  12. pystatistics-3.0.0/pystatistics/mvnmle/backends/_em_batched_torch.py +275 -0
  13. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/backends/em.py +5 -5
  14. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/mcar_test.py +7 -310
  15. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/gam/test_gam.py +33 -1
  16. pystatistics-2.2.0/pystatistics/mvnmle/backends/_em_batched.py +0 -897
  17. pystatistics-2.2.0/tests/mvnmle/test_mom_mcar.py +0 -169
  18. {pystatistics-2.2.0 → pystatistics-3.0.0}/.github/workflows/publish.yml +0 -0
  19. {pystatistics-2.2.0 → pystatistics-3.0.0}/.github/workflows/trigger-docs-rebuild.yml +0 -0
  20. {pystatistics-2.2.0 → pystatistics-3.0.0}/.gitignore +0 -0
  21. {pystatistics-2.2.0 → pystatistics-3.0.0}/.release/CHECKLIST.md +0 -0
  22. {pystatistics-2.2.0 → pystatistics-3.0.0}/.release/UNRELEASED.md +0 -0
  23. {pystatistics-2.2.0 → pystatistics-3.0.0}/.release/release.py +0 -0
  24. {pystatistics-2.2.0 → pystatistics-3.0.0}/LICENSE +0 -0
  25. {pystatistics-2.2.0 → pystatistics-3.0.0}/benchmarks/mvnmle_bench.py +0 -0
  26. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/DESIGN.md +0 -0
  27. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/Forge.md +0 -0
  28. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/GPU_BACKEND_NOTES.md +0 -0
  29. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/Makefile +0 -0
  30. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/PYSTATSBIO_CONTEXT.md +0 -0
  31. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/ROADMAP.md +0 -0
  32. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/_static/custom.css +0 -0
  33. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/anova.rst +0 -0
  34. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/conf.py +0 -0
  35. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/core.rst +0 -0
  36. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/descriptive.rst +0 -0
  37. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/hypothesis.rst +0 -0
  38. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/index.rst +0 -0
  39. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/mixed.rst +0 -0
  40. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/montecarlo.rst +0 -0
  41. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/mvnmle.rst +0 -0
  42. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/regression.rst +0 -0
  43. {pystatistics-2.2.0 → pystatistics-3.0.0}/docs/survival.rst +0 -0
  44. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/GPU_BACKEND_CONVENTION.md +0 -0
  45. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/anova/__init__.py +0 -0
  46. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/anova/_common.py +0 -0
  47. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/anova/_contrasts.py +0 -0
  48. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/anova/_levene.py +0 -0
  49. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/anova/_posthoc.py +0 -0
  50. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/anova/_repeated.py +0 -0
  51. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/anova/_ss.py +0 -0
  52. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/anova/design.py +0 -0
  53. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/anova/solution.py +0 -0
  54. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/anova/solvers.py +0 -0
  55. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/__init__.py +0 -0
  56. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/capabilities.py +0 -0
  57. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/__init__.py +0 -0
  58. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/device.py +0 -0
  59. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/linalg/__init__.py +0 -0
  60. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/linalg/batched.py +0 -0
  61. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/linalg/cholesky.py +0 -0
  62. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/linalg/determinant.py +0 -0
  63. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/linalg/qr.py +0 -0
  64. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/linalg/solve.py +0 -0
  65. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/linalg/svd.py +0 -0
  66. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/optimization/__init__.py +0 -0
  67. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/optimization/convergence.py +0 -0
  68. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/precision.py +0 -0
  69. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/timing.py +0 -0
  70. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/compute/tolerances.py +0 -0
  71. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/datasource.py +0 -0
  72. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/exceptions.py +0 -0
  73. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/protocols.py +0 -0
  74. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/result.py +0 -0
  75. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/core/validation.py +0 -0
  76. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/descriptive/__init__.py +0 -0
  77. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/descriptive/_missing.py +0 -0
  78. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/descriptive/_quantile_types.py +0 -0
  79. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/descriptive/backends/__init__.py +0 -0
  80. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/descriptive/backends/cpu.py +0 -0
  81. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/descriptive/backends/gpu.py +0 -0
  82. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/descriptive/design.py +0 -0
  83. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/descriptive/solution.py +0 -0
  84. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/descriptive/solvers.py +0 -0
  85. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/__init__.py +0 -0
  86. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/_basis.py +0 -0
  87. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/_common.py +0 -0
  88. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/_fit.py +0 -0
  89. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/_gam.py +0 -0
  90. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/_gcv.py +0 -0
  91. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/_smooth.py +0 -0
  92. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/backends/__init__.py +0 -0
  93. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/backends/_gpu_family.py +0 -0
  94. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/gam/solution.py +0 -0
  95. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/__init__.py +0 -0
  96. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/_common.py +0 -0
  97. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/_design_factories.py +0 -0
  98. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/_p_adjust.py +0 -0
  99. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/backends/__init__.py +0 -0
  100. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/backends/_chisq_test.py +0 -0
  101. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/backends/_fisher_test.py +0 -0
  102. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/backends/_ks_test.py +0 -0
  103. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/backends/_prop_test.py +0 -0
  104. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/backends/_t_test.py +0 -0
  105. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/backends/_var_test.py +0 -0
  106. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/backends/_wilcox_test.py +0 -0
  107. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/backends/cpu.py +0 -0
  108. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/backends/gpu.py +0 -0
  109. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/design.py +0 -0
  110. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/solution.py +0 -0
  111. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/hypothesis/solvers.py +0 -0
  112. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mixed/__init__.py +0 -0
  113. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mixed/_common.py +0 -0
  114. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mixed/_deviance.py +0 -0
  115. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mixed/_pirls.py +0 -0
  116. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mixed/_pls.py +0 -0
  117. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mixed/_random_effects.py +0 -0
  118. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mixed/_satterthwaite.py +0 -0
  119. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mixed/design.py +0 -0
  120. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mixed/solution.py +0 -0
  121. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mixed/solvers.py +0 -0
  122. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/montecarlo/__init__.py +0 -0
  123. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/montecarlo/_ci.py +0 -0
  124. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/montecarlo/_common.py +0 -0
  125. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/montecarlo/_influence.py +0 -0
  126. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/montecarlo/backends/__init__.py +0 -0
  127. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/montecarlo/backends/cpu.py +0 -0
  128. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/montecarlo/backends/gpu.py +0 -0
  129. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/montecarlo/design.py +0 -0
  130. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/montecarlo/solution.py +0 -0
  131. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/montecarlo/solvers.py +0 -0
  132. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multinomial/__init__.py +0 -0
  133. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multinomial/_common.py +0 -0
  134. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multinomial/_likelihood.py +0 -0
  135. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multinomial/_solver.py +0 -0
  136. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multinomial/backends/__init__.py +0 -0
  137. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multinomial/backends/gpu_likelihood.py +0 -0
  138. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multinomial/solution.py +0 -0
  139. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multivariate/__init__.py +0 -0
  140. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multivariate/_common.py +0 -0
  141. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multivariate/_factor.py +0 -0
  142. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multivariate/_pca.py +0 -0
  143. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multivariate/_rotation.py +0 -0
  144. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multivariate/backends/__init__.py +0 -0
  145. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/multivariate/backends/gpu_pca.py +0 -0
  146. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/_monotone.py +0 -0
  147. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/_objectives/__init__.py +0 -0
  148. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/_objectives/base.py +0 -0
  149. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/_objectives/cpu.py +0 -0
  150. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/_objectives/gpu_fp32.py +0 -0
  151. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/_objectives/gpu_fp64.py +0 -0
  152. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/_objectives/parameterizations.py +0 -0
  153. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/_utils.py +0 -0
  154. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/backends/__init__.py +0 -0
  155. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/backends/_squarem.py +0 -0
  156. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/backends/cpu.py +0 -0
  157. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/backends/gpu.py +0 -0
  158. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/datasets.py +0 -0
  159. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/design.py +0 -0
  160. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/patterns.py +0 -0
  161. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/solution.py +0 -0
  162. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/mvnmle/solvers.py +0 -0
  163. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/ordinal/__init__.py +0 -0
  164. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/ordinal/_common.py +0 -0
  165. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/ordinal/_likelihood.py +0 -0
  166. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/ordinal/_solver.py +0 -0
  167. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/ordinal/backends/__init__.py +0 -0
  168. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/ordinal/backends/gpu_likelihood.py +0 -0
  169. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/ordinal/solution.py +0 -0
  170. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/py.typed +0 -0
  171. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/__init__.py +0 -0
  172. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/_formatting.py +0 -0
  173. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/_glm.py +0 -0
  174. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/_linear.py +0 -0
  175. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/_nb_theta.py +0 -0
  176. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/backends/__init__.py +0 -0
  177. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/backends/cpu.py +0 -0
  178. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/backends/cpu_glm.py +0 -0
  179. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/backends/gpu.py +0 -0
  180. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/backends/gpu_glm.py +0 -0
  181. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/design.py +0 -0
  182. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/families.py +0 -0
  183. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/solution.py +0 -0
  184. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/regression/solvers.py +0 -0
  185. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/__init__.py +0 -0
  186. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/_common.py +0 -0
  187. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/_cox.py +0 -0
  188. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/_discrete.py +0 -0
  189. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/_km.py +0 -0
  190. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/_logrank.py +0 -0
  191. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/backends/__init__.py +0 -0
  192. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/backends/cpu.py +0 -0
  193. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/backends/gpu.py +0 -0
  194. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/design.py +0 -0
  195. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/solution.py +0 -0
  196. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/survival/solvers.py +0 -0
  197. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/__init__.py +0 -0
  198. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_acf.py +0 -0
  199. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_arima_batch.py +0 -0
  200. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_arima_factored.py +0 -0
  201. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_arima_fit.py +0 -0
  202. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_arima_forecast.py +0 -0
  203. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_arima_kalman.py +0 -0
  204. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_arima_likelihood.py +0 -0
  205. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_arima_order.py +0 -0
  206. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_common.py +0 -0
  207. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_decomposition.py +0 -0
  208. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_differencing.py +0 -0
  209. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_ets_fit.py +0 -0
  210. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_ets_forecast.py +0 -0
  211. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_ets_models.py +0 -0
  212. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_stationarity.py +0 -0
  213. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/_whittle.py +0 -0
  214. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/backends/__init__.py +0 -0
  215. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/backends/whittle_batch_gpu.py +0 -0
  216. {pystatistics-2.2.0 → pystatistics-3.0.0}/pystatistics/timeseries/backends/whittle_gpu.py +0 -0
  217. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/anova/__init__.py +0 -0
  218. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/anova/conftest.py +0 -0
  219. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/anova/test_contrasts.py +0 -0
  220. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/anova/test_design.py +0 -0
  221. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/anova/test_factorial.py +0 -0
  222. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/anova/test_levene.py +0 -0
  223. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/anova/test_oneway.py +0 -0
  224. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/anova/test_posthoc.py +0 -0
  225. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/anova/test_r_validation.py +0 -0
  226. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/anova/test_repeated_measures.py +0 -0
  227. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/benchmark_gpu.py +0 -0
  228. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/conftest.py +0 -0
  229. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/core/test_datasource.py +0 -0
  230. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/core/test_exceptions.py +0 -0
  231. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/core/test_result.py +0 -0
  232. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/core/test_validation.py +0 -0
  233. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/descriptive/__init__.py +0 -0
  234. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/descriptive/conftest.py +0 -0
  235. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/descriptive/test_cor.py +0 -0
  236. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/descriptive/test_cov.py +0 -0
  237. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/descriptive/test_describe.py +0 -0
  238. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/descriptive/test_gpu.py +0 -0
  239. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/descriptive/test_missing.py +0 -0
  240. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/descriptive/test_moments.py +0 -0
  241. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/descriptive/test_quantile.py +0 -0
  242. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/descriptive/test_r_validation.py +0 -0
  243. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_ancova_meta.json +0 -0
  244. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_ancova_r_results.json +0 -0
  245. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_bonferroni_meta.json +0 -0
  246. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_bonferroni_r_results.json +0 -0
  247. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_eta_meta.json +0 -0
  248. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_eta_r_results.json +0 -0
  249. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_levene_meta.json +0 -0
  250. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_levene_r_results.json +0 -0
  251. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_oneway_balanced_meta.json +0 -0
  252. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_oneway_balanced_r_results.json +0 -0
  253. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_oneway_unbalanced_meta.json +0 -0
  254. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_oneway_unbalanced_r_results.json +0 -0
  255. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_rm_mixed_meta.json +0 -0
  256. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_rm_mixed_r_results.json +0 -0
  257. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_rm_within_meta.json +0 -0
  258. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_rm_within_r_results.json +0 -0
  259. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_tukey_meta.json +0 -0
  260. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_tukey_r_results.json +0 -0
  261. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_twoway_balanced_meta.json +0 -0
  262. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_twoway_balanced_r_results.json +0 -0
  263. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_twoway_unbalanced_meta.json +0 -0
  264. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/anova_twoway_unbalanced_r_results.json +0 -0
  265. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/basic_100x3.csv +0 -0
  266. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/basic_100x3_meta.json +0 -0
  267. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/basic_100x3_r_results.json +0 -0
  268. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/collinear_almost.csv +0 -0
  269. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/collinear_almost_meta.json +0 -0
  270. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/collinear_almost_r_results.json +0 -0
  271. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_basic_100x5.csv +0 -0
  272. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_basic_100x5_meta.json +0 -0
  273. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_basic_100x5_r_results.json +0 -0
  274. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_constant_column.csv +0 -0
  275. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_constant_column_meta.json +0 -0
  276. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_constant_column_r_results.json +0 -0
  277. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_extreme_values.csv +0 -0
  278. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_extreme_values_meta.json +0 -0
  279. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_extreme_values_r_results.json +0 -0
  280. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_large_1000x10.csv +0 -0
  281. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_large_1000x10_meta.json +0 -0
  282. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_large_1000x10_r_results.json +0 -0
  283. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_nan_columnwise.csv +0 -0
  284. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_nan_columnwise_meta.json +0 -0
  285. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_nan_columnwise_r_results.json +0 -0
  286. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_nan_scattered.csv +0 -0
  287. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_nan_scattered_meta.json +0 -0
  288. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_nan_scattered_r_results.json +0 -0
  289. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_negative_correlation.csv +0 -0
  290. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_negative_correlation_meta.json +0 -0
  291. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_negative_correlation_r_results.json +0 -0
  292. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_perfect_correlation.csv +0 -0
  293. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_perfect_correlation_meta.json +0 -0
  294. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_perfect_correlation_r_results.json +0 -0
  295. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_single_column.csv +0 -0
  296. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_single_column_meta.json +0 -0
  297. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_single_column_r_results.json +0 -0
  298. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_ties.csv +0 -0
  299. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_ties_meta.json +0 -0
  300. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/desc_ties_r_results.json +0 -0
  301. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/different_scales.csv +0 -0
  302. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/different_scales_meta.json +0 -0
  303. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/different_scales_r_results.json +0 -0
  304. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/generate_anova_fixtures.py +0 -0
  305. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/generate_descriptive_fixtures.py +0 -0
  306. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/generate_fixtures.py +0 -0
  307. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/generate_glm_fixtures.py +0 -0
  308. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/generate_hypothesis_fixtures.py +0 -0
  309. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/generate_mixed_fixtures.py +0 -0
  310. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/generate_montecarlo_fixtures.py +0 -0
  311. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/generate_survival_fixtures.py +0 -0
  312. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_balanced.csv +0 -0
  313. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_balanced_meta.json +0 -0
  314. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_balanced_r_results.json +0 -0
  315. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_basic.csv +0 -0
  316. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_basic_meta.json +0 -0
  317. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_basic_r_results.json +0 -0
  318. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_large.csv +0 -0
  319. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_large_meta.json +0 -0
  320. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_large_r_results.json +0 -0
  321. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_separated.csv +0 -0
  322. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_separated_meta.json +0 -0
  323. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_binomial_separated_r_results.json +0 -0
  324. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_gaussian_basic.csv +0 -0
  325. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_gaussian_basic_meta.json +0 -0
  326. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_gaussian_basic_r_results.json +0 -0
  327. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_gaussian_large.csv +0 -0
  328. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_gaussian_large_meta.json +0 -0
  329. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_gaussian_large_r_results.json +0 -0
  330. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_poisson_basic.csv +0 -0
  331. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_poisson_basic_meta.json +0 -0
  332. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_poisson_basic_r_results.json +0 -0
  333. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_poisson_large_counts.csv +0 -0
  334. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_poisson_large_counts_meta.json +0 -0
  335. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_poisson_large_counts_r_results.json +0 -0
  336. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_poisson_zeros.csv +0 -0
  337. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_poisson_zeros_meta.json +0 -0
  338. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/glm_poisson_zeros_r_results.json +0 -0
  339. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/high_noise.csv +0 -0
  340. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/high_noise_meta.json +0 -0
  341. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/high_noise_r_results.json +0 -0
  342. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_chisq_2x2_yates_meta.json +0 -0
  343. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_chisq_2x2_yates_r_results.json +0 -0
  344. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_chisq_3x3_meta.json +0 -0
  345. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_chisq_3x3_r_results.json +0 -0
  346. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_chisq_gof_meta.json +0 -0
  347. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_chisq_gof_r_results.json +0 -0
  348. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_chisq_gof_unequal_meta.json +0 -0
  349. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_chisq_gof_unequal_r_results.json +0 -0
  350. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_fisher_2x2_less_meta.json +0 -0
  351. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_fisher_2x2_less_r_results.json +0 -0
  352. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_fisher_2x2_meta.json +0 -0
  353. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_fisher_2x2_r_results.json +0 -0
  354. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_fisher_3x3_meta.json +0 -0
  355. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_fisher_3x3_r_results.json +0 -0
  356. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_ks_onesample_norm_meta.json +0 -0
  357. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_ks_onesample_norm_r_results.json +0 -0
  358. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_ks_twosample_meta.json +0 -0
  359. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_ks_twosample_r_results.json +0 -0
  360. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_prop_onesample_meta.json +0 -0
  361. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_prop_onesample_r_results.json +0 -0
  362. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_prop_twosample_meta.json +0 -0
  363. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_prop_twosample_r_results.json +0 -0
  364. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_t_onesample_meta.json +0 -0
  365. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_t_onesample_r_results.json +0 -0
  366. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_t_paired_meta.json +0 -0
  367. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_t_paired_r_results.json +0 -0
  368. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_t_pooled_meta.json +0 -0
  369. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_t_pooled_r_results.json +0 -0
  370. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_t_welch_meta.json +0 -0
  371. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_t_welch_r_results.json +0 -0
  372. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_var_basic_meta.json +0 -0
  373. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_var_basic_r_results.json +0 -0
  374. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_wilcox_ranksum_meta.json +0 -0
  375. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_wilcox_ranksum_r_results.json +0 -0
  376. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_wilcox_signed_meta.json +0 -0
  377. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/htest_wilcox_signed_r_results.json +0 -0
  378. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/ill_conditioned.csv +0 -0
  379. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/ill_conditioned_meta.json +0 -0
  380. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/ill_conditioned_r_results.json +0 -0
  381. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/large_coeffs.csv +0 -0
  382. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/large_coeffs_meta.json +0 -0
  383. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/large_coeffs_r_results.json +0 -0
  384. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_ci_90_meta.json +0 -0
  385. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_ci_90_r_results.json +0 -0
  386. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_ci_normal_meta.json +0 -0
  387. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_ci_normal_r_results.json +0 -0
  388. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_ci_skewed_meta.json +0 -0
  389. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_ci_skewed_r_results.json +0 -0
  390. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_mean_balanced_meta.json +0 -0
  391. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_mean_balanced_r_results.json +0 -0
  392. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_mean_ordinary_meta.json +0 -0
  393. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_mean_ordinary_r_results.json +0 -0
  394. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_median_meta.json +0 -0
  395. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_median_r_results.json +0 -0
  396. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_variance_meta.json +0 -0
  397. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_boot_variance_r_results.json +0 -0
  398. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_perm_greater_meta.json +0 -0
  399. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_perm_greater_r_results.json +0 -0
  400. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_perm_not_significant_meta.json +0 -0
  401. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_perm_not_significant_r_results.json +0 -0
  402. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_perm_significant_meta.json +0 -0
  403. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mc_perm_significant_r_results.json +0 -0
  404. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mixed/glmm_binomial.csv +0 -0
  405. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mixed/glmm_poisson.csv +0 -0
  406. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mixed/lmm_crossed.csv +0 -0
  407. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mixed/lmm_intercept.csv +0 -0
  408. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mixed/lmm_ml.csv +0 -0
  409. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mixed/lmm_no_effect.csv +0 -0
  410. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mixed/lmm_slope.csv +0 -0
  411. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mixed/mixed_meta.json +0 -0
  412. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/mixed/mixed_r_results.json +0 -0
  413. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/near_square.csv +0 -0
  414. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/near_square_meta.json +0 -0
  415. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/near_square_r_results.json +0 -0
  416. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/no_intercept.csv +0 -0
  417. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/no_intercept_meta.json +0 -0
  418. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/no_intercept_r_results.json +0 -0
  419. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/run_r_anova_validation.R +0 -0
  420. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/run_r_descriptive_validation.R +0 -0
  421. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/run_r_glm_validation.R +0 -0
  422. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/run_r_hypothesis_validation.R +0 -0
  423. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/run_r_mixed_validation.R +0 -0
  424. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/run_r_montecarlo_validation.R +0 -0
  425. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/run_r_survival_validation.R +0 -0
  426. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/run_r_validation.R +0 -0
  427. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/run_validation.sh +0 -0
  428. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/small_noise.csv +0 -0
  429. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/small_noise_meta.json +0 -0
  430. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/small_noise_r_results.json +0 -0
  431. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_cox_breslow_meta.json +0 -0
  432. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_cox_breslow_r_results.json +0 -0
  433. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_cox_single_meta.json +0 -0
  434. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_cox_single_r_results.json +0 -0
  435. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_cox_ties_meta.json +0 -0
  436. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_cox_ties_r_results.json +0 -0
  437. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_cox_two_cov_meta.json +0 -0
  438. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_cox_two_cov_r_results.json +0 -0
  439. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_basic_meta.json +0 -0
  440. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_basic_r_results.json +0 -0
  441. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_heavy_cens_meta.json +0 -0
  442. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_heavy_cens_r_results.json +0 -0
  443. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_loglog_ci_meta.json +0 -0
  444. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_loglog_ci_r_results.json +0 -0
  445. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_no_cens_meta.json +0 -0
  446. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_no_cens_r_results.json +0 -0
  447. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_plain_ci_meta.json +0 -0
  448. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_plain_ci_r_results.json +0 -0
  449. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_ties_meta.json +0 -0
  450. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_km_ties_r_results.json +0 -0
  451. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_lr_peto_meta.json +0 -0
  452. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_lr_peto_r_results.json +0 -0
  453. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_lr_three_group_meta.json +0 -0
  454. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_lr_three_group_r_results.json +0 -0
  455. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_lr_two_group_meta.json +0 -0
  456. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/surv_lr_two_group_r_results.json +0 -0
  457. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/tall_skinny.csv +0 -0
  458. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/tall_skinny_meta.json +0 -0
  459. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/tall_skinny_r_results.json +0 -0
  460. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/fixtures/validate_against_r.py +0 -0
  461. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/gam/__init__.py +0 -0
  462. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/__init__.py +0 -0
  463. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/conftest.py +0 -0
  464. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_chisq_test.py +0 -0
  465. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_design_split.py +0 -0
  466. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_fisher_test.py +0 -0
  467. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_gpu.py +0 -0
  468. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_ks_test.py +0 -0
  469. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_p_adjust.py +0 -0
  470. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_prop_test.py +0 -0
  471. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_r_validation.py +0 -0
  472. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_t_test.py +0 -0
  473. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_var_test.py +0 -0
  474. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/hypothesis/test_wilcox_test.py +0 -0
  475. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/__init__.py +0 -0
  476. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/conftest.py +0 -0
  477. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/test_glmm.py +0 -0
  478. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/test_lmm_crossed.py +0 -0
  479. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/test_lmm_intercept.py +0 -0
  480. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/test_lmm_nested.py +0 -0
  481. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/test_lmm_slope.py +0 -0
  482. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/test_pls.py +0 -0
  483. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/test_r_validation.py +0 -0
  484. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/test_random_effects.py +0 -0
  485. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mixed/test_satterthwaite.py +0 -0
  486. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/montecarlo/__init__.py +0 -0
  487. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/montecarlo/conftest.py +0 -0
  488. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/montecarlo/test_batched_solver.py +0 -0
  489. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/montecarlo/test_boot_ci.py +0 -0
  490. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/montecarlo/test_bootstrap.py +0 -0
  491. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/montecarlo/test_gpu.py +0 -0
  492. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/montecarlo/test_influence.py +0 -0
  493. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/montecarlo/test_permutation.py +0 -0
  494. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/montecarlo/test_r_validation.py +0 -0
  495. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/multinomial/__init__.py +0 -0
  496. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/multinomial/test_multinom.py +0 -0
  497. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/multivariate/__init__.py +0 -0
  498. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/multivariate/test_multivariate.py +0 -0
  499. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/apple_em_reference.json +0 -0
  500. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/apple_reference.json +0 -0
  501. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/generate_em_fixtures.R +0 -0
  502. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/little_mcar_apple.json +0 -0
  503. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/little_mcar_complete.json +0 -0
  504. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/little_mcar_extreme.json +0 -0
  505. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/little_mcar_missvals.json +0 -0
  506. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/little_mcar_simple_mcar.json +0 -0
  507. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/little_mcar_summary.json +0 -0
  508. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/missvals_em_reference.json +0 -0
  509. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/missvals_reference.json +0 -0
  510. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/references/small_test_reference.json +0 -0
  511. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/test_em.py +0 -0
  512. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/test_gpu.py +0 -0
  513. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/test_mcar.py +0 -0
  514. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/test_mlest.py +0 -0
  515. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/test_monotone.py +0 -0
  516. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/test_no_silent_fallback.py +0 -0
  517. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/mvnmle/test_squarem.py +0 -0
  518. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/ordinal/__init__.py +0 -0
  519. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/ordinal/test_ordinal.py +0 -0
  520. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/benchmark.py +0 -0
  521. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/benchmark.r +0 -0
  522. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/conftest.py +0 -0
  523. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/test_fit.py +0 -0
  524. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/test_gamma_nb.py +0 -0
  525. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/test_glm.py +0 -0
  526. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/test_glm_gpu.py +0 -0
  527. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/test_glm_r_validation.py +0 -0
  528. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/test_module_split.py +0 -0
  529. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/test_r_validation.py +0 -0
  530. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/regression/test_stress_gpu.py +0 -0
  531. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/survival/__init__.py +0 -0
  532. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/survival/conftest.py +0 -0
  533. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/survival/test_coxph.py +0 -0
  534. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/survival/test_discrete_time.py +0 -0
  535. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/survival/test_gpu.py +0 -0
  536. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/survival/test_kaplan_meier.py +0 -0
  537. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/survival/test_logrank.py +0 -0
  538. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/survival/test_r_validation.py +0 -0
  539. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/test_code_quality.py +0 -0
  540. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/timeseries/__init__.py +0 -0
  541. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/timeseries/test_acf_stationarity.py +0 -0
  542. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/timeseries/test_arima.py +0 -0
  543. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/timeseries/test_decomposition.py +0 -0
  544. {pystatistics-2.2.0 → pystatistics-3.0.0}/tests/timeseries/test_ets.py +0 -0
@@ -1,5 +1,237 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### BREAKING: Removed MoM MCAR test and the entire `nonparametric_mcar` subpackage
6
+
7
+ `pystatistics.mvnmle.mom_mcar_test` and the full
8
+ `pystatistics.nonparametric_mcar` subpackage (propensity / HSIC /
9
+ MissMech + their shared `NonparametricMCARResult`) have been removed.
10
+ These were added in 2.2.0 and 2.3.0 respectively, specifically in
11
+ service of Lacuna's missingness-mechanism cache, NOT as general-
12
+ purpose statistical methods. That was a scope-boundary mistake on
13
+ pystatistics's part: we're a general-purpose statistics library, and
14
+ these tests are project-specific feature-extraction helpers.
15
+
16
+ **What remains in pystatistics:**
17
+ - `pystatistics.mvnmle.little_mcar_test` — the canonical Little (1988)
18
+ MLE-plug-in test. Textbook, general-purpose, stays.
19
+ - `MCARTestResult` dataclass — retained (downstream packages that
20
+ implement their own MCAR variants can and do reuse it).
21
+ - All of `mlest`, the EM / SQUAREM machinery, `analyze_patterns`,
22
+ `PatternInfo`, etc. — unchanged.
23
+
24
+ **Where the removed tests live now:** the cache-scale variants have
25
+ moved into Lacuna as `lacuna.analysis.mcar`:
26
+
27
+ - `lacuna.analysis.mcar.mom_mcar_test` (method-of-moments plug-in)
28
+ - `lacuna.analysis.mcar.propensity_mcar_test` (RF/GBM + analytical or
29
+ permutation null)
30
+ - `lacuna.analysis.mcar.hsic_mcar_test` (Gretton gamma or permutation null)
31
+ - `lacuna.analysis.mcar.missmech_mcar_test` (Jamshidian-Jalal-style)
32
+ - `lacuna.analysis.mcar.NonparametricMCARResult`
33
+
34
+ All the 2.3.0/2.4.0 performance work that was in-flight in this file
35
+ (analytical AUC p-value for propensity, HGB default, Gretton gamma
36
+ null for HSIC, vectorised MissMech permutation, etc.) moved with the
37
+ code. Downstream: Lacuna's cache build is unaffected — it now imports
38
+ from `lacuna.analysis.mcar` instead of `pystatistics.nonparametric_mcar`.
39
+
40
+ **Migration for external users (if any):**
41
+ - `from pystatistics.mvnmle import mom_mcar_test` →
42
+ `from lacuna.analysis.mcar import mom_mcar_test` (if using Lacuna).
43
+ Alternatively, the MoM algorithm is ~100 LOC of pairwise-deletion
44
+ moments + per-pattern chi-square and is straightforward to inline
45
+ if you don't want a Lacuna dependency.
46
+ - `from pystatistics.nonparametric_mcar import *` →
47
+ `from lacuna.analysis.mcar import *`.
48
+
49
+ **Why a major bump (3.0.0):** public API surface shrunk; imports that
50
+ worked in 2.x now fail. Even though our active user population is
51
+ small (internal), the convention matters — breaking removals are
52
+ semver-major.
53
+
54
+ **Dropped files:**
55
+ - `pystatistics/nonparametric_mcar/` (subpackage, 5 files)
56
+ - `pystatistics/mvnmle/mcar_test.py` lost `mom_mcar_test`,
57
+ `_resolve_mom_backend`, `_pairwise_deletion_moments`, and the
58
+ `_MOM_GPU_WORTH_IT_THRESHOLD` constant. `little_mcar_test` and
59
+ `MCARTestResult` remain.
60
+ - `pyproject.toml` lost the `nonparametric_mcar` optional extra.
61
+ - `tests/mvnmle/test_mom_mcar.py` and `tests/nonparametric_mcar/`.
62
+
63
+ (The dead batched MCAR chi-square machinery that this removal left
64
+ stranded has also been cleaned up — see the "Dead-code cleanup"
65
+ section below.)
66
+
67
+ ### Fixed flaky GAM GPU FP64 `total_edf` test
68
+
69
+ `tests/gam/test_gam.py::TestGAMGPU::test_gpu_fp64_matches_cpu_fitted_and_gcv`
70
+ had been flaking intermittently since 1.8.0. Measured CPU/GPU drift on
71
+ the `sine_data` fixture:
72
+
73
+ - `fitted_values` max abs diff: ~7e-8 (machine precision)
74
+ - `deviance` relative diff: ~1e-7
75
+ - `gcv` relative diff: ~3e-5
76
+ - `total_edf` relative diff: **~1.4e-3** (narrowly failing the 1e-3 bar)
77
+
78
+ Diagnosis: the primary fit statistics (fitted_values, deviance, GCV)
79
+ sit at the GCV-minimising λ, i.e. at a local minimum of `GCV(λ)`, so
80
+ they are insensitive to the tiny λ-drift the L-BFGS-B outer search
81
+ lands on across CPU/GPU. `total_edf`, however, passes through a trace
82
+ of `(X'WX + λ·S)⁻¹·X'WX`, which is LINEAR in λ near the optimum. With
83
+ the penalised normal-equation matrix at cond ≈ 1e16-17 the EDF trace
84
+ moves O(10⁻³) per O(10⁻⁶) λ shift — structurally more sensitive than
85
+ the fit statistics that a 1e-4 tolerance gated.
86
+
87
+ Fix: tolerance widened from `rel=1e-3` to `rel=5e-3` on `total_edf`
88
+ only. The other three assertions (fitted_values, deviance, GCV) keep
89
+ their 1e-4 margin. Test comment updated with the λ-sensitivity
90
+ analysis so future maintainers don't re-tighten it without
91
+ understanding why it's at 5e-3.
92
+
93
+ ### Fixed GAM GPU smooth-term chi-squared bug (null-space absorption)
94
+
95
+ Surfaced while tightening the `total_edf` tolerance above: the chi-
96
+ squared statistic reported in `smooth_terms` was diverging ~8×
97
+ between CPU and GPU backends — CPU ≈ 19, GPU ≈ 156 on the
98
+ `sine_data` fixture — despite fitted values agreeing to FP64
99
+ precision. This was a latent correctness bug in the GPU backend
100
+ going back to whenever the GAM GPU path was first written.
101
+
102
+ Root cause: the penalised normal matrix `A = X'WX + Σ λⱼ Sⱼ` has
103
+ condition number up to ~1e17 when λ is small — the penalty does not
104
+ fully eliminate the design matrix's null space (the constant / linear
105
+ directions in the spline basis's null space). On such `A`,
106
+ `torch.linalg.solve` (LU on device) and `np.linalg.cholesky`
107
+ (CPU reference path) converge to the same `X·β` (fitted values) but
108
+ pick DIFFERENT null-space-representative `β` (coefficients).
109
+ Concretely on `sine_data`: fitted values agreed to 7e-8 but
110
+ coefficients were shifted by a constant ±1.73 between the parametric
111
+ intercept and every smooth basis coefficient — exactly the null-space
112
+ direction the penalty fails to constrain. Since `smooth_terms.chi_sq`
113
+ is computed directly from `β` (via `β_j'·β_j / scale`), the null-
114
+ space shift broke it despite the rest of the fit being numerically
115
+ sound.
116
+
117
+ Fix: the GPU backend now canonicalises the final `β` by re-solving
118
+ `A·β = b` via numpy's Cholesky-with-LU-fallback — the same logic
119
+ the CPU path uses in `_pirls_step`. This lives in a new
120
+ `_canonicalise_beta` method; `fit_fixed` and `edf_per_term` both call
121
+ it after their P-IRLS loops converge. In-loop P-IRLS still uses
122
+ torch's fast LU on device (null-space ambiguity doesn't matter
123
+ there — only the resulting `μ` drives convergence). The D2H
124
+ round-trip for the final solve is ~100 µs on a p×p matrix with p
125
+ typically ≤ 80; the dominant GPU work (the n×p GEMM in each P-IRLS
126
+ step) stays on device.
127
+
128
+ Test: `TestGAMGPU::test_gpu_fp64_matches_cpu_fitted_and_gcv` gained
129
+ coefficient-level assertions (`rtol=1e-3, atol=1e-4`) and chi-squared
130
+ agreement (`rel=1e-3`) so this regression is caught if it returns.
131
+ Measured post-fix: coef max abs diff drops from 1.73 to 9e-5;
132
+ chi_sq rel diff drops from ~8× to 1.6e-5.
133
+
134
+ ### Dead-code cleanup
135
+
136
+ While removing ``mom_mcar_test``, noticed that the batched MCAR
137
+ chi-square machinery (``chi_square_mcar_batched_np`` and
138
+ ``chi_square_mcar_batched_torch`` in ``backends/_em_batched_{np,torch}.py``,
139
+ re-exported via the shim at ``backends/_em_batched.py``) was only ever
140
+ called from ``mom_mcar_test``. Those functions are now gone; shim
141
+ dropped their re-exports; backend file docstrings updated to record
142
+ the removal. Net: `_em_batched_np.py` went from 416 → 300 lines and
143
+ `_em_batched_torch.py` from 381 → 271 lines, and `backends/_em_batched.py`
144
+ lost two of its eleven shim exports.
145
+
146
+ ### Process change
147
+
148
+ Added **Rule 9 "Cross-Project Scope Boundary"** to
149
+ `CLAUDE.md`. Future Claude Code sessions working on pystatistics must
150
+ not modify sibling projects (Lacuna, pystatsbio, etc.) without
151
+ explicit per-session user authorisation. Functionality needed by
152
+ another project belongs in that project until demonstrably general.
153
+ This removal is the retroactive correction of previous boundary
154
+ crossings. The same rule was added to Lacuna's and pystatsbio's
155
+ CLAUDE.md files (§8 and §9 respectively, numbered by where the rule
156
+ fit in each file's existing structure).
157
+
158
+
159
+ ## 2.3.0
160
+
161
+ - **New subpackage `pystatistics.nonparametric_mcar`** for distribution-
162
+ free MCAR tests, motivated by the Lacuna ablation finding that the
163
+ MVN-based Little's MCAR feature (MLE or MoM plug-in) does not help
164
+ mechanism classification on heavy-tailed / categorical tabular data.
165
+
166
+ - Added `propensity_mcar_test(data, *, model='rf'|'gbm', cv_folds=5,
167
+ n_permutations=199, seed=0, alpha=0.05)`. Fits a sklearn
168
+ `RandomForestClassifier` or `GradientBoostingClassifier` to predict
169
+ each column's missingness indicator from the other columns
170
+ (mean-imputed + per-column missing-indicator features), computes
171
+ out-of-fold AUC, and calibrates against a permutation null. Returns
172
+ a `NonparametricMCARResult` with `statistic = mean_auc - 0.5` and
173
+ permutation-smoothed `p_value`. scikit-learn is an optional extra:
174
+ `pip install pystatistics[nonparametric_mcar]`.
175
+
176
+ - Added `NonparametricMCARResult` dataclass (statistic, p_value,
177
+ rejected, alpha, method, n_observations, n_variables,
178
+ n_missing_cells, extra). Intentionally narrower than the MVN-based
179
+ `MCARTestResult` — no df / ml_mean / ml_cov / patterns, because
180
+ nonparametric tests don't produce those.
181
+
182
+ - Tests: 11 in `tests/nonparametric_mcar/test_propensity.py` covering
183
+ normal cases (MCAR non-rejection, MAR rejection, reproducibility
184
+ under fixed seed, GBM option), edge cases (fully-observed column
185
+ ignored), and failure cases (1D input, too few rows/columns, no
186
+ missingness, invalid hyperparameters).
187
+
188
+ - Added `hsic_mcar_test(data, *, alpha=0.05, n_permutations=199,
189
+ seed=0)`. Hilbert-Schmidt Independence Criterion (Gretton et al.
190
+ 2005/2008) between stochastically-imputed observed values and the
191
+ missingness-indicator matrix, with Gaussian RBF kernel and
192
+ median-heuristic bandwidth. Biased HSIC estimator, permutation null
193
+ for calibration. Uses **stochastic** (column-mean + column-std
194
+ noise) imputation rather than plain mean imputation — pure
195
+ mean-imputation pulls heavy-missing rows toward the column
196
+ centroid, which creates a systematic X-R coupling and rejects MCAR
197
+ spuriously on MCAR-generated data. Pure numpy; no sklearn dep.
198
+
199
+ - Added `missmech_mcar_test(data, *, alpha=0.05, n_permutations=199,
200
+ n_neighbors=5, min_pattern_size=6, seed=0)`. Jamshidian-Jalal-style
201
+ test of homogeneity of means across missingness-pattern groups,
202
+ after k-NN imputation (via `sklearn.impute.KNNImputer`). Statistic
203
+ is the between-pattern weighted sum of squared mean differences
204
+ (Σ_p n_p ||μ_p − μ||²), calibrated against a pattern-label
205
+ permutation null — equivalent in hypothesis to Jamshidian & Jalal
206
+ (2010)'s bootstrap, but faster for the cached-scalar use case.
207
+ Requires the same `nonparametric_mcar` extra for sklearn.
208
+
209
+ - Tests: 9 in `test_hsic.py`, 10 in `test_missmech.py` — both
210
+ covering MCAR non-rejection, MAR rejection, reproducibility under
211
+ seed, and the same failure-case matrix as propensity.
212
+
213
+ - Suite: 156/156 across `tests/nonparametric_mcar/` and `tests/mvnmle/`
214
+ pass; no mvnmle regressions from the new subpackage.
215
+
216
+ - **Split `pystatistics/mvnmle/backends/_em_batched.py`** (501 SLOC →
217
+ over the Rule 4 hard limit of 500) into three focused files plus a
218
+ compatibility shim:
219
+ - `_em_batched_patterns.py` (63 SLOC) — `_BatchedPatternIndex`
220
+ dataclass, `_pattern_n`, `build_pattern_index`.
221
+ - `_em_batched_np.py` (203 SLOC) — NumPy CPU backend
222
+ (`compute_conditional_parameters_np`, `e_step_full_batched_np`,
223
+ `compute_loglik_batched_np`, `chi_square_mcar_batched_np`).
224
+ - `_em_batched_torch.py` (239 SLOC) — Torch GPU backend
225
+ (`_e_step_full_torch`, `_loglik_full_torch`,
226
+ `chi_square_mcar_batched_torch`, `compute_conditional_parameters_torch`).
227
+ - `_em_batched.py` (30 SLOC) — thin shim re-exporting every
228
+ symbol so existing importers in `em.py`, `solvers.py`, and
229
+ `mcar_test.py` need no changes.
230
+ The 157-test suite across `tests/test_code_quality.py`,
231
+ `tests/mvnmle/`, and `tests/nonparametric_mcar/` passes after the
232
+ split; `test_no_file_exceeds_500_code_lines` now passes.
233
+
234
+
3
235
  ## 2.2.0
4
236
 
5
237
  - Fixed a `torch._C._LinAlgError` crash in `chi_square_mcar_batched_torch`
@@ -218,6 +218,45 @@ file, that's a process failure.
218
218
 
219
219
  ---
220
220
 
221
+ ## 9. Cross-Project Scope Boundary — Stay in the Project You Were Invited Into
222
+
223
+ A Claude Code session is invoked on one project. It does not have a licence to edit
224
+ any other project visible on disk. Seeing sibling repos in `/mnt/projects/` does not
225
+ constitute an invitation to modify them.
226
+
227
+ **Rules:**
228
+ - Never modify source, tests, configs, or documentation in a sibling project (any
229
+ repo outside the current one) on your own initiative.
230
+ - When you believe a change belongs in a sibling project — "this belongs upstream",
231
+ "this helper is more general than the current project", "I should fix a bug in
232
+ their API" — stop and raise it with the user. Describe what you'd change, where,
233
+ and why. Wait for explicit authorisation before editing the sibling repo.
234
+ - "Explicit authorisation" means the user said, in the current session, something
235
+ like "yes, also modify project X". It is NOT a precedent from a prior session. It
236
+ is NOT "the user probably wouldn't mind". It is NOT inferred from the fact that
237
+ the user depends on project X.
238
+
239
+ **Corollary — Scope Creep Is a Design Decision, Not a Technical One:**
240
+ Pushing project-A-specific functionality into general-purpose project B because it's
241
+ technically convenient dilutes project B's identity, breaks the expectations of other
242
+ downstream consumers, and forces project B to carry maintenance burden for a use case
243
+ it was never meant to serve. "Project A needs X, and X involves statistics, therefore
244
+ X belongs in pystatistics" is not a valid reasoning chain. X belongs in project A
245
+ until (a) multiple sibling projects demonstrably need it AND (b) a decision has been
246
+ made to promote it — either into an existing general-purpose library or into a new
247
+ dedicated sibling.
248
+
249
+ **What to do when you think a sibling needs a change:**
250
+ 1. Implement the helper inside your OWN project first. It lives there until proven
251
+ general.
252
+ 2. Surface the "belongs upstream" thought to the user explicitly. Propose the
253
+ migration as a separate task. Do not pre-emptively modify the sibling repo.
254
+ 3. If the user authorises the migration, treat it as its own first-class task with
255
+ its own review, tests, and release cadence — not as a side-effect of the
256
+ originating feature.
257
+
258
+ ---
259
+
221
260
  ## Meta-Rule
222
261
 
223
262
  If any of these rules feel inconvenient, that feeling is the point. These rules exist
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pystatistics
3
- Version: 2.2.0
3
+ Version: 3.0.0
4
4
  Summary: GPU-accelerated statistical computing for Python
5
5
  Project-URL: Homepage, https://sgcx.org/technology/pystatistics/
6
6
  Project-URL: Documentation, https://sgcx.org/docs/pystatistics/
@@ -43,6 +43,8 @@ Requires-Dist: furo; extra == 'docs'
43
43
  Requires-Dist: sphinx>=6.0; extra == 'docs'
44
44
  Provides-Extra: gpu
45
45
  Requires-Dist: torch>=2.0; extra == 'gpu'
46
+ Provides-Extra: nonparametric-mcar
47
+ Requires-Dist: scikit-learn>=1.3; extra == 'nonparametric-mcar'
46
48
  Description-Content-Type: text/markdown
47
49
 
48
50
  # PyStatistics
@@ -51,73 +53,121 @@ GPU-accelerated statistical computing for Python.
51
53
 
52
54
  ## What's New
53
55
 
56
+ ### 3.0.0 — Scope correction: Lacuna-specific MCAR helpers removed (breaking)
57
+
58
+ Two years of feature creep are being rolled back. In 2.2.0 and 2.3.0
59
+ pystatistics accumulated MCAR-test variants — `mom_mcar_test` plus a
60
+ whole `nonparametric_mcar` subpackage (propensity / HSIC / MissMech) —
61
+ added specifically to serve Project Lacuna's cache-scale screening
62
+ use case. On reflection that was a scope mistake: pystatistics is a
63
+ general-purpose statistical library, not a Lacuna helper. These tests
64
+ are project-specific feature-extraction utilities, not textbook
65
+ methods, and their presence in pystatistics diluted the library's
66
+ identity and forced us to carry maintenance burden for a use case
67
+ that had nothing to do with general statistical inference.
68
+
69
+ **Removed (breaking):**
70
+ - `pystatistics.mvnmle.mom_mcar_test` and its helpers
71
+ (`_pairwise_deletion_moments`, `_resolve_mom_backend`, and the
72
+ `_MOM_GPU_WORTH_IT_THRESHOLD` constant).
73
+ - `pystatistics.nonparametric_mcar` subpackage in its entirety
74
+ (`propensity_mcar_test`, `hsic_mcar_test`, `missmech_mcar_test`,
75
+ `NonparametricMCARResult`).
76
+ - The `[nonparametric_mcar]` optional-dependency extra.
77
+ - 109 tests across `tests/mvnmle/test_mom_mcar.py` and
78
+ `tests/nonparametric_mcar/`.
79
+
80
+ **Removed (dead code, not breaking):** the batched MCAR chi-square
81
+ machinery (`chi_square_mcar_batched_np` and
82
+ `chi_square_mcar_batched_torch` in `pystatistics/mvnmle/backends/`)
83
+ was only ever called from `mom_mcar_test`. Those two functions and
84
+ their shim re-exports in `backends/_em_batched.py` are gone. Net
85
+ effect: `_em_batched_np.py` shrank from 416 → 300 lines and
86
+ `_em_batched_torch.py` from 381 → 271 lines, with no functional
87
+ change to the EM or log-likelihood paths.
88
+
89
+ **Retained (unchanged):**
90
+ - `little_mcar_test` — the canonical Little (1988) MLE-plug-in test.
91
+ Textbook, general-purpose, stays.
92
+ - `MCARTestResult` dataclass.
93
+ - `mlest`, `analyze_patterns`, `PatternInfo`, the full MVN MLE
94
+ machinery, and every EM / SQUAREM / monotone-closed-form path
95
+ unchanged.
96
+
97
+ **Where the removed code went:** all four removed tests are now
98
+ maintained by Project Lacuna at `lacuna.analysis.mcar.*`. If you were
99
+ using these from pystatistics and are also a Lacuna user, migration
100
+ is a one-line import change. If you were using them standalone, the
101
+ MoM test is ~100 LOC of pairwise-deletion moments + per-pattern
102
+ chi-square and is trivial to re-inline; the nonparametric variants
103
+ are self-contained single-file implementations you can vendor.
104
+
105
+ **Flaky GAM GPU FP64 test fixed.** The
106
+ `TestGAMGPU::test_gpu_fp64_matches_cpu_fitted_and_gcv` test had been
107
+ intermittently failing on `total_edf` since 1.8.0 with a ~1.4e-3
108
+ CPU/GPU drift against a 1e-3 tolerance. Diagnosis: the primary fit
109
+ statistics (fitted_values, deviance, GCV) sit at the GCV-minimising
110
+ λ — locally flat in λ, so cross-backend λ drift barely moves them
111
+ (measured ≤3e-5). `total_edf`, however, is LINEAR in λ near that
112
+ optimum and passes through tr((X'WX + λ·S)⁻¹·X'WX) on a
113
+ cond-1e16-17 penalised normal matrix — structurally more sensitive.
114
+ Tolerance widened to `rel=5e-3` on `total_edf` only, with a test
115
+ comment explaining the λ-sensitivity analysis so this doesn't get
116
+ tightened back by accident. Other three assertions keep their 1e-4
117
+ margin.
118
+
119
+ **GAM GPU smooth-term chi-squared fixed.** While investigating the
120
+ `total_edf` flake above, also found and fixed a latent bug: the
121
+ chi-squared statistic reported in `smooth_terms` was diverging ~8×
122
+ between CPU and GPU backends (CPU ≈ 19, GPU ≈ 156 on the `sine_data`
123
+ fixture) despite fitted values agreeing to FP64 precision. Root
124
+ cause: the penalised normal matrix `A = X'WX + Σ λⱼ Sⱼ` has condition
125
+ number up to ~1e17 when λ is small — the penalty does not fully
126
+ eliminate the design matrix's null space. On such `A`,
127
+ `torch.linalg.solve` (LU on device) and `np.linalg.cholesky`
128
+ (CPU path) converge to the same `X·β` but pick DIFFERENT null-space-
129
+ representative `β`. Fitted values were identical; coefficients were
130
+ shifted by a constant in the penalty null space, throwing off the
131
+ chi-squared statistic (which is computed directly from `β`). Fix:
132
+ the GPU backend now canonicalises the final `β` by re-solving
133
+ `A·β = b` via numpy's Cholesky-with-LU-fallback path — matching CPU
134
+ bit-for-bit. In-loop P-IRLS still uses torch's fast LU (where
135
+ null-space ambiguity doesn't matter — only the resulting `μ` drives
136
+ convergence). Test tightened to pin coefficient-level agreement
137
+ (`rtol=1e-3`) and chi-squared agreement (`rel=1e-3`) so this
138
+ regression is caught if it returns.
139
+
140
+ **Process change:** a new **"Cross-Project Scope Boundary"** rule
141
+ (Rule 9) has been added to `CLAUDE.md`, instructing future Claude
142
+ Code sessions working on pystatistics not to modify sibling projects
143
+ without explicit user authorisation, and to implement project-
144
+ specific helpers in those projects rather than in this one. This
145
+ release is the retroactive enforcement of that rule. The matching
146
+ rule has been added to the Lacuna and pystatsbio `CLAUDE.md` files.
147
+
148
+ **Suite status at release:** 2401 passed, 19 skipped, 0 failed.
149
+
150
+ ### 2.3.0 — Nonparametric MCAR tests (introduced, now removed in 3.0.0)
151
+
152
+ Originally shipped three distribution-free MCAR tests in a new
153
+ `nonparametric_mcar` subpackage. Removed in 3.0.0 as a scope
154
+ correction — see that section for the rationale. Code now lives in
155
+ Lacuna.
156
+
54
157
  ### 2.2.0 — Real-data robustness from Project Lacuna dogfooding
55
158
 
56
- Continuation of the 2.1.0 dogfooding track. Running `little_mcar_test`
57
- and `mom_mcar_test` on 3,080 (dataset × generator) pairs drawn from 28
58
- real UCI / OpenML / sklearn tabular datasets under
59
- `lacuna_tabular_110` missingness generators surfaced four classes of
60
- numerical failure that synthetic unit tests did not exhibit. All fixed
61
- in this release; no API breaks.
62
-
63
- **Batched MoM GPU Cholesky crash.** `chi_square_mcar_batched_torch`'s
64
- fast path selected `cholesky_solve` whenever the SVD-based condition
65
- number check passed, on the assumption that good conditioning implies
66
- positive-definiteness. On GPU FP32, roundoff can produce covariances
67
- that pass the cond-number check but have tiny negative eigenvalues —
68
- Cholesky fails, the call raises `torch._C._LinAlgError`. The fast path
69
- is now wrapped with `try/except` and falls back to pseudo-inverse when
70
- the ``regularize`` flag allows. Surfaced on `credit_card_default` ×
71
- `MNAR-NonLinSocial` during the Lacuna cache build.
72
-
73
- **Exception-type preservation in `little_mcar_test`.** The
74
- ML-estimation `try/except` at the top of `little_mcar_test` wrapped
75
- *every* exception as a bare `RuntimeError` — including
76
- `PyStatisticsError` subclasses. This broke the documented
77
- `except PyStatisticsError:` catch pattern downstream: users falling
78
- back to a sentinel on MLE failure saw their handler bypassed and the
79
- full build crash. Fix: explicitly re-raise `PyStatisticsError`, and
80
- use `raise ... from e` for anything else so the chain is preserved.
81
-
82
- **`regularize=True` default on the EM path (opt-out).** `mlest`,
83
- `_solve_em`, and `EMBackend.solve` gain `regularize: bool = True`,
84
- mirroring the existing convention on `mom_mcar_test` and
85
- `little_mcar_test`. When True, `EMBackend._ensure_pd` applies a small
86
- diagonal ridge — `max(0, 1e-10 − min_eig) + 1e-12` — to the M-step
87
- sigma whenever its smallest eigenvalue falls below the PD threshold,
88
- rather than raising `NumericalError`. The ridge is well below any
89
- statistical precision on real data — the typical case the old path
90
- rejected had `min_eig ≈ 1e-13` from pure FP64 roundoff on a matrix
91
- that's theoretically PSD. Dogfooding surfaced cases where `min_eig`
92
- hit `−0.66` on realistic MNAR mechanisms; the ridge fallback keeps EM
93
- progressing. Callers needing strict bit-for-bit behaviour pass
94
- `regularize=False` to restore the old raise.
95
-
96
- **Three additional Cholesky ridge-fallbacks** in `_em_batched.py`:
97
- `e_step_full_batched_np`, `_e_step_full_torch`, and
98
- `_loglik_full_batched_torch` all compute per-pattern Cholesky of
99
- `sigma_oo` sub-blocks. Real tabular data can produce individual
100
- sub-blocks that are numerically indefinite even when the global sigma
101
- is PD (integer-encoded categoricals with heavy collinearity in the
102
- intersection of a given missingness pattern's observed variables).
103
- Each site now wraps Cholesky in `try/except LinAlgError` with a
104
- `ridge·I` retry (ridge = 1e-10 at pattern scale; statistically
105
- invisible). Also removed a dead Cholesky call in `e_step_batched_np`
106
- whose factor was never used downstream — pure crash liability — and
107
- added a `pinv` fallback to the `np.linalg.solve` at the same site for
108
- singular sub-blocks.
109
-
110
- **Impact.** The Project Lacuna cache build on 3,080 (dataset ×
111
- generator) pairs went from crashing on the first batch containing
112
- `breast_cancer` or `credit_card_default` (pre-2.2.0) to completing in
113
- a single pass at 0.9% MoM sentinel rate and 16.4% MLE sentinel rate
114
- (the MLE sentinels are legitimate EM non-convergence on 1000-pattern
115
- datasets — not crashes). Synthetic unit tests: 125/125 mvnmle pass.
116
-
117
- **No API breaks.** New defaults (`regularize=True`) are strictly more
118
- permissive than the old raises — any caller that was crashing before
119
- will now proceed with a small `UserWarning`. Callers needing strict
120
- behaviour pass `regularize=False`.
159
+ Four classes of numerical failure on realistic tabular data — Cholesky
160
+ fast-path crash on GPU FP32 roundoff, bare-`RuntimeError` wrapping
161
+ breaking `PyStatisticsError` catch patterns, M-step sigma PD-check
162
+ false negatives from FP64 roundoff, and per-pattern Cholesky on
163
+ indefinite sub-blocks all fixed in this release with a unified
164
+ `regularize=True` opt-out-to-strict convention across `mlest`,
165
+ `little_mcar_test`, and the batched E-step. (Note: `mom_mcar_test`
166
+ was also part of this release; it was removed in 3.0.0 along with the
167
+ rest of the Lacuna-specific MCAR helpers.) The Project Lacuna cache
168
+ build on 3,080 (dataset × generator) pairs went from crashing on the
169
+ first batch to completing in a single pass. No API breaks at the time
170
+ of 2.2.0 release.
121
171
 
122
172
  ### 2.1.0 — Real-data EM speedup + monotone closed-form MLE
123
173
 
@@ -159,26 +209,13 @@ mvnmle reference cases (apple, missvals):
159
209
  Cholesky over all patterns, one solve across all N
160
210
  observations, no per-pattern Python loop.
161
211
 
162
- **`mom_mcar_test`: fast method-of-moments MCAR test.** A new *separate
163
- function* (not a mode on ``little_mcar_test``, because the MoM variant
164
- is not Little's test) that uses pairwise-deletion sample moments
165
- instead of MLE plug-in. The test is consistent under MCAR but not
166
- asymptotically efficient, trading a small amount of statistical
167
- efficiency for dramatic speed. At 15 % MCAR on sklearn demos:
168
-
169
- | dataset | shape | little_mcar_test | mom_mcar_test |
170
- |----------------|-----------|------------------|---------------|
171
- | iris | 150 × 4 | 2.9 ms | 0.31 ms |
172
- | wine | 178 × 13 | 60.9 ms | 2.17 ms |
173
- | breast_cancer | 569 × 30 | 1491 ms | 28.7 ms |
174
-
175
- For a 3410-dataset MCAR sweep: **~50 minutes → ~1.6 minutes**. Use
176
- ``little_mcar_test`` when you need Little 1988's asymptotic
177
- distribution exactly (regulated submissions, citing R reference);
178
- use ``mom_mcar_test`` for high-throughput diagnostic screens. The
179
- ``MCARTestResult.method`` field records which test produced a given
180
- result so downstream code can disambiguate without tracking the
181
- calling function.
212
+ **`mom_mcar_test`: fast method-of-moments MCAR test** *(introduced in
213
+ 2.1.0, removed in 3.0.0 see the 3.0.0 section above).* Originally
214
+ shipped as a separate function using pairwise-deletion sample moments
215
+ instead of MLE plug-in. Consistent under MCAR but not asymptotically
216
+ efficient; the speedup numbers for this feature still hold, but the
217
+ function is no longer in pystatistics see `lacuna.analysis.mcar` if
218
+ you need it.
182
219
 
183
220
  **Fully-batched device-resident EM on GPU.** Pre-2.1.0 the
184
221
  ``device='cuda'`` EM path set up a torch device but never used it —