001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     * 
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.math.stat.inference;
018    
019    import junit.framework.Test;
020    import junit.framework.TestCase;
021    import junit.framework.TestSuite;
022    
023    import java.util.ArrayList;
024    import java.util.List;
025    
026    /**
027     * Test cases for the OneWayAnovaImpl class.
028     *
029     * @version $Revision: 762087 $ $Date: 2009-04-05 10:20:18 -0400 (Sun, 05 Apr 2009) $
030     */
031    
032    public class OneWayAnovaTest extends TestCase {
033    
034        protected OneWayAnova testStatistic = new OneWayAnovaImpl();
035        
036        private double[] emptyArray = {};
037    
038        private double[] classA =
039                {93.0, 103.0, 95.0, 101.0, 91.0, 105.0, 96.0, 94.0, 101.0 };
040        private double[] classB =
041                {99.0, 92.0, 102.0, 100.0, 102.0, 89.0 };
042        private double[] classC =
043                {110.0, 115.0, 111.0, 117.0, 128.0, 117.0 };
044    
045        public OneWayAnovaTest(String name) {
046            super(name);
047        }
048    
049        public static Test suite() {
050            TestSuite suite = new TestSuite(OneWayAnovaTest.class);
051            suite.setName("TestStatistic Tests");
052            return suite;
053        }
054    
055        public void testAnovaFValue() throws Exception {
056            // Target comparison values computed using R version 2.6.0 (Linux version)
057            List<double[]> threeClasses = new ArrayList<double[]>();
058            threeClasses.add(classA);
059            threeClasses.add(classB);
060            threeClasses.add(classC);
061    
062            assertEquals("ANOVA F-value",  24.67361709460624,
063                     testStatistic.anovaFValue(threeClasses), 1E-12);
064    
065            List<double[]> twoClasses = new ArrayList<double[]>();
066            twoClasses.add(classA);
067            twoClasses.add(classB);
068            
069            assertEquals("ANOVA F-value",  0.0150579150579,
070                     testStatistic.anovaFValue(twoClasses), 1E-12);
071    
072            List<double[]> emptyContents = new ArrayList<double[]>();
073            emptyContents.add(emptyArray);
074            emptyContents.add(classC);
075            try {
076                testStatistic.anovaFValue(emptyContents);
077                fail("empty array for key classX, IllegalArgumentException expected");
078            } catch (IllegalArgumentException ex) {
079                // expected
080            }  
081    
082            List<double[]> tooFew = new ArrayList<double[]>();
083            tooFew.add(classA);
084            try {
085                testStatistic.anovaFValue(tooFew);
086                fail("less than two classes, IllegalArgumentException expected");
087            } catch (IllegalArgumentException ex) {
088                // expected
089            }  
090        }
091        
092    
093        public void testAnovaPValue() throws Exception {
094            // Target comparison values computed using R version 2.6.0 (Linux version)
095            List<double[]> threeClasses = new ArrayList<double[]>();
096            threeClasses.add(classA);
097            threeClasses.add(classB);
098            threeClasses.add(classC);
099    
100            assertEquals("ANOVA P-value", 6.959446E-06,
101                     testStatistic.anovaPValue(threeClasses), 1E-12);
102    
103            List<double[]> twoClasses = new ArrayList<double[]>();
104            twoClasses.add(classA);
105            twoClasses.add(classB);
106            
107            assertEquals("ANOVA P-value",  0.904212960464,
108                     testStatistic.anovaPValue(twoClasses), 1E-12);
109    
110        }
111    
112        public void testAnovaTest() throws Exception {
113            // Target comparison values computed using R version 2.3.1 (Linux version)
114            List<double[]> threeClasses = new ArrayList<double[]>();
115            threeClasses.add(classA);
116            threeClasses.add(classB);
117            threeClasses.add(classC);
118    
119            assertTrue("ANOVA Test P<0.01", testStatistic.anovaTest(threeClasses, 0.01));
120    
121            List<double[]> twoClasses = new ArrayList<double[]>();
122            twoClasses.add(classA);
123            twoClasses.add(classB);
124            
125            assertFalse("ANOVA Test P>0.01", testStatistic.anovaTest(twoClasses, 0.01));
126        }
127    
128    }