This commit adds the constructor and internals for setting and External Moment object to base internal calculations on. It also remove author tags and adds a new class FirstMoment to the project.

git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/math/trunk@140973 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Mark R. Diggory 2003-07-07 23:06:48 +00:00
parent 512f698edd
commit 4bf125a356
18 changed files with 483 additions and 215 deletions

View File

@ -0,0 +1,112 @@
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.math.stat.univariate.moment;
import org.apache.commons.math.stat.univariate.AbstractStorelessUnivariateStatistic;
/**
*
*/
public class FirstMoment extends AbstractStorelessUnivariateStatistic {
/** count of values that have been added */
protected int n = 0;
/** first moment of values that have been added */
protected double m1 = Double.NaN;
/** temporary internal state made available for higher order moments */
protected double dev = 0.0;
/** temporary internal state made available for higher order moments */
protected double v = 0.0;
/** temporary internal state made available for higher order moments */
protected double n0 = 0.0;
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#increment(double)
*/
public double increment(double d) {
if (n < 1) {
m1 = 0.0;
}
n++;
dev = d - m1;
n0 = (double)n;
v = dev / n0;
return m1 += v;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#clear()
*/
public void clear() {
m1 = Double.NaN;
n = 0;
dev = 0.0;
v = 0.0;
n0 = 0.0;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#getValue()
*/
public double getValue() {
return m1;
}
}

View File

@ -54,14 +54,21 @@
package org.apache.commons.math.stat.univariate.moment;
/**
* @author Mark Diggory
*
*
*/
public class FourthMoment extends ThirdMoment {
/** fourth moment of values that have been added */
protected double m4 = Double.NaN;
/** temporary internal state made available for higher order moments */
protected double prevM3 = 0.0;
/** temporary internal state made available for higher order moments */
protected double n3 = 0.0;
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#increment(double)
*/
@ -70,30 +77,23 @@ public class FourthMoment extends ThirdMoment {
m4 = m3 = m2 = m1 = 0.0;
}
n++;
double dev = d - m1;
double v = dev / ((double) n);
double v2 = v * v;
double n0 = (double) n;
double n1 = (double) (n - 1);
double n2 = (double) (n - 2);
/* retain previous m3 */
prevM3 = m3;
/* increment m1, m2 and m3 (and prevM2, _n0, _n1, _n2, _v, _v2) */
super.increment(d);
n3 = (double) (n - 3);
m4 =
m4
- (4.0 * v * m3)
+ (6.0 * v2 * m2)
- (4.0 * v * prevM3)
+ (6.0 * v2 * prevM2)
+ ((n0 * n0) - 3 * n1) * (v2 * v2 * n1 * n0);
m3 = m3 - (3.0 * v * m2) + (n0 * n1 * n2 * v2 * v);
m2 = m2 + n1 * dev * v;
m1 = m1 + v;
return m4;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#getValue()
*/
@ -107,6 +107,8 @@ public class FourthMoment extends ThirdMoment {
public void clear() {
super.clear();
m4 = Double.NaN;
prevM3 = 0.0;
n3 = 0.0;
}
}

View File

@ -56,13 +56,11 @@ package org.apache.commons.math.stat.univariate.moment;
import org.apache.commons.math.stat.univariate.summary.SumOfLogs;
/**
* @author Mark Diggory
*
*
*/
public class GeometricMean extends SumOfLogs {
//private SumOfLogs sumLog = new SumOfLogs();
private double geoMean = Double.NaN;
private int n = 0;
@ -92,6 +90,12 @@ public class GeometricMean extends SumOfLogs {
}
/**
* Returns the geometric mean for this collection of values
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the geometric mean or Double.NaN if the array is empty or
* any of the values are &lt;= 0.
* @see org.apache.commons.math.stat.univariate.UnivariateStatistic#evaluate(double[], int, int)
*/
public double evaluate(double[] values, int begin, int length) {

View File

@ -53,93 +53,131 @@
*/
package org.apache.commons.math.stat.univariate.moment;
import org
.apache
.commons
.math
.stat
.univariate
.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*/
public class Kurtosis extends FourthMoment {
public class Kurtosis extends AbstractStorelessUnivariateStatistic {
private double kurtosis = Double.NaN;
protected FourthMoment moment = null;
protected boolean incMoment = true;
public Kurtosis() {
moment = new FourthMoment();
}
public Kurtosis(FourthMoment m4) {
incMoment = false;
this.moment = m4;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#increment(double)
*/
public double increment(double d) {
super.increment(d);
double variance = (n <= 1) ? 0.0 : m2 / (double) (n - 1);
if (incMoment) {
moment.increment(d);
}
double variance =
(moment.n < 1) ? 0.0 : moment.m2 / (double) (moment.n - 1);
kurtosis =
(n <= 3 || variance < 10E-20)
(moment.n <= 3 || variance < 10E-20)
? 0.0
: ((double)n * ((double)n + 1) * m4 - 3 * m2 * m2 * (n-1))
/ ((n-1) * (n-2) * (n-3) * variance * variance);
: (moment.n0 * (moment.n0 + 1) * moment.m4
- 3 * moment.m2 * moment.m2 * moment.n1)
/ (moment.n1 * moment.n2 * moment.n3 * variance * variance);
return kurtosis;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#getValue()
*/
public double getValue() {
return kurtosis;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#clear()
*/
public void clear() {
super.clear();
if (incMoment) {
moment.clear();
}
kurtosis = Double.NaN;
}
/*UnvariateStatistic Approach */
Mean mean = new Mean();
/**
* Returns the kurtosis for this collection of values. Kurtosis is a
* measure of the "peakedness" of a distribution.
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the kurtosis of the values or Double.NaN if the array is empty
*/
public double evaluate(double[] values, int begin, int length) {
test(values, begin, length);
* This algorithm uses a corrected two pass algorithm of the following
* <a href="http://lib-www.lanl.gov/numerical/bookcpdf/c14-1.pdf">
* corrected two pass formula (14.1.8)</a>, and also referenced in:<p/>
* "Algorithms for Computing the Sample Variance: Analysis and
* Recommendations", Chan, T.F., Golub, G.H., and LeVeque, R.J.
* 1983, American Statistician, vol. 37, pp. 242?247.
* <p/>
* Returns the kurtosis for this collection of values. Kurtosis is a
* measure of the "peakedness" of a distribution.
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the kurtosis of the values or Double.NaN if the array is empty
*/
public double evaluate(double[] values, int begin, int length) {
test(values, begin, length);
// Initialize the kurtosis
double kurt = Double.NaN;
// Initialize the kurtosis
double kurt = Double.NaN;
// Get the mean and the standard deviation
double mean = super.evaluate(values, begin, length);
// Get the mean and the standard deviation
double m = mean.evaluate(values, begin, length);
// Calc the std, this is implemented here instead of using the
// standardDeviation method eliminate a duplicate pass to get the mean
double accum = 0.0;
double accum2 = 0.0;
for (int i = begin; i < begin + length; i++) {
accum += Math.pow((values[i] - mean), 2.0);
accum2 += (values[i] - mean);
}
double stdDev =
Math.sqrt(
(accum - (Math.pow(accum2, 2) / ((double) length)))
/ (double) (length - 1));
// Calc the std, this is implemented here instead of using the
// standardDeviation method eliminate a duplicate pass to get the mean
double accum = 0.0;
double accum2 = 0.0;
for (int i = begin; i < begin + length; i++) {
accum += Math.pow((values[i] - m), 2.0);
accum2 += (values[i] - m);
}
// Sum the ^4 of the distance from the mean divided by the
// standard deviation
double accum3 = 0.0;
for (int i = begin; i < begin + length; i++) {
accum3 += Math.pow((values[i] - mean) / stdDev, 4.0);
}
double stdDev =
Math.sqrt(
(accum - (Math.pow(accum2, 2) / ((double) length)))
/ (double) (length - 1));
// Get N
double n = length;
// Sum the ^4 of the distance from the mean divided by the
// standard deviation
double accum3 = 0.0;
for (int i = begin; i < begin + length; i++) {
accum3 += Math.pow((values[i] - m) / stdDev, 4.0);
}
double coefficientOne = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3));
double termTwo = ((3 * Math.pow(n - 1, 2.0)) / ((n - 2) * (n - 3)));
// Calculate kurtosis
kurt = (coefficientOne * accum3) - termTwo;
// Get N
double n = length;
double coefficientOne = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3));
double termTwo = ((3 * Math.pow(n - 1, 2.0)) / ((n - 2) * (n - 3)));
// Calculate kurtosis
kurt = (coefficientOne * accum3) - termTwo;
return kurt;
}
return kurt;
}
}

View File

@ -53,57 +53,77 @@
*/
package org.apache.commons.math.stat.univariate.moment;
import org.apache.commons.math.stat.univariate.AbstractStorelessUnivariateStatistic;
import org
.apache
.commons
.math
.stat
.univariate
.AbstractStorelessUnivariateStatistic;
import org.apache.commons.math.stat.univariate.summary.Sum;
/**
* @author Mark Diggory
*
*/
public class Mean extends AbstractStorelessUnivariateStatistic {
/** count of values that have been added */
protected int n = 0;
/** first moment of values that have been added */
protected double m1 = Double.NaN;
private Sum sum = new Sum();
protected FirstMoment moment = null;
protected boolean incMoment = true;
public Mean() {
moment = new FirstMoment();
}
public Mean(FirstMoment m1) {
this.moment = m1;
incMoment = false;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#increment(double)
*/
public double increment(double d) {
if (n < 1) {
m1 = 0.0;
if (incMoment) {
moment.increment(d);
}
n++;
m1 += (d - m1) / ((double) n);
return m1;
return moment.m1;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#clear()
*/
public void clear() {
m1 = Double.NaN;
n = 0;
if (incMoment) {
moment.clear();
}
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#getValue()
*/
public double getValue() {
return m1;
return moment.m1;
}
/*UnvariateStatistic Approach */
Sum sum = new Sum();
/**
* Returns the <a href=http://www.xycoon.com/arithmetic_mean.htm>
* arithmetic mean </a> of the available values
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the mean of the values or Double.NaN if the array is empty
* @see org.apache.commons.math.stat.univariate.UnivariateStatistic#evaluate(double[], int, int)
*/
public double evaluate(double[] values, int begin, int length) {
if(test(values,begin,length))
if (test(values, begin, length)) {
return sum.evaluate(values, begin, length) / ((double) length);
}
return Double.NaN;
}

View File

@ -53,23 +53,18 @@
*/
package org.apache.commons.math.stat.univariate.moment;
import org
.apache
.commons
.math
.stat
.univariate
.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*
*/
public class SecondMoment extends Mean {
public class SecondMoment extends FirstMoment {
/** second moment of values that have been added */
protected double m2 = Double.NaN;
/** temporary internal state made availabel for higher order moments */
protected double n1 = 0.0;
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#increment(double)
*/
@ -77,16 +72,17 @@ public class SecondMoment extends Mean {
if (n < 1) {
m1 = m2 = 0.0;
}
/* increment m1 and _n0, _dev, _v) */
super.increment(d);
n++;
double dev = d - m1;
double v = dev / ((double) n);
m2 += ((double)(n - 1)) * dev * v;
m1 += v;
n1 = n0 - 1;
/* increment and return m2 */
m2 += n1 * dev * v;
return m2;
}
/**
@ -95,6 +91,7 @@ public class SecondMoment extends Mean {
public void clear() {
super.clear();
m2 = Double.NaN;
n1 = 0.0;
}
/**

View File

@ -53,28 +53,51 @@
*/
package org.apache.commons.math.stat.univariate.moment;
import org
.apache
.commons
.math
.stat
.univariate
.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*
*/
public class Skewness extends ThirdMoment {
public class Skewness extends AbstractStorelessUnivariateStatistic {
private double skewness = Double.NaN;
protected ThirdMoment moment = null;
protected boolean incMoment = true;
public Skewness() {
moment = new ThirdMoment();
}
public Skewness(ThirdMoment m3) {
incMoment = false;
this.moment = m3;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#increment(double)
*/
public double increment(double d) {
if (incMoment) {
moment.increment(d);
}
super.increment(d);
double variance = (n <= 1) ? 0.0 : m2 / (double) (n - 1);
double variance =
(moment.n < 1) ? 0.0 : moment.m2 / (double) (moment.n - 1);
skewness =
(n <= 2 || variance < 10E-20)
(moment.n <= 2 || variance < 10E-20)
? 0.0
: (((double) n) * m3)
/ ((n - 1) * (n - 2) * Math.sqrt(variance) * variance);
: (moment.n0 * moment.m3)
/ (moment.n1 * moment.n2 * Math.sqrt(variance) * variance);
return skewness;
}
@ -90,55 +113,69 @@ public class Skewness extends ThirdMoment {
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#clear()
*/
public void clear() {
super.clear();
if (incMoment) {
moment.clear();
}
skewness = Double.NaN;
}
/*UnvariateStatistic Approach */
Mean mean = new Mean();
/**
* Returns the skewness of a collection of values. Skewness is a
* measure of the assymetry of a given distribution.
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the skewness of the values or Double.NaN if the array is empty
*/
public double evaluate(double[] values, int begin, int length) {
* This algorithm uses a corrected two pass algorithm of the following
* <a href="http://lib-www.lanl.gov/numerical/bookcpdf/c14-1.pdf">
* corrected two pass formula (14.1.8)</a>, and also referenced in:<p/>
* "Algorithms for Computing the Sample Variance: Analysis and
* Recommendations", Chan, T.F., Golub, G.H., and LeVeque, R.J.
* 1983, American Statistician, vol. 37, pp. 242?247.
* <p/>
* Returns the skewness of a collection of values. Skewness is a
* measure of the assymetry of a given distribution.
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the skewness of the values or Double.NaN if the array is empty
* @see org.apache.commons.math.stat.univariate.UnivariateStatistic#evaluate(double[], int, int)
*/
public double evaluate(double[] values, int begin, int length) {
test(values, begin, length);
test(values, begin, length);
// Initialize the skewness
double skew = Double.NaN;
// Initialize the skewness
double skew = Double.NaN;
// Get the mean and the standard deviation
double mean = super.evaluate(values, begin, length);
// Get the mean and the standard deviation
double m = mean.evaluate(values, begin, length);
// Calc the std, this is implemented here instead of using the
// standardDeviation method eliminate a duplicate pass to get the mean
double accum = 0.0;
double accum2 = 0.0;
for (int i = begin; i < begin + length; i++) {
accum += Math.pow((values[i] - mean), 2.0);
accum2 += (values[i] - mean);
}
double stdDev =
Math.sqrt(
(accum - (Math.pow(accum2, 2) / ((double) length)))
/ (double) (length - 1));
// Calc the std, this is implemented here instead of using the
// standardDeviation method eliminate a duplicate pass to get the mean
double accum = 0.0;
double accum2 = 0.0;
for (int i = begin; i < begin + length; i++) {
accum += Math.pow((values[i] - m), 2.0);
accum2 += (values[i] - m);
}
double stdDev =
Math.sqrt(
(accum - (Math.pow(accum2, 2) / ((double) length)))
/ (double) (length - 1));
// Calculate the skew as the sum the cubes of the distance
// from the mean divided by the standard deviation.
double accum3 = 0.0;
for (int i = begin; i < begin + length; i++) {
accum3 += Math.pow((values[i] - mean) / stdDev, 3.0);
}
// Calculate the skew as the sum the cubes of the distance
// from the mean divided by the standard deviation.
double accum3 = 0.0;
for (int i = begin; i < begin + length; i++) {
accum3 += Math.pow((values[i] - m) / stdDev, 3.0);
}
// Get N
double n = length;
// Get N
double n = length;
// Calculate skewness
skew = (n / ((n - 1) * (n - 2))) * accum3;
// Calculate skewness
skew = (n / ((n - 1) * (n - 2))) * accum3;
return skew;
}
return skew;
}
}

View File

@ -53,47 +53,57 @@
*/
package org.apache.commons.math.stat.univariate.moment;
import org.apache.commons.math.stat.univariate.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*
*/
public class StandardDeviation extends AbstractStorelessUnivariateStatistic {
public class StandardDeviation extends Variance {
private double value = Double.NaN;
private double std = Double.NaN;
private Variance var = new Variance();
public StandardDeviation(){
super();
}
public StandardDeviation(SecondMoment m2){
super(m2);
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#increment(double)
*/
public double increment(double d) {
var.increment(d);
value = Math.sqrt(var.getValue());
return value;
super.increment(d);
std = (variance != 0.0) ? Math.sqrt(variance) : 0.0;
return std;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#getValue()
*/
public double getValue() {
return value;
return std;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#clear()
*/
public void clear() {
var.clear();
value = Double.NaN;
super.clear();
std = Double.NaN;
}
/* (non-Javadoc)
/**
* Returns the Standard Deviation on an array of values.
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the result, Double.NaN if no values for an empty array
* or 0.0 for a single value set.
* @see org.apache.commons.math.stat.univariate.UnivariateStatistic#evaluate(double[], int, int)
*/
public double evaluate(double[] values, int begin, int length) {
double tmp = var.evaluate(values, begin, length);
double tmp = super.evaluate(values, begin, length);
return tmp != 0.0 ? Math.sqrt(tmp) : 0.0;
}

View File

@ -54,7 +54,7 @@
package org.apache.commons.math.stat.univariate.moment;
/**
* @author Mark Diggory
*
*
*/
public class ThirdMoment extends SecondMoment{
@ -62,6 +62,15 @@ public class ThirdMoment extends SecondMoment{
/** third moment of values that have been added */
protected double m3 = Double.NaN;
/** temporary internal state made availabel for higher order moments */
protected double v2 = 0.0;
/** temporary internal state made availabel for higher order moments */
protected double n2 = 0.0;
/** temporary internal state made availabel for higher order moments */
protected double prevM2 = 0.0;
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#increment(double)
*/
@ -70,23 +79,17 @@ public class ThirdMoment extends SecondMoment{
m3 = m2 = m1 = 0.0;
}
n++;
/* retain a reference to the last m2*/
prevM2 = m2;
double dev = d - m1;
double v = dev / ((double) n);
double v2 = v * v;
double n0 = (double) n;
double n1 = (double) (n - 1);
double n2 = (double) (n - 2);
/* increment m1 and m2 (and _n0, _n1, _v) */
super.increment(d);
m3 = m3 - (3.0 * v * m2) + (n0 * n1 * n2 * v2 * v);
v2 = v * v;
n2 = (double) (n - 2);
m2 = m2 + n1 * dev * v;
m3 = m3 - (3.0 * v * prevM2) + (n0 * n1 * n2 * v2 * v);
m1 = m1 + v;
return m3;
}
@ -103,6 +106,9 @@ public class ThirdMoment extends SecondMoment{
public void clear() {
super.clear();
m3 = Double.NaN;
v2 = 0.0;
n2 = 0.0;
prevM2 = 0.0;
}
}

View File

@ -53,29 +53,37 @@
*/
package org.apache.commons.math.stat.univariate.moment;
import org
.apache
.commons
.math
.stat
.univariate
.AbstractStorelessUnivariateStatistic;
import org.apache.commons.math.stat.univariate.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*
*/
public class Variance extends SecondMoment {
public class Variance extends AbstractStorelessUnivariateStatistic{
private double variance = Double.NaN;
protected double variance = Double.NaN;
protected SecondMoment moment = null;
protected boolean incMoment = true;
public Variance(){
moment = new SecondMoment();
}
public Variance(SecondMoment m2){
incMoment = false;
this.moment = m2;
}
/**
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#increment(double)
*/
public double increment(double d) {
super.increment(d);
variance = (n < 1) ? 0.0 : m2 / (double)(n - 1);
if (incMoment) {
moment.increment(d);
}
variance = (moment.n < 1) ? 0.0 : moment.m2 / (double)(moment.n - 1);
return variance;
}
@ -91,11 +99,30 @@ public class Variance extends SecondMoment {
* @see org.apache.commons.math.stat.univariate.StorelessUnivariateStatistic#clear()
*/
public void clear() {
super.clear();
if (incMoment) {
moment.clear();
}
variance = Double.NaN;
}
/* (non-Javadoc)
/*UnvariateStatistic Approach */
Mean mean = new Mean();
/**
* Returns the variance of the available values. This uses a corrected
* two pass algorithm of the following
* <a href="http://lib-www.lanl.gov/numerical/bookcpdf/c14-1.pdf">
* corrected two pass formula (14.1.8)</a>, and also referenced in:<p/>
* "Algorithms for Computing the Sample Variance: Analysis and
* Recommendations", Chan, T.F., Golub, G.H., and LeVeque, R.J.
* 1983, American Statistician, vol. 37, pp. 242?247.
*
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the result, Double.NaN if no values for an empty array
* or 0.0 for a single value set.
* @see org.apache.commons.math.stat.univariate.UnivariateStatistic#evaluate(double[], int, int)
*/
public double evaluate(double[] values, int begin, int length) {
@ -103,7 +130,7 @@ public class Variance extends SecondMoment {
if (values.length == 1) {
var = 0;
} else if (values.length > 1) {
double m = super.evaluate(values, begin, length);
double m = mean.evaluate(values, begin, length);
double accum = 0.0;
double accum2 = 0.0;
for (int i = begin; i < begin + length; i++) {

View File

@ -62,7 +62,7 @@ import org
.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*/
public class Max extends AbstractStorelessUnivariateStatistic {

View File

@ -55,7 +55,7 @@ package org.apache.commons.math.stat.univariate.rank;
/**
* @author Mark Diggory
*
*/
public class Median extends Percentile {

View File

@ -62,7 +62,7 @@ import org
.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*/
public class Min extends AbstractStorelessUnivariateStatistic {

View File

@ -57,9 +57,7 @@ import java.util.Arrays;
import org.apache.commons.math.stat.univariate.AbstractUnivariateStatistic;
/**
* @author <a href="mailto:tobrien@apache.org">Tim O'Brien</a>
* @author Mark Diggory
* @author <a href="mailto:phil@steitz.com">Phil Steitz</a>
*
*/
public class Percentile extends AbstractUnivariateStatistic {

View File

@ -62,7 +62,7 @@ import org
.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*/
public class Product extends AbstractStorelessUnivariateStatistic {
@ -99,6 +99,11 @@ public class Product extends AbstractStorelessUnivariateStatistic {
}
/**
* Returns the product for this collection of values
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the product values or Double.NaN if the array is empty
* @see org.apache.commons.math.stat.univariate.UnivariateStatistic#evaluate(double[], int, int)
*/
public double evaluate(double[] values, int begin, int length) {

View File

@ -62,7 +62,6 @@ import org
.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*/
public class Sum extends AbstractStorelessUnivariateStatistic {
@ -99,6 +98,11 @@ public class Sum extends AbstractStorelessUnivariateStatistic {
}
/**
* The sum of the values that have been added to Univariate.
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the sum of the values or Double.NaN if the array is empty
* @see org.apache.commons.math.stat.univariate.UnivariateStatistic#evaluate(double[], int, int)
*/
public double evaluate(double[] values, int begin, int length) {

View File

@ -62,7 +62,6 @@ import org
.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*/
public class SumOfLogs extends AbstractStorelessUnivariateStatistic {
@ -100,6 +99,11 @@ public class SumOfLogs extends AbstractStorelessUnivariateStatistic {
}
/**
* Returns the sum of the natural logs for this collection of values
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the sumLog value or Double.NaN if the array is empty
* @see org.apache.commons.math.stat.univariate.UnivariateStatistic#evaluate(double[], int, int)
*/
public double evaluate(double[] values, int begin, int length) {

View File

@ -62,7 +62,6 @@ import org
.AbstractStorelessUnivariateStatistic;
/**
* @author Mark Diggory
*
*/
public class SumOfSquares extends AbstractStorelessUnivariateStatistic {
@ -99,6 +98,11 @@ public class SumOfSquares extends AbstractStorelessUnivariateStatistic {
}
/**
* Returns the sum of the squares of the available values.
* @param values Is a double[] containing the values
* @param begin processing at this point in the array
* @param length processing at this point in the array
* @return the sum of the squared values or Double.NaN if the array is empty
* @see org.apache.commons.math.stat.univariate.UnivariateStatistic#evaluate(double[], int, int)
*/
public double evaluate(double[] values, int begin, int length) {