Autor Tema: Distribución normal estándar online

0 Usuarios y 1 Visitante están viendo este tema.

29 Marzo, 2025, 08:26 pm
Leído 2823 veces

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola, harto de perder tiempo en buscar tablas en internet cuando sale algún problema en el foro,  estoy queriendo hacer una página html con javascript para calcular los percentiles de la distribución normal estándar.

Se que para ello debo usar la función error

$$\operatorname{erf}(z)=\frac{2}{\sqrt{\pi}}\int_0^z e^{-t^2}dt $$

Ahora  he buscado la primitiva para hacer la integral y claro , no la encuentro  :o 8^) , necesitaría si me pueden confirmar lo siguiente:

 1) Si $$\operatorname{erf}(-\infty)=-1$$  ¿es correcto? Editado: Resuelto. Sí

y

2) He encontrado en la wiki la aproximación por Taylor pero para los complejos.

 $$\operatorname{erf}(z)=\frac{2}{\sqrt{\pi}}\sum_{n=0}^\infty\frac{(-1)^nz^{2n+1}}{n!(2n+1)}=\frac{2}{\sqrt{\pi}}\left(z-\frac{z^3}{3}+\frac{z^5}{10}-\frac{z^7}{42}+\frac{z^9}{216}-\cdots\right)$$

¿Me dará una buena aproximación si $$z$$ es real?, imagino que sí , pero por ahí... ¿Y si es buena esta aproximación...lo será en todo el dominio? y si no es así que me recomiendan.



Resulta que si seguía leyendo la misma Wikipedia me lo respondía
Citar
La función error es una función integral, no tiene singularidades y su expansión en serie de Taylor siempre converge pero esta es conocida porque tiene “mala convergencia” para valores
$${\displaystyle x>1}$$.
Entones para evitar esa mala convergencia debería tomar un $$n$$ lo mas grande y apetecible posible.  Aver que sale
Saludos  \(\mathbb {R}^3\)

30 Marzo, 2025, 12:35 am
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Listo,


teniendo javascript instalado , se puede ejecutar este código
codigo
Código: [Seleccionar]

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Percentil Normal Estandar</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            margin: 50px;
        }
        input, button {
            font-size: 16px;
            margin: 10px;
        }
    </style>
</head>
<body>
    <h1>Búsqueda del percentil</h1>
    <label for="numero">Ingresa probabilidad acumulada F(x): </label>
    <input type="number" id="numero">[br /]
    <button onclick="resolver()">Resolver</button>
    <p id="resultado"></p>
    <script>
       function factorial (n) {
         var total = 1;
         for (i=1; i<=n; i++) {
           total = total * i;
         }
         return total;
       }
        function resolver(){
            let a = document.getElementById("numero").value;
            let tope=2*a-1
            let erf = 0
            for (let x = 0; x < 20; x=x+0.00001) {
               let z = x/(2**(0.5))
               erf = 0
                for (let i = 0; i < 50; i++) {
                    erf= erf +2/Math.PI**0.5*(-1)**i*z**(2*i+1)/(factorial(i)*(2*i+1))
               };
               if (erf >= tope) {
                 document.getElementById("resultado").textContent = "x= " + x;
                  break;
               };
            };
        };
    </script>
</body>
</html>


[cerrar]
Y calcula el percentil $$x$$ de una distribución normal estándar con precisión de 1/10000000 dando como dato la probabilidad acumulada $$F(x)$$ para $$F(x)\geq 0.5$$

para percentiles menores  hay que usar la simetría de la distribución para  $$F(\alpha)=-F(1-\alpha)$$  si quiero saber el percentil menor al 5%  hago  $$1-5/100=0.95$$ calculo $$F(0.95)$$ y al valor obtenido le cambio de signo $$x= -1.64486...$$ 

Si no se puede descargar y ejecutar el archivo adjunto.
Saludos  \(\mathbb {R}^3\)

30 Marzo, 2025, 01:38 am
Respuesta #2

Masacroso

  • “Lo que oigo, lo olvido; lo que veo, lo recuerdo; lo que hago, lo aprendo” (antiguo proverbio chino)
  • Moderador Global
  • Mensajes: 5,485
  • País: es
  • Karma: +0/-0
Excelente. Yo hace años hice varios cursos de javascript pero ahora mismo lo tengo todo olvidado por no usarlo. Sin embargo, por experiencia, lo que haría sería buscar un código ya existente para el mismo problema y compararlo con el que haya hecho. Lo digo más que nada porque, al menos en mi caso, siempre he tenido que re-escribir las funciones al indagar y descubrir otra manera de hacer lo mismo pero mucho más eficiente (en cuanto a eficiencia computacional).

Aquí hay una lista a comparar:

https://github.com/search?q=normal+distribution+language%3AJavaScript&type=repositories&l=JavaScript

Por ejemplo, mirando en el código de una de esas librerías veo que usan el algoritmo de la página 221 del siguiente libro:

https://archive.org/details/NumericalRecipes/page/n243/mode/2up?view=theater

Parece ser muchísimo más eficiente, con un error también muy bajo. Se basa en algo que allí denominan "Chebyshev fitting", que imagino se refiere a esto.

Añado: conviene echar un vistazo también a los siguientes enlaces:

https://dlmf.nist.gov/3.11
https://2π.com/22/approximation/

30 Marzo, 2025, 01:29 pm
Respuesta #3

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Excelente. Yo hace años hice varios cursos de javascript pero ahora mismo lo tengo todo olvidado por no usarlo. Sin embargo, por experiencia, lo que haría sería buscar un código ya existente para el mismo problema y compararlo con el que haya hecho. Lo digo más que nada porque, al menos en mi caso, siempre he tenido que re-escribir las funciones al indagar y descubrir otra manera de hacer lo mismo pero mucho más eficiente (en cuanto a eficiencia computacional).
Hola, muchas gracias por las direcciones,  ya he navegado para ver de que tratan.
Para nada pretendo ser eficiente con los códigosque comparto, en este caso con ser eficaz en hallar algunos dígitos de precisión es suficiente,  el programa no ocupa mucho, ni tarda demasiado, con apenas reducir dos parámetros  se reduce la eficacia pero aumenta notoriamente la velocidad.


Encontrar el código correcto en github ,leerlo interpretarlo y adaptarlo para que se ajuste a un programa  propio ,en particular casi siempre me resulta más complicado, que buscar la solución  propia que además es más satisfactoria si la hallas.
Saludos  \(\mathbb {R}^3\)