brentworden 2004/05/03 07:32:25
Modified: math/src/test/org/apache/commons/math/stat/univariate
DescriptiveStatisticsTest.java
math/src/java/org/apache/commons/math/stat/univariate
AbstractDescriptiveStatistics.java
DescriptiveStatistics.java
DescriptiveStatisticsImpl.java
Log:
Added some unit tests for descriptive statistics. Fixed bug dealing with resizing
to infinite window size.
Revision Changes Path
1.3 +85 -1
jakarta-commons/math/src/test/org/apache/commons/math/stat/univariate/DescriptiveStatisticsTest.java
Index: DescriptiveStatisticsTest.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/math/src/test/org/apache/commons/math/stat/univariate/DescriptiveStatisticsTest.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DescriptiveStatisticsTest.java 27 Apr 2004 16:42:32 -0000 1.2
+++ DescriptiveStatisticsTest.java 3 May 2004 14:32:25 -0000 1.3
@@ -19,7 +19,11 @@
import junit.framework.TestCase;
import junit.framework.TestSuite;
+import org.apache.commons.math.MathException;
import org.apache.commons.math.TestUtils;
+import org.apache.commons.math.analysis.UnivariateRealFunction;
+import org.apache.commons.math.analysis.UnivariateRealSolverFactory;
+import org.apache.commons.math.analysis.UnivariateRealSolverUtils;
import org.apache.commons.math.random.RandomData;
import org.apache.commons.math.random.RandomDataImpl;
@@ -340,6 +344,7 @@
}
}
+
public void testNewInstanceStringValid() {
try {
DescriptiveStatistics u = DescriptiveStatistics.newInstance(
@@ -362,6 +367,7 @@
}
}
+
public void testNewInstanceClassValid() {
try {
DescriptiveStatistics u = DescriptiveStatistics.newInstance(
@@ -371,6 +377,84 @@
} catch (Exception ex) {
fail();
}
+ }
+
+ public void testWindowSize() {
+ DescriptiveStatistics u = DescriptiveStatistics.newInstance();
+ u.setWindowSize(1234);
+ assertEquals(1234, u.getWindowSize());
+
+ u.addValue(1.0);
+ u.addValue(2.0);
+ u.addValue(3.0);
+ u.addValue(4.0);
+ u.addValue(5.0);
+ assertEquals(5, u.getN());
+
+ u.setWindowSize(DescriptiveStatistics.INFINITE_WINDOW);
+ assertEquals(5, u.getN());
+ }
+
+ public void testWindowing() {
+ DescriptiveStatistics u = DescriptiveStatistics.newInstance();
+ u.setWindowSize(2);
+
+ u.addValue(1.0);
+ assertEquals(1.0, u.getMean(), tolerance);
+
+ u.addValue(2.0);
+ assertEquals(1.5, u.getMean(), tolerance);
+
+ u.addValue(3.0);
+ assertEquals(2.5, u.getMean(), tolerance);
+
+ u.setWindowSize(1);
+ assertEquals(3.0, u.getMean(), tolerance);
+ }
+
+ public void testGetKurtosis() throws MathException {
+ UnivariateRealFunction f = new UnivariateRealFunction() {
+ public double value(double x) throws MathException {
+ DescriptiveStatistics u = DescriptiveStatistics.newInstance();
+ u.setWindowSize(5);
+
+ u.addValue(1.0);
+ u.addValue(1.5);
+ u.addValue(x);
+ u.addValue(1.5);
+ u.addValue(1.0);
+
+ return u.getKurtosis();
+ }
+ };
+
+ assertEquals(0.0, UnivariateRealSolverUtils.solve(f, 2.0, 2.5), 1.0e-5);
+ }
+
+ public void testKurtosisClass() {
+ DescriptiveStatistics u = DescriptiveStatistics.newInstance();
+ u.setWindowSize(5);
+
+ u.addValue(1.0);
+ u.addValue(1.0);
+ u.addValue(2.0);
+ u.addValue(1.0);
+ u.addValue(1.0);
+ assertEquals(DescriptiveStatistics.LEPTOKURTIC, u.getKurtosisClass());
+
+ u.addValue(1.0);
+ u.addValue(2.0);
+ u.addValue(2.0);
+ u.addValue(2.0);
+ u.addValue(1.0);
+ assertEquals(DescriptiveStatistics.PLATYKURTIC, u.getKurtosisClass());
+//
+// u.addValue(1.0);
+// u.addValue(1.5);
+// u.addValue(2.0912994180548905);
+// u.addValue(1.5);
+// u.addValue(1.0);
+// assertEquals(DescriptiveStatistics.MESOKURTIC, u.getKurtosisClass());
}
}
1.2 +3 -10
jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/AbstractDescriptiveStatistics.java
Index: AbstractDescriptiveStatistics.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/AbstractDescriptiveStatistics.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AbstractDescriptiveStatistics.java 12 Apr 2004 02:27:49 -0000 1.1
+++ AbstractDescriptiveStatistics.java 3 May 2004 14:32:25 -0000 1.2
@@ -39,15 +39,8 @@
/**
* Create an AbstractDescriptiveStatistics
*/
- public AbstractDescriptiveStatistics() {
- }
-
- /**
- * Create an AbstractDescriptiveStatistics with a specific Window
- * @param window WindowSIze for stat calculation
- */
- public AbstractDescriptiveStatistics(int window) {
- setWindowSize(window);
+ protected AbstractDescriptiveStatistics() {
+ super();
}
/**
1.3 +2 -1
jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/DescriptiveStatistics.java
Index: DescriptiveStatistics.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/DescriptiveStatistics.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DescriptiveStatistics.java 23 Apr 2004 19:50:27 -0000 1.2
+++ DescriptiveStatistics.java 3 May 2004 14:32:25 -0000 1.3
@@ -69,6 +69,7 @@
DescriptiveStatistics.class,
"org.apache.commons.math.stat.univariate.DescriptiveStatisticsImpl");
} catch(Exception ex) {
+ ex.printStackTrace();
// ignore as default implementation will be used.
}
return factory;
1.4 +17 -28
jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/DescriptiveStatisticsImpl.java
Index: DescriptiveStatisticsImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/DescriptiveStatisticsImpl.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- DescriptiveStatisticsImpl.java 26 Apr 2004 19:15:48 -0000 1.3
+++ DescriptiveStatisticsImpl.java 3 May 2004 14:32:25 -0000 1.4
@@ -30,7 +30,7 @@
public class DescriptiveStatisticsImpl extends AbstractDescriptiveStatistics
implements Serializable {
/** hold the window size **/
- protected int windowSize = INFINITE_WINDOW;
+ protected int windowSize;
/**
* Stored data values
@@ -41,8 +41,7 @@
* Construct a DescriptiveStatisticsImpl with infinite window
*/
public DescriptiveStatisticsImpl() {
- super();
- eDA = new ContractableDoubleArray();
+ this(INFINITE_WINDOW);
}
/**
@@ -50,8 +49,9 @@
* @param window the finite window size.
*/
public DescriptiveStatisticsImpl(int window) {
- super(window);
+ super();
eDA = new ContractableDoubleArray();
+ setWindowSize(window);
}
/**
@@ -78,15 +78,6 @@
}
/**
- * @see
org.apache.commons.math.stat.univariate.DescriptiveStatistics#getSortedValues()
- */
- public double[] getSortedValues() {
- double[] sort = getValues();
- Arrays.sort(sort);
- return sort;
- }
-
- /**
* @see
org.apache.commons.math.stat.univariate.DescriptiveStatistics#getElement(int)
*/
public double getElement(int index) {
@@ -103,17 +94,12 @@
/**
* @see
org.apache.commons.math.stat.univariate.DescriptiveStatistics#addValue(double)
*/
- public synchronized void addValue(double v) {
+ public void addValue(double v) {
if (windowSize != INFINITE_WINDOW) {
if (getN() == windowSize) {
eDA.addElementRolling(v);
} else if (getN() < windowSize) {
eDA.addElement(v);
- } else {
- String msg =
- "A window Univariate had more element than " +
- "the windowSize. This is an inconsistent state.";
- throw new RuntimeException(msg);
}
} else {
eDA.addElement(v);
@@ -123,20 +109,26 @@
/**
* @see org.apache.commons.math.stat.univariate.DescriptiveStatistics#clear()
*/
- public synchronized void clear() {
+ public void clear() {
eDA.clear();
}
/**
* @see
org.apache.commons.math.stat.univariate.DescriptiveStatistics#setWindowSize(int)
*/
- public synchronized void setWindowSize(int windowSize) {
+ public void setWindowSize(int windowSize) {
+ if (windowSize < 1) {
+ if (windowSize != INFINITE_WINDOW) {
+ throw new IllegalArgumentException("window size must be positive.");
+ }
+ }
+
this.windowSize = windowSize;
// We need to check to see if we need to discard elements
// from the front of the array. If the windowSize is less than
// the current number of elements.
- if (windowSize < eDA.getNumElements()) {
+ if (windowSize != INFINITE_WINDOW && windowSize < eDA.getNumElements()) {
eDA.discardFrontElements(eDA.getNumElements() - windowSize);
}
}
@@ -147,9 +139,6 @@
* @return the computed value of the statistic.
*/
public double apply(UnivariateStatistic stat) {
- if (eDA != null) {
- return stat.evaluate(eDA.getValues(), eDA.start(),
eDA.getNumElements());
- }
- return Double.NaN;
+ return stat.evaluate(eDA.getValues(), eDA.start(), eDA.getNumElements());
}
-}
\ No newline at end of file
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]