1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math4.legacy.stat.correlation;
18
19 import org.apache.commons.math4.legacy.TestUtils;
20 import org.apache.commons.math4.legacy.exception.MathIllegalArgumentException;
21 import org.apache.commons.math4.legacy.exception.NotStrictlyPositiveException;
22 import org.apache.commons.math4.legacy.linear.Array2DRowRealMatrix;
23 import org.apache.commons.math4.legacy.linear.RealMatrix;
24 import org.apache.commons.math4.legacy.stat.descriptive.moment.Variance;
25 import org.junit.Assert;
26 import org.junit.Test;
27
28
29 public class CovarianceTest {
30
31 protected final double[] longleyData = new double[] {
32 60323,83.0,234289,2356,1590,107608,1947,
33 61122,88.5,259426,2325,1456,108632,1948,
34 60171,88.2,258054,3682,1616,109773,1949,
35 61187,89.5,284599,3351,1650,110929,1950,
36 63221,96.2,328975,2099,3099,112075,1951,
37 63639,98.1,346999,1932,3594,113270,1952,
38 64989,99.0,365385,1870,3547,115094,1953,
39 63761,100.0,363112,3578,3350,116219,1954,
40 66019,101.2,397469,2904,3048,117388,1955,
41 67857,104.6,419180,2822,2857,118734,1956,
42 68169,108.4,442769,2936,2798,120445,1957,
43 66513,110.8,444546,4681,2637,121950,1958,
44 68655,112.6,482704,3813,2552,123366,1959,
45 69564,114.2,502601,3931,2514,125368,1960,
46 69331,115.7,518173,4806,2572,127852,1961,
47 70551,116.9,554894,4007,2827,130081,1962
48 };
49
50 protected final double[] swissData = new double[] {
51 80.2,17.0,15,12,9.96,
52 83.1,45.1,6,9,84.84,
53 92.5,39.7,5,5,93.40,
54 85.8,36.5,12,7,33.77,
55 76.9,43.5,17,15,5.16,
56 76.1,35.3,9,7,90.57,
57 83.8,70.2,16,7,92.85,
58 92.4,67.8,14,8,97.16,
59 82.4,53.3,12,7,97.67,
60 82.9,45.2,16,13,91.38,
61 87.1,64.5,14,6,98.61,
62 64.1,62.0,21,12,8.52,
63 66.9,67.5,14,7,2.27,
64 68.9,60.7,19,12,4.43,
65 61.7,69.3,22,5,2.82,
66 68.3,72.6,18,2,24.20,
67 71.7,34.0,17,8,3.30,
68 55.7,19.4,26,28,12.11,
69 54.3,15.2,31,20,2.15,
70 65.1,73.0,19,9,2.84,
71 65.5,59.8,22,10,5.23,
72 65.0,55.1,14,3,4.52,
73 56.6,50.9,22,12,15.14,
74 57.4,54.1,20,6,4.20,
75 72.5,71.2,12,1,2.40,
76 74.2,58.1,14,8,5.23,
77 72.0,63.5,6,3,2.56,
78 60.5,60.8,16,10,7.72,
79 58.3,26.8,25,19,18.46,
80 65.4,49.5,15,8,6.10,
81 75.5,85.9,3,2,99.71,
82 69.3,84.9,7,6,99.68,
83 77.3,89.7,5,2,100.00,
84 70.5,78.2,12,6,98.96,
85 79.4,64.9,7,3,98.22,
86 65.0,75.9,9,9,99.06,
87 92.2,84.6,3,3,99.46,
88 79.3,63.1,13,13,96.83,
89 70.4,38.4,26,12,5.62,
90 65.7,7.7,29,11,13.79,
91 72.7,16.7,22,13,11.22,
92 64.4,17.6,35,32,16.92,
93 77.6,37.6,15,7,4.97,
94 67.6,18.7,25,7,8.65,
95 35.0,1.2,37,53,42.34,
96 44.7,46.6,16,29,50.43,
97 42.8,27.7,22,29,58.33
98 };
99
100
101
102
103
104
105
106
107
108
109
110
111 @Test
112 public void testLongley() {
113 RealMatrix matrix = createRealMatrix(longleyData, 16, 7);
114 RealMatrix covarianceMatrix = new Covariance(matrix).getCovarianceMatrix();
115 double[] rData = new double[] {
116 12333921.73333333246, 3.679666000000000e+04, 343330206.333333313,
117 1649102.666666666744, 1117681.066666666651, 23461965.733333334, 16240.93333333333248,
118 36796.66000000000, 1.164576250000000e+02, 1063604.115416667,
119 6258.666250000000, 3490.253750000000, 73503.000000000, 50.92333333333334,
120 343330206.33333331347, 1.063604115416667e+06, 9879353659.329166412,
121 56124369.854166664183, 30880428.345833335072, 685240944.600000024, 470977.90000000002328,
122 1649102.66666666674, 6.258666250000000e+03, 56124369.854166664,
123 873223.429166666698, -115378.762499999997, 4462741.533333333, 2973.03333333333330,
124 1117681.06666666665, 3.490253750000000e+03, 30880428.345833335,
125 -115378.762499999997, 484304.095833333326, 1764098.133333333, 1382.43333333333339,
126 23461965.73333333433, 7.350300000000000e+04, 685240944.600000024,
127 4462741.533333333209, 1764098.133333333302, 48387348.933333330, 32917.40000000000146,
128 16240.93333333333, 5.092333333333334e+01, 470977.900000000,
129 2973.033333333333, 1382.433333333333, 32917.40000000, 22.66666666666667
130 };
131
132 TestUtils.assertEquals("covariance matrix", createRealMatrix(rData, 7, 7), covarianceMatrix, 10E-9);
133 }
134
135
136
137
138
139 @Test
140 public void testSwissFertility() {
141 RealMatrix matrix = createRealMatrix(swissData, 47, 5);
142 RealMatrix covarianceMatrix = new Covariance(matrix).getCovarianceMatrix();
143 double[] rData = new double[] {
144 156.0424976873265, 100.1691489361702, -64.36692876965772, -79.7295097132285, 241.5632030527289,
145 100.169148936170251, 515.7994172062905, -124.39283071230344, -139.6574005550416, 379.9043755781684,
146 -64.3669287696577, -124.3928307123034, 63.64662349676226, 53.5758556891767, -190.5606105457909,
147 -79.7295097132285, -139.6574005550416, 53.57585568917669, 92.4560592044403, -61.6988297872340,
148 241.5632030527289, 379.9043755781684, -190.56061054579092, -61.6988297872340, 1739.2945371877890
149 };
150
151 TestUtils.assertEquals("covariance matrix", createRealMatrix(rData, 5, 5), covarianceMatrix, 10E-13);
152 }
153
154
155
156
157 @Test
158 public void testConstant() {
159 double[] noVariance = new double[] {1, 1, 1, 1};
160 double[] values = new double[] {1, 2, 3, 4};
161 Assert.assertEquals(0d, new Covariance().covariance(noVariance, values, true), Double.MIN_VALUE);
162 Assert.assertEquals(0d, new Covariance().covariance(noVariance, noVariance, true), Double.MIN_VALUE);
163 }
164
165
166
167
168 @Test
169 public void testOneColumn() {
170 RealMatrix cov = new Covariance(new double[][] {{1}, {2}}, false).getCovarianceMatrix();
171 Assert.assertEquals(1, cov.getRowDimension());
172 Assert.assertEquals(1, cov.getColumnDimension());
173 Assert.assertEquals(0.25, cov.getEntry(0, 0), 1.0e-15);
174 }
175
176
177
178
179 @Test
180 public void testInsufficientData() {
181 double[] one = new double[] {1};
182 double[] two = new double[] {2};
183 try {
184 new Covariance().covariance(one, two, false);
185 Assert.fail("Expecting MathIllegalArgumentException");
186 } catch (MathIllegalArgumentException ex) {
187
188 }
189 try {
190 new Covariance(new double[][] {{},{}});
191 Assert.fail("Expecting NotStrictlyPositiveException");
192 } catch (NotStrictlyPositiveException ex) {
193
194 }
195 }
196
197
198
199
200
201 @Test
202 public void testConsistency() {
203 final RealMatrix matrix = createRealMatrix(swissData, 47, 5);
204 final RealMatrix covarianceMatrix = new Covariance(matrix).getCovarianceMatrix();
205
206
207 Variance variance = new Variance();
208 for (int i = 0; i < 5; i++) {
209 Assert.assertEquals(variance.evaluate(matrix.getColumn(i)), covarianceMatrix.getEntry(i,i), 10E-14);
210 }
211
212
213 Assert.assertEquals(covarianceMatrix.getEntry(2, 3),
214 new Covariance().covariance(matrix.getColumn(2), matrix.getColumn(3), true), 10E-14);
215 Assert.assertEquals(covarianceMatrix.getEntry(2, 3), covarianceMatrix.getEntry(3, 2), Double.MIN_VALUE);
216
217
218 RealMatrix repeatedColumns = new Array2DRowRealMatrix(47, 3);
219 for (int i = 0; i < 3; i++) {
220 repeatedColumns.setColumnMatrix(i, matrix.getColumnMatrix(0));
221 }
222 RealMatrix repeatedCovarianceMatrix = new Covariance(repeatedColumns).getCovarianceMatrix();
223 double columnVariance = variance.evaluate(matrix.getColumn(0));
224 for (int i = 0; i < 3; i++) {
225 for (int j = 0; j < 3; j++) {
226 Assert.assertEquals(columnVariance, repeatedCovarianceMatrix.getEntry(i, j), 10E-14);
227 }
228 }
229
230
231 double[][] data = matrix.getData();
232 TestUtils.assertEquals("Covariances",
233 covarianceMatrix, new Covariance().computeCovarianceMatrix(data),Double.MIN_VALUE);
234 TestUtils.assertEquals("Covariances",
235 covarianceMatrix, new Covariance().computeCovarianceMatrix(data, true),Double.MIN_VALUE);
236
237 double[] x = data[0];
238 double[] y = data[1];
239 Assert.assertEquals(new Covariance().covariance(x, y),
240 new Covariance().covariance(x, y, true), Double.MIN_VALUE);
241 }
242
243 protected RealMatrix createRealMatrix(double[] data, int nRows, int nCols) {
244 double[][] matrixData = new double[nRows][nCols];
245 int ptr = 0;
246 for (int i = 0; i < nRows; i++) {
247 System.arraycopy(data, ptr, matrixData[i], 0, nCols);
248 ptr += nCols;
249 }
250 return new Array2DRowRealMatrix(matrixData);
251 }
252 }