/* * KernelDensityEstimatorDistribution.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 dr.math.distributions; import dr.math.UnivariateFunction; /** * @author Marc Suchard */ public abstract class KernelDensityEstimatorDistribution implements Distribution { public KernelDensityEstimatorDistribution(Double[] sample, Double lowerBound, Double upperBound, Double bandWidth) { this.sample = new double[sample.length]; for (int i = 0; i < sample.length; i++) { this.sample[i] = sample[i]; } this.N = sample.length; processBounds(lowerBound, upperBound); setBandWidth(bandWidth); } abstract protected double evaluateKernel(double x); abstract protected void processBounds(Double lowerBound, Double upperBound); abstract protected void setBandWidth(Double bandWidth); /** * probability density function of the distribution * * @param x argument * @return pdf value */ public double pdf(double x) { return evaluateKernel(x); } /** * the natural log of the probability density function of the distribution * * @param x argument * @return log pdf value */ public double logPdf(double x) { return Math.log(pdf(x)); } /** * cumulative density function of the distribution * * @param x argument * @return cdf value */ public double cdf(double x) { throw new RuntimeException("Not Implemented."); } /** * quantile (inverse cumulative density function) of the distribution * * @param y argument * @return icdf value */ public double quantile(double y) { throw new RuntimeException("Not Implemented."); } /** * mean of the distribution * * @return mean */ public double mean() { throw new RuntimeException("Not Implemented."); } /** * variance of the distribution * * @return variance */ public double variance() { throw new RuntimeException("Not Implemented."); } /** * @return a probability density function representing this distribution */ public UnivariateFunction getProbabilityDensityFunction() { throw new RuntimeException("Not Implemented."); } public double getBandWidth() { return bandWidth; } public enum Type { GAUSSIAN("Gaussian"), GAMMA("Gamma"), LOGTRANSFORMEDGAUSSIAN("LogTransformedGaussian"), BETA("Beta"); private Type(String text) { this.text = text; } public String getText() { return text; } public static Type parseFromString(String text) { for (Type format : Type.values()) { if (format.getText().compareToIgnoreCase(text) == 0) return format; } return null; } private final String text; } protected int N; protected double lowerBound; protected double upperBound; protected double bandWidth; protected double[] sample; }