/*
* File: StudentTDistributionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright August 9, 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.distribution;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.statistics.SmoothUnivariateDistributionTestHarness;
import gov.sandia.cognition.math.UnivariateStatisticsUtil;
import java.util.ArrayList;
/**
*
* @author Kevin R. Dixon
*/
public class StudentTDistributionTest
extends SmoothUnivariateDistributionTestHarness
{
/**
* Constructor
* @param testName name
*/
public StudentTDistributionTest(
String testName)
{
super(testName);
}
@Override
public StudentTDistribution createInstance()
{
// return new StudentTDistribution( RANDOM.nextDouble() * 10.0 );
return new StudentTDistribution(
RANDOM.nextDouble() * 10.0 + 5.0,
RANDOM.nextDouble()*10.0 + 10.0,
RANDOM.nextDouble() *0.1 + 0.1 );
// RANDOM.nextGaussian(),
// RANDOM.nextDouble() * 3.0 + 2.0 );
}
@Override
public void testPDFKnownValues()
{
System.out.println( "PDF.evaluate" );
// I got these values from octave's t_pdf() function
StudentTDistribution.PDF instance = new StudentTDistribution.PDF( 5.0 );
assertEquals( 0.3796066898, instance.evaluate( 0.0 ), TOLERANCE );
instance.setDegreesOfFreedom( 100.0 );
assertEquals( 0.3979461869, instance.evaluate( 0.0 ), TOLERANCE );
instance.setDegreesOfFreedom( 10.0 );
assertEquals( 0.2303619892, instance.evaluate( 1 ), TOLERANCE );
assertEquals( 0.2303619892, instance.evaluate(-1 ), TOLERANCE );
assertEquals( 0.0611457663, instance.evaluate( 2 ), TOLERANCE );
assertEquals( 0.0611457663, instance.evaluate(-2 ), TOLERANCE );
instance.setDegreesOfFreedom( 3.0 );
assertEquals( 0.0675096607, instance.evaluate( 2 ), TOLERANCE );
assertEquals( 0.0675096607, instance.evaluate(-2 ), TOLERANCE );
instance.setMean(1.0);
assertEquals( 0.0675096607, instance.evaluate( 3 ), TOLERANCE );
assertEquals( 0.0675096607, instance.evaluate(-1 ), TOLERANCE );
}
@Override
public void testCDFKnownValues()
{
System.out.println("CDF.evaluate");
StudentTDistribution.CDF cdf = this.createInstance().getCDF();
double mean = cdf.getMean();
assertEquals( 0.5, cdf.evaluate( cdf.getMean() ), TOLERANCE );
cdf.setPrecision(1.0);
cdf.setDegreesOfFreedom(1.0);
final double OLD_TOLERANCE = TOLERANCE;
TOLERANCE = 1e-3;
assertEquals( 1-0.10/2, cdf.evaluate( 6.314+mean ), TOLERANCE );
assertEquals( 1-0.05/2, cdf.evaluate(12.706+mean ), TOLERANCE );
assertEquals( 1-0.01/2, cdf.evaluate(63.657+mean ), TOLERANCE );
// Try the reflected values here
assertEquals( 0.10/2, cdf.evaluate( -6.314+mean ), TOLERANCE );
assertEquals( 0.05/2, cdf.evaluate(-12.706+mean ), TOLERANCE );
assertEquals( 0.01/2, cdf.evaluate(-63.657+mean ), TOLERANCE );
cdf.setDegreesOfFreedom(2.0);
assertEquals( 1-0.10/2, cdf.evaluate( 2.920+mean ), TOLERANCE );
assertEquals( 1-0.05/2, cdf.evaluate( 4.303+mean ), TOLERANCE );
assertEquals( 1-0.01/2, cdf.evaluate( 9.925+mean ), TOLERANCE );
cdf.setDegreesOfFreedom(10.0);
assertEquals( 1-0.10/2, cdf.evaluate( 1.812+mean ), TOLERANCE );
assertEquals( 1-0.05/2, cdf.evaluate( 2.228+mean ), TOLERANCE );
assertEquals( 1-0.01/2, cdf.evaluate( 3.169+mean ), TOLERANCE );
cdf.setDegreesOfFreedom(40.0);
assertEquals( 1-0.10/2, cdf.evaluate( 1.684+mean ), TOLERANCE );
assertEquals( 1-0.05/2, cdf.evaluate( 2.021+mean ), TOLERANCE );
assertEquals( 1-0.01/2, cdf.evaluate( 2.704+mean ), TOLERANCE );
cdf.setDegreesOfFreedom(1000.0);
assertEquals( 1-0.10/2, cdf.evaluate( 1.645+mean ), TOLERANCE );
assertEquals( 1-0.05/2, cdf.evaluate( 1.960+mean ), TOLERANCE );
assertEquals( 1-0.01/2, cdf.evaluate( 2.576+mean ), TOLERANCE );
TOLERANCE = OLD_TOLERANCE;
}
@Override
public void testKnownConvertToVector()
{
System.out.println( "CDF.convertToVector" );
StudentTDistribution.CDF cdf = this.createInstance().getCDF();
Vector x = cdf.convertToVector();
assertEquals( 3, x.getDimensionality() );
assertEquals( cdf.getDegreesOfFreedom(), x.getElement( 0 ) );
assertEquals( cdf.getMean(), x.getElement( 1 ) );
assertEquals( cdf.getPrecision(), x.getElement( 2 ) );
}
/**
* Degenerate Variance
*/
public void testStudentTVariance2()
{
System.out.println( "Degenerate variance=2" );
// This method measures the empirical variance for dof=2.0
// It is empically about 11.840391255691173, but can be anywhere
// from 8-20.
StudentTDistribution cdf = new StudentTDistribution.CDF( 2.0 );
ArrayList<Double> samples = cdf.sample(RANDOM, NUM_SAMPLES);
double variance = UnivariateStatisticsUtil.computeVariance(samples);
System.out.println( "Dof = " + cdf.getDegreesOfFreedom() + ", Variance = " + variance );
}
/**
* Degenerate variance
*/
public void testStudentTVariance1()
{
System.out.println( "Degenerate variance=1" );
// This method measures the empirical variance for dof=1.0
// It is empically tending to infinity, about 245089.9606973919
StudentTDistribution cdf = new StudentTDistribution.CDF( 1.0 );
ArrayList<Double> samples = cdf.sample(RANDOM, NUM_SAMPLES);
double variance = UnivariateStatisticsUtil.computeVariance(samples);
System.out.println( "Dof = " + cdf.getDegreesOfFreedom() + ", Variance = " + variance );
}
/**
* getDegreesOfFreedom
*/
public void testGetDegreesOfFreedom()
{
System.out.println( "getDegreesOfFreedom" );
double dof = RANDOM.nextDouble();
StudentTDistribution t = new StudentTDistribution( dof );
assertEquals( dof, t.getDegreesOfFreedom() );
t = new StudentTDistribution.CDF();
assertEquals( StudentTDistribution.DEFAULT_DEGREES_OF_FREEDOM, t.getDegreesOfFreedom() );
}
/**
* setDegreesOfFreedom
*/
public void testSetDegreesOfFreedom()
{
System.out.println( "setDegreesOfFreedom" );
double dof = RANDOM.nextDouble();
StudentTDistribution t = new StudentTDistribution( dof );
assertEquals( dof, t.getDegreesOfFreedom() );
double d2 = dof + RANDOM.nextDouble();
t.setDegreesOfFreedom(d2);
assertEquals( d2, t.getDegreesOfFreedom() );
try
{
t.setDegreesOfFreedom(0.0);
fail( "DOFs must be > 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public void testPDFConstructors()
{
System.out.println( "PDF Constructors" );
StudentTDistribution.PDF f = new StudentTDistribution.PDF();
assertEquals( StudentTDistribution.DEFAULT_DEGREES_OF_FREEDOM, f.getDegreesOfFreedom() );
double dof = Math.abs( RANDOM.nextGaussian() ) + 3.0;
f = new StudentTDistribution.PDF( dof );
assertEquals( dof, f.getDegreesOfFreedom() );
StudentTDistribution.PDF f2 = new StudentTDistribution.PDF( f );
assertEquals( f.getDegreesOfFreedom(), f2.getDegreesOfFreedom() );
}
@Override
public void testDistributionConstructors()
{
System.out.println( "Constructors" );
StudentTDistribution f = new StudentTDistribution();
assertEquals( StudentTDistribution.DEFAULT_DEGREES_OF_FREEDOM, f.getDegreesOfFreedom() );
double dof = Math.abs( RANDOM.nextGaussian() ) + 3.0;
f = new StudentTDistribution( dof );
assertEquals( dof, f.getDegreesOfFreedom() );
StudentTDistribution f2 = new StudentTDistribution( f );
assertEquals( f.getDegreesOfFreedom(), f2.getDegreesOfFreedom() );
}
@Override
public void testCDFConstructors()
{
System.out.println( "CDF Constructors" );
StudentTDistribution.CDF f = new StudentTDistribution.CDF();
assertEquals( StudentTDistribution.DEFAULT_DEGREES_OF_FREEDOM, f.getDegreesOfFreedom() );
double dof = Math.abs( RANDOM.nextGaussian() ) + 3.0;
f = new StudentTDistribution.CDF( dof );
assertEquals( dof, f.getDegreesOfFreedom() );
StudentTDistribution.CDF f2 = new StudentTDistribution.CDF( f );
assertEquals( f.getDegreesOfFreedom(), f2.getDegreesOfFreedom() );
}
/**
* setPrecision
*/
public void testSetPrecision()
{
System.out.println( "setPrecision" );
StudentTDistribution instance = this.createInstance();
double precision = RANDOM.nextDouble();
instance.setPrecision(precision);
assertEquals( precision, instance.getPrecision() );
try
{
instance.setPrecision(0.0);
fail( "Precision must be > 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Learner
*/
public void testLearner()
{
System.out.println( "Learner" );
StudentTDistribution.MaximumLikelihoodEstimator learner =
new StudentTDistribution.MaximumLikelihoodEstimator();
this.distributionEstimatorTest(learner);
}
/**
* Weighted learner
*/
public void testWeightedLearner()
{
System.out.println( "Weighted Learner" );
StudentTDistribution.WeightedMaximumLikelihoodEstimator learner =
new StudentTDistribution.WeightedMaximumLikelihoodEstimator();
this.weightedDistributionEstimatorTest(learner);
}
}