1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 Fourth Central Moment. Specifically,
22 * what is computed is the sum of
23 * <p>
24 * (x_i - xbar) ^ 4,
25 * <p>
26 * where the x_i are the
27 * sample observations and xbar is the sample mean.
28 * <p>
29 * The following recursive updating formula is used:
30 * <p>
31 * Let <ul>
32 * <li> dev = (current obs - previous mean) </li>
33 * <li> m2 = previous value of {@link SecondMoment} </li>
34 * <li> m2 = previous value of {@link ThirdMoment} </li>
35 * <li> n = number of observations (including current obs) </li>
36 * </ul>
37 * Then
38 * <p>
39 * new value = old value - 4 * (dev/n) * m3 + 6 * (dev/n)^2 * m2 + <br>
40 * [n^2 - 3 * (n-1)] * dev^4 * (n-1) / n^3
41 * <p>
42 * Returns <code>Double.NaN</code> if no data values have been added and
43 * returns <code>0</code> if there is just one value in the data set.
44 * <p>
45 * <strong>Note that this implementation is not synchronized.</strong> If
46 * multiple threads access an instance of this class concurrently, and at least
47 * one of the threads invokes the <code>increment()</code> or
48 * <code>clear()</code> method, it must be synchronized externally.
49 *
50 * @version $Revision: 348519 $ $Date: 2005-11-23 12:12:18 -0700 (Wed, 23 Nov 2005) $
51 */
52 public class FourthMoment extends ThirdMoment implements Serializable{
53
54 /** Serializable version identifier */
55 private static final long serialVersionUID = 4763990447117157611L;
56
57 /** fourth moment of values that have been added */
58 protected double m4;
59
60 /**
61 * Create a FourthMoment instance
62 */
63 public FourthMoment() {
64 super();
65 m4 = Double.NaN;
66 }
67
68 /**
69 * @see org.apache.commons.math.stat.descriptive.StorelessUnivariateStatistic#increment(double)
70 */
71 public void increment(final double d) {
72 if (n < 1) {
73 m4 = 0.0;
74 m3 = 0.0;
75 m2 = 0.0;
76 m1 = 0.0;
77 }
78
79 double prevM3 = m3;
80 double prevM2 = m2;
81
82 super.increment(d);
83
84 double n0 = (double) n;
85
86 m4 = m4 - 4.0 * nDev * prevM3 + 6.0 * nDevSq * prevM2 +
87 ((n0 * n0) - 3 * (n0 -1)) * (nDevSq * nDevSq * (n0 - 1) * n0);
88 }
89
90 /**
91 * @see org.apache.commons.math.stat.descriptive.StorelessUnivariateStatistic#getResult()
92 */
93 public double getResult() {
94 return m4;
95 }
96
97 /**
98 * @see org.apache.commons.math.stat.descriptive.StorelessUnivariateStatistic#clear()
99 */
100 public void clear() {
101 super.clear();
102 m4 = Double.NaN;
103 }
104
105 }