package statalign.utils;
/**
* Provides simple statistical information such as average and standard deviation for a set of values.
* These are calculated dynamically without storing the data values themselves. The applied formulas
* are optimized for numerical stability.
*
* @author novak.adam
*
*/
public class SimpleStats {
private String name;
private int n;
private double avg; // = 1/n*sum^n{x_i}
private double dsqSum; // = sum^n{(x_i-avg)^2}
private double min = Double.MAX_VALUE;
private double max = Double.MIN_VALUE;
public SimpleStats() {
}
public SimpleStats(String name) {
this.name = name;
}
public void addData(double value) {
double d = value-avg;
n++;
avg += d/n;
dsqSum += (n-1)*d*d/n;
if(value < min) {
min = value;
}
if(value > max) {
max = value;
}
}
public void addData(double[] values) {
for(double value : values) {
addData(value);
}
}
public void addData(int[] values) {
for(int value : values) {
addData(value);
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getN() {
return n;
}
public double getAvg() {
return avg;
}
public double getStdDev() {
if(n <= 1) { // to avoid division by zero
return 0;
}
return Math.sqrt(dsqSum/(n-1));
}
public double getMin() {
return min;
}
public double getMax() {
return max;
}
public void reset() {
n = 0;
avg = 0;
dsqSum = 0;
}
@Override
public String toString() {
String res = "";
if(name != null) {
res = name+": ";
}
return res+"n="+getN()+" avg="+getAvg()+" stddev="+getStdDev()+" min="+min+" max="+max;
}
public static void main(String[] args) {
SimpleStats test = new SimpleStats("test");
test.addData(.5);
test.addData(.10);
test.addData(.7);
System.out.println(test);
test.reset();
System.out.println(test);
test.addData(new double[] {4,5});
System.out.println(test);
}
}