package test.beast.math.distributions; import org.apache.commons.math.MathException; import beast.math.distributions.Normal; import beast.util.Randomizer; import junit.framework.TestCase; /** * adapted from BEAST 1 * @author Wai Lok Sibon Li * */ public class NormalDistributionTest extends TestCase { Normal norm; public void setUp() { norm = new Normal(); norm.initAndValidate(); Randomizer.setSeed(123); } public void testPdf() { System.out.println("Testing 10000 random pdf calls"); for (int i = 0; i < 10000; i++) { double M = Randomizer.nextDouble() * 10.0 - 5.0; double S = Randomizer.nextDouble() * 10; double x = Randomizer.nextDouble() * 10; norm.meanInput.setValue(M + "", norm); norm.sigmaInput.setValue(S + "", norm); norm.initAndValidate(); double a = 1.0 / (Math.sqrt(2.0 * Math.PI) * S); double b = -(x - M) * (x - M) / (2.0 * S * S); double pdf = a * Math.exp(b); assertEquals(pdf, norm.density(x), 1e-10); } /* Test with an example using R */ norm.meanInput.setValue(2.835202292812448 + "", norm); norm.sigmaInput.setValue(3.539139491639669 + "", norm); assertEquals(0.1123318, norm.density(2.540111), 1e-6); } public void testMean() { for (int i = 0; i < 1000; i++) { double M = Randomizer.nextDouble() * 10.0 - 5.0; norm.meanInput.setValue(M + "", norm); norm.initAndValidate(); assertEquals(M, norm.getMean(), 1e-10); } } // public void testVariance() { // // for (int i = 0; i < 1000; i++) { // double S = Randomizer.nextDouble() * 10; // norm.sigmaInput.setValue(S + "", norm); // norm.initAndValidate(); // // double variance = S * S; // // assertEquals(variance, norm.variance(), 1e-10); // } // } public void testMedian() throws MathException { System.out.println("Testing 10000 random quantile(0.5) calls"); for (int i = 0; i < 10000; i++) { double M = Randomizer.nextDouble() * 10.0 - 5.0; double S = Randomizer.nextDouble() * 10; norm.meanInput.setValue(M + "", norm); norm.sigmaInput.setValue(S + "", norm); norm.initAndValidate(); double median = M; assertEquals(median, norm.inverseCumulativeProbability(0.5), 1e-6); } } public void testCDFAndQuantile() throws MathException { System.out.println("Testing 10000 random quantile/cdf pairs"); for (int i = 0; i < 10000; i++) { double M = Randomizer.nextDouble() * 10.0 - 5.0; double S = Randomizer.nextDouble() * 10; norm.meanInput.setValue(M + "", norm); norm.sigmaInput.setValue(S + "", norm); norm.initAndValidate(); double p = Randomizer.nextDouble(); double quantile = norm.inverseCumulativeProbability(p); double cdf = norm.cumulativeProbability(quantile); assertEquals(p, cdf, 1e-7); } } // public void testCDFAndQuantile2() { // for(int i=0; i<10000; i++) { // double x =Randomizer.nextDouble(); // double m = Randomizer.nextDouble() * 10; // double s = Randomizer.nextDouble() * 10; // // double a = NormalDistribution.cdf(x, m, s, false); // double b =NormalDistribution.cdf(x, m, s); // // assertEquals(a, b, 1.0e-8); // } // } }