package test.dr.distibutions; import dr.math.distributions.LogNormalDistribution; import dr.math.interfaces.OneVariableFunction; import dr.math.iterations.BisectionZeroFinder; import junit.framework.TestCase; /** * @author Alexei Drummond */ public class LogNormalDistributionTest extends TestCase { LogNormalDistribution logNormal; public void setUp() { logNormal = new LogNormalDistribution(1.0, 2.0); } public void testPdf() { System.out.println("Testing 10000 random pdf calls"); for (int i = 0; i < 10000; i++) { double M = Math.random() * 10.0 - 5.0; double S = Math.random() * 10; double x = Math.log(Math.random() * 10); logNormal.setM(M); logNormal.setS(S); double pdf = 1.0 / (x * S * Math.sqrt(2 * Math.PI)) * Math.exp(-Math.pow(Math.log(x) - M, 2) / (2 * S * S)); if (x <= 0) pdf = 0; // see logNormal.pdf(x) //System.out.println("Testing logNormal[M=" + M + " S=" + S + "].pdf(" + x + ")"); assertEquals(pdf, logNormal.pdf(x), 1e-10); } } public void testMean() { for (int i = 0; i < 1000; i++) { double M = Math.random() * 10.0 - 5.0; double S = Math.random() * 10; logNormal.setM(M); logNormal.setS(S); double mean = Math.exp(M + S * S / 2); //System.out.println("Testing logNormal[M=" + M + " S=" + S + "].mean()"); assertEquals(mean, logNormal.mean(), 1e-10); } } public void testVariance() { for (int i = 0; i < 1000; i++) { double M = Math.random() * 10.0 - 5.0; double S = Math.random() * 10; logNormal.setM(M); logNormal.setS(S); double variance = (Math.exp(S * S) - 1) * Math.exp(2 * M + S * S); //System.out.println("Testing logNormal[M=" + M + " S=" + S + "].variance()"); assertEquals(variance, logNormal.variance(), 1e-10); } } public void testMedian() { System.out.println("Testing 10000 random quantile(0.5) calls"); for (int i = 0; i < 10000; i++) { double M = Math.random() * 10.0 - 5.0; double S = Math.random() * 10; logNormal.setM(M); logNormal.setS(S); double median = Math.exp(M); //System.out.println("Testing logNormal[M=" + M + " S=" + S + "].median()"); assertEquals(median, logNormal.quantile(0.5), median / 1e6); } } public void testCDFAndQuantile() { System.out.println("Testing 10000 random quantile/cdf pairs"); for (int i = 0; i < 10000; i++) { double M = Math.random() * 10.0 - 5.0; double S = Math.random() * 10; logNormal.setM(M); logNormal.setS(S); double p = Math.random(); double quantile = logNormal.quantile(p); double cdf = logNormal.cdf(quantile); assertEquals(p, cdf, 1e-8); } } public void testCDFAndQuantile2() { final LogNormalDistribution f = new LogNormalDistribution(1, 1); for (double i = 0.01; i < 0.95; i += 0.01) { final double y = i; BisectionZeroFinder zeroFinder = new BisectionZeroFinder(new OneVariableFunction() { public double value(double x) { return f.cdf(x) - y; } }, 0.01, 100); zeroFinder.evaluate(); assertEquals(f.quantile(i), zeroFinder.getResult(), 1e-6); } } }