statistical_tests_rs/
lib.rs1pub 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 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}