¿Cómo calcular la probabilidad asociada con puntuaciones Z absurdamente grandes?

14

Los paquetes de software para la detección de motivos de red pueden arrojar puntajes Z enormemente altos (el más alto que he visto es más de 600,000, pero los puntajes Z de más de 100 son bastante comunes). Planeo mostrar que estos puntajes Z son falsos.

Las puntuaciones Z enormes corresponden a probabilidades asociadas extremadamente bajas. Los valores de las probabilidades asociadas se dan, por ejemplo, en la página de wikipedia de distribución normal (y probablemente en todos los libros de texto de estadísticas) para puntuaciones Z de hasta 6. Entonces ...

Pregunta : ¿Cómo se calcula la función de error para n hasta 1,000,000, por ejemplo?1-mirF(norte/ /2)

Estoy particularmente después de un paquete ya implementado para esto (si es posible). Lo mejor que he encontrado hasta ahora es WolframAlpha, que logra calcularlo para n = 150 ( aquí ).

Douglas S. Stones
fuente
66
Quizás esta no sea la pregunta correcta. Estas puntuaciones z son falsas porque suponen que la distribución normal es una aproximación o modelo mucho mejor de lo que realmente es. Es un poco como asumir que la mecánica newtoniana es buena para 600,000 lugares decimales. Si realmente está interesado únicamente en calcular el erf para valores extremos de n , entonces esta pregunta pertenece a las matemáticas. SE, no aquí.
whuber
66
Pr(Z>z)(z2π)1ez2/2
Gracias cardenal, ese límite parece ser bastante preciso. ¿Por qué no haces de esto una respuesta?
Douglas S. Stones el
@ Douglas: Si todavía estás interesado, puedo armar algo al día siguiente y publicarlo como una respuesta más completa.
cardenal
1
Bueno ... creo que valdría la pena agregarlo como respuesta. Tal vez el límite es de conocimiento común en las estadísticas de prob +, pero no lo sabía. Además, las Q y A aquí no son únicamente para el OP.
Douglas S. Stones

Respuestas:

19

La pregunta se refiere a la función de error complementaria

erfc(x)=2πxexp(t2)dt

para valores "grandes" de x ( =n/2 en la pregunta original), es decir, entre 100 y 700,000 más o menos. (En la práctica, cualquier valor mayor que aproximadamente 6 debe considerarse "grande", como veremos). Tenga en cuenta que debido a que esto se usará para calcular los valores p, hay poco valor para obtener más de tres dígitos significativos (decimales) .

Para comenzar, considere la aproximación sugerida por @Iterator,

f(x)=11exp(x2(4+ax2π+ax2)),

dónde

a=8(π3)3(4π)0.439862.

Aunque esta es una aproximación excelente a la función de error en sí, es una aproximación terrible a erfc . Sin embargo, hay una manera de arreglarlo sistemáticamente.

Para los valores p asociados con valores tan grandes de , estamos interesados ​​en el error relativo f ( x ) / erfc ( x ) - 1 : esperamos que su valor absoluto sea menor que 0.001 para tres dígitos significativos de precisión. Desafortunadamente, esta expresión es difícil de estudiar para x grande debido a flujos inferiores en el cálculo de doble precisión. Aquí hay un intento, que traza el error relativo versus x para 0 x 5.8 :x f(x)/erfc(x)1xx0x5.8

Plot 1

El cálculo se vuelve inestable una vez que excede aproximadamente 5.3 y no puede entregar un dígito significativo más allá de 5.8. Esto no es sorprendente: exp ( - 5.8 2 ) 10 - 14.6 está empujando los límites de la aritmética de doble precisión. Debido a que no hay evidencia de que el error relativo sea aceptablemente pequeño para una x mayor , debemos hacerlo mejor.xexp(5.82)1014.6x

Realizar el cálculo en aritmética extendida (con Mathematica ) mejora nuestra imagen de lo que está sucediendo:

Plot 2

El error aumenta rápidamente con no muestra signos de nivelación. Pasado x = 10 más o menos, ¡esta aproximación ni siquiera ofrece un dígito confiable de información!xx=10

