/*
* GeneralizedIntegerGammaTest.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package test.dr.math;
import dr.evomodel.branchratemodel.LatentStateBranchRateModel;
import dr.inference.markovjumps.MarkovReward;
import dr.inference.markovjumps.SericolaSeriesMarkovReward;
import dr.inference.markovjumps.TwoStateOccupancyMarkovReward;
import dr.math.IntegrableUnivariateFunction;
import dr.math.distributions.GeneralizedIntegerGammaDistribution;
import dr.math.matrixAlgebra.Vector;
import org.apache.commons.math.FunctionEvaluationException;
import org.apache.commons.math.MaxIterationsExceededException;
import org.apache.commons.math.analysis.UnivariateRealFunction;
import org.apache.commons.math.analysis.integration.TrapezoidIntegrator;
/**
* @author Marc A. Suchard
*/
public class GeneralizedIntegerGammaTest extends MathTestCase {
private static final double tolerance = 10E-6;
private double sum(double[] v) {
double sum = 0.0;
for (double x : v) {
sum += x;
}
return sum;
}
int[] shape1s = new int[] { 10, 6, 2 };
int[] shape2s = new int[] { 1, 3, 4 };
double[] rate1s = new double[] { 0.1, 2, 3 };
double[] rate2s = new double[] { 2, 0.1, 0.2 };
double[] xs = new double[] { 0.1, 0.5, 1.2 };
public void testGeneratingFunction() {
for (int i = 0; i < shape1s.length; ++i) {
GeneralizedIntegerGammaDistribution gig = new GeneralizedIntegerGammaDistribution(
shape1s[i], shape2s[i], rate1s[i], rate2s[i]
);
double a = gig.generatingFunction(xs[i]);
double b = gig.generatingFunctionPartialFraction(xs[i]);
assertEquals(a, b, tolerance);
}
}
public void testPdf() {
for (int i = 0; i < shape1s.length; ++i) {
final GeneralizedIntegerGammaDistribution gig = new GeneralizedIntegerGammaDistribution(
shape1s[i], shape2s[i], rate1s[i], rate2s[i]
);
TrapezoidIntegrator integrator = new TrapezoidIntegrator();
double m0 = 0.0;
double m1 = 0.0;
double m2 = 0.0;
try {
m0 = integrator.integrate(
new UnivariateRealFunction() {
@Override
public double value(double x) throws FunctionEvaluationException {
final double pdf = gig.pdf(x);
return pdf;
}
}, 0.0, 1000.0);
m1 = integrator.integrate(
new UnivariateRealFunction() {
@Override
public double value(double x) throws FunctionEvaluationException {
final double pdf = gig.pdf(x);
return x * pdf;
}
}, 0.0, 1000.0);
m2 = integrator.integrate(
new UnivariateRealFunction() {
@Override
public double value(double x) throws FunctionEvaluationException {
final double pdf = gig.pdf(x);
return x * x * pdf;
}
}, 0.0, 1000.0);
} catch (MaxIterationsExceededException e) {
e.printStackTrace();
} catch (FunctionEvaluationException e) {
e.printStackTrace();
}
// Check normalization
assertEquals(1.0, m0, tolerance);
// Check mean
double mean = shape1s[i] / rate1s[i] + shape2s[i] / rate2s[i];
assertEquals(mean, m1, tolerance);
// Check variance
m2 -= m1 * m1;
double variance = shape1s[i] / rate1s[i] / rate1s[i] + shape2s[i] / rate2s[i] / rate2s[i];
assertEquals(variance, m2, tolerance * 10); // Harder to approximate
}
}
}