Generando una distribución binomial alrededor de cero.

Estoy buscando generar una distribución binomial-esque. Quiero una distribución binomial pero quiero que esté centrada alrededor de cero (sé que esto no tiene mucho sentido con respecto a la definición de distribuciones binomiales, pero aún así, este es mi objective).

La única forma que encontré de hacer esto en Python es:

def zeroed_binomial(n,p,size=None): return numpy.random.binomial(n,p,size) - n*p 

¿Hay un nombre real para esta distribución? ¿Este código realmente me da lo que quiero (y cómo puedo saberlo)? ¿Existe una forma más limpia / más agradable / canónica / ya implementada de hacer esto?

Lo que está haciendo está bien si desea una distribución normal “discretizada” centrada alrededor de 0. Si desea valores enteros, debe redondear n*p antes de restar.

Pero el límite de la distribución binomial es simplemente la distribución normal cuando n hace grande y con p acotado fuera de 0 o 1. ya que n*p no va a ser un entero, excepto por ciertos valores, ¿por qué no usar la distribución normal?

Las distribuciones de probabilidad implementadas en el módulo scipy.stats permiten cambiar distribuciones arbitrariamente especificando la palabra clave loc en el constructor. Para obtener una distribución binomial con la media desplazada cerca de 0, puede llamar

 p = stats.binom(N, p, loc=-round(N*p)) 

(Asegúrese de usar un valor entero para loc con una distribución discreta).

Aquí hay un ejemplo:

 p = stats.binom(20, 0.1, loc=-2) x = numpy.arange(-3,5) bar(x, p.pmf(x)) 

diagrama de barras

Editar:

Para generar los números aleatorios reales, use el método rvs() que viene con cada distribución aleatoria en el módulo scipy.stats . Por ejemplo:

 >>> stats.binom(20,0.1,loc=-2).rvs(10) array([-2, 0, 0, 1, 1, 1, -1, 1, 2, 0])