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;
}