01: /*
02: * Copyright 2003-2004 The Apache Software Foundation.
03: *
04: * Licensed under the Apache License, Version 2.0 (the "License");
05: * you may not use this file except in compliance with the License.
06: * You may obtain a copy of the License at
07: *
08: * http://www.apache.org/licenses/LICENSE-2.0
09: *
10: * Unless required by applicable law or agreed to in writing, software
11: * distributed under the License is distributed on an "AS IS" BASIS,
12: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13: * See the License for the specific language governing permissions and
14: * limitations under the License.
15: */
16: package org.apache.commons.math.stat.descriptive.moment;
17:
18: import java.io.Serializable;
19:
20: /**
21: * Computes a statistic related to the Second Central Moment. Specifically,
22: * what is computed is the sum of squared deviations from the sample mean.
23: * <p>
24: * The following recursive updating formula is used:
25: * <p>
26: * Let <ul>
27: * <li> dev = (current obs - previous mean) </li>
28: * <li> n = number of observations (including current obs) </li>
29: * </ul>
30: * Then
31: * <p>
32: * new value = old value + dev^2 * (n -1) / n.
33: * <p>
34: * Returns <code>Double.NaN</code> if no data values have been added and
35: * returns <code>0</code> if there is just one value in the data set.
36: * <p>
37: * <strong>Note that this implementation is not synchronized.</strong> If
38: * multiple threads access an instance of this class concurrently, and at least
39: * one of the threads invokes the <code>increment()</code> or
40: * <code>clear()</code> method, it must be synchronized externally.
41: *
42: * @version $Revision: 348519 $ $Date: 2005-11-23 12:12:18 -0700 (Wed, 23 Nov 2005) $
43: */
44: public class SecondMoment extends FirstMoment implements Serializable {
45:
46: /** Serializable version identifier */
47: private static final long serialVersionUID = 3942403127395076445L;
48:
49: /** second moment of values that have been added */
50: protected double m2;
51:
52: /**
53: * Create a SecondMoment instance
54: */
55: public SecondMoment() {
56: super ();
57: m2 = Double.NaN;
58: }
59:
60: /**
61: * @see org.apache.commons.math.stat.descriptive.StorelessUnivariateStatistic#increment(double)
62: */
63: public void increment(final double d) {
64: if (n < 1) {
65: m1 = m2 = 0.0;
66: }
67: super .increment(d);
68: m2 += ((double) n - 1) * dev * nDev;
69: }
70:
71: /**
72: * @see org.apache.commons.math.stat.descriptive.StorelessUnivariateStatistic#clear()
73: */
74: public void clear() {
75: super .clear();
76: m2 = Double.NaN;
77: }
78:
79: /**
80: * @see org.apache.commons.math.stat.descriptive.StorelessUnivariateStatistic#getResult()
81: */
82: public double getResult() {
83: return m2;
84: }
85:
86: }
|