varianza numeros normal exponencial estandar estadistica distribucion desviacion cuadrado correlaciones con chi aleatorios acumulada python statistics scipy

exponencial - numeros aleatorios con distribucion normal python



¿Cómo obtengo una distribución lognormal en Python con Mu y Sigma? (6)

He estado tratando de obtener el resultado de una distribución lognormal usando Scipy . Ya tengo el Mu y Sigma, así que no necesito hacer ningún otro trabajo de preparación. Si necesito ser más específico (y estoy tratando de estar con mi limitado conocimiento de las estadísticas), diría que estoy buscando la función acumulativa (cdf en Scipy). El problema es que no puedo averiguar cómo hacer esto con solo la media y la desviación estándar en una escala de 0-1 (es decir, la respuesta que se obtiene debe ser algo de 0-1). Tampoco estoy seguro de qué método de dist debería usar para obtener la respuesta. He intentado leer la documentación y buscar en el SO, pero las preguntas relevantes (como this y this ) no parecen proporcionar las respuestas que estaba buscando.

Aquí hay un ejemplo de código de lo que estoy trabajando. Gracias.

from scipy.stats import lognorm stddev = 0.859455801705594 mean = 0.418749176686875 total = 37 dist = lognorm.cdf(total,mean,stddev)

ACTUALIZAR:

Así que después de un poco de trabajo y un poco de investigación, llegué un poco más lejos. Pero todavía estoy recibiendo la respuesta incorrecta. El nuevo código está abajo. Según R y Excel, el resultado debería ser .7434 , pero eso no es lo que está sucediendo. ¿Hay una falla lógica que me falta?

dist = lognorm([1.744],loc=2.0785) dist.cdf(25) # yields=0.96374596, expected=0.7434

ACTUALIZACIÓN 2: Implementación de lognorm de trabajo que produce el resultado correcto de 0.7434 .

def lognorm(self,x,mu=0,sigma=1): a = (math.log(x) - mu)/math.sqrt(2*sigma**2) p = 0.5 + 0.5*math.erf(a) return p lognorm(25,1.744,2.0785) > 0.7434


Aún más tarde, pero en caso de que sea útil para alguien más: encontré que el Excel

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)

Proporciona los mismos resultados que Python.

from scipy.stats import lognorm lognorm.cdf(x,sigma,0,mean)

Del mismo modo, Excel''s.

LOGNORM.DIST(x,Ln(mean),standard_dev,FALSE)

Parece equivalente a la de Python.

from scipy.stats import lognorm lognorm.pdf(x,sigma,0,mean).


Parece que desea instanciar una distribución "congelada" de parámetros conocidos. En tu ejemplo, podrías hacer algo como:

from scipy.stats import lognorm stddev = 0.859455801705594 mean = 0.418749176686875 dist=lognorm([stddev],loc=mean)

que le dará un objeto de distribución lognorm con la media y la desviación estándar que especifique. A continuación, puede obtener el pdf o cdf de esta manera:

import numpy as np import pylab as pl x=np.linspace(0,6,200) pl.plot(x,dist.pdf(x)) pl.plot(x,dist.cdf(x))

¿Es esto lo que tenías en mente?


Sé que es un poco tarde (¡casi un año!) Pero he estado investigando la función lognorm en scipy.stats. Mucha gente parece confundida acerca de los parámetros de entrada, así que espero ayudar a estas personas. El ejemplo anterior es casi correcto, pero me pareció extraño establecer la media en el parámetro de ubicación ("loc"); esto indica que el cdf o el pdf no "despegan" hasta que el valor es mayor que la media. Además, los argumentos de la media y la desviación estándar deben estar en la forma exp (Ln (media)) y Ln (StdDev), respectivamente.

En pocas palabras, los argumentos son (x, shape, loc, scale), con las siguientes definiciones de parámetros:

loc: no equivalente, esto se resta de sus datos para que 0 se convierta en el límite del rango de los datos.

