mathru/statistics/test/
g.rs1use 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#[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 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}