You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ps...@apache.org on 2008/07/12 23:41:18 UTC

svn commit: r676241 - in /commons/proper/math/branches/MATH_2_0: ./ src/java/org/apache/commons/math/stat/regression/ src/test/org/apache/commons/math/stat/regression/

Author: psteitz
Date: Sat Jul 12 14:41:17 2008
New Revision: 676241

URL: http://svn.apache.org/viewvc?rev=676241&view=rev
Log:
Refactored data specification in multiple regression api. JIRA: MATH-255.  Patched by Mauro Televi.

Modified:
    commons/proper/math/branches/MATH_2_0/project.xml
    commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/AbstractMultipleLinearRegression.java
    commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/GLSMultipleLinearRegression.java
    commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/MultipleLinearRegression.java
    commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/OLSMultipleLinearRegression.java
    commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/AbstractMultipleLinearRegressionTest.java
    commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/GLSMultipleLinearRegressionTest.java
    commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/OLSMultipleLinearRegressionTest.java

Modified: commons/proper/math/branches/MATH_2_0/project.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/project.xml?rev=676241&r1=676240&r2=676241&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/project.xml (original)
+++ commons/proper/math/branches/MATH_2_0/project.xml Sat Jul 12 14:41:17 2008
@@ -23,7 +23,7 @@
   <name>Math</name>
   <groupId>commons-math</groupId>
   <artifactId>commons-math</artifactId>
-  <currentVersion>1.2-RC2</currentVersion>
+  <currentVersion>2.0-SNAPSHOT</currentVersion>
   <inceptionYear>2003</inceptionYear>
   <shortDescription>Commons Math</shortDescription>
   <description>The Math project is a library of lightweight, self-contained mathematics and statistics components addressing the most common practical problems not immediately available in the Java programming language or commons-lang.</description>

Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/AbstractMultipleLinearRegression.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/AbstractMultipleLinearRegression.java?rev=676241&r1=676240&r2=676241&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/AbstractMultipleLinearRegression.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/AbstractMultipleLinearRegression.java Sat Jul 12 14:41:17 2008
@@ -34,20 +34,43 @@
     protected RealMatrix Y;
 
     /**
-     * Adds y sample data.
+     * Loads model x and y sample data from a flat array of data, overriding any previous sample.
+     * Assumes that rows are concatenated with y values first in each row.
+     * 
+     * @param data input data array
+     * @param nobs number of observations (rows)
+     * @param nvars number of independent variables (columnns, not counting y)
+     */
+    public void newSampleData(double[] data, int nobs, int nvars) {
+        double[] y = new double[nobs];
+        double[][] x = new double[nobs][nvars + 1];
+        int pointer = 0;
+        for (int i = 0; i < nobs; i++) {
+            y[i] = data[pointer++];
+            x[i][0] = 1.0d;
+            for (int j = 1; j < nvars + 1; j++) {
+                x[i][j] = data[pointer++];
+            }
+        }
+        this.X = new RealMatrixImpl(x);
+        this.Y = new RealMatrixImpl(y);
+    }
+    
+    /**
+     * Loads new y sample data, overriding any previous sample
      * 
      * @param y the [n,1] array representing the y sample
      */
