package com.opendoorlogistics.core.utils.stats;
public class Statistics {
public static double ROUND_ERROR = 0.00000001;
private double count;
private double mean;
private double populationStdDev;
private double sampleStdDev;
private double skew;
public Statistics() {
}
public Statistics(double count, double sum, double sum2) {
this(count, sum, sum2, false);
}
public Statistics(double count, double sum, double sum2, boolean forceZeroStdDev) {
this.count = count;
this.mean = sum / count;
if (!forceZeroStdDev) {
double meanOfSqd = sum2 / count;
double diff = meanOfSqd - mean * mean;
assert diff > -ROUND_ERROR;
if (diff >= 0) {
populationStdDev = Math.sqrt(diff);
}
if (count>1){
if (diff >= 0) {
sampleStdDev = Math.sqrt(diff*count/(count-1));
}
}else{
populationStdDev = Double.POSITIVE_INFINITY;
}
}
}
public Statistics(double count, double sum, double sum2, double sum3) {
this(count, sum, sum2, sum3, false);
}
public Statistics(double count, double sum, double sum2, double sum3, boolean forceZeroStdDev) {
this(count, sum, sum2, forceZeroStdDev);
if (count > 0 && populationStdDev > ROUND_ERROR) {
// From http://en.wikipedia.org/wiki/Skewness#Definition
skew = sum3 / count - 3 * mean * populationStdDev * populationStdDev - mean * mean * mean;
skew /= populationStdDev * populationStdDev * populationStdDev;
}
}
public static Statistics Create(Iterable<Double> doubleList) {
double count = 0;
double sum = 0;
double sum2 = 0;
for (Double d : doubleList) {
count++;
sum += d;
sum2 += d * d;
}
return new Statistics(count, sum, sum2);
}
/**
* Return the mean value for the input array
*
* @param arr
* @return
*/
public static double Mean(double[] arr) {
double sum = Sum(arr);
if (arr.length > 0) {
sum /= arr.length;
}
return sum;
}
/**
* Return the sum of the input array
*
* @param arr
* @return
*/
public static double Sum(double[] arr) {
double sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
/**
* Calculate the sample standard deviation (sample std. dev divides by n-1.
* population std. dev divides by n)
*
* @param arr
* @return
*/
public static double SampleStandardDev(double[] arr) {
double mean = Mean(arr);
double sum = 0;
for (int i = 0; i < arr.length; i++) {
double temp = arr[i] - mean;
temp *= temp;
sum += temp;
}
if (arr.length > 1) {
double variance = sum / (arr.length - 1);
return Math.sqrt(variance);
}
else {
return 0;
}
}
@Override
public String toString() {
return "_count=" + count + ",_mean=" + mean + ", _sampleStdDev=" + sampleStdDev + ", _skew=" + skew;
}
public double getCount() {
return count;
}
public double getMean() {
return mean;
}
public double getPopulationStdDev() {
return populationStdDev;
}
public double getSampleStdDev() {
return sampleStdDev;
}
public double getSkew() {
return skew;
}
// public String meanStdToString(int nbDp){
// return Strings.ToString(_mean, nbDp) + "+-" + Strings.ToString(_sampleStdDev, nbDp);
// }
//
}