scale - exp μ, donde μ es la media del registro de la variable. (Al realizar la adaptación, normalmente se usaría la media de muestra del registro de los datos).

forma - la desviación estándar del registro de la variable.

Pasé por la misma frustración que la mayoría de las personas con esta función, así que estoy compartiendo mi solución. Solo tenga cuidado porque las explicaciones no son muy claras sin un compendio de recursos.

Para más información, encontré estas fuentes útiles:

Y aquí hay un ejemplo, tomado de la respuesta de @serv-inc, publicado en esta página here:

import math from scipy import stats # standard deviation of normal distribution sigma = 0.859455801705594 # mean of normal distribution mu = 0.418749176686875 # hopefully, total is the value where you need the cdf total = 37 frozen_lognorm = stats.lognorm(s=sigma, scale=math.exp(mu)) frozen_lognorm.cdf(total) # use whatever function and value you need here


Si lees esto y solo quieres una función con un comportamiento similar al de lnorm en R. Bueno, entonces libérate de la ira violenta y usa el número de numpy.random.lognormal del numpy.random.lognormal .


La respuesta de @lucas tiene el uso hacia abajo. Como ejemplo de código, podrías usar

import math from scipy import stats # standard deviation of normal distribution sigma = 0.859455801705594 # mean of normal distribution mu = 0.418749176686875 # hopefully, total is the value where you need the cdf total = 37 frozen_lognorm = stats.lognorm(s=sigma, scale=math.exp(mu)) frozen_lognorm.cdf(total) # use whatever function and value you need here


from math import exp from scipy import stats def lognorm_cdf(x, mu, sigma): shape = sigma loc = 0 scale = exp(mu) return stats.lognorm.cdf(x, shape, loc, scale) x = 25 mu = 2.0785 sigma = 1.744 p = lognorm_cdf(x, mu, sigma) #yields the expected 0.74341

Similar a Excel y R, la función lognorm_cdf anterior parametriza el CDF para la distribución log-normal usando mu y sigma .

Aunque SciPy utiliza los parámetros de forma , ubicación y escala para caracterizar sus distribuciones de probabilidad, para la distribución log-normal, me parece un poco más fácil pensar en estos parámetros en el nivel variable que en el nivel de distribución. Esto es lo que quiero decir ...

Una variable de registro normal X se relaciona con una variable normal Z de la siguiente manera:

X = exp(mu + sigma * Z) #Equation 1

que es lo mismo que

X = exp(mu) * exp(Z)**sigma #Equation 2

Esto se puede volver a escribir de la siguiente manera:

X = exp(mu) * exp(Z-Z0)**sigma #Equation 3

donde Z0 = 0. Esta ecuación es de la forma:

f(x) = a * ( (x-x0) ** b ) #Equation 4

Si puede visualizar ecuaciones en su cabeza, debe quedar claro que los parámetros de escala, forma y ubicación en la Ecuación 4 son: a , b y x0 , respectivamente. Esto significa que en la Ecuación 3 los parámetros de escala, forma y ubicación son: exp (mu) , sigma y cero, respetuosamente.

Si no puede visualizarlo muy claramente, reescribamos la Ecuación 2 como una función:

f(Z) = exp(mu) * exp(Z)**sigma #(same as Equation 2)

y luego observe los efectos de mu y sigma en f (Z) . La siguiente figura mantiene constante sigma y varía mu . Debería ver que mu escala verticalmente f (Z) . Sin embargo, lo hace de manera no lineal; el efecto de cambiar mu de 0 a 1 es más pequeño que el efecto de cambiar mu de 1 a 2. En la Ecuación 2 vemos que exp (mu) es en realidad el factor de escala lineal. Por lo tanto, la "escala" de SciPy es exp (mu) .

La siguiente figura mantiene mu constante y varía sigma . Debes ver que la forma de f (Z) cambia. Es decir, f (Z) tiene un valor constante cuando Z = 0 y sigma afecta la rapidez con que f (Z) se aleja del eje horizontal. Por lo tanto, la "forma" de SciPy es sigma .