@Test(expectedExceptions = IllegalArgumentException.class) public void testInputs() { new LeastSquaresRegressionResult(null); }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!super.equals(obj)) { return false; } if (getClass() != obj.getClass()) { return false; } NamedVariableLeastSquaresRegressionResult other = (NamedVariableLeastSquaresRegressionResult) obj; if (_independentVariableNames == null) { if (other._independentVariableNames != null) { return false; } } else if (!_independentVariableNames.equals(other._independentVariableNames)) { return false; } if (_result == null) { if (other._result != null) { return false; } } else if (!_result.equals(other._result)) { return false; } return true; } }
public LeastSquaresRegressionResult(LeastSquaresRegressionResult result) { ArgChecker.notNull(result, "regression result"); _betas = result.getBetas(); _residuals = result.getResiduals(); _meanSquareError = result.getMeanSquareError(); _standardErrorOfBeta = result.getStandardErrorOfBetas(); _rSquared = result.getRSquared(); _rSquaredAdjusted = result.getAdjustedRSquared(); _tStats = result.getTStatistics(); _pValues = result.getPValues(); _hasIntercept = result.hasIntercept(); }
public double getPredictedValue(double[] x) { ArgChecker.notNull(x, "x"); double[] betas = getBetas(); if (hasIntercept()) { if (x.length != betas.length - 1) { throw new IllegalArgumentException("Number of variables did not match number used in regression"); } } else { if (x.length != betas.length) { throw new IllegalArgumentException("Number of variables did not match number used in regression"); } } double sum = 0; for (int i = 0; i < (hasIntercept() ? x.length + 1 : x.length); i++) { if (hasIntercept()) { if (i == 0) { sum += betas[0]; } else { sum += betas[i] * x[i - 1]; } } else { sum += x[i] * betas[i]; } } return sum; }
private void assertRegressions(final int n, final int k, final LeastSquaresRegressionResult regression1, final LeastSquaresRegressionResult regression2) { final double[] r1 = regression1.getResiduals(); final double[] r2 = regression2.getResiduals(); for (int i = 0; i < n; i++) { assertEquals(r1[i], r2[i], EPS); } final double[] b1 = regression1.getBetas(); final double[] b2 = regression2.getBetas(); for (int i = 0; i < k; i++) { assertEquals(b1[i], b2[i], EPS); } } }
private void assertRegression(final LeastSquaresRegressionResult result, final double[] a) { final double[] beta = result.getBetas(); final double[] tStat = result.getTStatistics(); final double[] pStat = result.getPValues(); final double[] stdErr = result.getStandardErrorOfBetas(); for (int i = 0; i < 5; i++) { assertEquals(beta[i], a[i], EPS); assertTrue(Math.abs(tStat[i]) > FACTOR); assertTrue(pStat[i] < EPS); assertTrue(stdErr[i] < EPS); } assertEquals(result.getRSquared(), 1, EPS); assertEquals(result.getAdjustedRSquared(), 1, EPS); } }
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));
assertRegression(result1, a1); assertRegression(result2, a2); final double[] residuals1 = result1.getResiduals(); for (int i = 0; i < n; i++) { assertEquals(y1[i], a1[0] * x[i][0] + a1[1] * x[i][1] + a1[2] * x[i][2] + a1[3] * x[i][3] + a1[4] * x[i][4] + residuals1[i], 10 * EPS); final double[] residuals2 = result2.getResiduals(); for (int i = 0; i < n; i++) { assertEquals(y2[i], a2[0] + a2[1] * x[i][0] + a2[2] * x[i][1] + a2[3] * x[i][2] + a2[4] * x[i][3] + a2[5]
/** * Alternative regression method with different output. * @param xData X values of data * @param yData Y values of data * @param degree Degree of polynomial which fits the given data * @param normalize Normalize xData by mean and standard deviation if normalize == true * @return PolynomialsLeastSquaresRegressionResult containing coefficients, rMatrix, degrees of freedom, norm of residuals, and mean, standard deviation */ public PolynomialsLeastSquaresFitterResult regressVerbose( double[] xData, double[] yData, int degree, boolean normalize) { LeastSquaresRegressionResult result = regress(xData, yData, degree, normalize); int nData = xData.length; DoubleMatrix rMatriX = _qrResult.getR(); DoubleArray resResult = DoubleArray.copyOf(result.getResiduals()); double resNorm = OG_ALGEBRA.getNorm2(resResult); if (normalize == true) { return new PolynomialsLeastSquaresFitterResult(result.getBetas(), rMatriX, nData - degree - 1, resNorm, _renorm); } return new PolynomialsLeastSquaresFitterResult(result.getBetas(), rMatriX, nData - degree - 1, resNorm); }
public NamedVariableLeastSquaresRegressionResult( List<String> independentVariableNames, LeastSquaresRegressionResult result) { super(result); if (independentVariableNames == null) { throw new IllegalArgumentException("List of independent variable names was null"); } _independentVariableNames = new ArrayList<>(); if (result.hasIntercept()) { if (independentVariableNames.size() != result.getBetas().length - 1) { throw new IllegalArgumentException("Length of variable name array did not match number of results in the regression"); } _independentVariableNames.add(INTERCEPT_STRING); } else { if (independentVariableNames.size() != result.getBetas().length) { throw new IllegalArgumentException("Length of variable name array did not match number of results in the regression"); } } _independentVariableNames.addAll(independentVariableNames); _result = result; }
private void assertRegressions(final int n, final int k, final LeastSquaresRegressionResult regression1, final LeastSquaresRegressionResult regression2) { final double[] r1 = regression1.getResiduals(); final double[] r2 = regression2.getResiduals(); for (int i = 0; i < n; i++) { assertEquals(r1[i], r2[i], EPS); } final double[] b1 = regression1.getBetas(); final double[] t1 = regression1.getTStatistics(); final double[] p1 = regression1.getPValues(); final double[] s1 = regression1.getStandardErrorOfBetas(); final double[] b2 = regression2.getBetas(); final double[] t2 = regression2.getTStatistics(); final double[] p2 = regression2.getPValues(); final double[] s2 = regression2.getStandardErrorOfBetas(); for (int i = 0; i < k; i++) { assertEquals(b1[i], b2[i], EPS); assertEquals(t1[i], t2[i], EPS); assertEquals(p1[i], p2[i], EPS); assertEquals(s1[i], s2[i], EPS); } assertEquals(regression1.getRSquared(), regression2.getRSquared(), EPS); assertEquals(regression1.getAdjustedRSquared(), regression2.getAdjustedRSquared(), EPS); assertEquals(regression1.getMeanSquareError(), regression2.getMeanSquareError(), EPS); } }
double[] coeffResult = result.getBetas(); final double[] residuals = result.getResiduals(); func = new RealPolynomialFunction1D(coeffResult); double[] yValuesFit = new double[nPts];
@Test(expectedExceptions = IllegalArgumentException.class) public void testNullNames() { new NamedVariableLeastSquaresRegressionResult(null, new LeastSquaresRegressionResult(null, null, 0, null, 0, 0, null, null, false)); }
@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); } }
@Test(expectedExceptions = IllegalArgumentException.class) public void testNonMatchingInputs() { final List<String> names = Arrays.asList("A", "B"); final double[] array = new double[] {1. }; final LeastSquaresRegressionResult result = new LeastSquaresRegressionResult(array, array, 0., array, 0., 0., array, array, false); new NamedVariableLeastSquaresRegressionResult(names, result); }
pValues[i] = 1 - studentT.cumulativeProbability(Math.abs(tStats[i])); return new LeastSquaresRegressionResult( betas, residuals, meanSquareError, stdErrorBetas, rSquared, adjustedRSquared, tStats, pValues, useIntercept);
/** * This regression method is private and called in other regression methods * @param xDataMatrix _nData x (_degree + 1) matrix whose low vector is (xData[i]^0, xData[i]^1, ..., xData[i]^{_degree}) * @param yDataVector the y-values * @param nData Number of data points * @param degree the degree */ private LeastSquaresRegressionResult regress( DoubleMatrix xDataMatrix, DoubleArray yDataVector, int nData, int degree) { Decomposition<QRDecompositionResult> qrComm = new QRDecompositionCommons(); DecompositionResult decompResult = qrComm.apply(xDataMatrix); _qrResult = (QRDecompositionResult) decompResult; DoubleMatrix qMatrix = _qrResult.getQ(); DoubleMatrix rMatrix = _qrResult.getR(); double[] betas = backSubstitution(qMatrix, rMatrix, yDataVector, degree); double[] residuals = residualsSolver(xDataMatrix, betas, yDataVector); for (int i = 0; i < degree + 1; ++i) { ArgChecker.isFalse(Double.isNaN(betas[i]), "Input is too large or small"); } for (int i = 0; i < nData; ++i) { ArgChecker.isFalse(Double.isNaN(residuals[i]), "Input is too large or small"); } return new LeastSquaresRegressionResult(betas, residuals, 0.0, null, 0.0, 0.0, null, null, true); }