You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ps...@apache.org on 2008/02/03 23:48:39 UTC

svn commit: r618114 - in /commons/proper/math/trunk: src/java/org/apache/commons/math/stat/inference/TestUtils.java src/test/org/apache/commons/math/stat/inference/TestUtilsTest.java xdocs/userguide/stat.xml

Author: psteitz
Date: Sun Feb  3 14:48:38 2008
New Revision: 618114

URL: http://svn.apache.org/viewvc?rev=618114&view=rev
Log:
Added OneWayAnova methods to TestUtils and updated User Guide
to cover One-way Anova tests.
JIRA: MATH-173

Modified:
    commons/proper/math/trunk/src/java/org/apache/commons/math/stat/inference/TestUtils.java
    commons/proper/math/trunk/src/test/org/apache/commons/math/stat/inference/TestUtilsTest.java
    commons/proper/math/trunk/xdocs/userguide/stat.xml

Modified: commons/proper/math/trunk/src/java/org/apache/commons/math/stat/inference/TestUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/stat/inference/TestUtils.java?rev=618114&r1=618113&r2=618114&view=diff
==============================================================================
--- commons/proper/math/trunk/src/java/org/apache/commons/math/stat/inference/TestUtils.java (original)
+++ commons/proper/math/trunk/src/java/org/apache/commons/math/stat/inference/TestUtils.java Sun Feb  3 14:48:38 2008
@@ -16,6 +16,7 @@
  */
 package org.apache.commons.math.stat.inference;
 
+import java.util.Collection;
 import org.apache.commons.math.MathException;
 import org.apache.commons.math.stat.descriptive.StatisticalSummary;
 
@@ -45,6 +46,10 @@
     private static UnknownDistributionChiSquareTest unknownDistributionChiSquareTest = 
         new ChiSquareTestImpl();
     
+    /** Singleton OneWayAnova instance using default implementation. */
+    private static OneWayAnova oneWayAnova =
+        new OneWayAnovaImpl();
+    
     /**
      * Set the (singleton) TTest instance.
      * 
@@ -103,6 +108,27 @@
     }
     
     /**
+     * Set the (singleton) OneWayAnova instance
+     * 
+     * @param oneWayAnova the new instance to use
+     * @since 1.2
+     */
+    public static void setOneWayAnova(OneWayAnova oneWayAnova) {
+        TestUtils.oneWayAnova = oneWayAnova;
+    }
+    
+    /**
+     * Return a (singleton) OneWayAnova instance.  Does not create a new instance.
+     * 
+     * @return a OneWayAnova instance
+     * @since 1.2
+     */
+    public static OneWayAnova getOneWayAnova() {
+        return oneWayAnova;
+    }
+    
+    
+    /**
      * @see org.apache.commons.math.stat.inference.TTest#homoscedasticT(double[], double[])
      */
     public static double homoscedasticT(double[] sample1, double[] sample2)
@@ -321,6 +347,8 @@
 
     /**
      * @see org.apache.commons.math.stat.inference.UnknownDistributionChiSquareTest#chiSquareDataSetsComparison(long[], long[])
+     *
+     * @since 1.2
      */
     public static double chiSquareDataSetsComparison(long[] observed1, long[] observed2)
         throws IllegalArgumentException {
@@ -329,6 +357,8 @@
 
     /**
      * @see org.apache.commons.math.stat.inference.UnknownDistributionChiSquareTest#chiSquareTestDataSetsComparison(long[], long[])
+     *
+     * @since 1.2
      */
     public static double chiSquareTestDataSetsComparison(long[] observed1, long[] observed2)
         throws IllegalArgumentException, MathException {
@@ -338,12 +368,43 @@
 
     /**
      * @see org.apache.commons.math.stat.inference.UnknownDistributionChiSquareTest#chiSquareTestDataSetsComparison(long[], long[], double)
+     *
+     * @since 1.2
      */
     public static boolean chiSquareTestDataSetsComparison(long[] observed1, long[] observed2,
         double alpha)
         throws IllegalArgumentException, MathException {
         return unknownDistributionChiSquareTest.chiSquareTestDataSetsComparison(observed1, observed2, alpha);
     }
-
+    
+    /**
+     * @see org.apache.commons.math.stat.inference.OneWayAnova#anovaFValue(Collection)
+     *
+     * @since 1.2
+     */
+    public static double oneWayAnovaFValue(Collection categoryData)
+    throws IllegalArgumentException, MathException {
+        return oneWayAnova.anovaFValue(categoryData);
+    }
+    
+    /**
+     * @see org.apache.commons.math.stat.inference.OneWayAnova#anovaPValue(Collection)
+     * 
+     * @since 1.2
+     */
+    public static double oneWayAnovaPValue(Collection categoryData)
+    throws IllegalArgumentException, MathException {
+        return oneWayAnova.anovaPValue(categoryData);
+    }
+    
+    /**
+     * @see org.apache.commons.math.stat.inference.OneWayAnova#anovaTest(Collection,double)
+     *
+     * @since 1.2
+     */
+    public static boolean oneWayAnovaTest(Collection categoryData, double alpha)
+    throws IllegalArgumentException, MathException {
+        return oneWayAnova.anovaTest(categoryData, alpha);
+    }
 
 }

Modified: commons/proper/math/trunk/src/test/org/apache/commons/math/stat/inference/TestUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/inference/TestUtilsTest.java?rev=618114&r1=618113&r2=618114&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/stat/inference/TestUtilsTest.java (original)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/stat/inference/TestUtilsTest.java Sun Feb  3 14:48:38 2008
@@ -16,6 +16,9 @@
  */
 package org.apache.commons.math.stat.inference;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -440,4 +443,26 @@
         assertFalse(TestUtils.pairedTTest(sample1, sample3, .001));
         assertTrue(TestUtils.pairedTTest(sample1, sample3, .002));    
     }
