View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  /*
19   * This is not the original file distributed by the Apache Software Foundation
20   * It has been modified by the Hipparchus project
21   */
22  package org.hipparchus.stat.correlation;
23  
24  import org.hipparchus.UnitTestUtils;
25  import org.hipparchus.linear.Array2DRowRealMatrix;
26  import org.hipparchus.linear.RealMatrix;
27  import org.hipparchus.random.ISAACRandom;
28  import org.junit.Assert;
29  import org.junit.Test;
30  
31  public class StorelessCovarianceTest {
32  
33      protected final double[] longleyData = new double[] {
34              60323,83.0,234289,2356,1590,107608,1947,
35              61122,88.5,259426,2325,1456,108632,1948,
36              60171,88.2,258054,3682,1616,109773,1949,
37              61187,89.5,284599,3351,1650,110929,1950,
38              63221,96.2,328975,2099,3099,112075,1951,
39              63639,98.1,346999,1932,3594,113270,1952,
40              64989,99.0,365385,1870,3547,115094,1953,
41              63761,100.0,363112,3578,3350,116219,1954,
42              66019,101.2,397469,2904,3048,117388,1955,
43              67857,104.6,419180,2822,2857,118734,1956,
44              68169,108.4,442769,2936,2798,120445,1957,
45              66513,110.8,444546,4681,2637,121950,1958,
46              68655,112.6,482704,3813,2552,123366,1959,
47              69564,114.2,502601,3931,2514,125368,1960,
48              69331,115.7,518173,4806,2572,127852,1961,
49              70551,116.9,554894,4007,2827,130081,1962
50          };
51  
52      protected final double[] swissData = new double[] {
53              80.2,17.0,15,12,9.96,
54              83.1,45.1,6,9,84.84,
55              92.5,39.7,5,5,93.40,
56              85.8,36.5,12,7,33.77,
57              76.9,43.5,17,15,5.16,
58              76.1,35.3,9,7,90.57,
59              83.8,70.2,16,7,92.85,
60              92.4,67.8,14,8,97.16,
61              82.4,53.3,12,7,97.67,
62              82.9,45.2,16,13,91.38,
63              87.1,64.5,14,6,98.61,
64              64.1,62.0,21,12,8.52,
65              66.9,67.5,14,7,2.27,
66              68.9,60.7,19,12,4.43,
67              61.7,69.3,22,5,2.82,
68              68.3,72.6,18,2,24.20,
69              71.7,34.0,17,8,3.30,
70              55.7,19.4,26,28,12.11,
71              54.3,15.2,31,20,2.15,
72              65.1,73.0,19,9,2.84,
73              65.5,59.8,22,10,5.23,
74              65.0,55.1,14,3,4.52,
75              56.6,50.9,22,12,15.14,
76              57.4,54.1,20,6,4.20,
77              72.5,71.2,12,1,2.40,
78              74.2,58.1,14,8,5.23,
79              72.0,63.5,6,3,2.56,
80              60.5,60.8,16,10,7.72,
81              58.3,26.8,25,19,18.46,
82              65.4,49.5,15,8,6.10,
83              75.5,85.9,3,2,99.71,
84              69.3,84.9,7,6,99.68,
85              77.3,89.7,5,2,100.00,
86              70.5,78.2,12,6,98.96,
87              79.4,64.9,7,3,98.22,
88              65.0,75.9,9,9,99.06,
89              92.2,84.6,3,3,99.46,
90              79.3,63.1,13,13,96.83,
91              70.4,38.4,26,12,5.62,
92              65.7,7.7,29,11,13.79,
93              72.7,16.7,22,13,11.22,
94              64.4,17.6,35,32,16.92,
95              77.6,37.6,15,7,4.97,
96              67.6,18.7,25,7,8.65,
97              35.0,1.2,37,53,42.34,
98              44.7,46.6,16,29,50.43,
99              42.8,27.7,22,29,58.33
100         };
101 
102     protected final double[][] longleyDataSimple = {
103         {60323, 83.0},
104         {61122,88.5},
105         {60171, 88.2},
106         {61187, 89.5},
107         {63221, 96.2},
108         {63639, 98.1},
109         {64989, 99.0},
110         {63761, 100.0},
111         {66019, 101.2},
112         {67857, 104.6},
113         {68169, 108.4},
114         {66513, 110.8},
115         {68655, 112.6},
116         {69564, 114.2},
117         {69331, 115.7},
118         {70551, 116.9}
119     };
120 
121     @Test
122     public void testLonglySimpleVar(){
123         double rCov = 12333921.73333333246;
124         StorelessBivariateCovariance cov = new StorelessBivariateCovariance();
125         for(int i=0;i<longleyDataSimple.length;i++){
126             cov.increment(longleyDataSimple[i][0],longleyDataSimple[i][0]);
127         }
128         UnitTestUtils.assertEquals("simple covariance test", rCov, cov.getResult(), 10E-7);
129     }
130 
131     @Test
132     public void testLonglySimpleCov(){
133         double rCov = 36796.660000;
134         StorelessBivariateCovariance cov = new StorelessBivariateCovariance();
135         for(int i=0;i<longleyDataSimple.length;i++){
136             cov.increment(longleyDataSimple[i][0], longleyDataSimple[i][1]);
137         }
138         UnitTestUtils.assertEquals("simple covariance test", rCov, cov.getResult(), 10E-7);
139     }
140 
141     /**
142      * Test Longley dataset against R.
143      * Data Source: J. Longley (1967) "An Appraisal of Least Squares
144      * Programs for the Electronic Computer from the Point of View of the User"
145      * Journal of the American Statistical Association, vol. 62. September,
146      * pp. 819-841.
147      *
148      * Data are from NIST:
149      * <a href="https://www.itl.nist.gov/div898/strd/lls/data/LINKS/DATA/Longley.dat">Longley dataset</a>
150      */
151     @Test
152     public void testLonglyByRow() {
153         RealMatrix matrix = createRealMatrix(longleyData, 16, 7);
154 
155         double[] rData = new double[] {
156          12333921.73333333246, 3.679666000000000e+04, 343330206.333333313,
157          1649102.666666666744, 1117681.066666666651, 23461965.733333334, 16240.93333333333248,
158          36796.66000000000, 1.164576250000000e+02, 1063604.115416667,
159          6258.666250000000, 3490.253750000000, 73503.000000000, 50.92333333333334,
160          343330206.33333331347, 1.063604115416667e+06, 9879353659.329166412,
161          56124369.854166664183, 30880428.345833335072, 685240944.600000024, 470977.90000000002328,
162          1649102.66666666674, 6.258666250000000e+03, 56124369.854166664,
163          873223.429166666698, -115378.762499999997, 4462741.533333333, 2973.03333333333330,
164          1117681.06666666665, 3.490253750000000e+03, 30880428.345833335,
165          -115378.762499999997, 484304.095833333326, 1764098.133333333, 1382.43333333333339,
166          23461965.73333333433, 7.350300000000000e+04, 685240944.600000024,
167          4462741.533333333209, 1764098.133333333302, 48387348.933333330, 32917.40000000000146,
168          16240.93333333333, 5.092333333333334e+01, 470977.900000000,
169          2973.033333333333, 1382.433333333333, 32917.40000000, 22.66666666666667
170         };
171 
172         StorelessCovariance covMatrix = new StorelessCovariance(7);
173         for(int i=0;i<matrix.getRowDimension();i++){
174             covMatrix.increment(matrix.getRow(i));
175         }
176 
177         RealMatrix covarianceMatrix = covMatrix.getCovarianceMatrix();
178 
179         UnitTestUtils.assertEquals("covariance matrix", createRealMatrix(rData, 7, 7), covarianceMatrix, 10E-7);
180 
181     }
182 
183     /**
184      * Test R Swiss fertility dataset against R.
185      * Data Source: R datasets package
186      */
187     @Test
188     public void testSwissFertilityByRow() {
189          RealMatrix matrix = createRealMatrix(swissData, 47, 5);
190 
191          double[] rData = new double[] {
192            156.0424976873265, 100.1691489361702, -64.36692876965772, -79.7295097132285, 241.5632030527289,
193            100.169148936170251, 515.7994172062905, -124.39283071230344, -139.6574005550416, 379.9043755781684,
194            -64.3669287696577, -124.3928307123034, 63.64662349676226, 53.5758556891767, -190.5606105457909,
195            -79.7295097132285, -139.6574005550416, 53.57585568917669, 92.4560592044403, -61.6988297872340,
196             241.5632030527289, 379.9043755781684, -190.56061054579092, -61.6988297872340, 1739.2945371877890
197          };
198 
199         StorelessCovariance covMatrix = new StorelessCovariance(5);
200         for(int i=0;i<matrix.getRowDimension();i++){
201             covMatrix.increment(matrix.getRow(i));
202         }
203 
204         RealMatrix covarianceMatrix = covMatrix.getCovarianceMatrix();
205 
206         UnitTestUtils.assertEquals("covariance matrix", createRealMatrix(rData, 5, 5), covarianceMatrix, 10E-13);
207     }
208 
209     /**
210      * Test symmetry of the covariance matrix
211      */
212     @Test
213     public void testSymmetry() {
214         RealMatrix matrix = createRealMatrix(swissData, 47, 5);
215 
216         final int dimension = 5;
217         StorelessCovariance storelessCov = new StorelessCovariance(dimension);
218         for(int i=0;i<matrix.getRowDimension();i++){
219             storelessCov.increment(matrix.getRow(i));
220         }
221 
222         double[][] covMatrix = storelessCov.getData();
223         for (int i = 0; i < dimension; i++) {
224             for (int j = i; j < dimension; j++) {
225                 Assert.assertEquals(covMatrix[i][j], covMatrix[j][i], 10e-9);
226             }
227         }
228     }
229 
230     /**
231      * Test equality of covariance. chk: covariance of two
232      * samples separately and adds them together. cov: computes
233      * covariance of the combined sample showing both are equal.
234      */
235     @Test
236     public void testEquivalence() {
237         int num_sets = 2;
238         StorelessBivariateCovariance cov = new StorelessBivariateCovariance();// covariance of the superset
239         StorelessBivariateCovariance chk = new StorelessBivariateCovariance();// check covariance made by appending covariance of subsets
240 
241         ISAACRandom rand = new ISAACRandom(10L);// Seed can be changed
242         for (int s = 0; s < num_sets; s++) {// loop through sets of samlpes
243             StorelessBivariateCovariance covs = new StorelessBivariateCovariance();
244             for (int i = 0; i < 5; i++) { // loop through individual samlpes.
245                 double x = rand.nextDouble();
246                 double y = rand.nextDouble();
247                 covs.increment(x, y);// add sample to the subset
248                 cov.increment(x, y);// add sample to the superset
249             }
250            chk.append(covs);
251         }
252 
253         UnitTestUtils.assertEquals("covariance subset test", chk.getResult(), cov.getResult(), 10E-7);
254     }
255 
256     protected RealMatrix createRealMatrix(double[] data, int nRows, int nCols) {
257         double[][] matrixData = new double[nRows][nCols];
258         int ptr = 0;
259         for (int i = 0; i < nRows; i++) {
260             System.arraycopy(data, ptr, matrixData[i], 0, nCols);
261             ptr += nCols;
262         }
263         return new Array2DRowRealMatrix(matrixData);
264     }
265 
266 
267 }
268