25package umontreal.ssj.probdist;
27import umontreal.ssj.util.Num;
59 private double m_psi = -1.0e100;
61 private static double getMeanPsi(
double gamma,
double delta,
double xi,
double lambda,
double[] tpsi) {
66 final int NMAX = 10000;
67 final double EPS = 1.0e-15;
69 double a1 = 1.0 / (2 * delta * delta);
70 double a2 = (1.0 - 2 * delta * gamma) / (2 * delta * delta);
71 double a3 = (gamma - 1. / delta) / delta;
76 while (Math.abs(tem) > EPS * Math.abs(sum) && n < NMAX) {
78 v = Math.exp(-n * gamma / delta) + Math.exp(n * a3);
79 tem = Math.exp(-n * n * a1) * v / (1 + Math.exp(-2 * n * a1));
84 System.err.println(
"JohnsonSBDist: possible lack of accuracy on mean");
85 double A = (0.5 + sum) / (delta);
87 a1 = Math.PI * Math.PI * delta * delta;
88 a2 = Math.PI * delta * gamma;
93 while (Math.abs(tem) > EPS * Math.abs(sum) && n < NMAX) {
96 tem = Math.exp(-j * j * a1 / 2.0) * Math.sin(j * a2) / Math.sinh(j * a1);
100 System.err.println(
"JohnsonSBDist: possible lack of accuracy on mean");
101 double B = 2.0 * Math.PI * delta * sum;
103 a1 = 2 * Math.PI * Math.PI * delta * delta;
104 a2 = 2 * Math.PI * delta * gamma;
108 while (Math.abs(tem) > EPS * Math.abs(sum) && n < NMAX) {
110 tem = Math.exp(-n * n * a1) * Math.cos(n * a2);
114 System.err.println(
"JohnsonSBDist: possible lack of accuracy on mean");
115 double C = 1 + 2.0 * sum;
117 double D = Math.sqrt(2 * Math.PI) * Math.exp(gamma * gamma / 2.0);
118 double tmean = (A - B) / (C * D);
129 public JohnsonSBDist(
double gamma,
double delta,
double xi,
double lambda) {
130 super(gamma, delta, xi, lambda);
131 setLastParams(xi, lambda);
134 private void setLastParams(
double xi,
double lambda) {
136 supportB = xi + lambda;
140 return density(gamma, delta, xi, lambda, x);
143 public double cdf(
double x) {
144 return cdf(gamma, delta, xi, lambda, x);
148 return barF(gamma, delta, xi, lambda, x);
152 return inverseF(gamma, delta, xi, lambda, u);
164 return JohnsonSBDist.getStandardDeviation(gamma, delta, xi, lambda);
171 public static double density(
double gamma,
double delta,
double xi,
double lambda,
double x) {
173 throw new IllegalArgumentException(
"lambda <= 0");
175 throw new IllegalArgumentException(
"delta <= 0");
176 if (x <= xi || x >= (xi + lambda))
178 double y = (x - xi) / lambda;
179 double z = gamma + delta * Math.log(y / (1.0 - y));
180 return delta / (lambda * y * (1.0 - y) * Math.sqrt(2.0 * Math.PI)) * Math.exp(-z * z / 2.0);
187 public static double cdf(
double gamma,
double delta,
double xi,
double lambda,
double x) {
189 throw new IllegalArgumentException(
"lambda <= 0");
191 throw new IllegalArgumentException(
"delta <= 0");
194 if (x >= xi + lambda)
196 double y = (x - xi) / lambda;
197 double z = gamma + delta * Math.log(y / (1.0 - y));
204 public static double barF(
double gamma,
double delta,
double xi,
double lambda,
double x) {
206 throw new IllegalArgumentException(
"lambda <= 0");
208 throw new IllegalArgumentException(
"delta <= 0");
211 if (x >= xi + lambda)
213 double y = (x - xi) / lambda;
214 double z = gamma + delta * Math.log(y / (1.0 - y));
222 public static double inverseF(
double gamma,
double delta,
double xi,
double lambda,
double u) {
224 throw new IllegalArgumentException(
"lambda <= 0");
226 throw new IllegalArgumentException(
"delta <= 0");
227 if (u > 1.0 || u < 0.0)
228 throw new IllegalArgumentException(
"u not in [0,1]");
236 double v = (z - gamma) / delta;
244 return (xi + (xi + lambda) * v) / (1.0 + v);
269 public static double[]
getMLE(
double[] x,
int n,
double xi,
double lambda) {
271 throw new IllegalArgumentException(
"n <= 0");
273 double[] ftab =
new double[n];
277 for (
int i = 0; i < n; i++) {
278 t = (x[i] - xi) / lambda;
284 ftab[i] = Math.log(t / (1. - t));
287 double empiricalMean = sum / n;
290 for (
int i = 0; i < n; i++) {
291 t = ftab[i] - empiricalMean;
294 double sigmaf = Math.sqrt(sum / n);
296 double[] param =
new double[2];
297 param[0] = -empiricalMean / sigmaf;
298 param[1] = 1.0 / sigmaf;
316 double parameters[] =
getMLE(x, n, xi, lambda);
317 return new JohnsonSBDist(parameters[0], parameters[1], xi, lambda);
326 public static double getMean(
double gamma,
double delta,
double xi,
double lambda) {
328 throw new IllegalArgumentException(
"lambda <= 0");
330 throw new IllegalArgumentException(
"delta <= 0");
331 double[] tpsi =
new double[1];
332 double mu = getMeanPsi(gamma, delta, xi, lambda, tpsi);
333 return xi + lambda * mu;
343 public static double getVariance(
double gamma,
double delta,
double xi,
double lambda) {
345 throw new IllegalArgumentException(
"lambda <= 0");
347 throw new IllegalArgumentException(
"delta <= 0");
349 final int NMAX = 10000;
350 final double EPS = 1.0e-15;
352 double a1 = 1.0 / (2.0 * delta * delta);
353 double a2 = (1.0 - 2.0 * delta * gamma) / (2.0 * delta * delta);
354 double a3 = (gamma - 1. / delta) / delta;
359 while (Math.abs(tem) > EPS * Math.abs(sum) && n < NMAX) {
361 v = Math.exp(-n * gamma / delta) - Math.exp(n * a3);
362 tem = n * Math.exp(-n * n * a1) * v / (1 + Math.exp(-2 * n * a1));
367 System.err.println(
"JohnsonSBDist: possible lack of accuracy on variance");
368 double A = -sum / (delta * delta);
370 a1 = Math.PI * Math.PI * delta * delta;
371 a2 = Math.PI * delta * gamma;
376 while (Math.abs(tem) > EPS * Math.abs(sum) && n < NMAX) {
379 tem = j * Math.exp(-j * j * a1 / 2.0) * Math.cos(j * a2) / Math.sinh(j * a1);
383 System.err.println(
"JohnsonSBDist: possible lack of accuracy on variance");
384 double B = 2.0 * a1 * sum;
386 a1 = 2 * Math.PI * Math.PI * delta * delta;
387 a2 = 2 * Math.PI * delta * gamma;
391 while (Math.abs(tem) > EPS * Math.abs(sum) && n < NMAX) {
393 tem = n * Math.exp(-n * n * a1) * Math.sin(n * a2);
397 System.err.println(
"JohnsonSBDist: possible lack of accuracy on variance");
398 double C = -4.0 * Math.PI * delta * sum;
400 double D = Math.sqrt(2 * Math.PI) * Math.exp(0.5 * gamma * gamma);
401 double[] tpsi =
new double[1];
402 double mu = getMeanPsi(gamma, delta, xi, lambda, tpsi);
404 double tvar = mu * (1 - delta * gamma) - mu * mu + delta / tpsi[0] * (A - B - mu * C * D);
405 return lambda * lambda * tvar;
417 return Math.sqrt(
JohnsonSBDist.getVariance(gamma, delta, xi, lambda));
425 public void setParams(
double gamma,
double delta,
double xi,
double lambda) {
427 setLastParams(xi, lambda);
static JohnsonSBDist getInstanceFromMLE(double[] x, int n, double xi, double lambda)
Creates a new instance of a JohnsonSBDist object using the maximum likelihood method based on the ob...
void setParams(double gamma, double delta, double xi, double lambda)
Sets the value of the parameters , ,.
double getStandardDeviation()
Returns the standard deviation.
double barF(double x)
Returns the complementary distribution function.
static double[] getMLE(double[] x, int n, double xi, double lambda)
Estimates the parameters of the Johnson.
double inverseF(double u)
Returns the inverse distribution function .
static double inverseF(double gamma, double delta, double xi, double lambda, double u)
Returns the inverse of the distribution ( JohnsonSB-inverse ).
static double getVariance(double gamma, double delta, double xi, double lambda)
Returns the variance tfly06a of the Johnson distribution with parameters , ,.
static double barF(double gamma, double delta, double xi, double lambda, double x)
Returns the complementary distribution.
double getMean()
Returns the mean.
static double density(double gamma, double delta, double xi, double lambda, double x)
Returns the density function ( JohnsonSB-density ).
JohnsonSBDist(double gamma, double delta, double xi, double lambda)
Constructs a JohnsonSBDist object with shape parameters.
double cdf(double x)
Returns the distribution function .
static double getStandardDeviation(double gamma, double delta, double xi, double lambda)
Returns the standard deviation of the Johnson distribution with parameters , , ,.
static double cdf(double gamma, double delta, double xi, double lambda, double x)
Returns the distribution function ( JohnsonSB-dist ).
double getVariance()
Returns the variance.
double density(double x)
Returns , the density evaluated at .
static double getMean(double gamma, double delta, double xi, double lambda)
Returns the mean tjoh49a of the Johnson distribution with parameters , ,.
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 double LN_DBL_MIN
Natural logarithm of DBL_MIN.
static final double DBL_EPSILON
Difference between 1.0 and the smallest double greater than 1.0.
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 .