+    
+    private double[] classA =
+      {93.0, 103.0, 95.0, 101.0};
+    private double[] classB =
+      {99.0, 92.0, 102.0, 100.0, 102.0};
+    private double[] classC =
+      {110.0, 115.0, 111.0, 117.0, 128.0};
+    
+    private List classes = new ArrayList();
+    private OneWayAnova oneWayAnova = new OneWayAnovaImpl();
+    
+    public void testOneWayAnovaUtils() throws Exception {
+        classes.add(classA);
+        classes.add(classB);
+        classes.add(classC);
+        assertEquals(oneWayAnova.anovaFValue(classes), 
+                TestUtils.oneWayAnovaFValue(classes), 10E-12);
+        assertEquals(oneWayAnova.anovaPValue(classes), 
+                TestUtils.oneWayAnovaPValue(classes), 10E-12);
+        assertEquals(oneWayAnova.anovaTest(classes, 0.01), 
+                TestUtils.oneWayAnovaTest(classes, 0.01));   
+    } 
 }

Modified: commons/proper/math/trunk/xdocs/userguide/stat.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/xdocs/userguide/stat.xml?rev=618114&r1=618113&r2=618114&view=diff
==============================================================================
--- commons/proper/math/trunk/xdocs/userguide/stat.xml (original)
+++ commons/proper/math/trunk/xdocs/userguide/stat.xml Sun Feb  3 14:48:38 2008
@@ -29,7 +29,7 @@
         <p>
           The statistics package provides frameworks and implementations for
           basic Descriptive statistics, frequency distributions, bivariate regression,
-          and t- and chi-square test statistics.
+          and t-, chi-square and ANOVA test statistics.
         </p>
         <p>
          <a href="#1.2 Descriptive statistics">Descriptive statistics</a><br></br>
@@ -399,30 +399,36 @@
           <a href="../apidocs/org/apache/commons/math/stat/inference/">
           org.apache.commons.math.stat.inference</a> package provide
           <a href="http://www.itl.nist.gov/div898/handbook/prc/section2/prc22.htm">
-          Student's t</a> and
+          Student's t</a>,
           <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda35f.htm">
-          Chi-Square</a> test statistics as well as
+          Chi-Square</a> and 
+          <a href="http://www.itl.nist.gov/div898/handbook/prc/section4/prc43.htm">
+          One-Way ANOVA</a> test statistics as well as
           <a href="http://www.cas.lancs.ac.uk/glossary_v1.1/hyptest.html#pvalue">
-          p-values</a> associated with <code>t-</code> and
-          <code>Chi-Square</code> tests.  The interfaces are
+          p-values</a> associated with <code>t-</code>,
+          <code>Chi-Square</code> and <code>One-Way ANOVA</code> tests.  The
+          interfaces are
           <a href="../apidocs/org/apache/commons/math/stat/inference/TTest.html">
-          TTest</a> and
+          TTest</a>,
           <a href="../apidocs/org/apache/commons/math/stat/inference/ChiSquareTest.html">
-          ChiSquareTest</a>, with
-          provided implementations
+          ChiSquareTest</a>, and
+          <a href="../apidocs/org/apache/commons/math/stat/inference/OneWayAnova.html">
+          OneWayAnova</a> with provided implementations
           <a href="../apidocs/org/apache/commons/math/stat/inference/TTestImpl.html">
