001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.commons.math.distribution; 019 020 /** 021 * Test cases for ChiSquareDistribution. 022 * Extends ContinuousDistributionAbstractTest. See class javadoc for 023 * ContinuousDistributionAbstractTest for details. 024 * 025 * @version $Revision: 762087 $ $Date: 2009-04-05 10:20:18 -0400 (Sun, 05 Apr 2009) $ 026 */ 027 public class ChiSquareDistributionTest extends ContinuousDistributionAbstractTest { 028 029 /** 030 * Constructor for ChiSquareDistributionTest. 031 * @param name 032 */ 033 public ChiSquareDistributionTest(String name) { 034 super(name); 035 } 036 037 //-------------- Implementations for abstract methods ----------------------- 038 039 /** Creates the default continuous distribution instance to use in tests. */ 040 @Override 041 public ContinuousDistribution makeDistribution() { 042 return new ChiSquaredDistributionImpl(5.0); 043 } 044 045 /** Creates the default cumulative probability distribution test input values */ 046 @Override 047 public double[] makeCumulativeTestPoints() { 048 // quantiles computed using R version 1.8.1 (linux version) 049 return new double[] {0.210216d, 0.5542981d, 0.8312116d, 1.145476d, 1.610308d, 050 20.51501d, 15.08627d, 12.83250d, 11.07050d, 9.236357d}; 051 } 052 053 /** Creates the default cumulative probability density test expected values */ 054 @Override 055 public double[] makeCumulativeTestValues() { 056 return new double[] {0.001d, 0.01d, 0.025d, 0.05d, 0.1d, 0.999d, 057 0.990d, 0.975d, 0.950d, 0.900d}; 058 } 059 060 /** Creates the default inverse cumulative probability test input values */ 061 @Override 062 public double[] makeInverseCumulativeTestPoints() { 063 return new double[] {0, 0.001d, 0.01d, 0.025d, 0.05d, 0.1d, 0.999d, 064 0.990d, 0.975d, 0.950d, 0.900d, 1}; 065 } 066 067 /** Creates the default inverse cumulative probability density test expected values */ 068 @Override 069 public double[] makeInverseCumulativeTestValues() { 070 return new double[] {0, 0.210216d, 0.5542981d, 0.8312116d, 1.145476d, 1.610308d, 071 20.51501d, 15.08627d, 12.83250d, 11.07050d, 9.236357d, 072 Double.POSITIVE_INFINITY}; 073 } 074 075 // --------------------- Override tolerance -------------- 076 @Override 077 protected void setUp() throws Exception { 078 super.setUp(); 079 setTolerance(5e-6); 080 } 081 082 //---------------------------- Additional test cases ------------------------- 083 084 public void testSmallDf() throws Exception { 085 setDistribution(new ChiSquaredDistributionImpl(0.1d)); 086 setTolerance(1E-4); 087 // quantiles computed using R version 1.8.1 (linux version) 088 setCumulativeTestPoints(new double[] {1.168926E-60, 1.168926E-40, 1.063132E-32, 089 1.144775E-26, 1.168926E-20, 5.472917, 2.175255, 1.13438, 090 0.5318646, 0.1526342}); 091 setInverseCumulativeTestValues(getCumulativeTestPoints()); 092 setInverseCumulativeTestPoints(getCumulativeTestValues()); 093 verifyCumulativeProbabilities(); 094 verifyInverseCumulativeProbabilities(); 095 } 096 097 public void testDfAccessors() { 098 ChiSquaredDistribution distribution = (ChiSquaredDistribution) getDistribution(); 099 assertEquals(5d, distribution.getDegreesOfFreedom(), Double.MIN_VALUE); 100 distribution.setDegreesOfFreedom(4d); 101 assertEquals(4d, distribution.getDegreesOfFreedom(), Double.MIN_VALUE); 102 try { 103 distribution.setDegreesOfFreedom(0d); 104 fail("Expecting IllegalArgumentException for df = 0"); 105 } catch (IllegalArgumentException ex) { 106 // expected 107 } 108 } 109 110 public void testDensity() { 111 double[] x = new double[]{-0.1, 1e-6, 0.5, 1, 2, 5}; 112 //R 2.5: print(dchisq(x, df=1), digits=10) 113 checkDensity(1, x, new double[]{0.00000000000, 398.94208093034, 0.43939128947, 0.24197072452, 0.10377687436, 0.01464498256}); 114 //R 2.5: print(dchisq(x, df=0.1), digits=10) 115 checkDensity(0.1, x, new double[]{0.000000000e+00, 2.486453997e+04, 7.464238732e-02, 3.009077718e-02, 9.447299159e-03, 8.827199396e-04}); 116 //R 2.5: print(dchisq(x, df=2), digits=10) 117 checkDensity(2, x, new double[]{0.00000000000, 0.49999975000, 0.38940039154, 0.30326532986, 0.18393972059, 0.04104249931}); 118 //R 2.5: print(dchisq(x, df=10), digits=10) 119 checkDensity(10, x, new double[]{0.000000000e+00, 1.302082682e-27, 6.337896998e-05, 7.897534632e-04, 7.664155024e-03, 6.680094289e-02}); 120 } 121 122 private void checkDensity(double df, double[] x, double[] expected) { 123 ChiSquaredDistribution d = new ChiSquaredDistributionImpl(df); 124 for (int i = 0; i < x.length; i++) { 125 assertEquals(expected[i], d.density(x[i]), 1e-5); 126 } 127 } 128 129 }