Overall I think the old math-statistics functioned well and I would not be
inclined to mess with the old object hierarchy without reason. But there
are some strange design choices in this code. Mean() is used here as an
example.
1) In Mean() the two constructors create a FirstMoment() object:
--
/** Constructs a Mean. */
public Mean() {
incMoment = true;
moment = new FirstMoment();
}
/**
* Constructs a Mean with an External Moment.
*
* @param m1 the moment
*/
public Mean(final FirstMoment m1) {
this.moment = m1;
incMoment = false;
}
--
And then this moment object, as far as I can tell, is never used in the
mean calculation at all:
---
@Override
public double evaluate(final double[] values, final int begin, final
int length)
throws MathIllegalArgumentException {
if (MathArrays.verifyValues(values, begin, length)) {
Sum sum = new Sum();
double sampleSize = length;
// Compute initial estimate using definitional formula
double xbar = sum.evaluate(values, begin, length) / sampleSize;
// Compute correction factor in second pass
double correction = 0;
for (int i = begin; i < begin + length; i++) {
correction += values[i] - xbar;
}
return xbar + (correction/sampleSize);
}
return Double.NaN;
}
---
FirstMoment just seems to be in the constructor for its own sake.
I think it would make more sense to at the very least make Mean and
similar classes very lean, and see if there are any use cases for which
this is not sufficient.
2)
Mean extends AbstractStorelessUnivariateStatistics. I have no problem with
the class being Storeless, which I think means immutable. But, in that case
the methods might as well be static. However the old grammar of
new Mean().evaluate()
is only marginally different from what the static grammar would be:
Mean.evaluate
-Eric