-          TTestImpl</a> and
+          TTestImpl</a>,
           <a href="../apidocs/org/apache/commons/math/stat/inference/ChiSquareTestImpl.html">
-          ChiSquareTestImpl</a>.
-          Abstract and default factories are provided, with configuration
-          optional using commons-discovery to specify the concrete factory.  The
+          ChiSquareTestImpl</a> and
+          <a href="../apidocs/org/apache/commons/math/stat/inference/OneWayAnovaImpl.html">
+          OneWayAnovaImpl</a>, respectively.
+          The
           <a href="../apidocs/org/apache/commons/math/stat/inference/TestUtils.html">
           TestUtils</a> class provides static methods to get test instances or
           to compute test statistics directly.  The examples below all use the
           static methods in <code>TestUtils</code> to execute tests.  To get
           test object instances, either use e.g.,
-          <code>TestUtils.getTTest()</code> or use the factory directly, e.g.,
-          <code>TestFactory.newInstance().createChiSquareTest()</code>.
+          <code>TestUtils.getTTest()</code> or use the implementation constructors
+          directly, e.g.,
+          <code>new TTestImpl()</code>.
         </p>
         <p>
           <strong>Implementation Notes</strong>
@@ -448,8 +454,8 @@
           assumptions of the parametric t-test procedure, as discussed
           <a href="http://www.basic.nwu.edu/statguidefiles/ttest_unpaired_ass_viol.html">
           here</a></li>
-          <li>p-values returned by both t- and chi-square tests are exact, based
-           on numerical approximations to the t- and chi-square distributions in the
+          <li>p-values returned by t-, chi-square and Anova tests are exact, based
+           on numerical approximations to the t-, chi-square and F distributions in the
            <code>distributions</code> package. </li>
            <li>p-values returned by t-tests are for two-sided tests and the boolean-valued
            methods supporting fixed significance level tests assume that the hypotheses
@@ -512,6 +518,7 @@
           To test, for example at the 95% level of confidence, use
           <code>alpha = 0.05</code>
           </dd>
+          <br></br>
           <dt><strong>Two-Sample t-tests</strong></dt>
           <br></br>
           <dd><strong>Example 1:</strong> Paired test evaluating
@@ -584,7 +591,8 @@
            replace "t" at the beginning of the method name with "homoscedasticT"
            </p>
            </dd>
-          <dt>Computing <code>chi-square</code> test statistics</dt>
+           <br></br>
+          <dt><strong>Chi-square tests</strong></dt>
           <br></br>
           <dd>To compute a chi-square statistic measuring the agreement between a
           <code>long[]</code> array of observed counts and a <code>double[]</code>
@@ -644,7 +652,41 @@
           The boolean value returned will be <code>true</code> iff the null
           hypothesis can be rejected with confidence <code>1 - alpha</code>.
           </dd>
-          </dl>
+          <br></br>
+          <dt><strong><One-Way Anova tests</strong></dt>
+          <br></br>
+          <dd>To conduct a One-Way Analysis of Variance (ANOVA) to evaluate the
+          null hypothesis that the means of a collection of univariate datasets
+          are the same, start by loading the datasets into a collection, e.g.
+          <source>
+double[] classA =
+   {93.0, 103.0, 95.0, 101.0, 91.0, 105.0, 96.0, 94.0, 101.0 };
+double[] classB =
+   {99.0, 92.0, 102.0, 100.0, 102.0, 89.0 };
+double[] classC =
+   {110.0, 115.0, 111.0, 117.0, 128.0, 117.0 };
+List classes = new ArrayList();
+classes.add(classA);
+classes.add(classB);
+classes.add(classC);
+          </source>
+          Then you can compute ANOVA F- or p-values associated with the
+          null hypothesis that the class means are all the same
+          using a <code>OneWayAnova</code> instance or <code>TestUtils</code>
+          methods:
+          <source>
+double fStatistic = TestUtils.oneWayAnovaFValue(classes); // F-value
+double pValue = TestUtils.oneWayAnovaPValue(classes);     // P-value
+          </source>
+          To test perform a One-Way Anova test with signficance level set at 0.01
+          (so the test will, assuming assumptions are met, reject the null
+          hypothesis incorrectly only about one in 100 times), use
+          <source>
+TestUtils.oneWayAnovaTest(classes, 0.01); // returns a boolean
+                                          // true means reject null hypothesis
+          </source>
+          </dd>
+        </dl>
         </p>
       </subsection>
     </section>