Sin embargo, la trama comienza a verse lineal. Podríamos adivinar que el error relativo es directamente proporcional a . (Esto tiene sentido por motivos teóricos: erfc es manifiestamente una función impar yf es manifiestamente par, por lo que su relación debería ser una función impar. Por lo tanto, esperaríamos que el error relativo, si aumenta, se comportara como una potencia impar de x .) Esto nos lleva a estudiar el error relativo dividido por x . De manera equivalente, elijo examinar x erfc ( x ) / f ( x )xerfcfx xxerfc(x)/f(x), porque la esperanza es que esto debería tener un valor límite constante. Aquí está su gráfico:

Plot 3

Nuestra conjetura parece estar confirmada: esta relación parece estar llegando a un límite de alrededor de 8 más o menos. Cuando se le pregunte, Mathematica lo suministrará:

a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]

El valor es . Esto nos permite mejorar la estimación:tomamosa1=2πe3(4+π)28(3+π)7.94325

f1(x)=f(x)a1x

como el primer refinamiento de la aproximación. Cuando es realmente grande, mayor que unos pocos miles, esta aproximación está bien. Debido a que todavía no será lo suficientemente bueno para un rango interesante de argumentos entre 5.3 y 2000 más o menos, iteremos el procedimiento. Esta vez, el error relativo inverso - específicamente, la expresión 1 - erfc ( x ) / f 1 ( x ) - debería comportarse como 1 / x 2 para x grande (en virtud de las consideraciones de paridad anteriores). En consecuencia, multiplicamos por x 2x5.320001erfc(x)/f1(x)1/x2xx2 y encuentra el siguiente límite:

a2 = Limit[x^2 (a1 - x (Erfc[x]/f[x])), x -> \[Infinity]] 

El valor es

a2=132πe3(4+π)28(3+π)(329(4+π)3π(3+π)2)114.687.

Este proceso puede continuar todo el tiempo que queramos. Lo di un paso más, encontrando

a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]] 

con un valor aproximado de 1623.67. (La expresión completa implica una función racional de grado ocho de y es demasiado larga para ser útil aquí).π

Desenrollar estas operaciones produce nuestra aproximación final

f3(x)=f(x)(a1a2/x2+a3/x4)/x.

El error es proporcional a . De importación es la constante de proporcionalidad, así que graficamos x 6 ( 1 - erfc ( x ) / f 3 ( x ) ) :x6x6(1erfc(x)/f3(x))

Plot 4

Se acerca rápidamente a un valor límite alrededor de 2660.59. Usando la aproximación , obtenemos estimaciones de erfc ( x ) cuya precisión relativa es mejor que 2661 / x 6 para todo x > 0 . Una vez que x excede 20 o menos, tenemos nuestros tres dígitos significativos (o mucho más, a medida que x se hace más grande). Como verificación, aquí hay una tabla que compara los valores correctos con la aproximación para x entre 10 y 20 :f3erfc(x)2661/x6x>0xxx1020

 x  Erfc    Approximation      
10  2.088*10^-45    2.094*10^-45
11  1.441*10^-54    1.443*10^-54
12  1.356*10^-64    1.357*10^-64
13  1.740*10^-75    1.741*10^-75
14  3.037*10^-87    3.038*10^-87
15  7.213*10^-100   7.215*10^-100
16  2.328*10^-113   2.329*10^-113
17  1.021*10^-127   1.021*10^-127
18  6.082*10^-143   6.083*10^-143
19  4.918*10^-159   4.918*10^-159
20  5.396*10^-176   5.396*10^-176

De hecho, esta aproximación ofrece al menos dos cifras significativas de precisión para adelante, que es justo donde los cálculos de peatones (como la función de Excel ) se agotan.x=8NormSDist

Finalmente, uno podría preocuparse por nuestra capacidad de calcular la aproximación inicial . Sin embargo, eso no es difícil: cuando x es lo suficientemente grande como para causar desbordamientos en la exponencial, la raíz cuadrada se aproxima a la mitad de la exponencial,fx

f(x)12exp(x2(4+ax2π+ax2)).

Calcular el logaritmo de esto (en la base 10) es simple y proporciona fácilmente el resultado deseado. Por ejemplo, sea . El logaritmo común de esta aproximación esx=1000

