/* Re Kolmogorov statistics, here is Birnbaum and Tingey's formula for the distributionofD+,themaximumofallpositivedeviationsbetweena theoreticaldistributionfunctionP(x)andanempiricaloneSn(x) fromnsamples.
/* Exact Smirnov statistic, for one-sided test. */ double smirnov(n, e) int n; double e;
{ int v, nn; double evn, omevn, p, t, c, lgamnp1;
if (n <= 0 || e < 0.0 || e > 1.0) return (-1.0);
nn = floor((double)n * (1.0 - e));
p = 0.0; if (n < 1013) {
c = 1.0; for (v = 0; v <= nn; v++) {
evn = e + ((double)v) / n;
p += c * pow(evn, (double)(v - 1)) * pow(1.0 - evn, (double)(n - v)); /* Next combinatorial term; worst case error = 4e-15. */
c *= ((double)(n - v)) / (v + 1);
}
} else {
lgamnp1 = lgam((double)(n + 1)); for (v = 0; v <= nn; v++) {
evn = e + ((double)v) / n;
omevn = 1.0 - evn; if (fabs(omevn) > 0.0) {
t = lgamnp1 - lgam((double)(v + 1)) - lgam((double)(n - v + 1)) +
(v - 1) * log(evn) + (n - v) * log(omevn); if (t > -MAXLOG)
p += exp(t);
}
}
} return (p * e);
}
/* Kolmogorov's limiting distribution of two-sided test, returns probabilitythatsqrt(n)*maxdeviation>y, orthatmaxdeviation>y/sqrt(n). Theapproximationisusefulforthetailofthedistribution
when n is large. */ double kolmogorov(y) double y;
{ double p, t, r, sign, x;
x = -2.0 * y * y;
sign = 1.0;
p = 0.0;
r = 1.0; do {
t = exp(x * r * r);
p += sign * t; if (t == 0.0) break;
r += 1.0;
sign = -sign;
} while ((t / p) > 1.1e-16); return (p + p);
}
/* Functional inverse of Smirnov distribution
finds e such that smirnov(n,e) = p. */ double smirnovi(n, p) int n; double p;
{ double e, t, dpde;
if (p <= 0.0 || p > 1.0) {
mtherr("smirnovi", DOMAIN); return0.0;
} /* Start with approximation p = exp(-2 n e^2). */
e = sqrt(-log(p) / (2.0 * n)); do { /* Use approximate derivative in Newton iteration. */
t = -2.0 * n * e;
dpde = 2.0 * t * exp(t * e); if (fabs(dpde) > 0.0)
t = (p - smirnov(n, e)) / dpde; else {
mtherr("smirnovi", UNDERFLOW); return0.0;
}
e = e + t; if (e >= 1.0 || e <= 0.0) {
mtherr("smirnovi", OVERFLOW); return0.0;
}
} while (fabs(t / e) > 1e-10); return (e);
}
/* Functional inverse of Kolmogorov statistic for two-sided test. Findsysuchthatkolmogorov(y)=p. Ife=smirnovi(n,p),thenkolmogi(2*p)/sqrt(n)should
be close to e. */ double kolmogi(p) double p;
{ double y, t, dpdy;
if (p <= 0.0 || p > 1.0) {
mtherr("kolmogi", DOMAIN); return0.0;
} /* Start with approximation p = 2 exp(-2 y^2). */
y = sqrt(-0.5 * log(0.5 * p)); do { /* Use approximate derivative in Newton iteration. */
t = -2.0 * y;
dpdy = 4.0 * t * exp(t * y); if (fabs(dpdy) > 0.0)
t = (p - kolmogorov(y)) / dpdy; else {
mtherr("kolmogi", UNDERFLOW); return0.0;
}
y = y + t;
} while (fabs(t / y) > 1e-10); return (y);
}
#ifdef SALONE /* Type in a number. */ void getnum(s, px) char *s; double *px;
{ char str[30];
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.