/* *
* Title:
* Description:
* Copyright: Copyright (c)
* Company:
* @author
* @version 1.0
*/
package umontreal.iro.lecuyer.probdist;
import umontreal.iro.lecuyer.util.*;
import umontreal.iro.lecuyer.functions.MathFunction;
/**
* Extends the class {@link ContinuousDistribution} for the
* Watson G distribution (see).
* Given a sample of n independent uniforms Ui over [0, 1],
* the G statistic is defined by
*
*
*
*
* Gn
* =
* (n)1/2max1 <= j <= n{j/n - U(j) + bar(U)n -1/2}
*
*
*
* =
* (n)1/2(Dn+ + bar(U)n - 1/2),
*
*
*
*
*
* where the U(j) are the Ui sorted in increasing order,
* bar(U)n is the average of the observations Ui,
* and Dn+ is the Kolmogorov-Smirnov+ statistic.
* The distribution function (the cumulative probabilities)
* is defined as
* Fn(x) = P[Gn <= x].
*
*/
public class WatsonGDist extends ContinuousDistribution {
protected int n;
private static class Function implements MathFunction {
protected int n;
protected double u;
public Function (int n, double u) {
this.n = n;
this.u = u;
}
public double evaluate (double x) {
return u - cdf(n,x);
}
}
/**
* Constructs a Watson distribution for a sample of size n.
*
*/
public WatsonGDist (int n) {
setN (n);
}
public double density (double x) {
return density (n, x);
}
public double cdf (double x) {
return cdf (n, x);
}
public double barF (double x) {
return barF (n, x);
}
public double inverseF (double u) {
return inverseF (n, u);
}
/**
* Computes the density function
* for a Watson G distribution with parameter n.
*
*/
public static double density (int n, double x) {
final double MINARG = 0.15;
final double MAXARG = 1.5;
if (n < 2)
throw new IllegalArgumentException ("n < 2");
if (x <= MINARG || x >= XBIGM)
return 0.0;
final double Res;
if (x > MAXARG)
Res = 20 * Math.exp (19.0 - 20.0*x)
- 15.26 * Math.exp (13.34 - 15.26*x) / Math.sqrt ((double)n);
else {
final double EPS = 1.0 / 20.0;
Res = (cdf(n, x + EPS) - cdf(n, x - EPS)) / (2.0 * EPS);
}
if (Res <= 0.0)
return 0.0;
return Res;
}
// Tables for a spline approximation
// of the WatsonG distribution
// Empirical correction in 1/sqrt (n)
private static double YWA[] = new double[143];
private static double MWA[] = new double[143];
private static double CoWA[] = new double[143];
static {
/*
* Initialization for watsonG
*/
int j;
YWA[0] = 1.8121832847E-39;
YWA[1] = 2.0503176304E-32;
YWA[2] = 4.6139577764E-27;
YWA[3] = 6.5869745929E-23;
YWA[4] = 1.2765816107E-19;
YWA[5] = 5.6251923105E-17;
YWA[6] = 8.0747150511E-15;
YWA[7] = 4.8819994144E-13;
YWA[8] = 1.4996052497E-11;
YWA[9] = 2.6903519441E-10;
YWA[10] = 3.1322929018E-9;
YWA[11] = 2.5659643046E-8;
YWA[12] = 1.5749759318E-7;
YWA[13] = 7.6105096466E-7;
YWA[14] = 3.0113293541E-6;
YWA[15] = 1.0070166837E-5;
YWA[16] = 2.9199826692E-5;
YWA[17] = 7.4970409372E-5;
YWA[18] = 1.7340586581E-4;
YWA[19] = 3.6654236297E-4;
YWA[20] = 7.165864865E-4;
YWA[21] = 1.3087767385E-3;
YWA[22] = 2.2522044209E-3;
YWA[23] = 3.6781862572E-3;
YWA[24] = 5.7361958631E-3;
YWA[25] = 8.5877444706E-3;
YWA[26] = 1.23988738E-2;
YWA[27] = 1.73320516E-2;
YWA[28] = 2.35382479E-2;
YWA[29] = 3.11498548E-2;
YWA[30] = 4.02749297E-2;
YWA[31] = 5.09930445E-2;
YWA[32] = 6.33528333E-2;
YWA[33] = 7.73711747E-2;
YWA[34] = 9.30338324E-2;
YWA[35] = 1.10297306E-1;
YWA[36] = 1.290916098E-1;
YWA[37] = 1.493236984E-1;
YWA[38] = 1.708812741E-1;
YWA[39] = 1.936367476E-1;
YWA[40] = 2.174511609E-1;
YWA[41] = 2.42177928E-1;
YWA[42] = 2.676662852E-1;
YWA[43] = 2.937643828E-1;
YWA[44] = 3.203219784E-1;
YWA[45] = 3.471927188E-1;
YWA[46] = 3.742360163E-1;
YWA[47] = 4.013185392E-1;
YWA[48] = 4.283153467E-1;
YWA[49] = 4.551107027E-1;
YWA[50] = 4.815986082E-1;
YWA[51] = 5.076830902E-1;
YWA[52] = 5.332782852E-1;
YWA[53] = 5.583083531E-1;
YWA[54] = 5.827072528E-1;
YWA[55] = 6.064184099E-1;
YWA[56] = 6.293943006E-1;
YWA[57] = 6.515959739E-1;
YWA[58] = 6.729925313E-1;
YWA[59] = 6.935605784E-1;
YWA[60] = 7.132836621E-1;
YWA[61] = 7.321517033E-1;
YWA[62] = 7.501604333E-1;
YWA[63] = 7.673108406E-1;
YWA[64] = 7.836086337E-1;
YWA[65] = 7.99063723E-1;
YWA[66] = 8.136897251E-1;
YWA[67] = 8.275034914E-1;
YWA[68] = 8.405246632E-1;
YWA[69] = 8.527752531E-1;
YWA[70] = 8.642792535E-1;
YWA[71] = 8.750622738E-1;
YWA[72] = 8.851512032E-1;
YWA[73] = 8.945739017E-1;
YWA[74] = 9.033589176E-1;
YWA[75] = 9.115352296E-1;
YWA[76] = 9.19132015E-1;
YWA[77] = 9.261784413E-1;
YWA[78] = 9.327034806E-1;
YWA[79] = 9.387357465E-1;
YWA[80] = 9.44303351E-1;
YWA[81] = 9.494337813E-1;
YWA[82] = 9.541537951E-1;
YWA[83] = 9.584893325E-1;
YWA[84] = 9.624654445E-1;
YWA[85] = 9.661062352E-1;
YWA[86] = 9.694348183E-1;
YWA[87] = 9.724732859E-1;
YWA[88] = 9.752426872E-1;
YWA[89] = 9.777630186E-1;
YWA[90] = 9.800532221E-1;
YWA[91] = 9.821311912E-1;
YWA[92] = 9.840137844E-1;
YWA[93] = 9.85716844E-1;
YWA[94] = 9.872552203E-1;
YWA[95] = 9.886428002E-1;
YWA[96] = 9.898925389E-1;
YWA[97] = 9.910164946E-1;
YWA[98] = 9.920258656E-1;
YWA[99] = 9.929310287E-1;
YWA[100] = 9.937415788E-1;
YWA[101] = 9.944663692E-1;
YWA[102] = 9.95113552E-1;
YWA[103] = 9.956906185E-1;
YWA[104] = 9.962044387E-1;
YWA[105] = 9.966613009E-1;
YWA[106] = 9.970669496E-1;
YWA[107] = 9.974266225E-1;
YWA[108] = 9.977450862E-1;
YWA[109] = 9.980266707E-1;
YWA[110] = 9.982753021E-1;
YWA[111] = 9.984945338E-1;
YWA[112] = 9.98687576E-1;
YWA[113] = 9.98857324E-1;
YWA[114] = 9.990063842E-1;
YWA[115] = 9.991370993E-1;
YWA[116] = 9.992515708E-1;
YWA[117] = 9.99351681E-1;
YWA[118] = 9.994391129E-1;
YWA[119] = 9.995153688E-1;
YWA[120] = 9.995817875E-1;
YWA[121] = 9.996395602E-1;
YWA[122] = 9.996897446E-1;
YWA[123] = 9.997332791E-1;
YWA[124] = 9.997709943E-1;
YWA[125] = 9.998036243E-1;
YWA[126] = 9.998318172E-1;
YWA[127] = 9.998561438E-1;
YWA[128] = 9.998771066E-1;
YWA[129] = 9.998951466E-1;
YWA[130] = 9.999106508E-1;
YWA[131] = 9.99923958E-1;
YWA[132] = 9.999353645E-1;
YWA[133] = 9.999451288E-1;
YWA[134] = 9.999534765E-1;
YWA[135] = 9.999606035E-1;
YWA[136] = 9.999666805E-1;
YWA[137] = 9.999718553E-1;
YWA[138] = 9.999762562E-1;
YWA[139] = 9.999799939E-1;
YWA[140] = 9.999831643E-1;
YWA[141] = 9.999858E-1;
YWA[142] = 9.999883E-1;
MWA[0] = 0.0;
MWA[1] = 6.909E-15;
MWA[2] = 2.763E-14;
MWA[3] = 1.036E-13;
MWA[4] = 3.792E-13;
MWA[5] = 4.773E-12;
MWA[6] = 4.59E-10;
MWA[7] = 2.649E-8;
MWA[8] = 7.353E-7;
MWA[9] = 1.14E-5;
MWA[10] = 1.102E-4;
MWA[11] = 7.276E-4;
MWA[12] = 3.538E-3;
MWA[13] = 0.01342;
MWA[14] = 0.04157;
MWA[15] = 0.1088;
MWA[16] = 0.2474;
MWA[17] = 0.4999;
MWA[18] = 0.913;
MWA[19] = 1.53;
MWA[20] = 2.381;
MWA[21] = 3.475;
MWA[22] = 4.795;
MWA[23] = 6.3;
MWA[24] = 7.928;
MWA[25] = 9.602;
MWA[26] = 11.24;
MWA[27] = 12.76;
MWA[28] = 14.1;
MWA[29] = 15.18;
MWA[30] = 15.98;
MWA[31] = 16.47;
MWA[32] = 16.64;
MWA[33] = 16.49;
MWA[34] = 16.05;
MWA[35] = 15.35;
MWA[36] = 14.41;
MWA[37] = 13.28;
MWA[38] = 12.0;
MWA[39] = 10.6;
MWA[40] = 9.13;
MWA[41] = 7.618;
MWA[42] = 6.095;
MWA[43] = 4.588;
MWA[44] = 3.122;
MWA[45] = 1.713;
MWA[46] = 0.3782;
MWA[47] = -0.8726;
MWA[48] = -2.031;
MWA[49] = -3.091;
MWA[50] = -4.051;
MWA[51] = -4.91;
MWA[52] = -5.668;
MWA[53] = -6.327;
MWA[54] = -6.893;
MWA[55] = -7.367;
MWA[56] = -7.756;
MWA[57] = -8.064;
MWA[58] = -8.297;
MWA[59] = -8.46;
MWA[60] = -8.56;
MWA[61] = -8.602;
MWA[62] = -8.591;
MWA[63] = -8.533;
MWA[64] = -8.433;
MWA[65] = -8.296;
MWA[66] = -8.127;
MWA[67] = -7.93;
MWA[68] = -7.709;
MWA[69] = -7.469;
MWA[70] = -7.212;
MWA[71] = -6.943;
MWA[72] = -6.663;
MWA[73] = -6.378;
MWA[74] = -6.087;
MWA[75] = -5.795;
MWA[76] = -5.503;
MWA[77] = -5.213;
MWA[78] = -4.927;
MWA[79] = -4.646;
MWA[80] = -4.371;
MWA[81] = -4.103;
MWA[82] = -3.843;
MWA[83] = -3.593;
MWA[84] = -3.352;
MWA[85] = -3.12;
MWA[86] = -2.899;
MWA[87] = -2.689;
MWA[88] = -2.489;
MWA[89] = -2.3;
MWA[90] = -2.121;
MWA[91] = -1.952;
MWA[92] = -1.794;
MWA[93] = -1.645;
MWA[94] = -1.506;
MWA[95] = -1.377;
MWA[96] = -1.256;
MWA[97] = -1.144;
MWA[98] = -1.041;
MWA[99] = -0.9449;
MWA[100] = -0.8564;
MWA[101] = -0.775;
MWA[102] = -0.7001;
MWA[103] = -0.6315;
MWA[104] = -0.5687;
MWA[105] = -0.5113;
MWA[106] = -0.459;
MWA[107] = -0.4114;
MWA[108] = -0.3681;
MWA[109] = -0.3289;
MWA[110] = -0.2934;
MWA[111] = -0.2614;
MWA[112] = -0.2325;
MWA[113] = -0.2064;
MWA[114] = -0.183;
MWA[115] = -0.1621;
MWA[116] = -0.1433;
MWA[117] = -0.1265;
MWA[118] = -0.1115;
MWA[119] = -9.813E-2;
MWA[120] = -8.624E-2;
MWA[121] = -7.569E-2;
MWA[122] = -6.632E-2;
MWA[123] = -5.803E-2;
MWA[124] = -5.071E-2;
MWA[125] = -4.424E-2;
MWA[126] = -3.855E-2;
MWA[127] = -3.353E-2;
MWA[128] = -2.914E-2;
MWA[129] = -2.528E-2;
MWA[130] = -0.0219;
MWA[131] = -1.894E-2;
MWA[132] = -1.637E-2;
MWA[133] = -1.412E-2;
MWA[134] = -1.217E-2;
MWA[135] = -1.046E-2;
MWA[136] = -8.988E-3;
MWA[137] = -7.72E-3;
MWA[138] = -6.567E-3;
MWA[139] = -5.802E-3;
MWA[140] = -0.0053;
MWA[141] = -4.7E-4;
MWA[142] = -4.3E-4;
for (j = 5; j <= 11; j++) {
CoWA[j] = 0.0;
}
CoWA[12] = 1.25E-5;
CoWA[13] = 3.87E-5;
CoWA[14] = 1.004E-4;
CoWA[15] = 2.703E-4;
CoWA[16] = 6.507E-4;
CoWA[17] = 1.3985E-3;
CoWA[18] = 2.8353E-3;
CoWA[19] = 5.1911E-3;
CoWA[20] = 8.9486E-3;
CoWA[21] = 1.41773E-2;
CoWA[22] = 2.16551E-2;
CoWA[23] = 3.1489E-2;
CoWA[24] = 4.34123E-2;
CoWA[25] = 5.78719E-2;
CoWA[26] = 7.46921E-2;
CoWA[27] = 9.45265E-2;
CoWA[28] = 1.165183E-1;
CoWA[29] = 1.406353E-1;
CoWA[30] = 1.662849E-1;
CoWA[31] = 1.929895E-1;
CoWA[32] = 2.189347E-1;
CoWA[33] = 2.457772E-1;
CoWA[34] = 2.704794E-1;
CoWA[35] = 2.947906E-1;
CoWA[36] = 3.169854E-1;
CoWA[37] = 3.377435E-1;
CoWA[38] = 3.573555E-1;
CoWA[39] = 3.751205E-1;
CoWA[40] = 3.906829E-1;
CoWA[41] = 4.039806E-1;
CoWA[42] = 4.142483E-1;
CoWA[43] = 4.22779E-1;
CoWA[44] = 4.288013E-1;
CoWA[45] = 4.330353E-1;
CoWA[46] = 4.34452E-1;
CoWA[47] = 4.338138E-1;
CoWA[48] = 4.31504E-1;
CoWA[49] = 4.272541E-1;
CoWA[50] = 4.220568E-1;
CoWA[51] = 4.158229E-1;
CoWA[52] = 4.083281E-1;
CoWA[53] = 3.981182E-1;
CoWA[54] = 3.871678E-1;
CoWA[55] = 3.755527E-1;
CoWA[56] = 3.628823E-1;
CoWA[57] = 3.520135E-1;
CoWA[58] = 3.400924E-1;
CoWA[59] = 3.280532E-1;
CoWA[60] = 3.139477E-1;
CoWA[61] = 2.997087E-1;
CoWA[62] = 2.849179E-1;
CoWA[63] = 2.710475E-1;
CoWA[64] = 2.576478E-1;
CoWA[65] = 2.449155E-1;
CoWA[66] = 2.317447E-1;
CoWA[67] = 2.193161E-1;
CoWA[68] = 2.072622E-1;
CoWA[69] = 1.956955E-1;
CoWA[70] = 1.846514E-1;
CoWA[71] = 1.734096E-1;
CoWA[72] = 1.622678E-1;
CoWA[73] = 1.520447E-1;
CoWA[74] = 1.416351E-1;
CoWA[75] = 1.32136E-1;
CoWA[76] = 1.231861E-1;
CoWA[77] = 1.150411E-1;
CoWA[78] = 1.071536E-1;
CoWA[79] = 9.9465E-2;
CoWA[80] = 9.22347E-2;
CoWA[81] = 8.54394E-2;
CoWA[82] = 7.87697E-2;
CoWA[83] = 7.23848E-2;
CoWA[84] = 6.6587E-2;
CoWA[85] = 6.15849E-2;
CoWA[86] = 5.6573E-2;
CoWA[87] = 5.17893E-2;
CoWA[88] = 4.70011E-2;
CoWA[89] = 4.2886E-2;
CoWA[90] = 3.91224E-2;
CoWA[91] = 3.53163E-2;
CoWA[92] = 3.20884E-2;
CoWA[93] = 2.92264E-2;
CoWA[94] = 2.66058E-2;
CoWA[95] = 2.37352E-2;
CoWA[96] = 2.14669E-2;
CoWA[97] = 1.94848E-2;
CoWA[98] = 1.75591E-2;
CoWA[99] = 1.58232E-2;
CoWA[100] = 1.40302E-2;
CoWA[101] = 1.24349E-2;
CoWA[102] = 1.11856E-2;
CoWA[103] = 9.9765E-3;
CoWA[104] = 8.9492E-3;
CoWA[105] = 8.0063E-3;
CoWA[106] = 7.1509E-3;
CoWA[107] = 6.3196E-3;
CoWA[108] = 5.6856E-3;
CoWA[109] = 5.0686E-3;
CoWA[110] = 4.5085E-3;
CoWA[111] = 3.9895E-3;
CoWA[112] = 3.4804E-3;
CoWA[113] = 3.0447E-3;
CoWA[114] = 2.7012E-3;
CoWA[115] = 2.2984E-3;
CoWA[116] = 2.0283E-3;
CoWA[117] = 1.7399E-3;
CoWA[118] = 1.5032E-3;
CoWA[119] = 1.3267E-3;
CoWA[120] = 1.1531E-3;
CoWA[121] = 9.92E-4;
CoWA[122] = 9.211E-4;
CoWA[123] = 8.296E-4;
CoWA[124] = 6.991E-4;
CoWA[125] = 5.84E-4;
CoWA[126] = 5.12E-4;
CoWA[127] = 4.314E-4;
CoWA[128] = 3.593E-4;
CoWA[129] = 3.014E-4;
CoWA[130] = 2.401E-4;
CoWA[131] = 2.004E-4;
CoWA[132] = 1.614E-4;
CoWA[133] = 1.257E-4;
CoWA[134] = 1.112E-4;
CoWA[135] = 9.22E-5;
CoWA[136] = 8.77E-5;
CoWA[137] = 6.22E-5;
CoWA[138] = 4.93E-5;
CoWA[139] = 3.92E-5;
CoWA[140] = 3.15E-5;
CoWA[141] = 1.03E-5;
CoWA[142] = 9.6E-6;
}
/**
* Computes the Watson G distribution function Fn(x), with parameter n.
* A cubic spline interpolation is used for the asymptotic distribution when
*
* n -> ∞, and an empirical correction of order
* 1/(n)1/2, obtained
* empirically from 107 simulation runs with n = 256 is then added.
* The absolute error is estimated to be less than
* 0.01, 0.005, 0.002, 0.0008, 0.0005, 0.0005, 0.0005 for
* n = 16, 32, 64, 128, 256, 512, 1024, respectively.
*
*/
public static double cdf (int n, double x) {
/*
* Approximation of the cumulative distribution function of the
* watsonG statistics by the cubic spline function.
* Y[.] - tabular value of the statistic;
* M[.] - tabular value of the first derivative;
*/
if (n <= 1)
throw new IllegalArgumentException ("n < 2");
final double MINARG = 0.15;
if (x <= MINARG)
return 0.0;
if (x >= 10.0)
return 1.0;
double R, Res;
final double MAXARG = 1.5;
if (x > MAXARG) {
R = Math.exp (19.0 - 20.0*x);
Res = 1.0 - R;
// Empirical Correction in 1/sqrt (n)
R = Math.exp (13.34 - 15.26*x)/Math.sqrt ((double)n);
Res += R;
// The correction in 1/sqrt (n) is not always precise
if (Res >= 1.0)
return 1.0;
else
return Res;
}
final double MINTAB = 0.1;
final double STEP = 0.01;
int i, j;
double Tj;
double Ti;
double P;
double H;
// Search of the correct slot in the interpolation table
i = (int)((x - MINTAB)/STEP + 1);
Ti = MINTAB + i*STEP;
Tj = Ti - STEP;
// Approximation within the slot
j = i - 1;
H = x - Tj;
R = Ti - x;
P = STEP*STEP/6.0;
Res = ((MWA[j]*R*R*R + MWA[i]*H*H*H)/6.0)/STEP;
Res += ((YWA[j] - MWA[j]*P)*R + (YWA[i] - MWA[i]*P)*H)/STEP;
// Empirical correction in 1/sqrt (n)
Res += (CoWA[i]*H + CoWA[j]*R)/(STEP*Math.sqrt ((double)n));
if (Res >= 1.0)
return 1.0;
return Res;
}
/**
* Computes the complementary distribution function
* bar(F)n(x)
* with parameter n.
*
*/
public static double barF (int n, double x) {
return 1.0 - cdf(n,x);
}
/**
* Computes
* x = Fn-1(u), where Fn is the
* Watson G distribution with parameter n.
*
*/
public static double inverseF (int n, double u) {
if (n <= 1)
throw new IllegalArgumentException ("n < 2");
if (u < 0.0 || u > 1.0)
throw new IllegalArgumentException ("u must be in [0,1]");
if (u == 1.0)
return Double.POSITIVE_INFINITY;
if (u == 0.0)
return 0.0;
Function f = new Function (n,u);
return RootFinder.brentDekker (0.0, 10.0, f, 1e-5);
}
/**
* Returns the parameter n of this object.
*
*/
public int getN() {
return n;
}
/**
* Sets the parameter n of this object.
*
*/
public void setN (int n) {
if (n <= 1)
throw new IllegalArgumentException ("n < 2");
this.n = n;
supportA = 0.0;
supportB = 10.0;
}
/**
* Return an array containing the parameter n of this object.
*
*
*/
public double[] getParams () {
double[] retour = {n};
return retour;
}
public String toString () {
return getClass().getSimpleName() + " : n = " + n;
}
}
Ads help maintain this website.