AutoStatLib 0.2.1__py3-none-any.whl → 0.2.2__py3-none-any.whl
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.
Potentially problematic release.
This version of AutoStatLib might be problematic. Click here for more details.
- AutoStatLib/AutoStatLib.py +104 -122
- AutoStatLib/_version.py +1 -1
- {AutoStatLib-0.2.1.dist-info → AutoStatLib-0.2.2.dist-info}/METADATA +37 -16
- AutoStatLib-0.2.2.dist-info/RECORD +9 -0
- AutoStatLib-0.2.1.dist-info/RECORD +0 -9
- {AutoStatLib-0.2.1.dist-info → AutoStatLib-0.2.2.dist-info}/LICENSE +0 -0
- {AutoStatLib-0.2.1.dist-info → AutoStatLib-0.2.2.dist-info}/WHEEL +0 -0
- {AutoStatLib-0.2.1.dist-info → AutoStatLib-0.2.2.dist-info}/top_level.txt +0 -0
AutoStatLib/AutoStatLib.py
CHANGED
|
@@ -10,6 +10,78 @@ class __StatisticalTests():
|
|
|
10
10
|
Statistical tests mixin
|
|
11
11
|
'''
|
|
12
12
|
|
|
13
|
+
def run_test_auto(self):
|
|
14
|
+
|
|
15
|
+
if self.n_groups == 1:
|
|
16
|
+
if self.parametric:
|
|
17
|
+
self.run_test_by_id('t_test_single_sample')
|
|
18
|
+
else:
|
|
19
|
+
self.run_test_by_id('wilcoxon_single_sample')
|
|
20
|
+
|
|
21
|
+
elif self.n_groups == 2:
|
|
22
|
+
if self.paired:
|
|
23
|
+
if self.parametric:
|
|
24
|
+
self.run_test_by_id('t_test_paired')
|
|
25
|
+
else:
|
|
26
|
+
self.run_test_by_id('wilcoxon')
|
|
27
|
+
else:
|
|
28
|
+
if self.parametric:
|
|
29
|
+
self.run_test_by_id('t_test_independent')
|
|
30
|
+
else:
|
|
31
|
+
self.run_test_by_id('mann_whitney')
|
|
32
|
+
|
|
33
|
+
elif self.n_groups >= 3:
|
|
34
|
+
if self.paired:
|
|
35
|
+
if self.parametric:
|
|
36
|
+
self.run_test_by_id('anova_1w_rm')
|
|
37
|
+
else:
|
|
38
|
+
self.run_test_by_id('friedman')
|
|
39
|
+
else:
|
|
40
|
+
if self.parametric:
|
|
41
|
+
self.run_test_by_id('anova_1w_ordinary')
|
|
42
|
+
else:
|
|
43
|
+
self.run_test_by_id('kruskal_wallis')
|
|
44
|
+
|
|
45
|
+
else:
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
def run_test_by_id(self, test_id):
|
|
49
|
+
|
|
50
|
+
test_names_dict = {
|
|
51
|
+
'anova_1w_ordinary': 'Ordinary One-Way ANOVA',
|
|
52
|
+
'anova_1w_rm': 'Repeated Measures One-Way ANOVA',
|
|
53
|
+
'friedman': 'Friedman test',
|
|
54
|
+
'kruskal_wallis': 'Kruskal-Wallis test',
|
|
55
|
+
'mann_whitney': 'Mann-Whitney U test',
|
|
56
|
+
't_test_independent': 't-test for independent samples',
|
|
57
|
+
't_test_paired': 't-test for paired samples',
|
|
58
|
+
't_test_single_sample': 'Single-sample t-test',
|
|
59
|
+
'wilcoxon': 'Wilcoxon signed-rank test',
|
|
60
|
+
'wilcoxon_single_sample': 'Wilcoxon signed-rank test for single sample',
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
match test_id:
|
|
64
|
+
case 'anova_1w_ordinary': stat, p_value = self.anova_1w_ordinary()
|
|
65
|
+
case 'anova_1w_rm': stat, p_value = self.anova_1w_rm()
|
|
66
|
+
case 'friedman': stat, p_value = self.friedman()
|
|
67
|
+
case 'kruskal_wallis': stat, p_value = self.kruskal_wallis()
|
|
68
|
+
case 'mann_whitney': stat, p_value = self.mann_whitney()
|
|
69
|
+
case 't_test_independent': stat, p_value = self.t_test_independent()
|
|
70
|
+
case 't_test_paired': stat, p_value = self.t_test_paired()
|
|
71
|
+
case 't_test_single_sample': stat, p_value = self.t_test_single_sample()
|
|
72
|
+
case 'wilcoxon': stat, p_value = self.wilcoxon()
|
|
73
|
+
case 'wilcoxon_single_sample': stat, p_value = self.wilcoxon_single_sample()
|
|
74
|
+
|
|
75
|
+
if test_id in self.test_ids_dependent:
|
|
76
|
+
self.paired = True
|
|
77
|
+
else:
|
|
78
|
+
self.paired = False
|
|
79
|
+
|
|
80
|
+
self.test_name = test_names_dict[test_id]
|
|
81
|
+
self.test_id = test_id
|
|
82
|
+
self.test_stat = stat
|
|
83
|
+
self.p_value = p_value
|
|
84
|
+
|
|
13
85
|
def anova_1w_ordinary(self):
|
|
14
86
|
stat, p_value = f_oneway(*self.data)
|
|
15
87
|
self.tails = 2
|
|
@@ -17,11 +89,7 @@ class __StatisticalTests():
|
|
|
17
89
|
# p_value /= 2
|
|
18
90
|
# if self.tails == 1:
|
|
19
91
|
# p_value /= 2
|
|
20
|
-
|
|
21
|
-
self.test_id = 'anova_1w_ordinary'
|
|
22
|
-
self.paired = False
|
|
23
|
-
self.test_stat = stat
|
|
24
|
-
self.p_value = p_value
|
|
92
|
+
return stat, p_value
|
|
25
93
|
|
|
26
94
|
def anova_1w_rm(self):
|
|
27
95
|
"""
|
|
@@ -33,34 +101,22 @@ class __StatisticalTests():
|
|
|
33
101
|
|
|
34
102
|
df = self.matrix_to_dataframe(self.data)
|
|
35
103
|
res = AnovaRM(df, 'Value', 'Row', within=['Col']).fit()
|
|
36
|
-
|
|
104
|
+
stat = res.anova_table['F Value'][0]
|
|
37
105
|
p_value = res.anova_table['Pr > F'][0]
|
|
38
106
|
|
|
39
107
|
self.tails = 2
|
|
40
|
-
|
|
41
|
-
self.test_id = 'anova_1w_rm'
|
|
42
|
-
self.paired = True
|
|
43
|
-
self.test_stat = f_stat
|
|
44
|
-
self.p_value = p_value
|
|
108
|
+
return stat, p_value
|
|
45
109
|
|
|
46
|
-
def
|
|
110
|
+
def friedman(self):
|
|
47
111
|
stat, p_value = friedmanchisquare(*self.data)
|
|
48
112
|
self.tails = 2
|
|
49
|
-
|
|
50
|
-
self.test_id = 'friedman'
|
|
51
|
-
self.paired = True
|
|
52
|
-
self.test_stat = stat
|
|
53
|
-
self.p_value = p_value
|
|
113
|
+
return stat, p_value
|
|
54
114
|
|
|
55
|
-
def
|
|
115
|
+
def kruskal_wallis(self):
|
|
56
116
|
stat, p_value = kruskal(*self.data)
|
|
57
|
-
|
|
58
|
-
self.test_id = 'kruskal_wallis'
|
|
59
|
-
self.paired = False
|
|
60
|
-
self.test_stat = stat
|
|
61
|
-
self.p_value = p_value
|
|
117
|
+
return stat, p_value
|
|
62
118
|
|
|
63
|
-
def
|
|
119
|
+
def mann_whitney(self):
|
|
64
120
|
stat, p_value = mannwhitneyu(
|
|
65
121
|
self.data[0], self.data[1], alternative='two-sided')
|
|
66
122
|
if self.tails == 1:
|
|
@@ -71,71 +127,46 @@ class __StatisticalTests():
|
|
|
71
127
|
# self.data[0], self.data[1], alternative='two-sided' if self.tails == 2 else 'less')
|
|
72
128
|
# if self.tails == 1 and p_value > 0.5:
|
|
73
129
|
# p_value = 1-p_value
|
|
74
|
-
|
|
75
|
-
self.test_name = 'Mann-Whitney U test'
|
|
76
|
-
self.test_id = 'mann_whitney'
|
|
77
|
-
self.paired = False
|
|
78
|
-
self.test_stat = stat
|
|
79
|
-
self.p_value = p_value
|
|
130
|
+
return stat, p_value
|
|
80
131
|
|
|
81
132
|
def t_test_independent(self):
|
|
82
|
-
|
|
133
|
+
stat, p_value = ttest_ind(
|
|
83
134
|
self.data[0], self.data[1])
|
|
84
135
|
if self.tails == 1:
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
self.test_id = 't_test_independent'
|
|
88
|
-
self.paired = False
|
|
89
|
-
self.test_stat = t_stat
|
|
90
|
-
self.p_value = t_p_value
|
|
136
|
+
p_value /= 2
|
|
137
|
+
return stat, p_value
|
|
91
138
|
|
|
92
139
|
def t_test_paired(self):
|
|
93
|
-
|
|
140
|
+
stat, p_value = ttest_rel(
|
|
94
141
|
self.data[0], self.data[1])
|
|
95
142
|
if self.tails == 1:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
self.test_id = 't_test_paired'
|
|
99
|
-
self.paired = True
|
|
100
|
-
self.test_stat = t_stat
|
|
101
|
-
self.p_value = t_p_value
|
|
143
|
+
p_value /= 2
|
|
144
|
+
return stat, p_value
|
|
102
145
|
|
|
103
146
|
def t_test_single_sample(self):
|
|
104
147
|
if self.popmean == None:
|
|
105
148
|
self.popmean = 0
|
|
106
149
|
self.AddWarning('no_pop_mean_set')
|
|
107
|
-
|
|
150
|
+
stat, p_value = ttest_1samp(self.data[0], self.popmean)
|
|
108
151
|
if self.tails == 1:
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
self.test_id = 't_test_single_sample'
|
|
112
|
-
self.paired = False
|
|
113
|
-
self.test_stat = t_stat
|
|
114
|
-
self.p_value = t_p_value
|
|
152
|
+
p_value /= 2
|
|
153
|
+
return stat, p_value
|
|
115
154
|
|
|
155
|
+
def wilcoxon(self):
|
|
156
|
+
stat, p_value = wilcoxon(self.data[0], self.data[1])
|
|
157
|
+
if self.tails == 1:
|
|
158
|
+
p_value /= 2
|
|
159
|
+
return stat, p_value
|
|
160
|
+
|
|
116
161
|
def wilcoxon_single_sample(self):
|
|
117
162
|
if self.popmean == None:
|
|
118
163
|
self.popmean = 0
|
|
119
164
|
self.AddWarning('no_pop_mean_set')
|
|
120
165
|
data = [i - self.popmean for i in self.data[0]]
|
|
121
|
-
|
|
122
|
-
if self.tails == 1:
|
|
123
|
-
p_value /= 2
|
|
124
|
-
self.test_name = 'Wilcoxon signed-rank test for single sample'
|
|
125
|
-
self.test_id = 'wilcoxon_single_sample'
|
|
126
|
-
self.paired = False
|
|
127
|
-
self.test_stat = w_stat
|
|
128
|
-
self.p_value = p_value
|
|
129
|
-
|
|
130
|
-
def wilcoxon(self):
|
|
131
|
-
stat, p_value = wilcoxon(self.data[0], self.data[1])
|
|
166
|
+
stat, p_value = wilcoxon(data)
|
|
132
167
|
if self.tails == 1:
|
|
133
168
|
p_value /= 2
|
|
134
|
-
|
|
135
|
-
self.test_id = 'wilcoxon'
|
|
136
|
-
self.paired = True
|
|
137
|
-
self.test_stat = stat
|
|
138
|
-
self.p_value = p_value
|
|
169
|
+
return stat, p_value
|
|
139
170
|
|
|
140
171
|
|
|
141
172
|
class __NormalityTests():
|
|
@@ -550,29 +581,13 @@ class StatisticalAnalysis(__StatisticalTests, __NormalityTests, __TextFormatting
|
|
|
550
581
|
if not test == 'auto' and self.parametric and not test in self.test_ids_parametric:
|
|
551
582
|
self.AddWarning('non-param_test_with_normal_data')
|
|
552
583
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
self.
|
|
557
|
-
elif test == 'friedman':
|
|
558
|
-
self.friedman_test()
|
|
559
|
-
elif test == 'kruskal_wallis':
|
|
560
|
-
self.kruskal_wallis_test()
|
|
561
|
-
elif test == 'mann_whitney':
|
|
562
|
-
self.mann_whitney_u_test()
|
|
563
|
-
elif test == 't_test_independent':
|
|
564
|
-
self.t_test_independent()
|
|
565
|
-
elif test == 't_test_paired':
|
|
566
|
-
self.t_test_paired()
|
|
567
|
-
elif test == 't_test_single_sample':
|
|
568
|
-
self.t_test_single_sample()
|
|
569
|
-
elif test == 'wilcoxon':
|
|
570
|
-
self.wilcoxon()
|
|
571
|
-
elif test == 'wilcoxon_single_sample':
|
|
572
|
-
self.wilcoxon_single_sample()
|
|
584
|
+
# run the test
|
|
585
|
+
|
|
586
|
+
if test in self.test_ids_all:
|
|
587
|
+
self.run_test_by_id(test)
|
|
573
588
|
else:
|
|
574
|
-
self.
|
|
575
|
-
|
|
589
|
+
self.run_test_auto()
|
|
590
|
+
|
|
576
591
|
|
|
577
592
|
# print the results
|
|
578
593
|
self.results = self.create_results_dict()
|
|
@@ -585,40 +600,7 @@ class StatisticalAnalysis(__StatisticalTests, __NormalityTests, __TextFormatting
|
|
|
585
600
|
if self.verbose == True:
|
|
586
601
|
print(self.summary)
|
|
587
602
|
|
|
588
|
-
def __auto(self):
|
|
589
|
-
|
|
590
|
-
if self.n_groups == 1:
|
|
591
|
-
if self.parametric:
|
|
592
|
-
return self.t_test_single_sample()
|
|
593
|
-
else:
|
|
594
|
-
return self.wilcoxon_single_sample()
|
|
595
|
-
|
|
596
|
-
elif self.n_groups == 2:
|
|
597
|
-
if self.paired:
|
|
598
|
-
if self.parametric:
|
|
599
|
-
return self.t_test_paired()
|
|
600
|
-
else:
|
|
601
|
-
return self.wilcoxon()
|
|
602
|
-
else:
|
|
603
|
-
if self.parametric:
|
|
604
|
-
return self.t_test_independent()
|
|
605
|
-
else:
|
|
606
|
-
return self.mann_whitney_u_test()
|
|
607
|
-
|
|
608
|
-
elif self.n_groups >= 3:
|
|
609
|
-
if self.paired:
|
|
610
|
-
if self.parametric:
|
|
611
|
-
return self.anova_1w_rm()
|
|
612
|
-
else:
|
|
613
|
-
return self.friedman_test()
|
|
614
|
-
else:
|
|
615
|
-
if self.parametric:
|
|
616
|
-
return self.anova_1w_ordinary()
|
|
617
|
-
else:
|
|
618
|
-
return self.kruskal_wallis_test()
|
|
619
603
|
|
|
620
|
-
else:
|
|
621
|
-
pass
|
|
622
604
|
|
|
623
605
|
# public methods:
|
|
624
606
|
def RunAuto(self):
|
AutoStatLib/_version.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# AutoStatLib package version:
|
|
2
|
-
__version__ = "0.2.
|
|
2
|
+
__version__ = "0.2.2"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: AutoStatLib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: AutoStatLib - a simple statistical analysis tool
|
|
5
5
|
Author: Stemonitis, SciWare LLC
|
|
6
6
|
Author-email: konung-yaropolk <yaropolk1995@gmail.com>
|
|
@@ -595,10 +595,11 @@ analysis.RunTtestPaired()
|
|
|
595
595
|
analysis.RunWilcoxon()
|
|
596
596
|
|
|
597
597
|
# 3 and more independed groups comparison:
|
|
598
|
-
analysis.
|
|
598
|
+
analysis.RunOnewayAnova()
|
|
599
599
|
analysis.RunKruskalWallis()
|
|
600
600
|
|
|
601
601
|
# 3 and more depended groups comparison:
|
|
602
|
+
analysis.RunOnewayAnovaRM()
|
|
602
603
|
analysis.RunFriedman()
|
|
603
604
|
|
|
604
605
|
# single group tests"
|
|
@@ -648,20 +649,40 @@ If errors occured, *GetResult()* returns an empty dictionary
|
|
|
648
649
|
|
|
649
650
|
|
|
650
651
|
---
|
|
651
|
-
## Pre-Alpha dev status.
|
|
652
|
-
|
|
653
|
-
### TODO:
|
|
654
|
-
|
|
655
|
-
--Kruskal-Wallis test - add Dunn's multiple comparisons
|
|
656
|
-
--Anova: add 2-way anova and 3-way
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
--
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
--
|
|
664
|
-
--
|
|
652
|
+
## Pre-Alpha dev status.
|
|
653
|
+
|
|
654
|
+
### TODO:
|
|
655
|
+
|
|
656
|
+
-- Kruskal-Wallis test - add Dunn's multiple comparisons
|
|
657
|
+
-- Anova: add 2-way anova and 3-way anova
|
|
658
|
+
-- onevay Anova: add repeated measures (for normal dependent values) with and without Gaisser-Greenhouse correction
|
|
659
|
+
-- onevay Anova: add Brown-Forsithe and Welch (for normal independent values with unequal SDs between groups)
|
|
660
|
+
-- paired T-test: add ratio-paired t-test (ratios of paired values are consistent)
|
|
661
|
+
-- add Welch test (for norm data unequal variances)
|
|
662
|
+
-- add Kolmogorov-smirnov test (unpaired nonparametric 2 sample, compare cumulative distributions)
|
|
663
|
+
-- add independent t-test with Welch correction (do not assume equal SDs in groups)
|
|
664
|
+
-- add correlation test, correlation diagram
|
|
665
|
+
-- add linear regression, regression diagram
|
|
666
|
+
-- add QQ plot
|
|
667
|
+
-- n-sample tests: add onetail option
|
|
668
|
+
|
|
669
|
+
✅ done -- detailed normality test results
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
checked tests:
|
|
673
|
+
1-sample:
|
|
674
|
+
--Wilcoxon 2,1 tails - ok
|
|
675
|
+
--t-tests 2,1 tails -ok
|
|
676
|
+
|
|
677
|
+
2-sample:
|
|
678
|
+
--Wilcoxon 2,1 tails - ok
|
|
679
|
+
--Mann-whitney 2,1 tails - ok
|
|
680
|
+
--t-tests 2,1 tails -ok
|
|
681
|
+
|
|
682
|
+
n-sample:
|
|
683
|
+
--Kruskal-Wallis 2 tail - ok
|
|
684
|
+
--Friedman 2 tail - ok
|
|
685
|
+
--one-way ANOWA 2 tail - ok
|
|
665
686
|
|
|
666
687
|
|
|
667
688
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
AutoStatLib/AutoStatLib.py,sha256=lUDNdzH2NdsyGm1jgLvQ1b-PXIyo8SfMApEK4uOQxSg,23479
|
|
2
|
+
AutoStatLib/__init__.py,sha256=0wHYnglzKRPqSHtZlfbMEA2Bj5rDR4LLaXbOrJi-sqM,101
|
|
3
|
+
AutoStatLib/__main__.py,sha256=ROKWensrxDh3Gl-yhexJ-BYFohDSh9y-CuMkaLpmnnQ,247
|
|
4
|
+
AutoStatLib/_version.py,sha256=WbLB15iApm4FvkoTxz3n4t20nHfs58LNdIBr1m1YbxU,53
|
|
5
|
+
AutoStatLib-0.2.2.dist-info/LICENSE,sha256=IMF9i4xIpgCADf0U-V1cuf9HBmqWQd3qtI3FSuyW4zE,26526
|
|
6
|
+
AutoStatLib-0.2.2.dist-info/METADATA,sha256=4Ro1Bo6FsklfwMo-G5N9C--n-7HJA4nMNns6qivu90k,36473
|
|
7
|
+
AutoStatLib-0.2.2.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
8
|
+
AutoStatLib-0.2.2.dist-info/top_level.txt,sha256=BuHzVyE2andc7RwD_UPmDjLl9CUAyBH6WHZGjaIReUI,12
|
|
9
|
+
AutoStatLib-0.2.2.dist-info/RECORD,,
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
AutoStatLib/AutoStatLib.py,sha256=_Id6bJb1OmGpUyfB0ho6-2F9S_8YO8euMB-prLjfpPI,23976
|
|
2
|
-
AutoStatLib/__init__.py,sha256=0wHYnglzKRPqSHtZlfbMEA2Bj5rDR4LLaXbOrJi-sqM,101
|
|
3
|
-
AutoStatLib/__main__.py,sha256=ROKWensrxDh3Gl-yhexJ-BYFohDSh9y-CuMkaLpmnnQ,247
|
|
4
|
-
AutoStatLib/_version.py,sha256=jkitUHmog4Z-O5_8BUMHBBb92A758Kea22juu9b2a2Q,53
|
|
5
|
-
AutoStatLib-0.2.1.dist-info/LICENSE,sha256=IMF9i4xIpgCADf0U-V1cuf9HBmqWQd3qtI3FSuyW4zE,26526
|
|
6
|
-
AutoStatLib-0.2.1.dist-info/METADATA,sha256=PFpKRRElBXYciMgOuMRI8wsoCKkX9iiwMVNJthvC_3A,35569
|
|
7
|
-
AutoStatLib-0.2.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
8
|
-
AutoStatLib-0.2.1.dist-info/top_level.txt,sha256=BuHzVyE2andc7RwD_UPmDjLl9CUAyBH6WHZGjaIReUI,12
|
|
9
|
-
AutoStatLib-0.2.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|