/* * File: KolmogorovSmirnovConfidenceTest.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright August 15, 2007, Sandia Corporation. Under the terms of Contract * DE-AC04-94AL85000, there is a non-exclusive license for use of this work by * or on behalf of the U.S. Government. Export of this program may require a * license from the United States Government. See CopyrightHistory.txt for * complete details. * */ package gov.sandia.cognition.statistics.method; import gov.sandia.cognition.statistics.CumulativeDistributionFunction; import gov.sandia.cognition.statistics.distribution.KolmogorovDistribution; import gov.sandia.cognition.statistics.distribution.StudentTDistribution; import gov.sandia.cognition.statistics.distribution.UniformDistribution; import gov.sandia.cognition.statistics.distribution.UnivariateGaussian; import gov.sandia.cognition.statistics.method.KolmogorovSmirnovConfidence.Statistic; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.Random; import junit.framework.TestCase; /** * * @author Kevin R. Dixon */ public class KolmogorovSmirnovConfidenceTest extends TestCase { /** * RNG */ public Random random = new Random( 1 ); /** * Constructor * @param testName */ public KolmogorovSmirnovConfidenceTest(String testName) { super(testName); } /** * Test of clone method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence. */ public void testClone() { System.out.println("clone"); KolmogorovSmirnovConfidence instance = new KolmogorovSmirnovConfidence(); KolmogorovSmirnovConfidence clone = (KolmogorovSmirnovConfidence) instance.clone(); assertNotSame(instance, clone); } /** * Test of kstest method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence. */ public void testEvaluateNullHypothesisCDF() { System.out.println("testEvaluateNullHypothesisCDF"); LinkedList<Double> p1 = new LinkedList<Double>(); LinkedList<Double> p2 = new LinkedList<Double>(); int N = 100; double mean = 0.0; double variance = random.nextDouble(); CumulativeDistributionFunction<Double> cdf1 = new UnivariateGaussian.CDF(mean, variance); CumulativeDistributionFunction<Double> cdf2 = new StudentTDistribution.CDF(2.0); for (int i = 0; i < 100; i++) { ArrayList<? extends Double> v1 = cdf1.sample( random, N ); p1.add(KolmogorovSmirnovConfidence.evaluateNullHypothesis(v1, cdf1).getNullHypothesisProbability()); p2.add(KolmogorovSmirnovConfidence.evaluateNullHypothesis(v1, cdf2).getNullHypothesisProbability()); } double confidence = 0.95; GaussianConfidence gc = new GaussianConfidence(); ConfidenceInterval c1 = gc.computeConfidenceInterval(p1, confidence); ConfidenceInterval c2 = gc.computeConfidenceInterval(p2, confidence); ConfidenceStatistic cs12 = gc.evaluateNullHypothesis(p1, p2); System.out.println("Gaussian: " + c1); System.out.println("Student-t: " + c2); System.out.println("Null Hypo: " + cs12.getNullHypothesisProbability()); assertTrue(c1.getCentralValue() > 1.0 - confidence); assertTrue(cs12.getNullHypothesisProbability() < 1.0 - confidence); } /** * Test of kstest method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence. */ public void testEvaluateNullHypothesisData() { System.out.println("evaluateNullHypothesisData"); LinkedList<Double> p11 = new LinkedList<Double>(); LinkedList<Double> p12 = new LinkedList<Double>(); LinkedList<Double> p1bad = new LinkedList<Double>(); LinkedList<Double> p2bad = new LinkedList<Double>(); int N = 100; double mean = 0.0; double variance = random.nextDouble(); CumulativeDistributionFunction<Double> cdf1 = new UnivariateGaussian.CDF(mean, variance); KolmogorovSmirnovConfidence instance = new KolmogorovSmirnovConfidence(); for (int i = 0; i < 1000; i++) { Collection<? extends Double> v11 = cdf1.sample( random, N ); Collection<? extends Double> v12 = cdf1.sample( random, N ); Collection<Double> vbad = new UniformDistribution().sample( random, N ); p11.add(instance.evaluateNullHypothesis(v11, v11).getNullHypothesisProbability()); p12.add(instance.evaluateNullHypothesis(v11, v12).getNullHypothesisProbability()); p1bad.add(instance.evaluateNullHypothesis(v11, vbad).getNullHypothesisProbability()); p2bad.add(instance.evaluateNullHypothesis(v12, vbad).getNullHypothesisProbability()); } double confidence = 0.95; GaussianConfidence gc = new GaussianConfidence(); ConfidenceInterval c12 = gc.computeConfidenceInterval(p12, confidence); System.out.println("GC12: " + c12); assertTrue(1.0 - confidence < c12.getCentralValue()); } /** * Test of KSsignificance method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence. */ public void testStatisticKSSignificance() { System.out.println("Statistic.KSSignificance"); double Ne = random.nextInt(100) + 10.0; double D = random.nextDouble(); double expected = 1.0 - KolmogorovDistribution.CDF.evaluate( (Math.sqrt(Ne) + 0.12 + 0.11 / Math.sqrt(Ne)) * D); double result = KolmogorovSmirnovConfidence.Statistic.KSsignificance(Ne, D); assertEquals(expected, result); } /** * Test of computeAscendingArray method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence. */ public void testComputeAscendingArray() { System.out.println("computeAscendingArray"); Collection<Double> data = new LinkedList<Double>(); int N = random.nextInt(1000) + 100; for (int i = 0; i < N; i++) { data.add(random.nextDouble()); } double[] expResult = null; double[] result = KolmogorovSmirnovConfidence.computeAscendingArray(data); assertEquals(data.size(), result.length); double previous, current = result[0]; for (int i = 1; i < result.length; i++) { previous = current; current = result[i]; assertTrue(previous <= current); } } public KolmogorovSmirnovConfidence.Statistic createStatisticInstance() { double D = random.nextDouble(); double Ne = random.nextInt(1000) + 1.0; return new KolmogorovSmirnovConfidence.Statistic(Ne, D); } /** * Test of clone method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence.Statistic. */ public void testStatisticClone() { System.out.println("Statistic.clone"); KolmogorovSmirnovConfidence.Statistic instance = createStatisticInstance(); KolmogorovSmirnovConfidence.Statistic clone = (Statistic) instance.clone(); double p = KolmogorovSmirnovConfidence.Statistic.KSsignificance(instance.getNe(), instance.getD()); System.out.println("P = " + p); assertEquals(p, instance.getNullHypothesisProbability()); assertEquals(instance.getNullHypothesisProbability(), clone.getNullHypothesisProbability()); assertEquals(instance.getD(), clone.getD()); assertEquals(instance.getNe(), clone.getNe()); } /** * Test of getD method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence.Statistic. */ public void testStatisticGetD() { System.out.println("Statistic.getD"); KolmogorovSmirnovConfidence.Statistic instance = createStatisticInstance(); assertTrue(instance.getD() >= 0.0); assertTrue(instance.getD() <= 1.0); } /** * Test of setD method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence.Statistic. */ public void testStatisticSetD() { System.out.println("Statistic.setD"); KolmogorovSmirnovConfidence.Statistic instance = this.createStatisticInstance(); assertTrue(instance.getD() >= 0.0); assertTrue(instance.getD() <= 1.0); double d2 = instance.getD() / 2.0; instance.setD(d2); assertEquals(d2, instance.getD()); instance.setD(0.0); instance.setD(1.0); try { instance.setD(-1.0); fail("0.0 <= D <= 1.0"); } catch (Exception e) { System.out.println("Good: " + e); } try { instance.setD(1.1); fail("0.0 <= D <= 1.0"); } catch (Exception e) { System.out.println("Good: " + e); } } /** * Test of getNe method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence.Statistic. */ public void testStatisticGetNe() { System.out.println("Statistic.getNe"); KolmogorovSmirnovConfidence.Statistic instance = this.createStatisticInstance(); assertTrue(instance.getNe() > 0.0); } /** * Test of setNe method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence.Statistic. */ public void testStatisticSetNe() { System.out.println("Statistic.setNe"); KolmogorovSmirnovConfidence.Statistic instance = this.createStatisticInstance(); assertTrue(instance.getNe() > 0.0); double ne2 = instance.getNe() + 1.0; instance.setNe(ne2); assertEquals(ne2, instance.getNe()); instance.setNe(Double.POSITIVE_INFINITY); } /** * Test of evaluateGaussianHypothesis method, of class gov.sandia.cognition.learning.util.statistics.KolmogorovSmirnovConfidence. */ public void testEvaluateGaussianHypothesis() { System.out.println("evaluateGaussianHypothesis"); double r = 5; double mean = random.nextGaussian(); double variance = random.nextDouble() * r; UnivariateGaussian.CDF cdf1 = new UnivariateGaussian.CDF(mean, variance); UnivariateGaussian.CDF cdf2 = new UnivariateGaussian.CDF(mean + r, variance); UnivariateGaussian.CDF cdf3 = new UnivariateGaussian.CDF(mean, variance / r); UniformDistribution.CDF cdf4 = new UniformDistribution.CDF(mean - variance, mean + variance); int N = 1000; Collection<Double> data = cdf1.sample( random, N ); KolmogorovSmirnovConfidence.Statistic s0 = KolmogorovSmirnovConfidence.evaluateGaussianHypothesis(data); System.out.println("Gaussian test: " + s0.getNullHypothesisProbability()); KolmogorovSmirnovConfidence.Statistic s1 = KolmogorovSmirnovConfidence.evaluateNullHypothesis(data, cdf1); System.out.println("CDF test 1: " + s1.getNullHypothesisProbability()); KolmogorovSmirnovConfidence.Statistic s2 = KolmogorovSmirnovConfidence.evaluateNullHypothesis(data, cdf2); System.out.println("CDF test 2: " + s2.getNullHypothesisProbability()); KolmogorovSmirnovConfidence.Statistic s3 = KolmogorovSmirnovConfidence.evaluateNullHypothesis(data, cdf3); System.out.println("CDF test 3: " + s3.getNullHypothesisProbability()); KolmogorovSmirnovConfidence.Statistic s4 = KolmogorovSmirnovConfidence.evaluateNullHypothesis(data, cdf4); System.out.println("CDF test 4: " + s4.getNullHypothesisProbability()); } }