mathru/statistics/test/
g.rs

1use crate::{
2    algebra::abstr::Real,
3    special::error::Error,
4    special::gamma::Gamma,
5    statistics::distrib::{ChiSquare, Continuous},
6};
7use std::clone::Clone;
8
9#[cfg(feature = "serde")]
10use serde::{Deserialize, Serialize};
11
12/// G-Test
13///
14/// Fore more information:
15/// <https://de.wikipedia.org/wiki/G-Test>
16///
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18#[derive(Clone, Copy, Debug)]
19pub struct G<T> {
20    df: u32,
21    g: T,
22}
23
24impl<T> G<T>
25where
26    T: Real + Gamma + Error,
27{
28    ///
29    /// \sum_{i}{y_{i}} = n = \sum_i{xs_i}
30    /// b = \sum_{i}{x_{i}}
31    /// k = n/b
32    /// xs_{i} = x{i}*k
33    ///
34    /// x: observation
35    /// y: expectation
36    pub fn test_vector(x: &[T], y: &[T]) -> G<T> {
37        if x.len() != y.len() {
38            panic!();
39        }
40
41        let df: u32 = (x.len() - 1) as u32;
42
43        let mut n: T = T::zero();
44        for y_i in y.iter() {
45            n += *y_i;
46        }
47
48        let mut b: T = T::zero();
49        for x_i in x.iter() {
50            b += *x_i;
51        }
52
53        let k: T = n / b;
54
55        let mut g: T = T::zero();
56
57        for i in 0..x.len() {
58            g += x[i] * (x[i] / (y[i] / k)).ln()
59        }
60
61        G {
62            df,
63            g: T::from_f64(2.0) * g,
64        }
65    }
66
67    pub fn df(&self) -> u32 {
68        self.df
69    }
70
71    pub fn g(&self) -> T {
72        self.g
73    }
74
75    pub fn p_value(&self) -> T {
76        let distrib: ChiSquare<T> = ChiSquare::new(self.df);
77        T::one() - distrib.cdf(self.g)
78    }
79}