/*
* File: StudentTConfidenceTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright August 7, 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.distribution.StudentTDistribution;
import gov.sandia.cognition.statistics.distribution.UnivariateGaussian;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Random;
import java.util.Collection;
import junit.framework.TestCase;
/**
*
* @author Kevin R. Dixon
*/
public class StudentTConfidenceTest
extends TestCase
{
public static Random RANDOM = new Random( 1 );
public StudentTConfidenceTest(String testName)
{
super(testName);
}
/**
* Test of twoTailTStatistic method, of class gov.sandia.cognition.learning.util.function.cost.StudentTConfidence.
*/
public void testStatisticTwoTailTStatistic()
{
System.out.println("Statistic.twoTailTStatistic");
final double EPS = 1e-3;
assertEquals(0.10, StudentTConfidence.Statistic.twoTailTStatistic(6.314, 1), EPS);
assertEquals(0.05, StudentTConfidence.Statistic.twoTailTStatistic(12.706, 1), EPS);
assertEquals(0.01, StudentTConfidence.Statistic.twoTailTStatistic(63.657, 1), EPS);
assertEquals(0.10, StudentTConfidence.Statistic.twoTailTStatistic(2.920, 2), EPS);
assertEquals(0.05, StudentTConfidence.Statistic.twoTailTStatistic(4.303, 2), EPS);
assertEquals(0.01, StudentTConfidence.Statistic.twoTailTStatistic(9.925, 2), EPS);
assertEquals(0.10, StudentTConfidence.Statistic.twoTailTStatistic(1.812, 10), EPS);
assertEquals(0.05, StudentTConfidence.Statistic.twoTailTStatistic(2.228, 10), EPS);
assertEquals(0.01, StudentTConfidence.Statistic.twoTailTStatistic(3.169, 10), EPS);
assertEquals(0.10, StudentTConfidence.Statistic.twoTailTStatistic(1.684, 40), EPS);
assertEquals(0.05, StudentTConfidence.Statistic.twoTailTStatistic(2.021, 40), EPS);
assertEquals(0.01, StudentTConfidence.Statistic.twoTailTStatistic(2.704, 40), EPS);
assertEquals(0.10, StudentTConfidence.Statistic.twoTailTStatistic(1.645, 1000), EPS);
assertEquals(0.05, StudentTConfidence.Statistic.twoTailTStatistic(1.960, 1000), EPS);
assertEquals(0.01, StudentTConfidence.Statistic.twoTailTStatistic(2.576, 1000), EPS);
}
/**
* Test of computeConfidenceInterval method, of class gov.sandia.cognition.learning.util.statistics.StudentTConfidence.
*/
public void testComputeConfidenceInterval()
{
System.out.println("computeConfidenceInterval");
int N = RANDOM.nextInt(1000) + 100;
double confidence = RANDOM.nextDouble();
Collection<Double> data = new LinkedList<Double>();
for (int i = 0; i < N; i++)
{
data.add(RANDOM.nextGaussian());
}
UnivariateGaussian g =
UnivariateGaussian.MaximumLikelihoodEstimator.learn(data, 0.0);
double dof = N - 1;
double alpha = 1.0 - confidence;
StudentTDistribution.CDF cdf = new StudentTDistribution.CDF( dof );
double z = -cdf.inverse(alpha / 2.0);
double delta = z * Math.sqrt(g.getVariance() / data.size());
StudentTConfidence conf = new StudentTConfidence();
ConfidenceInterval c = conf.computeConfidenceInterval(data, confidence);
final double EPS = 1e-5;
assertEquals(g.getMean(), c.getCentralValue(), EPS);
assertEquals(g.getMean() - delta, c.getLowerBound(), EPS);
assertEquals(g.getMean() + delta, c.getUpperBound(), EPS);
assertEquals(N, c.getNumSamples());
assertEquals(confidence, c.getConfidence());
}
/**
* Test of clone method, of class gov.sandia.cognition.learning.util.statistics.StudentTConfidence.
*/
public void testClone()
{
System.out.println("clone");
StudentTConfidence t = new StudentTConfidence();
StudentTConfidence clone = (StudentTConfidence) t.clone();
assertNotSame(t, clone);
}
/**
* Test of evaluateNullHypothesis method, of class gov.sandia.cognition.learning.util.statistics.StudentTConfidence.
*/
public void testEvaluateNullHypothesis()
{
System.out.println("evaluateNullHypothesis");
StudentTConfidence t = new StudentTConfidence();
// Result is from Microsoft Excel's function TTEST(data1,data2,2,1)
Collection<Double> data1 = new LinkedList<Double>();
data1.add(1.0);
data1.add(2.0);
data1.add(3.0);
data1.add(4.0);
Collection<Double> data2 = new LinkedList<Double>();
data2.add(1.0);
data2.add(2.0);
data2.add(3.0);
data2.add(5.0);
double result1 = t.evaluateNullHypothesis(data1, data2).getNullHypothesisProbability();
System.out.println("Result: " + result1);
assertEquals(0.3910022, result1, 1e-5);
data2.clear();
data2.add(1.0);
data2.add(1.0);
data2.add(1.0);
data2.add(2.0);
double result2 = t.evaluateNullHypothesis(data1, data2).getNullHypothesisProbability();
System.out.println("Result: " + result2);
assertEquals(0.0796049808088472, result2, 1e-5);
data2.clear();
data2.add(1.0);
data2.add(1.0);
data2.add(1.0);
data2.add(4.0);
double result3 = t.evaluateNullHypothesis(data1, data2).getNullHypothesisProbability();
System.out.println("Result: " + result3);
assertEquals(0.21516994193023, result3, 1e-5);
data1.addAll(data1);
data2.addAll(data2);
double result4 = t.evaluateNullHypothesis(data1, data2).getNullHypothesisProbability();
System.out.println("Result: " + result4);
assertEquals(0.0479447721419457, result4, 1e-5);
data2.clear();
for (int i = 1; i <= 8; i++)
{
data2.add((double) i);
}
double result5 = t.evaluateNullHypothesis(data1, data2).getNullHypothesisProbability();
System.out.println("Result: " + result5);
assertEquals(0.0331455001143753, result5, 1e-5);
}
public static StudentTConfidence.Statistic createStatisticInstance()
{
double dof = RANDOM.nextDouble() * 100 + 1.0;
StudentTDistribution.CDF cdf = new StudentTDistribution.CDF( dof );
double x = RANDOM.nextDouble() / 2.0 + 0.5;
double t = cdf.inverse(x);
return new StudentTConfidence.Statistic(t, dof);
}
/**
* Test of Statistic.clone method, of class gov.sandia.cognition.learning.util.statistics.StudentTConfidence.Statistic.
*/
public void testStatisticClone()
{
System.out.println("Statistic.clone");
StudentTConfidence.Statistic instance = createStatisticInstance();
StudentTConfidence.Statistic clone = instance.clone();
assertEquals(instance.getT(), clone.getT());
assertEquals(instance.getDegreesOfFreedom(), clone.getDegreesOfFreedom());
assertEquals(instance.getNullHypothesisProbability(), clone.getNullHypothesisProbability());
double p = StudentTConfidence.Statistic.twoTailTStatistic(instance.getT(), instance.getDegreesOfFreedom());
assertEquals(p, instance.getNullHypothesisProbability(), 1e-5);
}
/**
* Test of getT method, of class gov.sandia.cognition.learning.util.statistics.StudentTConfidence.Statistic.
*/
public void testStatisticGetT()
{
System.out.println("Statistic.getT");
StudentTConfidence.Statistic instance = createStatisticInstance();
assertTrue(instance.getT() != 0.0);
}
/**
* Test of setT method, of class gov.sandia.cognition.learning.util.statistics.StudentTConfidence.Statistic.
*/
public void testStatisticSetT()
{
System.out.println("Statistic.setT");
StudentTConfidence.Statistic instance = createStatisticInstance();
assertTrue(instance.getT() != 0.0);
double t2 = instance.getT();
instance.setT(t2);
assertEquals(t2, instance.getT());
}
/**
* Test of getDegreesOfFreedom method, of class gov.sandia.cognition.learning.util.statistics.StudentTConfidence.Statistic.
*/
public void testStatisticGetDegreesOfFreedom()
{
System.out.println("Statistic.getDegreesOfFreedom");
StudentTConfidence.Statistic instance = createStatisticInstance();
assertTrue(instance.getDegreesOfFreedom() > 0.0);
}
/**
* Test of setDegreesOfFreedom method, of class gov.sandia.cognition.learning.util.statistics.StudentTConfidence.Statistic.
*/
public void testStatisticSetDegreesOfFreedom()
{
System.out.println("Statistic.setDegreesOfFreedom");
StudentTConfidence.Statistic instance = createStatisticInstance();
assertTrue(instance.getDegreesOfFreedom() > 0.0);
double dof2 = instance.getDegreesOfFreedom();
instance.setDegreesOfFreedom(dof2);
assertEquals(dof2, instance.getDegreesOfFreedom());
try
{
instance.setDegreesOfFreedom(0.0);
fail("degreesOfFreedom > 0.0");
}
catch (Exception e)
{
System.out.println("Good: " + e);
}
}
/**
* Test for issue 58 where the result of passing in data versus passing
* in the relevant mean and variance were returning different values.
* The underlying issue was that an extra smoothing value was being added
* to the variance in the first case.
*/
public void testIssue58()
{
ConfidenceInterval c1 = StudentTConfidence.INSTANCE.computeConfidenceInterval(Arrays.asList(1D, 2D, 3D), 0.99);
ConfidenceInterval c2 = StudentTConfidence.INSTANCE.computeConfidenceInterval(2.0, 1.0, 3, 0.99);
assertEquals(c1.getUpperBound(), c2.getUpperBound(), 0.0);
assertEquals(c1.getLowerBound(), c2.getLowerBound(), 0.0);
// This is a degenerate variance case.
c2 = StudentTConfidence.INSTANCE.computeConfidenceInterval(2.0, 0, 3, 0.99);
assertEquals(c2.getLowerBound(), c2.getUpperBound());
}
}