package test.dr.distibutions; import junit.framework.TestCase; import dr.math.distributions.InverseGammaDistribution; /** * Simple test for inverse gamma distribution. * * @author Joseph Heled * Date: 24/04/2009 */ public class InvGammaTest extends TestCase { interface TestData { double getShape(); double getScale(); double[] getPDF(); double[] getCDF(); } // test data generated from this python code: // import scipy.stats // //print """TestData[] tests = {""" //for shape,scale in ((3,2), (3,1)) : // d = scipy.stats.invgamma(shape, scale=scale) // print """ // new TestData() { // public double getShape() { // return %d; // } // // public double getScale() { // return %d; // }""" % (shape, scale) // x = (0.5, 1, 2) // print """ // public double[] getPDF() { // return new double[]{%s}; // }""" % " , ".join(["%g,%.14lf" % (z,d.pdf(z)) for z in x]) // // print """ // public double[] getCDF() { // return new double[]{%s}; // } // } ,""" % " , ".join(["%g,%.14lf" % (z,d.cdf(z)) for z in x]) // TestData[] tests = { new TestData() { public double getShape() { return 3; } public double getScale() { return 2; } public double[] getPDF() { return new double[]{0.5, 1.17220088887899, 1, 0.54134113294645, 2, 0.09196986029286}; } public double[] getCDF() { return new double[]{0.5, 0.23810330555354, 1, 0.67667641618306, 2, 0.91969860292861}; } }, new TestData() { public double getShape() { return 3; } public double getScale() { return 1; } public double[] getPDF() { return new double[]{0.5, 1.08268226589290, 1, 0.18393972058572, 2, 0.01895408311602}; } public double[] getCDF() { return new double[]{0.5, 0.67667641618306, 1, 0.91969860292861, 2, 0.98561232203303}; } }, }; public void testInvGamma() { for( TestData td : tests ) { InverseGammaDistribution d = new InverseGammaDistribution(td.getShape(), td.getScale()); { double[] p = td.getPDF(); for(int k = 0; k < p.length; k += 2) { assertEquals(d.pdf(p[k]), p[k + 1], 1e-10); assertEquals(d.logPdf(p[k]), Math.log(p[k + 1]), 1e-10); } } double[] cdf = td.getCDF(); for(int k = 0; k < cdf.length; k += 2) { assertEquals(d.cdf(cdf[k]), cdf[k + 1], 1e-10); } // int count[] = new int[cdf.length]; // final int N = 100000; // for(int k = 0; k < N; ++k) { // double x = d.nextInverseGamma(); // for(int l = 0; l < cdf.length; l += 2) { // if( x < cdf[l] ) { // count[l / 2] += 1; // } // } // } // for(int l = 0; l < cdf.length; l += 2) { // assertEquals(count[l / 2] / (double) N, cdf[l + 1], 5e-3); // } } } }