statistical_tests_rs/
lib.rs

1pub struct SampleStatistics {
2    pub sample_mean: f64,
3    pub standard_error: f64,
4    pub n: usize,
5}
6
7pub struct PopulationStatistics {
8    pub population_mean: f64,
9    pub standard_error: f64,
10    pub n: usize,
11}
12
13pub trait GetStatistics {
14    fn from_array(array: &[f64]) -> Self;
15}
16
17impl GetStatistics for SampleStatistics {
18    fn from_array(array: &[f64]) -> Self {
19        let n = array.len();
20        let sample_mean = mean(&array);
21        let standard_error = sample_standard_deviation(&array);
22
23        SampleStatistics {
24            sample_mean,
25            standard_error,
26            n,
27        }
28    }
29}
30
31impl GetStatistics for PopulationStatistics {
32    fn from_array(array: &[f64]) -> Self {
33        let n = array.len();
34        let population_mean = mean(&array);
35        let standard_error = population_standard_deviation(&array);
36
37        PopulationStatistics {
38            population_mean,
39            standard_error,
40            n,
41        }
42    }
43}
44
45pub struct Population {
46    pub population: [f64],
47}
48
49pub struct Sample {
50    pub sample: [f64],
51}
52
53trait StandDev {
54    fn standard_deviation(array: &[f64]) -> f64;
55}
56
57impl StandDev for Population {
58    fn standard_deviation(array: &[f64]) -> f64 {
59        let n = array.len();
60        let p_mean = mean(&array);
61
62        let mut sum = 0.0;
63        for xi in array.into_iter() {
64            sum += f64::powf(xi - p_mean, 2.0)
65        }
66
67        sum = sum / (n as f64);
68        sum.sqrt()
69    }
70}
71
72impl StandDev for Sample {
73    fn standard_deviation(array: &[f64]) -> f64 {
74        let n = array.len();
75        let s_mean = mean(&array);
76
77        let mut sum = 0.0;
78        for xi in array.into_iter() {
79            sum += f64::powf(xi - s_mean, 2.0)
80        }
81
82        sum = sum / (n as f64 - 1.0);
83        sum.sqrt()
84    }
85}
86
87pub fn mean(list: &[f64]) -> f64 {
88    let sum: f64 = Iterator::sum(list.iter());
89    f64::from(sum) / (list.len() as f64)
90}
91
92pub fn sample_standard_deviation(array: &[f64]) -> f64 {
93    let n = array.len();
94    let s_mean = mean(&array);
95
96    let mut sum = 0.0;
97    for xi in array.into_iter() {
98        sum += f64::powf(xi - s_mean, 2.0) as f64;
99    }
100
101    sum = sum / (n as f64 - 1.0);
102    sum.sqrt()
103}
104
105pub fn population_standard_deviation(array: &[f64]) -> f64 {
106    let n = array.len();
107    let p_mean = mean(&array);
108
109    let mut sum = 0.0;
110    for xi in array.into_iter() {
111        sum += f64::powf(xi - p_mean, 2.0) as f64;
112    }
113
114    sum = sum / (n as f64);
115    sum.sqrt()
116}
117
118pub struct TTestResult {
119    pub t: f64,
120    pub p_value: f64,
121}
122
123pub fn two_samp_t_test(samp_1: SampleStatistics, samp_2: SampleStatistics) -> TTestResult {
124    let mean_delta = samp_1.sample_mean - samp_2.sample_mean;
125    let stand =
126        (samp_1.standard_error / samp_1.n as f64) + (samp_2.standard_error / samp_2.n as f64);
127    let t = mean_delta / stand.sqrt();
128
129    // TODO: use t cdf for p_value
130    let p_value: f64 = 0.05;
131
132    return TTestResult { t, p_value };
133}
134
135#[cfg(test)]
136mod tests {
137    use super::*;
138
139    #[test]
140    fn mean_test() {
141        assert!(mean(&[1.0]) == 1.0);
142        assert!(mean(&[1.0, 3.0]) == 2.0);
143    }
144
145    #[test]
146    fn sample_standard_deviation_test() {
147        assert_eq!(
148            sample_standard_deviation(&[1.0, 2.0, 3.0, 5.5, 7.7]),
149            2.73001831495688
150        );
151
152        assert_eq!(sample_standard_deviation(&[1.0, 2.0, 3.0]), 1.0);
153    }
154
155    #[test]
156    fn population_standard_deviation_test() {
157        assert_eq!(
158            population_standard_deviation(&[1.0, 2.0, 3.0, 5.5, 7.7]),
159            2.4418026128252057
160        );
161
162        assert_eq!(
163            population_standard_deviation(&[1.0, 2.0, 3.0]),
164            0.816496580927726
165        );
166    }
167
168    #[test]
169    fn pop_stats_from_array_test() {
170        let pop = PopulationStatistics::from_array(&[1.0, 5.5, 7.7, 8.9]);
171        assert_eq!(pop.n, 4);
172        assert_eq!(pop.standard_error, 3.0144443932506038);
173        assert_eq!(pop.population_mean, 5.775);
174    }
175
176    #[test]
177    fn samp_stats_from_array_test() {
178        let samp = SampleStatistics::from_array(&[1.0, 5.5, 7.7, 8.9]);
179        assert_eq!(samp.n, 4);
180        assert_eq!(samp.standard_error, 3.4807805638007885);
181        assert_eq!(samp.sample_mean, 5.775);
182    }
183}