ProportionTesting.__init__()   C
last analyzed

Complexity

Conditions 7

Size

Total Lines 24

Duplication

Lines 24
Ratio 100 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 7
dl 24
loc 24
rs 5.5
c 2
b 0
f 0
1
import math
2
import random
3
4
from pysie.stats.distributions import DistributionFamily
5
from scipy.stats import norm, t
6
7
8
class MeanTesting(object):
9
    sampling_distribution = None
10
    p_value_one_tail = None
11
    p_value_two_tail = None
12
    mean_null = None
13
    test_statistic = None
14
    significance_level = None
15
    reject_mean_null = None
16
17
    def __init__(self, sampling_distribution, mean_null, significance_level=None):
18
        self.sampling_distribution = sampling_distribution
19
        self.mean_null = mean_null
20
        if significance_level is not None:
21
            self.significance_level = significance_level
22
23
        if self.sampling_distribution.distribution_family == DistributionFamily.normal:
24
            standard_error_null = sampling_distribution.standard_error
25
            Z = (sampling_distribution.point_estimate - mean_null) / standard_error_null
26
            self.test_statistic = Z
27
            pf = norm.cdf(Z)
28
            if Z < 0:
29
                pf = 1 - pf
30
            self.p_value_one_tail = 1 - pf
31
            self.p_value_two_tail = self.p_value_one_tail * 2
32
        else:
33
            standard_error_null = sampling_distribution.standard_error
34
            td_df = (sampling_distribution.point_estimate - mean_null) / standard_error_null
35
            self.test_statistic = td_df
36
            pf = t.cdf(td_df, sampling_distribution.df)
37
            if td_df < 0:
38
                pf = 1 - pf
39
            self.p_value_one_tail = 1 - pf
40
            self.p_value_two_tail = self.p_value_one_tail * 2
41
42
        if significance_level is not None:
43
            self.reject_mean_null = (self.p_value_one_tail < significance_level,
44
                                     self.p_value_two_tail < significance_level)
45
46
    def will_reject(self, significance_level):
47
48
        return self.p_value_one_tail < significance_level, self.p_value_two_tail < significance_level
49
50
51
class ProportionTesting(object):
52
    sampling_distribution = None
53
    p_value_one_tail = None
54
    p_value_two_tail = None
55
    p_null = None
56
    test_statistic = None
57
    significance_level = None
58
    reject_mean_null = None
59
60 View Code Duplication
    def __init__(self, sampling_distribution, p_null, significance_level=None):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
61
        self.sampling_distribution = sampling_distribution
62
        self.p_null = p_null
63
        if significance_level is not None:
64
            self.significance_level = significance_level
65
66
        if self.sampling_distribution.distribution_family == DistributionFamily.normal:
67
            standard_error_null = math.sqrt(p_null * (1 - p_null) / sampling_distribution.sample_size)
68
            Z = (sampling_distribution.point_estimate - p_null) / standard_error_null
69
            self.test_statistic = Z
70
            pf = norm.cdf(Z)
71
            if Z < 0:
72
                pf = 1 - pf
73
            self.p_value_one_tail = 1 - pf
74
            self.p_value_two_tail = self.p_value_one_tail * 2
75
        else:
76
            simulated_proportions = self.simulate()
77
78
            self.p_value_one_tail = sum(1.0 for x in simulated_proportions if x > sampling_distribution.point_estimate) / 1000.0
79
            self.p_value_two_tail = self.p_value_one_tail
80
81
        if significance_level is not None:
82
            self.reject_mean_null = (self.p_value_one_tail < significance_level,
83
                                     self.p_value_two_tail < significance_level)
84
85
    def simulate(self):
86
        simulated_proportions = [0] * 1000
87
        for i in range(1000):
88
            count = 0
89
            for trials in range(self.sampling_distribution.sample_size):
90
                if random.random() <= self.p_null:
91
                    count += 1
92
            simulated_proportions[i] = float(count) / self.sampling_distribution.sample_size
93
        return sorted(simulated_proportions)
94
95
    def will_reject(self, significance_level):
96
97
        return self.p_value_one_tail < significance_level, self.p_value_two_tail < significance_level
98
99