csv-stats 0.2.0__tar.gz → 0.4.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 (182) hide show
  1. {csv_stats-0.2.0 → csv_stats-0.4.0}/PKG-INFO +23 -1
  2. {csv_stats-0.2.0 → csv_stats-0.4.0}/README.md +20 -0
  3. {csv_stats-0.2.0 → csv_stats-0.4.0}/pyproject.toml +9 -2
  4. csv_stats-0.4.0/src/csvstats/__init__.py +1 -0
  5. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/core.py +37 -0
  6. csv_stats-0.4.0/src/csvstats/lmm.py +748 -0
  7. csv_stats-0.4.0/tests/reference/README.md +49 -0
  8. csv_stats-0.4.0/tests/reference/datasets/B2B2W2_complete_n17_icc50_effect_unit_intercept.csv +35 -0
  9. csv_stats-0.4.0/tests/reference/datasets/B2B2W2_mcar15_n17_icc50_effect_unit_intercept.csv +30 -0
  10. csv_stats-0.4.0/tests/reference/datasets/B2B2W2_monotone15_n17_icc50_effect_unit_intercept.csv +32 -0
  11. csv_stats-0.4.0/tests/reference/datasets/B2W3_complete_n12_icc50_effect_unit_intercept.csv +37 -0
  12. csv_stats-0.4.0/tests/reference/datasets/B2W3_complete_n17_icc50_effect_unit_intercept.csv +52 -0
  13. csv_stats-0.4.0/tests/reference/datasets/B2W3_complete_n17_icc50_null_unit_intercept.csv +52 -0
  14. csv_stats-0.4.0/tests/reference/datasets/B2W3_complete_n40_icc50_effect_unit_intercept.csv +121 -0
  15. csv_stats-0.4.0/tests/reference/datasets/B2W3_complete_n6_icc50_effect_unit_intercept.csv +19 -0
  16. csv_stats-0.4.0/tests/reference/datasets/B2W3_level_missing_one_group_n17_icc50_effect_unit_intercept.csv +49 -0
  17. csv_stats-0.4.0/tests/reference/datasets/B2W3_mcar05_n17_icc50_effect_unit_intercept.csv +49 -0
  18. csv_stats-0.4.0/tests/reference/datasets/B2W3_mcar15_n17_icc50_effect_unit_intercept.csv +44 -0
  19. csv_stats-0.4.0/tests/reference/datasets/B2W3_mcar30_n17_icc50_effect_unit_intercept.csv +38 -0
  20. csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone15_n12_icc50_effect_unit_intercept.csv +35 -0
  21. csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone15_n17_icc50_effect_unit_intercept.csv +47 -0
  22. csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone15_n40_icc50_effect_unit_intercept.csv +114 -0
  23. csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone15_n6_icc50_effect_unit_intercept.csv +18 -0
  24. csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone40_n17_icc50_effect_unit_intercept.csv +41 -0
  25. csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone40_n17_icc50_null_unit_intercept.csv +39 -0
  26. csv_stats-0.4.0/tests/reference/datasets/B2W3_singletons_n17_icc50_effect_unit_intercept.csv +46 -0
  27. csv_stats-0.4.0/tests/reference/datasets/B2W3_sparse_cell_n17_icc50_effect_unit_intercept.csv +46 -0
  28. csv_stats-0.4.0/tests/reference/datasets/B2W3_unequal_groups_n17_icc50_effect_unit_intercept.csv +52 -0
  29. csv_stats-0.4.0/tests/reference/datasets/B2W3_unequal_reps_n17_icc50_effect_unit_intercept.csv +136 -0
  30. csv_stats-0.4.0/tests/reference/datasets/B2rep_complete_n17_icc50_effect_unit_intercept.csv +52 -0
  31. csv_stats-0.4.0/tests/reference/datasets/B2rep_unequal_reps_n17_icc50_effect_unit_intercept.csv +44 -0
  32. csv_stats-0.4.0/tests/reference/datasets/B3W2_complete_n17_icc50_effect_unit_intercept.csv +35 -0
  33. csv_stats-0.4.0/tests/reference/datasets/B3W2_mcar15_n17_icc50_effect_unit_intercept.csv +30 -0
  34. csv_stats-0.4.0/tests/reference/datasets/B3W2_monotone15_n17_icc50_effect_unit_intercept.csv +32 -0
  35. csv_stats-0.4.0/tests/reference/datasets/LABELS_complete_n17_icc50_effect_unit_intercept.csv +52 -0
  36. csv_stats-0.4.0/tests/reference/datasets/LABELS_monotone15_n17_icc50_effect_unit_intercept.csv +46 -0
  37. csv_stats-0.4.0/tests/reference/datasets/W2_complete_n17_icc50_effect_unit_intercept.csv +35 -0
  38. csv_stats-0.4.0/tests/reference/datasets/W2_mcar05_n17_icc50_effect_unit_intercept.csv +33 -0
  39. csv_stats-0.4.0/tests/reference/datasets/W2_mcar15_n17_icc50_effect_unit_intercept.csv +30 -0
  40. csv_stats-0.4.0/tests/reference/datasets/W2_mcar30_n17_icc50_effect_unit_intercept.csv +26 -0
  41. csv_stats-0.4.0/tests/reference/datasets/W2_monotone15_n17_icc50_effect_unit_intercept.csv +32 -0
  42. csv_stats-0.4.0/tests/reference/datasets/W2_monotone40_n17_icc50_effect_unit_intercept.csv +28 -0
  43. csv_stats-0.4.0/tests/reference/datasets/W2_singletons_n17_icc50_effect_unit_intercept.csv +32 -0
  44. csv_stats-0.4.0/tests/reference/datasets/W2_sparse_cell_n17_icc50_effect_unit_intercept.csv +20 -0
  45. csv_stats-0.4.0/tests/reference/datasets/W2_unequal_reps_n17_icc50_effect_unit_intercept.csv +87 -0
  46. csv_stats-0.4.0/tests/reference/datasets/W2xW3_complete_n17_icc50_effect_unit_intercept.csv +103 -0
  47. csv_stats-0.4.0/tests/reference/datasets/W2xW3_complete_n17_icc50_null_unit_intercept.csv +103 -0
  48. csv_stats-0.4.0/tests/reference/datasets/W2xW3_mcar15_n17_icc50_effect_unit_intercept.csv +88 -0
  49. csv_stats-0.4.0/tests/reference/datasets/W2xW3_monotone15_n17_icc50_effect_unit_intercept.csv +95 -0
  50. csv_stats-0.4.0/tests/reference/datasets/W2xW3_monotone40_n17_icc50_effect_unit_intercept.csv +87 -0
  51. csv_stats-0.4.0/tests/reference/datasets/W2xW3_monotone40_n17_icc50_null_unit_intercept.csv +85 -0
  52. csv_stats-0.4.0/tests/reference/datasets/W3_complete_n12_icc50_effect_unit_intercept.csv +37 -0
  53. csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc0_effect_unit_intercept.csv +52 -0
  54. csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc10_effect_unit_intercept.csv +52 -0
  55. csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc50_effect_large_intercept.csv +52 -0
  56. csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc50_effect_small_intercept.csv +52 -0
  57. csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc50_effect_unit_intercept.csv +52 -0
  58. csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc80_effect_unit_intercept.csv +52 -0
  59. csv_stats-0.4.0/tests/reference/datasets/W3_complete_n40_icc50_effect_unit_intercept.csv +121 -0
  60. csv_stats-0.4.0/tests/reference/datasets/W3_complete_n6_icc50_effect_unit_intercept.csv +19 -0
  61. csv_stats-0.4.0/tests/reference/datasets/W3_mcar05_n17_icc50_effect_unit_intercept.csv +49 -0
  62. csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc0_effect_unit_intercept.csv +44 -0
  63. csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc10_effect_unit_intercept.csv +44 -0
  64. csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc50_effect_large_intercept.csv +44 -0
  65. csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc50_effect_small_intercept.csv +44 -0
  66. csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc50_effect_unit_intercept.csv +44 -0
  67. csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc80_effect_unit_intercept.csv +44 -0
  68. csv_stats-0.4.0/tests/reference/datasets/W3_mcar30_n17_icc50_effect_unit_intercept.csv +37 -0
  69. csv_stats-0.4.0/tests/reference/datasets/W3_monotone15_n12_icc50_effect_unit_intercept.csv +35 -0
  70. csv_stats-0.4.0/tests/reference/datasets/W3_monotone15_n17_icc50_effect_unit_intercept.csv +47 -0
  71. csv_stats-0.4.0/tests/reference/datasets/W3_monotone15_n40_icc50_effect_unit_intercept.csv +113 -0
  72. csv_stats-0.4.0/tests/reference/datasets/W3_monotone15_n6_icc50_effect_unit_intercept.csv +17 -0
  73. csv_stats-0.4.0/tests/reference/datasets/W3_monotone40_n17_icc50_effect_unit_intercept.csv +42 -0
  74. csv_stats-0.4.0/tests/reference/datasets/W3_singletons_n17_icc50_effect_unit_intercept.csv +46 -0
  75. csv_stats-0.4.0/tests/reference/datasets/W3_sparse_cell_n17_icc50_effect_unit_intercept.csv +37 -0
  76. csv_stats-0.4.0/tests/reference/datasets/W3_unequal_reps_n17_icc50_effect_unit_intercept.csv +126 -0
  77. csv_stats-0.4.0/tests/reference/datasets/W3rep_complete_n17_icc50_effect_unit_intercept.csv +154 -0
  78. csv_stats-0.4.0/tests/reference/datasets/W3rep_complete_n17_icc50_effect_unit_slopes.csv +154 -0
  79. csv_stats-0.4.0/tests/reference/datasets/W3rep_mcar15_n17_icc50_effect_unit_intercept.csv +130 -0
  80. csv_stats-0.4.0/tests/reference/datasets/W3rep_mcar15_n17_icc50_effect_unit_slopes.csv +130 -0
  81. csv_stats-0.4.0/tests/reference/datasets/W3rep_monotone15_n17_icc50_effect_unit_intercept.csv +142 -0
  82. csv_stats-0.4.0/tests/reference/datasets/W7_complete_n17_icc50_effect_unit_intercept.csv +120 -0
  83. csv_stats-0.4.0/tests/reference/datasets/W7_mcar15_n17_icc50_effect_unit_intercept.csv +102 -0
  84. csv_stats-0.4.0/tests/reference/datasets/W7_monotone15_n17_icc50_effect_unit_intercept.csv +110 -0
  85. csv_stats-0.4.0/tests/reference/make_lmm_reference.R +405 -0
  86. csv_stats-0.4.0/tests/reference/results/B2B2W2_complete_n17_icc50_effect_unit_intercept.json +596 -0
  87. csv_stats-0.4.0/tests/reference/results/B2B2W2_mcar15_n17_icc50_effect_unit_intercept.json +596 -0
  88. csv_stats-0.4.0/tests/reference/results/B2B2W2_monotone15_n17_icc50_effect_unit_intercept.json +596 -0
  89. csv_stats-0.4.0/tests/reference/results/B2W3_complete_n12_icc50_effect_unit_intercept.json +395 -0
  90. csv_stats-0.4.0/tests/reference/results/B2W3_complete_n17_icc50_effect_unit_intercept.json +395 -0
  91. csv_stats-0.4.0/tests/reference/results/B2W3_complete_n17_icc50_null_unit_intercept.json +395 -0
  92. csv_stats-0.4.0/tests/reference/results/B2W3_complete_n40_icc50_effect_unit_intercept.json +395 -0
  93. csv_stats-0.4.0/tests/reference/results/B2W3_complete_n6_icc50_effect_unit_intercept.json +399 -0
  94. csv_stats-0.4.0/tests/reference/results/B2W3_level_missing_one_group_n17_icc50_effect_unit_intercept.json +395 -0
  95. csv_stats-0.4.0/tests/reference/results/B2W3_mcar05_n17_icc50_effect_unit_intercept.json +395 -0
  96. csv_stats-0.4.0/tests/reference/results/B2W3_mcar15_n17_icc50_effect_unit_intercept.json +395 -0
  97. csv_stats-0.4.0/tests/reference/results/B2W3_mcar30_n17_icc50_effect_unit_intercept.json +395 -0
  98. csv_stats-0.4.0/tests/reference/results/B2W3_monotone15_n12_icc50_effect_unit_intercept.json +395 -0
  99. csv_stats-0.4.0/tests/reference/results/B2W3_monotone15_n17_icc50_effect_unit_intercept.json +395 -0
  100. csv_stats-0.4.0/tests/reference/results/B2W3_monotone15_n40_icc50_effect_unit_intercept.json +395 -0
  101. csv_stats-0.4.0/tests/reference/results/B2W3_monotone15_n6_icc50_effect_unit_intercept.json +395 -0
  102. csv_stats-0.4.0/tests/reference/results/B2W3_monotone40_n17_icc50_effect_unit_intercept.json +395 -0
  103. csv_stats-0.4.0/tests/reference/results/B2W3_monotone40_n17_icc50_null_unit_intercept.json +395 -0
  104. csv_stats-0.4.0/tests/reference/results/B2W3_singletons_n17_icc50_effect_unit_intercept.json +395 -0
  105. csv_stats-0.4.0/tests/reference/results/B2W3_sparse_cell_n17_icc50_effect_unit_intercept.json +395 -0
  106. csv_stats-0.4.0/tests/reference/results/B2W3_unequal_groups_n17_icc50_effect_unit_intercept.json +395 -0
  107. csv_stats-0.4.0/tests/reference/results/B2W3_unequal_reps_n17_icc50_effect_unit_intercept.json +395 -0
  108. csv_stats-0.4.0/tests/reference/results/B2rep_complete_n17_icc50_effect_unit_intercept.json +132 -0
  109. csv_stats-0.4.0/tests/reference/results/B2rep_unequal_reps_n17_icc50_effect_unit_intercept.json +132 -0
  110. csv_stats-0.4.0/tests/reference/results/B3W2_complete_n17_icc50_effect_unit_intercept.json +395 -0
  111. csv_stats-0.4.0/tests/reference/results/B3W2_mcar15_n17_icc50_effect_unit_intercept.json +395 -0
  112. csv_stats-0.4.0/tests/reference/results/B3W2_monotone15_n17_icc50_effect_unit_intercept.json +395 -0
  113. csv_stats-0.4.0/tests/reference/results/LABELS_complete_n17_icc50_effect_unit_intercept.json +395 -0
  114. csv_stats-0.4.0/tests/reference/results/LABELS_monotone15_n17_icc50_effect_unit_intercept.json +395 -0
  115. csv_stats-0.4.0/tests/reference/results/W2_complete_n17_icc50_effect_unit_intercept.json +132 -0
  116. csv_stats-0.4.0/tests/reference/results/W2_mcar05_n17_icc50_effect_unit_intercept.json +132 -0
  117. csv_stats-0.4.0/tests/reference/results/W2_mcar15_n17_icc50_effect_unit_intercept.json +132 -0
  118. csv_stats-0.4.0/tests/reference/results/W2_mcar30_n17_icc50_effect_unit_intercept.json +132 -0
  119. csv_stats-0.4.0/tests/reference/results/W2_monotone15_n17_icc50_effect_unit_intercept.json +132 -0
  120. csv_stats-0.4.0/tests/reference/results/W2_monotone40_n17_icc50_effect_unit_intercept.json +132 -0
  121. csv_stats-0.4.0/tests/reference/results/W2_singletons_n17_icc50_effect_unit_intercept.json +132 -0
  122. csv_stats-0.4.0/tests/reference/results/W2_sparse_cell_n17_icc50_effect_unit_intercept.json +132 -0
  123. csv_stats-0.4.0/tests/reference/results/W2_unequal_reps_n17_icc50_effect_unit_intercept.json +132 -0
  124. csv_stats-0.4.0/tests/reference/results/W2xW3_complete_n17_icc50_effect_unit_intercept.json +395 -0
  125. csv_stats-0.4.0/tests/reference/results/W2xW3_complete_n17_icc50_null_unit_intercept.json +395 -0
  126. csv_stats-0.4.0/tests/reference/results/W2xW3_mcar15_n17_icc50_effect_unit_intercept.json +395 -0
  127. csv_stats-0.4.0/tests/reference/results/W2xW3_monotone15_n17_icc50_effect_unit_intercept.json +395 -0
  128. csv_stats-0.4.0/tests/reference/results/W2xW3_monotone40_n17_icc50_effect_unit_intercept.json +395 -0
  129. csv_stats-0.4.0/tests/reference/results/W2xW3_monotone40_n17_icc50_null_unit_intercept.json +395 -0
  130. csv_stats-0.4.0/tests/reference/results/W3_complete_n12_icc50_effect_unit_intercept.json +181 -0
  131. csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc0_effect_unit_intercept.json +185 -0
  132. csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc10_effect_unit_intercept.json +181 -0
  133. csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc50_effect_large_intercept.json +181 -0
  134. csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc50_effect_small_intercept.json +181 -0
  135. csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc50_effect_unit_intercept.json +181 -0
  136. csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc80_effect_unit_intercept.json +181 -0
  137. csv_stats-0.4.0/tests/reference/results/W3_complete_n40_icc50_effect_unit_intercept.json +181 -0
  138. csv_stats-0.4.0/tests/reference/results/W3_complete_n6_icc50_effect_unit_intercept.json +181 -0
  139. csv_stats-0.4.0/tests/reference/results/W3_mcar05_n17_icc50_effect_unit_intercept.json +181 -0
  140. csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc0_effect_unit_intercept.json +185 -0
  141. csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc10_effect_unit_intercept.json +185 -0
  142. csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc50_effect_large_intercept.json +181 -0
  143. csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc50_effect_small_intercept.json +181 -0
  144. csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc50_effect_unit_intercept.json +181 -0
  145. csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc80_effect_unit_intercept.json +181 -0
  146. csv_stats-0.4.0/tests/reference/results/W3_mcar30_n17_icc50_effect_unit_intercept.json +181 -0
  147. csv_stats-0.4.0/tests/reference/results/W3_monotone15_n12_icc50_effect_unit_intercept.json +181 -0
  148. csv_stats-0.4.0/tests/reference/results/W3_monotone15_n17_icc50_effect_unit_intercept.json +181 -0
  149. csv_stats-0.4.0/tests/reference/results/W3_monotone15_n40_icc50_effect_unit_intercept.json +181 -0
  150. csv_stats-0.4.0/tests/reference/results/W3_monotone15_n6_icc50_effect_unit_intercept.json +181 -0
  151. csv_stats-0.4.0/tests/reference/results/W3_monotone40_n17_icc50_effect_unit_intercept.json +181 -0
  152. csv_stats-0.4.0/tests/reference/results/W3_singletons_n17_icc50_effect_unit_intercept.json +181 -0
  153. csv_stats-0.4.0/tests/reference/results/W3_sparse_cell_n17_icc50_effect_unit_intercept.json +181 -0
  154. csv_stats-0.4.0/tests/reference/results/W3_unequal_reps_n17_icc50_effect_unit_intercept.json +181 -0
  155. csv_stats-0.4.0/tests/reference/results/W3rep_complete_n17_icc50_effect_unit_intercept.json +181 -0
  156. csv_stats-0.4.0/tests/reference/results/W3rep_complete_n17_icc50_effect_unit_slopes.json +199 -0
  157. csv_stats-0.4.0/tests/reference/results/W3rep_mcar15_n17_icc50_effect_unit_intercept.json +181 -0
  158. csv_stats-0.4.0/tests/reference/results/W3rep_mcar15_n17_icc50_effect_unit_slopes.json +195 -0
  159. csv_stats-0.4.0/tests/reference/results/W3rep_monotone15_n17_icc50_effect_unit_intercept.json +181 -0
  160. csv_stats-0.4.0/tests/reference/results/W7_complete_n17_icc50_effect_unit_intercept.json +577 -0
  161. csv_stats-0.4.0/tests/reference/results/W7_mcar15_n17_icc50_effect_unit_intercept.json +577 -0
  162. csv_stats-0.4.0/tests/reference/results/W7_monotone15_n17_icc50_effect_unit_intercept.json +577 -0
  163. csv_stats-0.4.0/tests/test_anova1way.py +239 -0
  164. csv_stats-0.4.0/tests/test_anova2way.py +371 -0
  165. csv_stats-0.4.0/tests/test_assumption_checks.py +38 -0
  166. csv_stats-0.4.0/tests/test_core.py +288 -0
  167. csv_stats-0.4.0/tests/test_descriptive.py +116 -0
  168. csv_stats-0.4.0/tests/test_lmm.py +180 -0
  169. csv_stats-0.4.0/tests/test_lmm_reference.py +317 -0
  170. csv_stats-0.2.0/csvstats/__init__.py +0 -1
  171. {csv_stats-0.2.0 → csv_stats-0.4.0}/.gitignore +0 -0
  172. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/anova.py +0 -0
  173. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/descriptive.py +0 -0
  174. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/ttest.py +0 -0
  175. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/__init__.py +0 -0
  176. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/load_data.py +0 -0
  177. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/plot_data.py +0 -0
  178. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/plot_helper.py +0 -0
  179. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/run_all_columns.py +0 -0
  180. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/save_stats.py +0 -0
  181. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/summary_stats.py +0 -0
  182. {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/test_assumptions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: csv-stats
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: A Python package for the life sciences to conduct hypothesis testing from CSV files.
5
5
  Project-URL: Homepage, https://github.com/mtillman14/csv-stats
6
6
  Project-URL: Documentation, https://github.com/mtillman14/csv-stats
@@ -20,6 +20,7 @@ Requires-Dist: pandas>=1.5
20
20
  Requires-Dist: scipy>=1.7
21
21
  Provides-Extra: dev
22
22
  Requires-Dist: matplotlib>=3.6; extra == 'dev'
23
+ Requires-Dist: patsy>=0.5; extra == 'dev'
23
24
  Requires-Dist: pingouin>=0.6.0; extra == 'dev'
24
25
  Requires-Dist: pytest; extra == 'dev'
25
26
  Requires-Dist: reportlab>=4.4.4; extra == 'dev'
@@ -27,6 +28,7 @@ Requires-Dist: seaborn>=0.13; extra == 'dev'
27
28
  Requires-Dist: statsmodels>=0.14.5; extra == 'dev'
28
29
  Provides-Extra: full
29
30
  Requires-Dist: matplotlib>=3.6; extra == 'full'
31
+ Requires-Dist: patsy>=0.5; extra == 'full'
30
32
  Requires-Dist: pingouin>=0.6.0; extra == 'full'
31
33
  Requires-Dist: reportlab>=4.4.4; extra == 'full'
32
34
  Requires-Dist: seaborn>=0.13; extra == 'full'
@@ -55,6 +57,26 @@ ci_interval([4.1, 5.0, 6.2]) # (low, high); also a seaborn errorbar= calla
55
57
  ci_half_width(sd=1.2, n=5) # t(0.975, 4) * 1.2 / sqrt(5)
56
58
  ```
57
59
 
60
+ ## Linear mixed models (0.4.0)
61
+ `csvstats.lmm` uses every observation: a subject missing some within-subject
62
+ levels is kept, not dropped (a repeated-measures ANOVA or paired t-test would
63
+ have to drop it). Random intercept per subject, REML, sum-to-zero coding.
64
+ Tests use **Satterthwaite** degrees of freedom, as R's lmerTest does: t(df) per
65
+ coefficient, a type-III F(q, ddf) per term, and t(df) per pairwise contrast. The
66
+ pairwise contrasts come from the full model (emmeans-style). Everything is checked
67
+ against lme4 / lmerTest / emmeans on 75 reference datasets (tests/reference).
68
+ If a df cannot be computed, the Wald test is reported, labelled `df_method: "wald"`.
69
+
70
+ ```python
71
+ from csvstats.lmm import lmm, lmm_pairwise
72
+ from csvstats.core import assumption_checks
73
+
74
+ lmm(df, "step_length", within=["session", "speed"], subject="subject") # one F(q, ddf) per term
75
+ lmm_pairwise(df, "step_length", within=["session", "speed"], subject="subject", factor="session",
76
+ levels={"session": ["post", "pre"]}) # post − pre within each speed, t(df)
77
+ assumption_checks(df, "step_length", within=["session"], subject="subject") # Shapiro–Wilk on residuals (+ Levene)
78
+ ```
79
+
58
80
  ## Examples
59
81
  All code examples below use the following constants:
60
82
  ```python
@@ -20,6 +20,26 @@ ci_interval([4.1, 5.0, 6.2]) # (low, high); also a seaborn errorbar= calla
20
20
  ci_half_width(sd=1.2, n=5) # t(0.975, 4) * 1.2 / sqrt(5)
21
21
  ```
22
22
 
23
+ ## Linear mixed models (0.4.0)
24
+ `csvstats.lmm` uses every observation: a subject missing some within-subject
25
+ levels is kept, not dropped (a repeated-measures ANOVA or paired t-test would
26
+ have to drop it). Random intercept per subject, REML, sum-to-zero coding.
27
+ Tests use **Satterthwaite** degrees of freedom, as R's lmerTest does: t(df) per
28
+ coefficient, a type-III F(q, ddf) per term, and t(df) per pairwise contrast. The
29
+ pairwise contrasts come from the full model (emmeans-style). Everything is checked
30
+ against lme4 / lmerTest / emmeans on 75 reference datasets (tests/reference).
31
+ If a df cannot be computed, the Wald test is reported, labelled `df_method: "wald"`.
32
+
33
+ ```python
34
+ from csvstats.lmm import lmm, lmm_pairwise
35
+ from csvstats.core import assumption_checks
36
+
37
+ lmm(df, "step_length", within=["session", "speed"], subject="subject") # one F(q, ddf) per term
38
+ lmm_pairwise(df, "step_length", within=["session", "speed"], subject="subject", factor="session",
39
+ levels={"session": ["post", "pre"]}) # post − pre within each speed, t(df)
40
+ assumption_checks(df, "step_length", within=["session"], subject="subject") # Shapiro–Wilk on residuals (+ Levene)
41
+ ```
42
+
23
43
  ## Examples
24
44
  All code examples below use the following constants:
25
45
  ```python
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "csv-stats"
7
- version = "0.2.0"
7
+ version = "0.4.0"
8
8
  description = "A Python package for the life sciences to conduct hypothesis testing from CSV files."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -35,6 +35,7 @@ dependencies = [
35
35
  full = [
36
36
  "pingouin>=0.6.0",
37
37
  "statsmodels>=0.14.5",
38
+ "patsy>=0.5", # csvstats.lmm builds its design matrices with patsy
38
39
  "reportlab>=4.4.4",
39
40
  "matplotlib>=3.6",
40
41
  "seaborn>=0.13",
@@ -53,5 +54,11 @@ Issues = "https://github.com/mtillman14/csv-stats/issues"
53
54
  [tool.hatch.build.targets.wheel]
54
55
  packages = ["src/csvstats"]
55
56
 
57
+ # The sdist keeps the src/ layout: the wheel is built FROM the sdist, and
58
+ # looks for src/csvstats. `packages` here re-rooted it to csvstats/, so the
59
+ # 0.2.0 wheel came out empty (metadata only).
56
60
  [tool.hatch.build.targets.sdist]
57
- packages = ["src/csvstats"]
61
+ only-include = ["src/csvstats", "tests", "README.md"]
62
+
63
+ [tool.hatch.build]
64
+ ignore-vcs = true
@@ -0,0 +1 @@
1
+ __version__ = "0.4.0"
@@ -334,6 +334,43 @@ def _levene(groups: list[np.ndarray], alpha: float) -> dict[str, Any]:
334
334
  return {"name": "homogeneity_of_variance", "test": "levene", "scope": "groups", "statistic": _num(w), "p": _num(p), "violated": bool(p < alpha)}
335
335
 
336
336
 
337
+ def assumption_checks(
338
+ data: pd.DataFrame,
339
+ dv: str,
340
+ *,
341
+ between: Sequence[str] = (),
342
+ within: Sequence[str] = (),
343
+ subject: str | None = None,
344
+ levels: dict[str, list[Any]] | None = None,
345
+ alpha: float = 0.05,
346
+ ) -> dict[str, Any]:
347
+ """The checks a caller uses to RECOMMEND a test, before running one.
348
+
349
+ Normality (Shapiro–Wilk) of the residuals the parametric model would have:
350
+ ``y − cell mean`` for between-only designs, and additionally centred on
351
+ each subject's mean when there is a within factor (every observation is
352
+ used; nobody is dropped). Homogeneity of variance (Levene, median-centred)
353
+ across the between cells, when there are any.
354
+
355
+ Returns ``{"assumptions": [...], "n": ...}``. Pre-testing assumptions to
356
+ choose a test is debated; callers should show this as evidence for a
357
+ recommendation the user can override, never as a silent switch.
358
+ """
359
+ between, within = list(between), list(within)
360
+ factors = [*between, *within]
361
+ prep = _Prepared(data, dv, factors, subject if within else None, levels)
362
+ frame = prep.frame
363
+ y = frame[dv].astype(float)
364
+ resid = y - (frame.groupby(factors)[dv].transform("mean") if factors else y.mean())
365
+ if within and subject:
366
+ resid = resid - frame.groupby(subject)[dv].transform("mean") + y.mean()
367
+ checks = [_shapiro(resid.to_numpy(float), "residuals", alpha)]
368
+ if between:
369
+ groups = [g[dv].to_numpy(float) for _, g in frame.groupby(between)]
370
+ checks.append(_levene(groups, alpha))
371
+ return {"assumptions": checks, "n": prep.n_record()}
372
+
373
+
337
374
  def _flag_violations(assumptions: list[dict], warnings: list[dict]) -> None:
338
375
  for a in assumptions:
339
376
  if a.get("violated"):