rohitsanj / doex

@@ -1,11 +1,22 @@
Loading
1 +
import numpy as np
1 2
import scipy.stats
3 +
from statsmodels.stats.libqsturng import qsturng
2 4
from prettytable import PrettyTable
5 +
from itertools import combinations
3 6
4 7
5 8
def p_value(f, dfn, dfd):
6 9
    return 1 - scipy.stats.f.cdf(f, dfn, dfd)
7 10
8 11
12 +
def get_q_crit(k, df, alpha=0.05):
13 +
    return qsturng(1 - alpha, k, df)
14 +
15 +
16 +
def get_t_value(y1, y2, sigma, n1, n2):
17 +
    return (y2 - y1) / (sigma * np.sqrt((1 / n1) + (1 / n2)))
18 +
19 +
9 20
def create_anova_table():
10 21
    float_format = ".4"
11 22
@@ -24,3 +35,38 @@
Loading
24 35
        "p value",
25 36
    ]
26 37
    return table
38 +
39 +
40 +
def create_multi_comparisons_table():
41 +
    float_format = " .4"
42 +
43 +
    table = PrettyTable()
44 +
    table.float_format["t statistic"] = float_format
45 +
46 +
    table.field_names = ["Treatment", "t statistic", ""]
47 +
    return table
48 +
49 +
50 +
def multiple_comparisons(treatments, treatments_data, error_dof, sigma_error, alpha=0.05):
51 +
    treatment_map = {t: d for t, d in zip(treatments, treatments_data)}
52 +
    treatment_means = {t: (np.average(d), len(d)) for t, d in treatment_map.items()}
53 +
54 +
    k = len(treatment_means)
55 +
56 +
    q_crit = get_q_crit(k, error_dof, alpha) / np.sqrt(2)
57 +
58 +
    comparisons_list = list(combinations(treatments, 2))
59 +
60 +
    t_values = {}
61 +
    for pair in comparisons_list:
62 +
        value1, degree1 = treatment_means[pair[0]]
63 +
        value2, degree2 = treatment_means[pair[1]]
64 +
        t = get_t_value(value1, value2, sigma_error, degree1, degree2)
65 +
        t_values[pair] = (t, "Significant" if abs(t) > q_crit else "Not Significant")
66 +
67 +
    table = create_multi_comparisons_table()
68 +
    sorted_t_values = {k: v for k, v in sorted(t_values.items(), key=lambda item: item[0])}
69 +
    for comp, t in sorted_t_values.items():
70 +
        table.add_row(["{} vs {}".format(*comp), *t])
71 +
72 +
    return table

@@ -1,6 +1,6 @@
Loading
1 1
import numpy as np
2 2
3 -
from .utils import p_value, create_anova_table
3 +
from .utils import p_value, create_anova_table, multiple_comparisons
4 4
5 5
6 6
class CompletelyRandomizedDesign:
@@ -35,6 +35,17 @@
Loading
35 35
        self.table = self._create_table()
36 36
        print(self.table)
37 37
38 +
    def multiple_comparisons(self):
39 +
        # Display multiple comparisons result
40 +
        print(
41 +
            multiple_comparisons(
42 +
                list(range(1, len(self.entries) + 1)),
43 +
                self.entries,
44 +
                self.dof_error,
45 +
                np.sqrt(self.mss_error),
46 +
            )
47 +
        )
48 +
38 49
    def _create_table(self):
39 50
        table = create_anova_table()
40 51

@@ -1,6 +1,6 @@
Loading
1 1
import numpy as np
2 2
3 -
from .utils import p_value, create_anova_table
3 +
from .utils import p_value, create_anova_table, multiple_comparisons
4 4
5 5
6 6
class RandomizedCompleteBlockDesign:
@@ -49,6 +49,19 @@
Loading
49 49
        self.table = self._create_table()
50 50
        print(self.table)
51 51
52 +
    def multiple_comparisons(self):
53 +
        # Multiple comparisons
54 +
        n_treatments, _ = self.data.shape
55 +
56 +
        print(
57 +
            multiple_comparisons(
58 +
                list(range(1, n_treatments + 1)),
59 +
                self.data,
60 +
                self.dof_error,
61 +
                np.sqrt(self.mss_error),
62 +
            )
63 +
        )
64 +
52 65
    def _create_table(self):
53 66
        table = create_anova_table()
54 67

@@ -1,10 +1,15 @@
Loading
1 1
import numpy as np
2 2
3 -
from .utils import p_value, create_anova_table
3 +
from .utils import (
4 +
    p_value,
5 +
    create_anova_table,
6 +
    multiple_comparisons,
7 +
)
4 8
5 9
6 10
class LatinSquare:
7 -
    def __init__(self, treatments_order, treatments_values):
11 +
    def __init__(self, treatments_order, treatments_values, alpha=0.05):
12 +
        self.alpha = alpha
8 13
        self.treatments = list()
9 14
        self.treatments_order = np.array(treatments_order)
10 15
        self.treatments_values = np.array(treatments_values)
@@ -80,6 +85,14 @@
Loading
80 85
        self.table = self._create_table()
81 86
        print(self.table)
82 87
88 +
    def multiple_comparisons(self):
89 +
        # Display multiple comparisons result
90 +
        print(
91 +
            multiple_comparisons(
92 +
                self.treatments, self.treatments_data, self.dof_error, np.sqrt(self.mss_error)
93 +
            )
94 +
        )
95 +
83 96
    def _validate_treatments_order(self):
84 97
        for row in self.treatments_order:
85 98
            self.treatments = list(set(self.treatments + list(row)))
Files Coverage
doex 100.00%
Project Totals (6 files) 100.00%
codecov-umbrella
Build #317381988 -
unittests
codecov-umbrella
Build #317381988 -
unittests
codecov-umbrella
Build #317381988 -
unittests

No yaml found.

Create your codecov.yml to customize your Codecov experience

Sunburst
The inner-most circle is the entire project, moving away from the center are folders then, finally, a single file. The size and color of each slice is representing the number of statements and the coverage, respectively.
Icicle
The top section represents the entire project. Proceeding with folders and finally individual files. The size and color of each slice is representing the number of statements and the coverage, respectively.
Grid
Each block represents a single file in the project. The size and color of each block is represented by the number of statements and the coverage, respectively.
Loading