com.opengamma.analytics.math.statistics.estimation.GeneralizedParetoDistributionMomentEstimator.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.analytics.math.statistics.estimation.GeneralizedParetoDistributionMomentEstimator.java

Source

/**
 * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.analytics.math.statistics.estimation;

import org.apache.commons.lang.Validate;

import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.rootfinding.BisectionSingleRootFinder;
import com.opengamma.analytics.math.rootfinding.BracketRoot;
import com.opengamma.analytics.math.rootfinding.RealSingleRootFinder;
import com.opengamma.analytics.math.statistics.descriptive.MeanCalculator;
import com.opengamma.analytics.math.statistics.descriptive.SampleSkewnessCalculator;
import com.opengamma.analytics.math.statistics.descriptive.SampleVarianceCalculator;
import com.opengamma.analytics.math.statistics.distribution.GeneralizedParetoDistribution;
import com.opengamma.analytics.math.statistics.distribution.ProbabilityDistribution;

/**
 * 
 */
public class GeneralizedParetoDistributionMomentEstimator extends DistributionParameterEstimator<Double> {
    private static final Function1D<double[], Double> MEAN = new MeanCalculator();
    private static final Function1D<double[], Double> VARIANCE = new SampleVarianceCalculator();
    private static final Function1D<double[], Double> SKEWNESS = new SampleSkewnessCalculator();
    private static final RealSingleRootFinder ROOT_FINDER = new BisectionSingleRootFinder();
    private static final BracketRoot BRACKETER = new BracketRoot();

    @Override
    public ProbabilityDistribution<Double> evaluate(final double[] x) {
        Validate.notNull(x);
        final double mean = MEAN.evaluate(x);
        final double variance = VARIANCE.evaluate(x);
        final double skewness = SKEWNESS.evaluate(x);
        final Function1D<Double, Double> ksiFunction = new Function1D<Double, Double>() {

            @Override
            public Double evaluate(final Double a) {
                return 2 * (1 + a) * Math.sqrt(1 - 2. * a) / (1 - 3. * a) - skewness;
            }

        };
        double[] bracket = BRACKETER.getBracketedPoints(ksiFunction, 0, 0.33333);
        final double ksi = ROOT_FINDER.getRoot(ksiFunction, bracket[0], bracket[1]);
        final double ksiP1 = 1 - ksi;
        final double sigma = Math.sqrt(variance * (1 - 2 * ksi) * ksiP1 * ksiP1);
        final double mu = mean - sigma / ksiP1;
        return new GeneralizedParetoDistribution(mu, sigma, ksi);
    }
}