25package umontreal.ssj.probdist;
27import umontreal.ssj.util.*;
28import umontreal.ssj.functions.MathFunction;
61 public Function(
double sb1) {
65 public double evaluate(
double t) {
66 return (t * t * t - 3 * t - a);
70 private static double[] initPar(
double[] x,
int n,
double xmin) {
75 for (j = 0; j < n; j++) {
78 double mean = sum / n;
83 for (j = 0; j < n; j++) {
91 v = m3 / Math.pow(m2, 1.5);
92 Function f =
new Function(v);
94 double tlim = Math.cbrt(v);
101 throw new UnsupportedOperationException(
"t <= 0; no MLE");
102 double xi = mean - Math.sqrt(m2 / t);
106 v = 1 + m2 / ((mean - xi) * (mean - xi));
107 double delta = 1.0 / Math.sqrt((Math.log(v)));
109 double lambda = (mean - xi) / v;
110 double[] param =
new double[3];
117 private static class Optim
implements Uncmin_methods {
122 private static final double BARRIER = 1.0e100;
124 public Optim(
double[] X,
int n,
double xmin) {
130 public double f_to_minimize(
double[] par) {
133 double delta = par[1];
135 double lambda = par[3];
136 if (delta <= 0.0 || lambda <= 0.0)
141 double loglam = Math.log(lambda);
145 for (
int j = 0; j < n; j++) {
146 v = Math.log(X[j] - xi);
147 z = delta * (v - loglam);
152 return sumv + sumz / 2.0 - n * Math.log(delta);
155 public void gradient(
double[] x,
double[] g) {
158 public void hessian(
double[] x,
double[][] h) {
167 this(gamma, delta, 0, 1);
176 public JohnsonSLDist(
double gamma,
double delta,
double xi,
double lambda) {
177 super(gamma, delta, xi, lambda);
181 private void setLastParams(
double xi) {
186 return density(gamma, delta, xi, lambda, x);
189 public double cdf(
double x) {
190 return cdf(gamma, delta, xi, lambda, x);
194 return barF(gamma, delta, xi, lambda, x);
198 return inverseF(gamma, delta, xi, lambda, u);
210 return JohnsonSLDist.getStandardDeviation(gamma, delta, xi, lambda);
216 public static double density(
double gamma,
double delta,
double xi,
double lambda,
double x) {
218 throw new IllegalArgumentException(
"lambda <= 0");
220 throw new IllegalArgumentException(
"delta <= 0");
224 double y = (x - xi) / lambda;
225 double z = gamma + delta * Math.log(y);
228 return delta * Math.exp(-z * z / 2.0) / (lambda * y * Math.sqrt(2.0 * Math.PI));
234 public static double cdf(
double gamma,
double delta,
double xi,
double lambda,
double x) {
236 throw new IllegalArgumentException(
"lambda <= 0");
238 throw new IllegalArgumentException(
"delta <= 0");
242 double y = (x - xi) / lambda;
243 double z = gamma + delta * Math.log(y);
250 public static double barF(
double gamma,
double delta,
double xi,
double lambda,
double x) {
252 throw new IllegalArgumentException(
"lambda <= 0");
254 throw new IllegalArgumentException(
"delta <= 0");
258 double y = (x - xi) / lambda;
259 double z = gamma + delta * Math.log(y);
266 public static double inverseF(
double gamma,
double delta,
double xi,
double lambda,
double u) {
268 throw new IllegalArgumentException(
"lambda <= 0");
270 throw new IllegalArgumentException(
"delta <= 0");
271 if (u > 1.0 || u < 0.0)
272 throw new IllegalArgumentException(
"u not in [0,1]");
275 return Double.POSITIVE_INFINITY;
280 double t = (z - gamma) / delta;
282 return Double.POSITIVE_INFINITY;
286 return xi + lambda * Math.exp(t);
301 public static double[]
getMLE(
double[] x,
int n) {
303 throw new IllegalArgumentException(
"n <= 0");
306 double xmin = Double.MAX_VALUE;
307 for (j = 0; j < n; j++) {
311 double[] paramIn =
new double[3];
312 paramIn = initPar(x, n, xmin);
313 double[] paramOpt =
new double[4];
314 for (
int i = 0; i < 3; i++)
315 paramOpt[i + 1] = paramIn[i];
317 Optim system =
new Optim(x, n, xmin);
319 double[] xpls =
new double[4];
320 double[] fpls =
new double[4];
321 double[] gpls =
new double[4];
322 int[] itrcmd =
new int[2];
323 double[][] a =
new double[4][4];
324 double[] udiag =
new double[4];
326 Uncmin_f77.optif0_f77(3, paramOpt, system, xpls, fpls, gpls, itrcmd, a, udiag);
328 double[] param =
new double[4];
330 for (
int i = 1; i <= 3; i++)
345 double param[] =
getMLE(x, n);
357 public static double getMean(
double gamma,
double delta,
double xi,
double lambda) {
359 throw new IllegalArgumentException(
"lambda <= 0");
361 throw new IllegalArgumentException(
"delta <= 0");
363 double t = 1.0 / (2.0 * delta * delta) - gamma / delta;
364 return (xi + lambda * Math.exp(t));
377 public static double getVariance(
double gamma,
double delta,
double xi,
double lambda) {
379 throw new IllegalArgumentException(
"lambda <= 0");
381 throw new IllegalArgumentException(
"delta <= 0");
383 double t = 1.0 / (delta * delta) - 2 * gamma / delta;
384 return lambda * lambda * Math.exp(t) * (Math.exp(1.0 / (delta * delta)) - 1);
395 return Math.sqrt(
JohnsonSLDist.getVariance(gamma, delta, xi, lambda));
403 public void setParams(
double gamma,
double delta,
double xi,
double lambda) {
double inverseF(double u)
Returns the inverse distribution function .
static double density(double gamma, double delta, double xi, double lambda, double x)
Returns the density function .
static JohnsonSLDist getInstanceFromMLE(double[] x, int n)
Creates a new instance of a Johnson distribution with parameters 0, , and over the interval estim...
double density(double x)
Returns , the density evaluated at .
static double getVariance(double gamma, double delta, double xi, double lambda)
Returns the variance.
JohnsonSLDist(double gamma, double delta, double xi, double lambda)
Constructs a JohnsonSLDist object with shape parameters.
static double getStandardDeviation(double gamma, double delta, double xi, double lambda)
Returns the standard deviation of the Johnson distribution with parameters , , ,.
double getMean()
Returns the mean.
static double barF(double gamma, double delta, double xi, double lambda, double x)
Returns the complementary distribution function .
void setParams(double gamma, double delta, double xi, double lambda)
Sets the value of the parameters , ,.
static double cdf(double gamma, double delta, double xi, double lambda, double x)
Returns the distribution function .
static double getMean(double gamma, double delta, double xi, double lambda)
Returns the mean.
double getVariance()
Returns the variance.
static double[] getMLE(double[] x, int n)
Estimates the parameters , , ,.
JohnsonSLDist(double gamma, double delta)
Same as JohnsonSLDist(gamma, delta, 0, 1).
static double inverseF(double gamma, double delta, double xi, double lambda, double u)
Returns the inverse distribution function .
double cdf(double x)
Returns the distribution function .
double getStandardDeviation()
Returns the standard deviation.
double barF(double x)
Returns the complementary distribution function.
void setParams0(double gamma, double delta, double xi, double lambda)
Sets the value of the parameters , ,.
JohnsonSystem(double gamma, double delta, double xi, double lambda)
Constructs a JohnsonSystem object with shape parameters.
Extends the class ContinuousDistribution for the normal distribution (e.g., tjoh95a (page 80)).
static double inverseF01(double u)
Same as inverseF(0, 1, u).
static double cdf01(double x)
Same as cdf(0, 1, x).
static double barF01(double x)
Same as barF(0, 1, x).
This class provides various constants and methods to compute numerical quantities such as factorials,...
static final int DBL_MIN_EXP
Smallest int such that is representable (approximately) as a normalised double.
static final int DBL_MAX_EXP
Largest int such that is representable (approximately) as a double.
static final double LN2
The values of .
This class provides numerical methods to solve non-linear equations.
static double brentDekker(double a, double b, MathFunction f, double tol)
Computes a root of the function in f using the Brent-Dekker method.
This interface should be implemented by classes which represent univariate mathematical functions.