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.correlation;
018    
019    import org.apache.commons.math.TestUtils;
020    import org.apache.commons.math.linear.BlockRealMatrix;
021    import org.apache.commons.math.linear.RealMatrix;
022    
023    /**
024     * Test cases for Spearman's rank correlation
025     * 
026     * @since 2.0
027     * @version $Revision: 799857 $ $Date: 2009-08-01 09:07:12 -0400 (Sat, 01 Aug 2009) $
028     */
029    public class SpearmansRankCorrelationTest extends PearsonsCorrelationTest {
030    
031        @Override
032        protected void setUp() throws Exception {
033            super.setUp();
034        }
035    
036        @Override
037        protected void tearDown() throws Exception {
038            super.tearDown();
039        }
040        
041        /**
042         * Test Longley dataset against R.
043         */
044        @Override
045        public void testLongly() throws Exception {  
046            RealMatrix matrix = createRealMatrix(longleyData, 16, 7);
047            SpearmansCorrelation corrInstance = new SpearmansCorrelation(matrix); 
048            RealMatrix correlationMatrix = corrInstance.getCorrelationMatrix();
049            double[] rData = new double[] {
050                    1, 0.982352941176471, 0.985294117647059, 0.564705882352941, 0.2264705882352941, 0.976470588235294,
051                    0.976470588235294, 0.982352941176471, 1, 0.997058823529412, 0.664705882352941, 0.2205882352941176,
052                    0.997058823529412, 0.997058823529412, 0.985294117647059, 0.997058823529412, 1, 0.638235294117647,
053                    0.2235294117647059, 0.9941176470588236, 0.9941176470588236, 0.564705882352941, 0.664705882352941,
054                    0.638235294117647, 1, -0.3411764705882353, 0.685294117647059, 0.685294117647059, 0.2264705882352941,
055                    0.2205882352941176, 0.2235294117647059, -0.3411764705882353, 1, 0.2264705882352941, 0.2264705882352941,
056                    0.976470588235294, 0.997058823529412, 0.9941176470588236, 0.685294117647059, 0.2264705882352941, 1, 1,
057                    0.976470588235294, 0.997058823529412, 0.9941176470588236, 0.685294117647059, 0.2264705882352941, 1, 1
058            }; 
059            TestUtils.assertEquals("Spearman's correlation matrix", createRealMatrix(rData, 7, 7), correlationMatrix, 10E-15);
060        }
061        
062        /**
063         * Test R swiss fertility dataset.
064         */
065        public void testSwiss() throws Exception {  
066            RealMatrix matrix = createRealMatrix(swissData, 47, 5);
067            SpearmansCorrelation corrInstance = new SpearmansCorrelation(matrix); 
068            RealMatrix correlationMatrix = corrInstance.getCorrelationMatrix();
069            double[] rData = new double[] {
070                    1, 0.2426642769364176, -0.660902996352354, -0.443257690360988, 0.4136455623012432,
071                    0.2426642769364176, 1, -0.598859938748963, -0.650463814145816, 0.2886878090882852,
072                   -0.660902996352354, -0.598859938748963, 1, 0.674603831406147, -0.4750575257171745,
073                   -0.443257690360988, -0.650463814145816, 0.674603831406147, 1, -0.1444163088302244,
074                    0.4136455623012432, 0.2886878090882852, -0.4750575257171745, -0.1444163088302244, 1
075            }; 
076            TestUtils.assertEquals("Spearman's correlation matrix", createRealMatrix(rData, 5, 5), correlationMatrix, 10E-15);
077        }
078        
079        /**
080         * Constant column
081         */
082        @Override
083        public void testConstant() {
084            double[] noVariance = new double[] {1, 1, 1, 1};
085            double[] values = new double[] {1, 2, 3, 4};
086            assertTrue(Double.isNaN(new SpearmansCorrelation().correlation(noVariance, values)));
087        }
088        
089        /**
090         * Insufficient data
091         */ 
092        @Override
093        public void testInsufficientData() {
094            double[] one = new double[] {1};
095            double[] two = new double[] {2};
096            try {
097                new SpearmansCorrelation().correlation(one, two);
098                fail("Expecting IllegalArgumentException");
099            } catch (IllegalArgumentException ex) {
100                // Expected
101            }
102            RealMatrix matrix = new BlockRealMatrix(new double[][] {{0},{1}});
103            try {
104                new SpearmansCorrelation(matrix);
105                fail("Expecting IllegalArgumentException");
106            } catch (IllegalArgumentException ex) {
107                // Expected
108            }
109        }
110        
111        @Override
112        public void testConsistency() {
113            RealMatrix matrix = createRealMatrix(longleyData, 16, 7);
114            SpearmansCorrelation corrInstance = new SpearmansCorrelation(matrix); 
115            double[][] data = matrix.getData();
116            double[] x = matrix.getColumn(0);
117            double[] y = matrix.getColumn(1);
118            assertEquals(new SpearmansCorrelation().correlation(x, y), 
119                    corrInstance.getCorrelationMatrix().getEntry(0, 1), Double.MIN_VALUE);
120            TestUtils.assertEquals("Correlation matrix", corrInstance.getCorrelationMatrix(),
121                    new SpearmansCorrelation().computeCorrelationMatrix(data), Double.MIN_VALUE);
122        }
123        
124        // Not relevant here
125        @Override
126        public void testStdErrorConsistency() throws Exception {}
127        @Override
128        public void testCovarianceConsistency() throws Exception {}
129         
130    }