You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by md...@apache.org on 2003/11/18 16:07:12 UTC
cvs commit: jakarta-commons/math/src/java/org/apache/commons/math/stat BivariateRegression.java
mdiggory 2003/11/18 07:07:12
Modified: math/src/test/org/apache/commons/math/stat
BivariateRegressionTest.java
math/src/java/org/apache/commons/math/special Beta.java
math/src/java/org/apache/commons/math/stat
BivariateRegression.java
Log:
fix for wrong results and stack overflow error from BivariateRegression
PR: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=24747
Obtained from:
Submitted by: Sergei Skarupo, Brent Worden
Reviewed by: Mark Diggory
Revision Changes Path
1.9 +34 -3 jakarta-commons/math/src/test/org/apache/commons/math/stat/BivariateRegressionTest.java
Index: BivariateRegressionTest.java
===================================================================
RCS file: /home/cvs/jakarta-commons/math/src/test/org/apache/commons/math/stat/BivariateRegressionTest.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- BivariateRegressionTest.java 14 Nov 2003 22:22:18 -0000 1.8
+++ BivariateRegressionTest.java 18 Nov 2003 15:07:12 -0000 1.9
@@ -53,6 +53,8 @@
*/
package org.apache.commons.math.stat;
+import java.util.Random;
+
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
@@ -258,6 +260,35 @@
;
}
- }
+ }
+
+ public void testPerfect() {
+ BivariateRegression regression = new BivariateRegression();
+ int n = 100;
+ for (int i = 0; i < n; i++) {
+ regression.addData(((double) i) / (n - 1), i);
+ }
+ assertEquals(0.0, regression.getSignificance(), 1.0e-5);
+ assertTrue(regression.getSlope() > 0.0);
+ }
+
+ public void testPerfectNegative() {
+ BivariateRegression regression = new BivariateRegression();
+ int n = 100;
+ for (int i = 0; i < n; i++) {
+ regression.addData(-((double) i) / (n - 1), i);
+ }
+ assertEquals(0.0, regression.getSignificance(), 1.0e-5);
+ assertTrue(regression.getSlope() < 0.0);
+ }
+
+ public void testRandom() {
+ BivariateRegression regression = new BivariateRegression();
+ Random random = new Random(1);
+ int n = 100;
+ for (int i = 0; i < n; i++) {
+ regression.addData(((double) i) / (n - 1), random.nextDouble());
+ }
+ assertTrue(0.0 < regression.getSignificance() && regression.getSignificance() < 1.0);
+ }
}
-
1.13 +5 -2 jakarta-commons/math/src/java/org/apache/commons/math/special/Beta.java
Index: Beta.java
===================================================================
RCS file: /home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/special/Beta.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- Beta.java 14 Nov 2003 22:22:17 -0000 1.12
+++ Beta.java 18 Nov 2003 15:07:12 -0000 1.13
@@ -151,8 +151,11 @@
double ret;
if (Double.isNaN(x) || Double.isNaN(a) || Double.isNaN(b) || (x < 0) ||
- (x > 1) || (a <= 0.0) || (b <= 0.0)) {
+ (x > 1) || (a <= 0.0) || (b <= 0.0))
+ {
ret = Double.NaN;
+ } else if (x > (a + 1.0) / (a + b + 1.0)) {
+ ret = 1.0 - regularizedBeta(1.0 - x, b, a, epsilon, maxIterations);
} else {
ContinuedFraction fraction = new ContinuedFraction() {
protected double getB(int n, double x) {
1.10 +8 -6 jakarta-commons/math/src/java/org/apache/commons/math/stat/BivariateRegression.java
Index: BivariateRegression.java
===================================================================
RCS file: /home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/stat/BivariateRegression.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- BivariateRegression.java 15 Nov 2003 16:01:38 -0000 1.9
+++ BivariateRegression.java 18 Nov 2003 15:07:12 -0000 1.10
@@ -133,11 +133,13 @@
xbar = x;
ybar = y;
} else {
- sumXX += ((double) n / (double) (n + 1)) * (x - xbar) * (x - xbar);
- sumYY += ((double) n / (double) (n + 1)) * (y - ybar) * (y - ybar);
- sumXY += ((double) n / (double) (n + 1)) * (x - xbar) * (y - ybar);
- xbar += (1d / (double) (n + 1)) * (x - xbar);
- ybar += (1d / (double) (n + 1)) * (y - ybar);
+ double dx = x - xbar;
+ double dy = y - ybar;
+ sumXX += dx * dx * (double) n / (double) (n + 1.0);
+ sumYY += dy * dy * (double) n / (double) (n + 1.0);
+ sumXY += dx * dy * (double) n / (double) (n + 1.0);
+ xbar += dx / (double) (n + 1.0);
+ ybar += dy / (double) (n + 1.0);
}
sumX += x;
sumY += y;
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org