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.
- {csv_stats-0.2.0 → csv_stats-0.4.0}/PKG-INFO +23 -1
- {csv_stats-0.2.0 → csv_stats-0.4.0}/README.md +20 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0}/pyproject.toml +9 -2
- csv_stats-0.4.0/src/csvstats/__init__.py +1 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/core.py +37 -0
- csv_stats-0.4.0/src/csvstats/lmm.py +748 -0
- csv_stats-0.4.0/tests/reference/README.md +49 -0
- csv_stats-0.4.0/tests/reference/datasets/B2B2W2_complete_n17_icc50_effect_unit_intercept.csv +35 -0
- csv_stats-0.4.0/tests/reference/datasets/B2B2W2_mcar15_n17_icc50_effect_unit_intercept.csv +30 -0
- csv_stats-0.4.0/tests/reference/datasets/B2B2W2_monotone15_n17_icc50_effect_unit_intercept.csv +32 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_complete_n12_icc50_effect_unit_intercept.csv +37 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_complete_n17_icc50_effect_unit_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_complete_n17_icc50_null_unit_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_complete_n40_icc50_effect_unit_intercept.csv +121 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_complete_n6_icc50_effect_unit_intercept.csv +19 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_level_missing_one_group_n17_icc50_effect_unit_intercept.csv +49 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_mcar05_n17_icc50_effect_unit_intercept.csv +49 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_mcar15_n17_icc50_effect_unit_intercept.csv +44 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_mcar30_n17_icc50_effect_unit_intercept.csv +38 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone15_n12_icc50_effect_unit_intercept.csv +35 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone15_n17_icc50_effect_unit_intercept.csv +47 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone15_n40_icc50_effect_unit_intercept.csv +114 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone15_n6_icc50_effect_unit_intercept.csv +18 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone40_n17_icc50_effect_unit_intercept.csv +41 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_monotone40_n17_icc50_null_unit_intercept.csv +39 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_singletons_n17_icc50_effect_unit_intercept.csv +46 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_sparse_cell_n17_icc50_effect_unit_intercept.csv +46 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_unequal_groups_n17_icc50_effect_unit_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/B2W3_unequal_reps_n17_icc50_effect_unit_intercept.csv +136 -0
- csv_stats-0.4.0/tests/reference/datasets/B2rep_complete_n17_icc50_effect_unit_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/B2rep_unequal_reps_n17_icc50_effect_unit_intercept.csv +44 -0
- csv_stats-0.4.0/tests/reference/datasets/B3W2_complete_n17_icc50_effect_unit_intercept.csv +35 -0
- csv_stats-0.4.0/tests/reference/datasets/B3W2_mcar15_n17_icc50_effect_unit_intercept.csv +30 -0
- csv_stats-0.4.0/tests/reference/datasets/B3W2_monotone15_n17_icc50_effect_unit_intercept.csv +32 -0
- csv_stats-0.4.0/tests/reference/datasets/LABELS_complete_n17_icc50_effect_unit_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/LABELS_monotone15_n17_icc50_effect_unit_intercept.csv +46 -0
- csv_stats-0.4.0/tests/reference/datasets/W2_complete_n17_icc50_effect_unit_intercept.csv +35 -0
- csv_stats-0.4.0/tests/reference/datasets/W2_mcar05_n17_icc50_effect_unit_intercept.csv +33 -0
- csv_stats-0.4.0/tests/reference/datasets/W2_mcar15_n17_icc50_effect_unit_intercept.csv +30 -0
- csv_stats-0.4.0/tests/reference/datasets/W2_mcar30_n17_icc50_effect_unit_intercept.csv +26 -0
- csv_stats-0.4.0/tests/reference/datasets/W2_monotone15_n17_icc50_effect_unit_intercept.csv +32 -0
- csv_stats-0.4.0/tests/reference/datasets/W2_monotone40_n17_icc50_effect_unit_intercept.csv +28 -0
- csv_stats-0.4.0/tests/reference/datasets/W2_singletons_n17_icc50_effect_unit_intercept.csv +32 -0
- csv_stats-0.4.0/tests/reference/datasets/W2_sparse_cell_n17_icc50_effect_unit_intercept.csv +20 -0
- csv_stats-0.4.0/tests/reference/datasets/W2_unequal_reps_n17_icc50_effect_unit_intercept.csv +87 -0
- csv_stats-0.4.0/tests/reference/datasets/W2xW3_complete_n17_icc50_effect_unit_intercept.csv +103 -0
- csv_stats-0.4.0/tests/reference/datasets/W2xW3_complete_n17_icc50_null_unit_intercept.csv +103 -0
- csv_stats-0.4.0/tests/reference/datasets/W2xW3_mcar15_n17_icc50_effect_unit_intercept.csv +88 -0
- csv_stats-0.4.0/tests/reference/datasets/W2xW3_monotone15_n17_icc50_effect_unit_intercept.csv +95 -0
- csv_stats-0.4.0/tests/reference/datasets/W2xW3_monotone40_n17_icc50_effect_unit_intercept.csv +87 -0
- csv_stats-0.4.0/tests/reference/datasets/W2xW3_monotone40_n17_icc50_null_unit_intercept.csv +85 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_complete_n12_icc50_effect_unit_intercept.csv +37 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc0_effect_unit_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc10_effect_unit_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc50_effect_large_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc50_effect_small_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc50_effect_unit_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_complete_n17_icc80_effect_unit_intercept.csv +52 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_complete_n40_icc50_effect_unit_intercept.csv +121 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_complete_n6_icc50_effect_unit_intercept.csv +19 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_mcar05_n17_icc50_effect_unit_intercept.csv +49 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc0_effect_unit_intercept.csv +44 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc10_effect_unit_intercept.csv +44 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc50_effect_large_intercept.csv +44 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc50_effect_small_intercept.csv +44 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc50_effect_unit_intercept.csv +44 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_mcar15_n17_icc80_effect_unit_intercept.csv +44 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_mcar30_n17_icc50_effect_unit_intercept.csv +37 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_monotone15_n12_icc50_effect_unit_intercept.csv +35 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_monotone15_n17_icc50_effect_unit_intercept.csv +47 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_monotone15_n40_icc50_effect_unit_intercept.csv +113 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_monotone15_n6_icc50_effect_unit_intercept.csv +17 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_monotone40_n17_icc50_effect_unit_intercept.csv +42 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_singletons_n17_icc50_effect_unit_intercept.csv +46 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_sparse_cell_n17_icc50_effect_unit_intercept.csv +37 -0
- csv_stats-0.4.0/tests/reference/datasets/W3_unequal_reps_n17_icc50_effect_unit_intercept.csv +126 -0
- csv_stats-0.4.0/tests/reference/datasets/W3rep_complete_n17_icc50_effect_unit_intercept.csv +154 -0
- csv_stats-0.4.0/tests/reference/datasets/W3rep_complete_n17_icc50_effect_unit_slopes.csv +154 -0
- csv_stats-0.4.0/tests/reference/datasets/W3rep_mcar15_n17_icc50_effect_unit_intercept.csv +130 -0
- csv_stats-0.4.0/tests/reference/datasets/W3rep_mcar15_n17_icc50_effect_unit_slopes.csv +130 -0
- csv_stats-0.4.0/tests/reference/datasets/W3rep_monotone15_n17_icc50_effect_unit_intercept.csv +142 -0
- csv_stats-0.4.0/tests/reference/datasets/W7_complete_n17_icc50_effect_unit_intercept.csv +120 -0
- csv_stats-0.4.0/tests/reference/datasets/W7_mcar15_n17_icc50_effect_unit_intercept.csv +102 -0
- csv_stats-0.4.0/tests/reference/datasets/W7_monotone15_n17_icc50_effect_unit_intercept.csv +110 -0
- csv_stats-0.4.0/tests/reference/make_lmm_reference.R +405 -0
- csv_stats-0.4.0/tests/reference/results/B2B2W2_complete_n17_icc50_effect_unit_intercept.json +596 -0
- csv_stats-0.4.0/tests/reference/results/B2B2W2_mcar15_n17_icc50_effect_unit_intercept.json +596 -0
- csv_stats-0.4.0/tests/reference/results/B2B2W2_monotone15_n17_icc50_effect_unit_intercept.json +596 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_complete_n12_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_complete_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_complete_n17_icc50_null_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_complete_n40_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_complete_n6_icc50_effect_unit_intercept.json +399 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_level_missing_one_group_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_mcar05_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_mcar15_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_mcar30_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_monotone15_n12_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_monotone15_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_monotone15_n40_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_monotone15_n6_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_monotone40_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_monotone40_n17_icc50_null_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_singletons_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_sparse_cell_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_unequal_groups_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2W3_unequal_reps_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B2rep_complete_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/B2rep_unequal_reps_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/B3W2_complete_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B3W2_mcar15_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/B3W2_monotone15_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/LABELS_complete_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/LABELS_monotone15_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/W2_complete_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/W2_mcar05_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/W2_mcar15_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/W2_mcar30_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/W2_monotone15_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/W2_monotone40_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/W2_singletons_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/W2_sparse_cell_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/W2_unequal_reps_n17_icc50_effect_unit_intercept.json +132 -0
- csv_stats-0.4.0/tests/reference/results/W2xW3_complete_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/W2xW3_complete_n17_icc50_null_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/W2xW3_mcar15_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/W2xW3_monotone15_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/W2xW3_monotone40_n17_icc50_effect_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/W2xW3_monotone40_n17_icc50_null_unit_intercept.json +395 -0
- csv_stats-0.4.0/tests/reference/results/W3_complete_n12_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc0_effect_unit_intercept.json +185 -0
- csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc10_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc50_effect_large_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc50_effect_small_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_complete_n17_icc80_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_complete_n40_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_complete_n6_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_mcar05_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc0_effect_unit_intercept.json +185 -0
- csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc10_effect_unit_intercept.json +185 -0
- csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc50_effect_large_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc50_effect_small_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_mcar15_n17_icc80_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_mcar30_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_monotone15_n12_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_monotone15_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_monotone15_n40_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_monotone15_n6_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_monotone40_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_singletons_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_sparse_cell_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3_unequal_reps_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3rep_complete_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3rep_complete_n17_icc50_effect_unit_slopes.json +199 -0
- csv_stats-0.4.0/tests/reference/results/W3rep_mcar15_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W3rep_mcar15_n17_icc50_effect_unit_slopes.json +195 -0
- csv_stats-0.4.0/tests/reference/results/W3rep_monotone15_n17_icc50_effect_unit_intercept.json +181 -0
- csv_stats-0.4.0/tests/reference/results/W7_complete_n17_icc50_effect_unit_intercept.json +577 -0
- csv_stats-0.4.0/tests/reference/results/W7_mcar15_n17_icc50_effect_unit_intercept.json +577 -0
- csv_stats-0.4.0/tests/reference/results/W7_monotone15_n17_icc50_effect_unit_intercept.json +577 -0
- csv_stats-0.4.0/tests/test_anova1way.py +239 -0
- csv_stats-0.4.0/tests/test_anova2way.py +371 -0
- csv_stats-0.4.0/tests/test_assumption_checks.py +38 -0
- csv_stats-0.4.0/tests/test_core.py +288 -0
- csv_stats-0.4.0/tests/test_descriptive.py +116 -0
- csv_stats-0.4.0/tests/test_lmm.py +180 -0
- csv_stats-0.4.0/tests/test_lmm_reference.py +317 -0
- csv_stats-0.2.0/csvstats/__init__.py +0 -1
- {csv_stats-0.2.0 → csv_stats-0.4.0}/.gitignore +0 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/anova.py +0 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/descriptive.py +0 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/ttest.py +0 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/__init__.py +0 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/load_data.py +0 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/plot_data.py +0 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/plot_helper.py +0 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/run_all_columns.py +0 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/save_stats.py +0 -0
- {csv_stats-0.2.0 → csv_stats-0.4.0/src}/csvstats/utils/summary_stats.py +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
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"):
|