/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.regression; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals; import org.testng.annotations.Test; import cern.jet.random.engine.MersenneTwister; import cern.jet.random.engine.RandomEngine; import com.opengamma.analytics.math.function.Function2D; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class LeastSquaresRegressionResultTest { private static final LeastSquaresRegression REGRESSION = new OrdinaryLeastSquaresRegression(); private static final RandomEngine RANDOM = new MersenneTwister(MersenneTwister.DEFAULT_SEED); private static final LeastSquaresRegressionResult NO_INTERCEPT; private static final LeastSquaresRegressionResult INTERCEPT; private static final double BETA_0 = 3.9; private static final double BETA_1 = -1.4; private static final double BETA_2 = 4.6; private static final Function2D<Double, Double> F1 = new Function2D<Double, Double>() { @Override public Double evaluate(final Double x1, final Double x2) { return x1 * BETA_1 + x2 * BETA_2; } }; private static final Function2D<Double, Double> F2 = new Function2D<Double, Double>() { @Override public Double evaluate(final Double x1, final Double x2) { return BETA_0 + x1 * BETA_1 + x2 * BETA_2; } }; private static final double EPS = 1e-9; static { final int n = 100; final double[][] x = new double[n][2]; final double[] y1 = new double[n]; final double[] y2 = new double[n]; for (int i = 0; i < n; i++) { x[i][0] = RANDOM.nextDouble(); x[i][1] = RANDOM.nextDouble(); y1[i] = F1.evaluate(x[i][0], x[i][1]); y2[i] = F2.evaluate(x[i][0], x[i][1]); } NO_INTERCEPT = REGRESSION.regress(x, null, y1, false); INTERCEPT = REGRESSION.regress(x, null, y2, true); } @Test(expectedExceptions = IllegalArgumentException.class) public void testInputs() { new LeastSquaresRegressionResult(null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullArray() { NO_INTERCEPT.getPredictedValue(null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testLongArray() { NO_INTERCEPT.getPredictedValue(new double[] {2.4, 2.5, 3.4}); } @Test(expectedExceptions = IllegalArgumentException.class) public void testShortArray() { NO_INTERCEPT.getPredictedValue(new double[] {2.4}); } @Test public void testPredictedValue() { double[] z; for (int i = 0; i < 10; i++) { z = new double[] {RANDOM.nextDouble(), RANDOM.nextDouble()}; assertEquals(F1.evaluate(z[0], z[1]), NO_INTERCEPT.getPredictedValue(z), EPS); assertEquals(F2.evaluate(z[0], z[1]), INTERCEPT.getPredictedValue(z), EPS); } } @Test public void testEqualsAndHashCode() { final double[] residuals = new double[] {1, 2, 3}; final double[] betas = new double[] {1.1, 2.1, 3.1}; final double meanSquareError = 0.78; final double[] standardErrorOfBeta = new double[] {1.2, 2.2, 3.2}; final double rSquared = 0.98; final double rSquaredAdjusted = 0.96; final double[] tStats = new double[] {1.3, 2.3, 3.3}; final double[] pValues = new double[] {1.4, 2.4, 3.4}; final boolean hasIntercept = false; final LeastSquaresRegressionResult result = new LeastSquaresRegressionResult(betas, residuals, meanSquareError, standardErrorOfBeta, rSquared, rSquaredAdjusted, tStats, pValues, hasIntercept); LeastSquaresRegressionResult other = new LeastSquaresRegressionResult(result); assertEquals(result, other); assertEquals(result.hashCode(), other.hashCode()); other = new LeastSquaresRegressionResult(betas, residuals, meanSquareError, standardErrorOfBeta, rSquared, rSquaredAdjusted, tStats, pValues, hasIntercept); assertEquals(result, other); assertEquals(result.hashCode(), other.hashCode()); final double[] x = new double[] {1.5, 2.5, 3.5}; other = new LeastSquaresRegressionResult(x, residuals, meanSquareError, standardErrorOfBeta, rSquared, rSquaredAdjusted, tStats, pValues, hasIntercept); assertFalse(result.equals(other)); other = new LeastSquaresRegressionResult(betas, x, meanSquareError, standardErrorOfBeta, rSquared, rSquaredAdjusted, tStats, pValues, hasIntercept); assertFalse(result.equals(other)); other = new LeastSquaresRegressionResult(betas, residuals, meanSquareError + 1, standardErrorOfBeta, rSquared, rSquaredAdjusted, tStats, pValues, hasIntercept); assertFalse(result.equals(other)); other = new LeastSquaresRegressionResult(betas, residuals, meanSquareError, x, rSquared, rSquaredAdjusted, tStats, pValues, hasIntercept); assertFalse(result.equals(other)); other = new LeastSquaresRegressionResult(betas, residuals, meanSquareError, standardErrorOfBeta, rSquared + 1, rSquaredAdjusted, tStats, pValues, hasIntercept); assertFalse(result.equals(other)); other = new LeastSquaresRegressionResult(betas, residuals, meanSquareError, standardErrorOfBeta, rSquared, rSquaredAdjusted + 1, tStats, pValues, hasIntercept); assertFalse(result.equals(other)); other = new LeastSquaresRegressionResult(betas, residuals, meanSquareError, standardErrorOfBeta, rSquared, rSquaredAdjusted, x, pValues, hasIntercept); assertFalse(result.equals(other)); other = new LeastSquaresRegressionResult(betas, residuals, meanSquareError, standardErrorOfBeta, rSquared, rSquaredAdjusted, tStats, x, hasIntercept); assertFalse(result.equals(other)); other = new LeastSquaresRegressionResult(betas, residuals, meanSquareError, standardErrorOfBeta, rSquared, rSquaredAdjusted, tStats, pValues, !hasIntercept); assertFalse(result.equals(other)); } @Test public void testGetters() { final double[] residuals = new double[] {1, 2, 3}; final double[] betas = new double[] {1.1, 2.1, 3.1}; final double meanSquareError = 0.78; final double[] standardErrorOfBeta = new double[] {1.2, 2.2, 3.2}; final double rSquared = 0.98; final double rSquaredAdjusted = 0.96; final double[] tStats = new double[] {1.3, 2.3, 3.3}; final double[] pValues = new double[] {1.4, 2.4, 3.4}; final boolean hasIntercept = false; final LeastSquaresRegressionResult result = new LeastSquaresRegressionResult(betas, residuals, meanSquareError, standardErrorOfBeta, rSquared, rSquaredAdjusted, tStats, pValues, hasIntercept); assertEquals(result.getAdjustedRSquared(), rSquaredAdjusted, 0); assertArrayEquals(result.getBetas(), betas, 0); assertEquals(result.getMeanSquareError(), meanSquareError, 0); assertArrayEquals(result.getPValues(), pValues, 0); assertArrayEquals(result.getResiduals(), residuals, 0); assertEquals(result.getRSquared(), rSquared, 0); assertArrayEquals(result.getStandardErrorOfBetas(), standardErrorOfBeta, 0); assertArrayEquals(result.getTStatistics(), tStats, 0); } }