log10(f(x))(10002(4+a10002π+a10002)log(2))/log(10)434295.63047.

Exponentiating yields

f(1000)2.3416910434296.

Applying the correction (in f3) produces

erfc(1000)1.86003 70486 3232810434298.

Note that the correction reduces the original approximation by over 99% (and indeed, a1/x1%.) (This approximation differs from the correct value only in the last digit. Another well-known approximation, exp(x2)/(xπ), equals 1.86003810434298, erring in the sixth significant digit. I'm sure we could improve that one, too, if we wanted, using the same techniques.)

whuber
fuente
1
+1 This is a great answer, somehow I have never come across this thread before.
amoeba says Reinstate Monica
15

A simple upper bound

For very large values of the argument in the calculation of upper tail probability of a normal, excellent bounds exist that are probably as good as one will get using any other methods with double-precision floating point. For z>0, let

S(z):=P(Z>z)=zφ(z)dz,
where φ(z)=(2π)1/2ez2/2 is the standard normal pdf. I've used the notation S(z) in deference to the standard notation in survival analysis. In engineering contexts, they call this function the Q-function and denote it by Q(z).

Then, a very simple, elementary upper bound is

S(z)φ(z)z=:S^u(z),
where the notation on the right-hand side indicates this is an upper-bound estimate. This answer gives a proof of the bound.

There are several nice complementary lower bounds as well. One of the handiest and easiest to derive is the bound

S(z)zz2+1φ(z)=:S^(z).
There are at least three separate methods for deriving this bound. A rough sketch of one such method can be found in this answer to a related question.

A picture

Below is a plot of the two bounds (in grey) along with the actual function S(z).

Upper-tail of normal and bounds

How good is it?

From the plot, it seems that the bounds become quite tight even for moderately large z. We might ask ourselves how tight they are and what sort of quantitative statement in that regard can be made.

One useful measure of tightness is the absolute relative error

E(z)=|S^u(z)S(z)S(z)|.
This gives you the proportional error of the estimate.

Now, note that, since all of the involved functions are nonnegative, by using the bounding properties of S^u(z) and S^(z), we get

E(z)=S^u(z)S(z)S(z)S^u(z)S^(z)S^(z)=z2,
and so this provides a proof that for z10 the upper-bound is correct to within 1%, for z28 it is correct to within 0.1% and for z100 it is correct to within 0.01%.

In fact, the simple form of the bounds provides a good check on other "approximations". If, in the numerical calculation of more complicated approximations, we get a value outside these bounds, we can simply "correct" it to take the value of, e.g., the upper bound provided here.

There are many refinements of these bounds. The Laplace bounds mentioned here provide a nice sequence of upper and lower bounds on S(z) of the form R(z)φ(z) where R(z) is a rational function.

Finally, here is another somewhat-related question and answer.

cardinal
fuente
1
Apologies for all the "self-citations". Once, several years ago, I took an intense, two-week-long interest in related questions and tried to learn as much as I could about this topic.
cardinal
+1 Agree with whuber. Very nice, and I appreciate the links to other answers.
Iterator
5

You can approximate it with much simpler functions - see this Wikipedia section for more information. The basic approximation is that erf(x)sgn(x)1exp(x24/π+ax21+ax2)

The article has an incorrect link for that section. The PDF referenced can be found in Sergei Winitzki's files - or at this link.

Iterator
fuente
1
Some amplification of this would be welcome, for two reasons. First, it's best when answers can stand alone. Second, that article writes ambiguously about the quality of the approximation "in a neighborhood of infinity": just how accurate is "very accurate"? (You implicitly have a good sense of this, but it's a lot to expect of all interested readers.) The stated value of ".00035" is useless here.
whuber
Thanks. I didn't notice that there was Javascript-based support for using TeX, which made the difference in writing that out.
Iterator
1
Incidentally, the Wikipedia reference to that approximation is broken. Mathematica finds, though, that the relative error (1 - approx(x)/erf(x)) behaves like the reciprocal of 2exp(x2+3(π4)2/(8(π3))).
whuber
@whuber, can you post the Mathematica code for that? :) I haven't seen Mathematica in 15+ years, and never for this kind of purpose.
Iterator
I posted it in a separate reply.
whuber