    1   /*
    2    * Copyright 2003-2004 The Apache Software Foundation.
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    *
    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 junit.framework.Test;
    19  import junit.framework.TestSuite;
    20
    21  import org.apache.commons.math.stat.descriptive.StorelessUnivariateStatisticAbstractTest;
    22  import org.apache.commons.math.stat.descriptive.UnivariateStatistic;
    23
    24  /***
    25   * Test cases for the {@link UnivariateStatistic} class.
    26   *
    27   * @version $Revision: 155427 $ $Date: 2005-02-26 06:11:52 -0700 (Sat, 26 Feb 2005) $
    28   */
    29  public class StandardDeviationTest extends StorelessUnivariateStatisticAbstractTest{
    30
    31      protected StandardDeviation stat;
    32
    33      /***
    34       * @param name
    35       */
    36      public StandardDeviationTest(String name) {
    37          super(name);
    38      }
    39
    40      /* (non-Javadoc)
    41       * @see org.apache.commons.math.stat.descriptive.UnivariateStatisticAbstractTest#getUnivariateStatistic()
    42       */
    43      public UnivariateStatistic getUnivariateStatistic() {
    44          return new StandardDeviation();
    45      }
    46
    47      public static Test suite() {
    48          TestSuite suite = new TestSuite(StandardDeviationTest.class);
    49          suite.setName("StandardDeviation Tests");
    50          return suite;
    51      }
    52
    53      /* (non-Javadoc)
    54       * @see org.apache.commons.math.stat.descriptive.UnivariateStatisticAbstractTest#expectedValue()
    55       */
    56      public double expectedValue() {
    57          return this.std;
    58      }
    59
    60      /***
    61       * Make sure Double.NaN is returned iff n = 0
    62       *
    63       */
    64      public void testNaN() {
    65          StandardDeviation std = new StandardDeviation();
    66          assertTrue(Double.isNaN(std.getResult()));
    67          std.increment(1d);
    68          assertEquals(0d, std.getResult(), 0);
    69      }
    70
    71      /***
    72       * Test population version of variance
    73       */
    74      public void testPopulation() {
    75          double[] values = {-1.0d, 3.1d, 4.0d, -2.1d, 22d, 11.7d, 3d, 14d};
    76          double sigma = populationStandardDeviation(values);
    77          SecondMoment m = new SecondMoment();
    78          m.evaluate(values);  // side effect is to add values
    79          StandardDeviation s1 = new StandardDeviation();
    80          s1.setBiasCorrected(false);
    81          assertEquals(sigma, s1.evaluate(values), 1E-14);
    82          s1.incrementAll(values);
    83          assertEquals(sigma, s1.getResult(), 1E-14);
    84          s1 = new StandardDeviation(false, m);
    85          assertEquals(sigma, s1.getResult(), 1E-14);
    86          s1 = new StandardDeviation(false);
    87          assertEquals(sigma, s1.evaluate(values), 1E-14);
    88          s1.incrementAll(values);
    89          assertEquals(sigma, s1.getResult(), 1E-14);
    90      }
    91
    92      /***
    93       * Definitional formula for population standard deviation
    94       */
    95      protected double populationStandardDeviation(double[] v) {
    96          double mean = new Mean().evaluate(v);
    97          double sum = 0;
    98          for (int i = 0; i < v.length; i++) {
    99              sum += (v[i] - mean) * (v[i] - mean);
    100         }
    101         return Math.sqrt(sum / (double) v.length);
    102     }
    103
    104 }