commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From gr...@apache.org
Subject svn commit: r1174509 - in /commons/proper/math/trunk/src: main/java/org/apache/commons/math/exception/util/ main/java/org/apache/commons/math/stat/regression/ site/xdoc/ test/java/org/apache/commons/math/stat/regression/
Date Fri, 23 Sep 2011 03:36:12 GMT
Author: gregs
Date: Fri Sep 23 03:36:11 2011
New Revision: 1174509

URL: http://svn.apache.org/viewvc?rev=1174509&view=rev
Log:
JIRA: MATH-607 Adding support for UpdatingMultipleLinearRegression to SimpleRegression

Modified:
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/exception/util/LocalizedFormats.java
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/RegressionResults.java
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/SimpleRegression.java
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/UpdatingMultipleLinearRegression.java
    commons/proper/math/trunk/src/site/xdoc/changes.xml
    commons/proper/math/trunk/src/test/java/org/apache/commons/math/stat/regression/SimpleRegressionTest.java

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/exception/util/LocalizedFormats.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/exception/util/LocalizedFormats.java?rev=1174509&r1=1174508&r2=1174509&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/exception/util/LocalizedFormats.java
(original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/exception/util/LocalizedFormats.java
Fri Sep 23 03:36:11 2011
@@ -42,6 +42,7 @@ public enum LocalizedFormats implements 
     // CHECKSTYLE: stop JavadocVariable
 
     ARGUMENT_OUTSIDE_DOMAIN("Argument {0} outside domain [{1} ; {2}]"),
+    ARRAY_SIZE_EXCEEDS_MAX_VARIABLES("array size cannot be greater than {0}"),
     ARRAY_SIZES_SHOULD_HAVE_DIFFERENCE_1("array sizes should have difference 1 ({0} != {1}
+ 1)"),
     ARRAY_SUMS_TO_ZERO("array sums to zero"),
     ASSYMETRIC_EIGEN_NOT_SUPPORTED("eigen decomposition of assymetric matrices not supported
yet"),
@@ -135,6 +136,7 @@ public enum LocalizedFormats implements 
     INVALID_INTERVAL_INITIAL_VALUE_PARAMETERS("invalid interval, initial value parameters:
 lower={0}, initial={1}, upper={2}"),
     INVALID_ITERATIONS_LIMITS("invalid iteration limits: min={0}, max={1}"),
     INVALID_MAX_ITERATIONS("bad value for maximum iterations number: {0}"),
+    NOT_ENOUGH_DATA_REGRESSION("the number of observations is not sufficient to conduct regression"),
     INVALID_REGRESSION_ARRAY("input data array length = {0} does not match the number of
observations = {1} and the number of regressors = {2}"),
     INVALID_REGRESSION_OBSERVATION("length of regressor array = {0} does not match the number
of variables = {1} in the model"),
     INVALID_ROUNDING_METHOD("invalid rounding method {0}, valid methods: {1} ({2}), {3} ({4}),
{5} ({6}), {7} ({8}), {9} ({10}), {11} ({12}), {13} ({14}), {15} ({16})"),
@@ -239,6 +241,7 @@ public enum LocalizedFormats implements 
     NO_RESULT_AVAILABLE("no result available"),
     NO_SUCH_MATRIX_ENTRY("no entry at indices ({0}, {1}) in a {2}x{3} matrix"),
     NULL_NOT_ALLOWED("null is not allowed"), /* keep */
+    ARRAY_ZERO_LENGTH_OR_NULL_NOTALLOWED("A null or zero length array not allowed"),
     COVARIANCE_MATRIX("covariance matrix"), /* keep */
     DENOMINATOR("denominator"), /* keep */
     DENOMINATOR_FORMAT("denominator format"), /* keep */

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/RegressionResults.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/RegressionResults.java?rev=1174509&r1=1174508&r2=1174509&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/RegressionResults.java
(original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/RegressionResults.java
Fri Sep 23 03:36:11 2011
@@ -114,7 +114,7 @@ public class RegressionResults implement
         this.globalFitInfo = new double[5];
         Arrays.fill(this.globalFitInfo, Double.NaN);
 
-        if (rank > 2) {
+        if (rank > 0) {
             this.globalFitInfo[SST_IDX] = containsConstant ?
                     (sumysq - sumy * sumy / ((double) nobs)) : sumysq;
         }

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/SimpleRegression.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/SimpleRegression.java?rev=1174509&r1=1174508&r2=1174509&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/SimpleRegression.java
(original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/SimpleRegression.java
Fri Sep 23 03:36:11 2011
@@ -22,8 +22,11 @@ import org.apache.commons.math.MathExcep
 import org.apache.commons.math.exception.OutOfRangeException;
 import org.apache.commons.math.distribution.TDistribution;
 import org.apache.commons.math.distribution.TDistributionImpl;
+import org.apache.commons.math.exception.MathIllegalArgumentException;
+import org.apache.commons.math.exception.NoDataException;
 import org.apache.commons.math.exception.util.LocalizedFormats;
 import org.apache.commons.math.util.FastMath;
+import org.apache.commons.math.util.MathUtils;
 
 /**
  * Estimates an ordinary least squares regression model
@@ -55,7 +58,7 @@ import org.apache.commons.math.util.Fast
  *
  * @version $Id$
  */
-public class SimpleRegression implements Serializable {
+public class SimpleRegression implements Serializable, UpdatingMultipleLinearRegression {
 
     /** Serializable version identifier */
     private static final long serialVersionUID = -3004689053607543335L;
@@ -98,7 +101,7 @@ public class SimpleRegression implements
     * Secondary constructor which allows the user the ability to include/exclude const
     * @param includeIntercept boolean flag, true includes an intercept
     */
-    public SimpleRegression(boolean includeIntercept){
+    public SimpleRegression(boolean includeIntercept) {
         super();
         hasIntercept = includeIntercept;
     }
@@ -116,7 +119,7 @@ public class SimpleRegression implements
      * @param x independent variable value
      * @param y dependent variable value
      */
-    public void addData(final double x, final double y){
+    public void addData(final double x,final double y) {
         if (n == 0) {
             xbar = x;
             ybar = y;
@@ -158,7 +161,7 @@ public class SimpleRegression implements
      * @param x independent variable value
      * @param y dependent variable value
      */
-    public void removeData(double x, double y) {
+    public void removeData(final double x,final double y) {
         if (n > 0) {
             if (hasIntercept) {
                 final double fact1 = (double) n - 1.0;
@@ -200,13 +203,69 @@ public class SimpleRegression implements
      * data.</p>
      *
      * @param data array of observations to be added
+     * @throws ModelSpecificationException if the length of {@code data[i]} is not
+     * greater than or equal to 2
      */
-    public void addData(double[][] data) {
+    public void addData(final double[][] data) {
         for (int i = 0; i < data.length; i++) {
+            if( data[i].length < 2 ){
+               throw new ModelSpecificationException(LocalizedFormats.INVALID_REGRESSION_OBSERVATION,
+                    data[i].length, 2);
+            }
             addData(data[i][0], data[i][1]);
         }
+        return;
+    }
+
+    /**
+     * Adds one observation to the regression model.
+     *
+     * @param x the independent variables which form the design matrix
+     * @param y the dependent or response variable
+     * @throws ModelSpecificationException if the length of {@code x} does not equal
+     * the number of independent variables in the model
+     */
+    public void addObservation(final double[] x,final double y) throws ModelSpecificationException{
+        if( x == null || x.length == 0 ){
+            throw new ModelSpecificationException(LocalizedFormats.INVALID_REGRESSION_OBSERVATION,x!=null?x.length:0,
1);
+        }
+        addData( x[0], y );
+        return;
     }
 
+    /**
+     * Adds a series of observations to the regression model. The lengths of
+     * x and y must be the same and x must be rectangular.
+     *
+     * @param x a series of observations on the independent variables
+     * @param y a series of observations on the dependent variable
+     * The length of x and y must be the same
+     * @throws ModelSpecificationException if {@code x} is not rectangular, does not match
+     * the length of {@code y} or does not contain sufficient data to estimate the model
+     */
+    public void addObservations(final double[][] x,final double[] y) {
+        if ((x == null) || (y == null) || (x.length != y.length)) {
+            throw new ModelSpecificationException(
+                  LocalizedFormats.DIMENSIONS_MISMATCH_SIMPLE,
+                  (x == null) ? 0 : x.length,
+                  (y == null) ? 0 : y.length);
+        }
+        boolean obsOk=true;
+        for( int i = 0 ; i < x.length; i++){
+            if( x[i] == null || x[i].length == 0 ){
+                obsOk = false;
+            }
+        }
+        if( !obsOk ){
+            throw new ModelSpecificationException(
+                  LocalizedFormats.NOT_ENOUGH_DATA_FOR_NUMBER_OF_PREDICTORS,
+                  0, 1);
+        }
+        for( int i = 0 ; i < x.length ; i++){
+            addData( x[i][0], y[i] );
+        }
+        return;
+    }
 
     /**
      * Removes observations represented by the elements in <code>data</code>.
@@ -265,8 +324,8 @@ public class SimpleRegression implements
      * @param x input <code>x</code> value
      * @return predicted <code>y</code> value
      */
-    public double predict(double x) {
-        double b1 = getSlope();
+    public double predict(final double x) {
+        final double b1 = getSlope();
         if (hasIntercept) {
             return getIntercept(b1) + b1 * x;
         }
@@ -298,7 +357,7 @@ public class SimpleRegression implements
      *
      * @return true if constant exists, false otherwise
      */
-    public boolean hasIntercept(){
+    public boolean hasIntercept() {
         return hasIntercept;
     }
 
@@ -572,7 +631,7 @@ public class SimpleRegression implements
      * @return half-width of 95% confidence interval for the slope estimate
      * @throws MathException if the confidence interval can not be computed.
      */
-    public double getSlopeConfidenceInterval(double alpha)
+    public double getSlopeConfidenceInterval(final double alpha)
         throws MathException {
         if (alpha >= 1 || alpha <= 0) {
             throw new OutOfRangeException(LocalizedFormats.SIGNIFICANCE_LEVEL,
@@ -620,7 +679,7 @@ public class SimpleRegression implements
     * @param slope current slope
     * @return the intercept of the regression line
     */
-    private double getIntercept(double slope){
+    private double getIntercept(final double slope) {
       if( hasIntercept){
         return (sumY - slope * sumX) / n;
       }
@@ -633,7 +692,134 @@ public class SimpleRegression implements
      * @param slope regression slope estimate
      * @return sum of squared deviations of predicted y values
      */
-    private double getRegressionSumSquares(double slope) {
+    private double getRegressionSumSquares(final double slope) {
         return slope * slope * sumXX;
     }
+
+    /**
+     * Performs a regression on data present in buffers and outputs a RegressionResults object
+     * @return RegressionResults acts as a container of regression output
+     * @throws ModelSpecificationException if the model is not correctly specified
+     */
+    public RegressionResults regress() throws ModelSpecificationException{
+        if( hasIntercept ){
+          if( n < 3 ){
+              throw new NoDataException( LocalizedFormats.NOT_ENOUGH_DATA_REGRESSION );
+          }
+          if( FastMath.abs( sumXX ) > MathUtils.SAFE_MIN ){
+              final double[] params = new double[]{ getIntercept(), getSlope() };
+              final double mse = getMeanSquareError();
+              final double _syy = sumYY + sumY * sumY / ((double) n);
+              final double[] vcv = new double[]{
+                mse * (xbar *xbar /sumXX + 1.0 / ((double) n)),
+                -xbar*mse/sumXX,
+                mse/sumXX };
+              return new RegressionResults(
+                      params, new double[][]{vcv}, true, n, 2,
+                      sumY, _syy, getSumSquaredErrors(),true,false);
+          }else{
+              final double[] params = new double[]{ sumY/((double) n), Double.NaN };
+              //final double mse = getMeanSquareError();
+              final double[] vcv = new double[]{
+                ybar / ((double) n - 1.0),
+                Double.NaN,
+                Double.NaN };
+              return new RegressionResults(
+                      params, new double[][]{vcv}, true, n, 1,
+                      sumY, sumYY, getSumSquaredErrors(),true,false);
+          }
+        }else{
+          if( n < 2 ){
+              throw new NoDataException( LocalizedFormats.NOT_ENOUGH_DATA_REGRESSION );
+          }
+          if( !Double.isNaN(sumXX) ){
+          final double[] vcv = new double[]{ getMeanSquareError() / sumXX };
+          final double[] params = new double[]{ sumXY/sumXX };
+          return new RegressionResults(
+                      params, new double[][]{vcv}, true, n, 1,
+                      sumY, sumYY, getSumSquaredErrors(),false,false);
+          }else{
+          final double[] vcv = new double[]{Double.NaN };
+          final double[] params = new double[]{ Double.NaN };
+          return new RegressionResults(
+                      params, new double[][]{vcv}, true, n, 1,
+                      Double.NaN, Double.NaN, Double.NaN,false,false);
+          }
+        }
+    }
+
+    /**
+     * Performs a regression on data present in buffers including only regressors
+     * indexed in variablesToInclude and outputs a RegressionResults object
+     * @param variablesToInclude an array of indices of regressors to include
+     * @return RegressionResults acts as a container of regression output
+     * @throws ModelSpecificationException if the model is not correctly specified
+     * @throws MathIllegalArgumentException if the variablesToInclude array is null or zero
length
+     * @throws OutOfRangeException if a requested variable is not present in model
+     */
+    public RegressionResults regress(int[] variablesToInclude) throws ModelSpecificationException{
+        if( variablesToInclude == null || variablesToInclude.length == 0){
+          throw new MathIllegalArgumentException(LocalizedFormats.ARRAY_ZERO_LENGTH_OR_NULL_NOTALLOWED);
+        }
+        if( variablesToInclude.length > 2 || (variablesToInclude.length > 1 &&
!hasIntercept) ){
+            throw new ModelSpecificationException(
+                    LocalizedFormats.ARRAY_SIZE_EXCEEDS_MAX_VARIABLES,
+                    (variablesToInclude.length > 1 && !hasIntercept) ? 1 : 2);
+        }
+
+        if( hasIntercept ){
+            if( variablesToInclude.length == 2 ){
+                if( variablesToInclude[0] == 1 ){
+                    throw new ModelSpecificationException(LocalizedFormats.NOT_INCREASING_SEQUENCE);
+                }else if( variablesToInclude[0] != 0 ){
+                    throw new OutOfRangeException( variablesToInclude[0], 0,1 );
+                }
+                if( variablesToInclude[1] != 1){
+                     throw new OutOfRangeException( variablesToInclude[0], 0,1 );
+                }
+                return regress();
+            }else{
+                if( variablesToInclude[0] != 1 && variablesToInclude[0] != 0 ){
+                     throw new OutOfRangeException( variablesToInclude[0],0,1 );
+                }
+                final double _mean = sumY * sumY / ((double) n);
+                final double _syy = sumYY + _mean;
+                if( variablesToInclude[0] == 0 ){
+                    //just the mean
+                    final double[] vcv = new double[]{ sumYY/((double)((n-1)*n)) };
+                    final double[] params = new double[]{ ybar };
+                    return new RegressionResults(
+                      params, new double[][]{vcv}, true, n, 1,
+                      sumY, _syy+_mean, sumYY,true,false);
+
+                }else if( variablesToInclude[0] == 1){
+                    //final double _syy = sumYY + sumY * sumY / ((double) n);
+                    final double _sxx = sumXX + sumX * sumX / ((double) n);
+                    final double _sxy = sumXY + sumX * sumY / ((double) n);
+                    final double _sse = FastMath.max(0d, _syy - _sxy * _sxy / _sxx);
+                    final double _mse = _sse/((double)(n-1));
+                    if( !Double.isNaN(_sxx) ){
+                        final double[] vcv = new double[]{ _mse / _sxx };
+                        final double[] params = new double[]{ _sxy/_sxx };
+                        return new RegressionResults(
+                                    params, new double[][]{vcv}, true, n, 1,
+                                    sumY, _syy, _sse,false,false);
+                    }else{
+                        final double[] vcv = new double[]{Double.NaN };
+                        final double[] params = new double[]{ Double.NaN };
+                        return new RegressionResults(
+                                    params, new double[][]{vcv}, true, n, 1,
+                                    Double.NaN, Double.NaN, Double.NaN,false,false);
+                    }
+                }
+            }
+        }else{
+            if( variablesToInclude[0] != 0 ){
+                throw new OutOfRangeException(variablesToInclude[0],0,0);
+            }
+            return regress();
+        }
+
+        return null;
+    }
 }

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/UpdatingMultipleLinearRegression.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/UpdatingMultipleLinearRegression.java?rev=1174509&r1=1174508&r2=1174509&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/UpdatingMultipleLinearRegression.java
(original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/stat/regression/UpdatingMultipleLinearRegression.java
Fri Sep 23 03:36:11 2011
@@ -61,7 +61,7 @@ public interface UpdatingMultipleLinearR
      * @throws ModelSpecificationException if {@code x} is not rectangular, does not match
      * the length of {@code y} or does not contain sufficient data to estimate the model
      */
-    void addObservations(double[][] x, double[] y);
+    void addObservations(double[][] x, double[] y) throws ModelSpecificationException;
 
     /**
      * Clears internal buffers and resets the regression model. This means all

Modified: commons/proper/math/trunk/src/site/xdoc/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/site/xdoc/changes.xml?rev=1174509&r1=1174508&r2=1174509&view=diff
==============================================================================
--- commons/proper/math/trunk/src/site/xdoc/changes.xml (original)
+++ commons/proper/math/trunk/src/site/xdoc/changes.xml Fri Sep 23 03:36:11 2011
@@ -52,6 +52,9 @@ The <action> type attribute can be add,u
     If the output is not quite correct, check for invisible trailing spaces!
      -->
     <release version="3.0" date="TBD" description="TBD">
+      <action dev="gregs" type="update" issue="MATH-607">
+        SimpleRegression implements UpdatingMultipleLinearRegression interface.
+      </action>
       <action dev="gregs" type="update" issue="MATH-675">
         Added isMonotone methods in MathUtils. Optimized checkOrder method.
       </action>

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/stat/regression/SimpleRegressionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/stat/regression/SimpleRegressionTest.java?rev=1174509&r1=1174508&r2=1174509&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math/stat/regression/SimpleRegressionTest.java
(original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/stat/regression/SimpleRegressionTest.java
Fri Sep 23 03:36:11 2011
@@ -80,9 +80,9 @@ public final class SimpleRegressionTest 
             {5, -1 }, {6, 12 }
     };
 
-    
+
     /*
-     * Data from NIST NOINT1 
+     * Data from NIST NOINT1
      */
     private double[][] noint1 = {
         {130.0,60.0},
@@ -95,26 +95,74 @@ public final class SimpleRegressionTest 
         {137.0,67.0},
         {138.0,68.0},
         {139.0,69.0},
-        {140.0,70.0}        
+        {140.0,70.0}
     };
-    
+
     /*
-     * Data from NIST NOINT2 
-     * 
+     * Data from NIST NOINT2
+     *
      */
     private double[][] noint2 = {
         {3.0,4},
         {4,5},
         {4,6}
     };
-    
+
+    @Test
+    public void testRegressIfaceMethod(){
+        final SimpleRegression regression = new SimpleRegression(true);
+        final UpdatingMultipleLinearRegression iface = regression;
+        final SimpleRegression regressionNoint = new SimpleRegression( false );
+        final SimpleRegression regressionIntOnly= new SimpleRegression( false );
+        for (int i = 0; i < data.length; i++) {
+            iface.addObservation( new double[]{data[i][1]}, data[i][0]);
+            regressionNoint.addData(data[i][1], data[i][0]);
+            regressionIntOnly.addData(1.0, data[i][0]);
+        }
+
+        //should not be null
+        final RegressionResults fullReg = iface.regress( );
+        Assert.assertTrue(fullReg != null);
+        Assert.assertEquals("intercept", regression.getIntercept(), fullReg.getParameterEstimate(0),
1.0e-16);
+        Assert.assertEquals("intercept std err",regression.getInterceptStdErr(), fullReg.getStdErrorOfEstimate(0),1.0E-16);
+        Assert.assertEquals("slope", regression.getSlope(), fullReg.getParameterEstimate(1),
1.0e-16);
+        Assert.assertEquals("slope std err",regression.getSlopeStdErr(), fullReg.getStdErrorOfEstimate(1),1.0E-16);
+        Assert.assertEquals("number of observations",regression.getN(), fullReg.getN());
+        Assert.assertEquals("r-square",regression.getRSquare(), fullReg.getRSquared(), 1.0E-16);
+        Assert.assertEquals("SSR", regression.getRegressionSumSquares(), fullReg.getRegressionSumSquares()
,1.0E-16);
+        Assert.assertEquals("MSE", regression.getMeanSquareError(), fullReg.getMeanSquareError()
,1.0E-16);
+        Assert.assertEquals("SSE", regression.getSumSquaredErrors(), fullReg.getErrorSumSquares()
,1.0E-16);
+
+
+        final RegressionResults noInt   = iface.regress( new int[]{1} );
+        Assert.assertTrue(noInt != null);
+        Assert.assertEquals("slope", regressionNoint.getSlope(), noInt.getParameterEstimate(0),
1.0e-12);
+        Assert.assertEquals("slope std err",regressionNoint.getSlopeStdErr(), noInt.getStdErrorOfEstimate(0),1.0E-16);
+        Assert.assertEquals("number of observations",regressionNoint.getN(), noInt.getN());
+        Assert.assertEquals("r-square",regressionNoint.getRSquare(), noInt.getRSquared(),
1.0E-16);
+        Assert.assertEquals("SSR", regressionNoint.getRegressionSumSquares(), noInt.getRegressionSumSquares()
,1.0E-8);
+        Assert.assertEquals("MSE", regressionNoint.getMeanSquareError(), noInt.getMeanSquareError()
,1.0E-16);
+        Assert.assertEquals("SSE", regressionNoint.getSumSquaredErrors(), noInt.getErrorSumSquares()
,1.0E-16);
+
+        final RegressionResults onlyInt = iface.regress( new int[]{0} );
+        Assert.assertTrue( onlyInt != null );
+        Assert.assertEquals("slope", regressionIntOnly.getSlope(), onlyInt.getParameterEstimate(0),
1.0e-12);
+        Assert.assertEquals("slope std err",regressionIntOnly.getSlopeStdErr(), onlyInt.getStdErrorOfEstimate(0),1.0E-12);
+        Assert.assertEquals("number of observations",regressionIntOnly.getN(), onlyInt.getN());
+        Assert.assertEquals("r-square",regressionIntOnly.getRSquare(), onlyInt.getRSquared(),
1.0E-14);
+        Assert.assertEquals("SSE", regressionIntOnly.getSumSquaredErrors(), onlyInt.getErrorSumSquares()
,1.0E-8);
+        Assert.assertEquals("SSR", regressionIntOnly.getRegressionSumSquares(), onlyInt.getRegressionSumSquares()
,1.0E-8);
+        Assert.assertEquals("MSE", regressionIntOnly.getMeanSquareError(), onlyInt.getMeanSquareError()
,1.0E-8);
+
+    }
+
     @Test
     public void testNoInterceot_noint2(){
          SimpleRegression regression = new SimpleRegression(false);
          regression.addData(noint2[0][1], noint2[0][0]);
          regression.addData(noint2[1][1], noint2[1][0]);
          regression.addData(noint2[2][1], noint2[2][0]);
-         Assert.assertEquals("slope", 0.727272727272727, 
+         Assert.assertEquals("slope", 0.727272727272727,
                  regression.getSlope(), 10E-12);
          Assert.assertEquals("slope std err", 0.420827318078432E-01,
                 regression.getSlopeStdErr(),10E-12);
@@ -128,8 +176,8 @@ public final class SimpleRegressionTest 
         Assert.assertEquals("SSE", 0.272727272727273,
             regression.getSumSquaredErrors(),10E-9);
     }
-    
-    @Test 
+
+    @Test
     public void testNoIntercept_noint1(){
         SimpleRegression regression = new SimpleRegression(false);
         for (int i = 0; i < noint1.length; i++) {
@@ -147,9 +195,9 @@ public final class SimpleRegressionTest 
             regression.getMeanSquareError(), 10E-10);
         Assert.assertEquals("SSE", 127.272727272727,
             regression.getSumSquaredErrors(),10E-9);
-            
-    }  
-    
+
+    }
+
     @Test
     public void testNorris() {
         SimpleRegression regression = new SimpleRegression();



Mime
View raw message