-    protected void addYSampleData(double[] y) {
+    protected void newYSampleData(double[] y) {
         this.Y = new RealMatrixImpl(y);
     }
 
     /**
-     * Adds x sample data.
+     * Loads new x sample data, overriding any previous sample
      * 
      * @param x the [n,k] array representing the x sample
      */
-    protected void addXSampleData(double[][] x) {
+    protected void newXSampleData(double[][] x) {
         this.X = new RealMatrixImpl(x);
     }
 

Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/GLSMultipleLinearRegression.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/GLSMultipleLinearRegression.java?rev=676241&r1=676240&r2=676241&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/GLSMultipleLinearRegression.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/GLSMultipleLinearRegression.java Sat Jul 12 14:41:17 2008
@@ -44,15 +44,12 @@
     /** Covariance matrix. */
     private RealMatrix Omega;
 
-    /**
-     * {@inheritDoc}
-     */
-    public void addData(double[] y, double[][] x, double[][] covariance) {
+    public void newSampleData(double[] y, double[][] x, double[][] covariance) {
         validateSampleData(x, y);
-        addYSampleData(y);
-        addXSampleData(x);
+        newYSampleData(y);
+        newXSampleData(x);
         validateCovarianceData(x, covariance);
-        addCovarianceData(covariance);
+        newCovarianceData(covariance);
     }
 
     /**
@@ -60,7 +57,7 @@
      * 
      * @param omega the [n,n] array representing the covariance
      */
-    protected void addCovarianceData(double[][] omega){
+    protected void newCovarianceData(double[][] omega){
         this.Omega = new RealMatrixImpl(omega);
     }
     

Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/MultipleLinearRegression.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/MultipleLinearRegression.java?rev=676241&r1=676240&r2=676241&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/MultipleLinearRegression.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/MultipleLinearRegression.java Sat Jul 12 14:41:17 2008
@@ -33,17 +33,6 @@
 public interface MultipleLinearRegression {
 
     /**
-     * Adds sample and covariance data.
-     * 
-     * @param y the [n,1] array representing the y sample
-     * @param x the [n,k] array representing x sample
-     * @param covariance the [n,n] array representing the covariance matrix or <code>null</code> if not required for the
-     *          specific implementation
-     * @throws IllegalArgumentException if required data arrays are <code>null</code> or their dimensions are not appropriate
-     */
-    void addData(double[] y, double[][] x, double[][] covariance);
-
-    /**
      * Estimates the regression parameters b.
      * 
      * @return The [k,1] array representing b

Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/OLSMultipleLinearRegression.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/OLSMultipleLinearRegression.java?rev=676241&r1=676240&r2=676241&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/OLSMultipleLinearRegression.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/regression/OLSMultipleLinearRegression.java Sat Jul 12 14:41:17 2008
@@ -40,13 +40,10 @@
  */
 public class OLSMultipleLinearRegression extends AbstractMultipleLinearRegression {
 
-    /**
-     * {@inheritDoc}
-     */
-    public void addData(double[] y, double[][] x, double[][] covariance) {
+    public void newSampleData(double[] y, double[][] x) {
         validateSampleData(x, y);
-        addYSampleData(y);
-        addXSampleData(x);
+        newYSampleData(y);
+        newXSampleData(x);
     }
     
     /**

Modified: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/AbstractMultipleLinearRegressionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/AbstractMultipleLinearRegressionTest.java?rev=676241&r1=676240&r2=676241&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/AbstractMultipleLinearRegressionTest.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/AbstractMultipleLinearRegressionTest.java Sat Jul 12 14:41:17 2008
@@ -61,45 +61,5 @@
         double variance = regression.estimateRegressandVariance();
         assertTrue(variance > 0.0);
     }   
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void cannotAddXSampleData() {
-        regression.addData(new double[]{}, null, null);
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void cannotAddNullYSampleData() {
-        regression.addData(null, new double[][]{}, null);
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void cannotAddSampleDataWithSizeMismatch() {
-        double[] y = new double[]{1.0, 2.0};
-        double[][] x = new double[1][];
-        x[0] = new double[]{1.0, 0};
-        regression.addData(y, x, null);
-    }
-    
-    /**
-     * Loads model Y[] and X[][] arrays from a flat array of data.
-     * Assumes that rows are concatenated with y values first in each row.
-     * 
-     * @param data input data array
-     * @param y vector of y values to be filled
-     * @param x matrix of x values to be filled
-     * @param nobs number of observations (rows)
-     * @param nvars number of independent variables (columnns, not counting y)
-     */
-    protected void loadModelData(double[] data, double[] y, double[][] x, int nobs, int nvars) {
-        int pointer = 0;
-        for (int i = 0; i < nobs; i++) {
-            y[i] = data[pointer++];
-            x[i][0] = 1.0d;
-            for (int j = 1; j < nvars + 1; j++) {
-                x[i][j] = data[pointer++];
-            }
-        }
-        
-    }
 
 }

Modified: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/GLSMultipleLinearRegressionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/GLSMultipleLinearRegressionTest.java?rev=676241&r1=676240&r2=676241&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/GLSMultipleLinearRegressionTest.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/GLSMultipleLinearRegressionTest.java Sat Jul 12 14:41:17 2008
@@ -45,10 +45,27 @@
         super.setUp();
     }
    
+    @Test(expected=IllegalArgumentException.class)
+    public void cannotAddXSampleData() {
+        createRegression().newSampleData(new double[]{}, null, null);
+    }
 
     @Test(expected=IllegalArgumentException.class)
+    public void cannotAddNullYSampleData() {
+        createRegression().newSampleData(null, new double[][]{}, null);
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void cannotAddSampleDataWithSizeMismatch() {
+        double[] y = new double[]{1.0, 2.0};
+        double[][] x = new double[1][];
+        x[0] = new double[]{1.0, 0};
+        createRegression().newSampleData(y, x, null);
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
     public void cannotAddNullCovarianceData() {
-        regression.addData(new double[]{}, new double[][]{}, null);
+        createRegression().newSampleData(new double[]{}, new double[][]{}, null);
     }
     
     @Test(expected=IllegalArgumentException.class)
@@ -59,7 +76,7 @@
         x[1] = new double[]{0, 1.0};
         double[][] omega = new double[1][];
         omega[0] = new double[]{1.0, 0};
-        regression.addData(y, x, omega);
+        createRegression().newSampleData(y, x, omega);
     }
 
     @Test(expected=IllegalArgumentException.class)
@@ -72,12 +89,12 @@
         omega[0] = new double[]{1.0, 0};
         omega[1] = new double[]{0, 1.0};
         omega[2] = new double[]{0, 2.0};
-        regression.addData(y, x, omega);
+        createRegression().newSampleData(y, x, omega);
     }
 
-    protected MultipleLinearRegression createRegression() {
-        MultipleLinearRegression regression = new GLSMultipleLinearRegression();
-        regression.addData(y, x, omega);
+    protected GLSMultipleLinearRegression createRegression() {
+        GLSMultipleLinearRegression regression = new GLSMultipleLinearRegression();
+        regression.newSampleData(y, x, omega);
         return regression;
     }
 

Modified: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/OLSMultipleLinearRegressionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/OLSMultipleLinearRegressionTest.java?rev=676241&r1=676240&r2=676241&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/OLSMultipleLinearRegressionTest.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/regression/OLSMultipleLinearRegressionTest.java Sat Jul 12 14:41:17 2008
@@ -38,9 +38,9 @@
         super.setUp();
     }
 
-    protected MultipleLinearRegression createRegression() {
-        MultipleLinearRegression regression = new OLSMultipleLinearRegression();
-        regression.addData(y, x, null);
+    protected OLSMultipleLinearRegression createRegression() {
+        OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
+        regression.newSampleData(y, x);
         return regression;
     }
 
@@ -52,6 +52,24 @@
         return y.length;
     }
     
+    @Test(expected=IllegalArgumentException.class)
+    public void cannotAddXSampleData() {
+        createRegression().newSampleData(new double[]{}, null);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void cannotAddNullYSampleData() {
+        createRegression().newSampleData(null, new double[][]{});
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void cannotAddSampleDataWithSizeMismatch() {
+        double[] y = new double[]{1.0, 2.0};
+        double[][] x = new double[1][];
+        x[0] = new double[]{1.0, 0};
+        createRegression().newSampleData(y, x);
+    }
+    
     @Test
     public void testPerfectFit() {
         double[] betaHat = regression.estimateRegressionParameters();
@@ -102,13 +120,10 @@
         // Transform to Y and X required by interface
         int nobs = 16;
         int nvars = 6;
-        double[] y = new double[nobs];
-        double[][] x = new double[nobs][nvars + 1];
-        loadModelData(design, y, x, nobs, nvars);
         
         // Estimate the model
-        MultipleLinearRegression model = new OLSMultipleLinearRegression();
-        model.addData(y, x, null);
+        OLSMultipleLinearRegression model = new OLSMultipleLinearRegression();
+        model.newSampleData(design, nobs, nvars);
         
         // Check expected beta values from NIST
         double[] betaHat = model.estimateRegressionParameters();
@@ -193,13 +208,10 @@
         // Transform to Y and X required by interface
         int nobs = 47;
         int nvars = 4;
-        double[] y = new double[nobs];
-        double[][] x = new double[nobs][nvars + 1];
-        loadModelData(design, y, x, nobs, nvars);
 
         // Estimate the model
-        MultipleLinearRegression model = new OLSMultipleLinearRegression();
-        model.addData(y, x, null);
+        OLSMultipleLinearRegression model = new OLSMultipleLinearRegression();
+        model.newSampleData(design, nobs, nvars);
 
         // Check expected beta values from R
         double[] betaHat = model.estimateRegressionParameters();