Johnson y Kotz señalan que
-
El $B$ (Beta) y $F$ Las distribuciones están estrechamente relacionadas: Cuando $k$ tiene un $B(\nu_1, \nu_2)$ distribución, entonces $f$ tiene un $F(2\nu_1, 2\nu_2)$ distribución en la que
$$f = \frac{k \nu_2}{(1-k)\nu_1}.$$
-
La aproximación de Wilson-Hilferty a $\chi^2$ (o, en su defecto, un $\Gamma$ distribución) -que tiene una "notable precisión"- puede aplicarse a $F$ que a su vez es una relación de $\chi^2$ distribuciones.
El resultado es que
$$z = \frac{\sqrt[3]{f} \left(1-\frac{2}{9 \nu_2}\right)+\left(\frac{2}{9 \nu_1}-1 \right)}{\sqrt{\frac{2 f^{2/3}}{9 \nu_2}+\frac{2}{9 \nu_1}}}$$
tiene aproximadamente una distribución normal estándar. Esto proporciona cálculos relativamente rápidos de la FCD de la $B$ o el $F$ distribución y no es difícil de invertir.
Esta aproximación funciona bastante bien para $\nu_2 \ge 1000$ et $\nu_1=1$ y progresivamente mejor a medida que $\nu_1$ aumentos. A continuación se muestra un conjunto de gráficos de la diferencia entre la FCD aproximada y la FCD correcta para $\nu_2=1000$ et $\nu_1 = 1,2,3,6,10$ , que se muestran con escalas idénticas en sus ejes:
El error es extremadamente bajo en la cola derecha, donde a menudo se centra el interés, pero incluso en la cola izquierda rara vez supera $0.002$ una vez $\nu_1 \ge 2$ . Como $\nu_2$ aumenta, los errores se mantienen más o menos igual.
Dado el nivel de exactitud de esta aproximación, no tiene mucho sentido calcular la FCD normal (o su inversa) con una exactitud de doble precisión. Esto permitirá un cómputo aún más rápido.
Un enfoque es crear una tabla de valores e interpolar dentro de ella. Dado que la FCD normal es tan curvada cerca de las colas, parece que se necesita una tabla más grande para obtener una mayor precisión. Sin embargo, al considerar Relación de Mills uno podría ser llevado a crear una (muy) pequeña tabla de pares $(z, \sqrt{-2\log(\Phi(z))}$ para $z$ en la cola inferior, digamos para $-8 \le z \le 0$ , donde $\Phi$ es la CDF normalizada. La interpolación spline cúbica hace un gran trabajo incluso cuando estos pares se evalúan sólo para la integral $z$ (nueve valores en total en toda la tabla). Para simplificar aún más la programación (si no se dispone de una rutina de interpolación de splines cúbicos) se podría implementar un spline cuadrático. Incluso mejor -y apenas más difícil- es formar la media ponderada de un interpolador lineal (que tiende a subestimar la FCD) y un interpolador cuadrático (que sobreestima la FCD). Una ponderación de $0.238$ aplicado al interpolador lineal funciona bien:
Este gráfico muestra las diferencias entre tres interpoladores y la CDF Normal estándar: el rojo es para el interpolador lineal, el dorado para el interpolador cuadrático, y el azul (en medio) para su media ponderada.
(La misma técnica de promediación en un interpolador lineal también disminuye el error en un orden de magnitud cuando se utiliza un spline cúbico).
La media ponderada es otro interpolador cuadrático, pero ya no es un spline (no tiene primeras derivadas continuas en los enteros negativos), pero ¿y qué? En efecto, calcula la FCD con una precisión absoluta mejor que $0.00005$ para $z\le -1$ y, por simetría, para $z\ge 1$ . Interpolación cuadrática o cúbica entre un pequeño número de pares de $(z, \Phi(z))$ debería funcionar bien para $-1 \lt z \lt 1$ si se necesitan esos cálculos. (Por lo general, sólo una precisión muy baja, digamos hasta aproximadamente $0.01$ en este rango). El resultado es que la FCD (o, utilizando métodos similares, su inversa) puede calcularse con suficiente precisión utilizando una docena de operaciones aritméticas sencillas y una exponenciación, con el coste de almacenar alrededor de una docena de valores precalculados: incluso en una plataforma interpretada como Java eso debería ir muy rápido, tardando una pequeña fracción de microsegundo.
Ejemplos
Mathematica El código para producir la primera figura es el siguiente.
fDist[f_, {ν1_, ν2_}] := CDF[NormalDistribution[]][((1-2/(9 ν2)) f^(1/3) - (1-2/(9 ν1))) /
Sqrt[2 f^(2/3)/(9 ν2) + 2/(9 ν1)]];
f[k_, {ν1_, ν2_}] := (k ν2)/((1 - k) ν1);
With[{ν1 = 1, ν2 = 1000},
Plot[fDist[f[k,{ν1,ν2}], {2 ν1,2 ν2}] - CDF[FRatioDistribution[2 ν1,2 ν2]][f[k,{ν1,ν2}]],
{k, 0, 10 ν1/(ν1 + ν2)}, PlotRange -> Full]
]
Código para realizar la interpolación para $|z| \ge 1$ y trazar su error:
d = Table[{z, Sqrt[-2 Log[CDF[NormalDistribution[], z]]]}, {z, -8, -0, 1}];
f1 = Interpolation[d, InterpolationOrder -> 1];
f2 = Interpolation[d, InterpolationOrder -> 2];
f[z_] := 0.238 f1[z] + (1 - 0.238) f2[z];
Plot[{Exp[-f[z]^2/2 ] - CDF[NormalDistribution[], z]}, {z, -4, -1}, PlotRange -> Full]
Referencias
Norman L. Johnson y Samuel Kotz, Distribuciones continuas univariantes - 2. J. Wiley & Sons, Nueva York, 1970.