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?
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í ).
fuente
Respuestas:
La pregunta se refiere a la función de error complementaria
para valores "grandes" dex ( =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,
dónde
Aunque esta es una aproximación excelente a la función de error en sí, es una aproximación terrible aerfc . 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)−1 x x 0≤x≤5.8
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.x exp(−5.82)≈10−14.6 x
Realizar el cálculo en aritmética extendida (con Mathematica ) mejora nuestra imagen de lo que está sucediendo:
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!x x=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 )x erfc f x x x⋅erfc(x)/f(x) , porque la esperanza es que esto debería tener un valor límite constante. Aquí está su gráfico:
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á:
El valor es . Esto nos permite mejorar la estimación:tomamosa1=2π√e3(−4+π)28(−3+π)≈7.94325
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 2x 5.3 2000 1−erfc(x)/f1(x) 1/x2 x x2 y encuentra el siguiente límite:
El valor es
Este proceso puede continuar todo el tiempo que queramos. Lo di un paso más, encontrando
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
El error es proporcional a . De importación es la constante de proporcionalidad, así que graficamos x 6 ( 1 - erfc ( x ) / f 3 ( x ) ) :x−6 x6(1−erfc(x)/f3(x))
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 :f3 erfc(x) 2661/x6 x>0 x x x 10 20
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=8
NormSDist
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,f x
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
Exponentiating yields
Applying the correction (inf3 ) produces
Note that the correction reduces the original approximation by over 99% (and indeed,a1/x≈1% .) (This approximation differs from the correct value only in the last digit. Another well-known approximation, exp(−x2)/(xπ−−√) , equals 1.860038⋅10−434298 , erring in the sixth significant digit. I'm sure we could improve that one, too, if we wanted, using the same techniques.)
fuente
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. Forz>0 , let
Then, a very simple, elementary upper bound is
There are several nice complementary lower bounds as well. One of the handiest and easiest to derive is the bound
A picture
Below is a plot of the two bounds (in grey) along with the actual functionS(z) .
How good is it?
From the plot, it seems that the bounds become quite tight even for moderately largez . 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
Now, note that, since all of the involved functions are nonnegative, by using the bounding properties ofS^u(z) and S^ℓ(z) , we get
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 onS(z) of the form R(z)φ(z) where R(z) is a rational function.
Finally, here is another somewhat-related question and answer.
fuente
You can approximate it with much simpler functions - see this Wikipedia section for more information. The basic approximation is thaterf(x)≈sgn(x)1−exp(−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.
fuente