tutorial book python statistics

book - python statistics tutorial



Cómo calcular la distribución normal acumulada en Python (6)

Adaptado de aquí http://mail.python.org/pipermail/python-list/2000-June/039873.html

from math import * def erfcc(x): """Complementary error function.""" z = abs(x) t = 1. / (1. + 0.5*z) r = t * exp(-z*z-1.26551223+t*(1.00002368+t*(.37409196+ t*(.09678418+t*(-.18628806+t*(.27886807+ t*(-1.13520398+t*(1.48851587+t*(-.82215223+ t*.17087277))))))))) if (x >= 0.): return r else: return 2. - r def ncdf(x): return 1. - 0.5*erfcc(x/(2**0.5))

Estoy buscando una función en Numpy o Scipy (o cualquier biblioteca de Python rigurosa) que me dé la función de distribución normal acumulativa en Python.


Aquí hay un ejemplo:

>>> from scipy.stats import norm >>> norm.cdf(1.96) array(0.97500210485177952)

Si necesita el CDF inverso:

>>> norm.ppf(norm.cdf(1.96)) array(1.9599999999999991)


Como Google da esta respuesta para el netlogo pdf de búsqueda, aquí está la versión de netlogo del código python anterior

;; Normal distribution cumulative density function to-report normcdf [x mu sigma] let t x - mu let y 0.5 * erfcc [ - t / ( sigma * sqrt 2.0)] if ( y > 1.0 ) [ set y 1.0 ] report y end ;; Normal distribution probability density function to-report normpdf [x mu sigma] let u = (x - mu) / abs sigma let y = 1 / ( sqrt [2 * pi] * abs sigma ) * exp ( - u * u / 2.0) report y end ;; Complementary error function to-report erfcc [x] let z abs x let t 1.0 / (1.0 + 0.5 * z) let r t * exp ( - z * z -1.26551223 + t * (1.00002368 + t * (0.37409196 + t * (0.09678418 + t * (-0.18628806 + t * (.27886807 + t * (-1.13520398 +t * (1.48851587 +t * (-0.82215223 + t * .17087277 ))))))))) ifelse (x >= 0) [ report r ] [report 2.0 - r] end


La respuesta de Alex muestra una solución para la distribución normal estándar (media = 0, desviación estándar = 1). Si tiene una distribución normal con mean y std (que es sqr(var) ) y desea calcular:

from scipy.stats import norm # cdf(x < val) print norm.cdf(val, m, s) # cdf(x > val) print 1 - norm.cdf(val, m, s) # cdf(v1 < x < v2) print norm.cdf(v2, m, s) - norm.cdf(v1, m, s)

Lea más sobre cdf aquí y la implementación astuta de distribución normal con muchas fórmulas here .


Para construir sobre el ejemplo de Unknown, el equivalente Python de la función normdist () implementada en muchas bibliotecas sería:

def normcdf(x, mu, sigma): t = x-mu; y = 0.5*erfcc(-t/(sigma*sqrt(2.0))); if y>1.0: y = 1.0; return y def normpdf(x, mu, sigma): u = (x-mu)/abs(sigma) y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2) return y def normdist(x, mu, sigma, f): if f: y = normcdf(x,mu,sigma) else: y = normpdf(x,mu,sigma) return y


Puede que sea demasiado tarde para responder la pregunta, pero dado que Google todavía dirige a la gente aquí, decido escribir mi solución aquí.

Es decir, desde Python 2.7, la biblioteca math ha integrado la función de error math.erf(x)

La función erf() se puede usar para calcular funciones estadísticas tradicionales, como la distribución normal estándar acumulativa:

from math import * def phi(x): #''Cumulative distribution function for the standard normal distribution'' return (1.0 + erf(x / sqrt(2.0))) / 2.0

Árbitro:

https://docs.python.org/2/library/math.html

https://docs.python.org/3/library/math.html

¿Cómo se relacionan la función de error y la distribución estándar estándar?