25 votos

¿Una distribución que tenga un rango de 0 a 1 y con un pico entre ellos?

¿Existe una distribución o puedo trabajar desde otra distribución para crear una distribución como la que se muestra en la imagen a continuación (disculpas por los malos dibujos)?

distribución donde doy un número (0.2, 0.5 y 0.9 en los ejemplos) para indicar dónde debe estar el pico y una desviación estándar (sigma) que hace que la función sea más ancha o más estrecha.

P.D.: Cuando el número dado es 0.5, la distribución es una distribución normal.

22 votos

21 votos

Ten en cuenta que el caso 0.5 no sería la distribución normal ya que el rango de la distribución normal es $\pm \infty$

9 votos

Si tomas tus fotos literalmente, entonces no hay distribuciones que se vean así, ya que el área en todos los casos es estrictamente menor que 1. Si vas a restringir el soporte a [0,1], entonces no puedes restringir el rango de la función de densidad de probabilidad a [0,1] tampoco (excepto en el caso trivial uniforme).

38voto

Dipstick Puntos 4869

Una opción posible es la distribución beta, pero reparametrizada en términos de la media $\mu$ y la precisión $\phi$, es decir, "para $\mu$ fijo, cuanto mayor sea el valor de $\phi$, menor será la varianza de $y$" (ver Ferrari y Cribari-Neto, 2004). La función de densidad de probabilidad se construye reemplazando los parámetros estándar de la distribución beta por $\alpha = \phi\mu$ y $\beta = \phi(1-\mu)

$$ f(y) = \frac{1}{\mathrm{B}(\phi\mu,\; \phi(1-\mu))}\; y^{\phi\mu-1} (1-y)^{\phi(1-\mu)-1} $$

donde $E(Y) = \mu$ y $\mathrm{Var}(Y) = \frac{\mu(1-\mu)}{1+\phi}$.

Alternativamente, puedes calcular los parámetros apropiados $\alpha$ y $\beta$ que conducirían a una distribución beta con media y varianza predefinidas. Sin embargo, ten en cuenta que existen restricciones en los valores posibles de varianza que son válidos para la distribución beta. Personalmente, la parametrización utilizando precisión es más intuitiva (piensa en las $x\,/\,\phi$ proporciones en una $X$ distribuida binomialmente, con tamaño de muestra $\phi$ y probabilidad de éxito $\mu$).

La distribución Kumaraswamy es otra distribución continua acotada, pero sería más difícil reparametrizarla como arriba mencionado.

Como otros han señalado, no es normal ya que la distribución normal tiene soporte $(-\infty, \infty)$, por lo que en el mejor de los casos podrías utilizar la normal truncada como aproximación.

Ferrari, S., & Cribari-Neto, F. (2004). <a href="https://www.ime.usp.br/~sferrari/beta.pdf" rel="noreferrer">Regresión beta para modelar tasas y proporciones.</a> Journal of Applied Statistics, 31(7), 799-815.

0 votos

Me gusta tu respuesta, he construido algunos gráficos a partir de ella. El único problema que tengo es que no puedo controlar el ancho (sigma en una distribución normal de la curva). Me gustaría tener una fórmula que calcule el valor de phi cuando se da un cierto valor de sigma. El problema que tengo es que la curva se invierte o toma una forma extraña, ese es el comportamiento que quiero evitar.

0 votos

En resumen: Me gustaría darle un mu y un sigma a la función y luego obtener una distribución que sea amplia cuando el sigma sea grande y sea delgada (pero no se vuelva del revés o muestre un comportamiento extraño) cuando el sigma sea pequeño.

1 votos

La precisión y desviación estándar están relacionadas: $\phi = \mu(1-\mu)/\sigma^2 - 1$. Además, la Distribución Beta es unimodal (no mostrará un comportamiento extraño) cuando $\alpha$ y $\beta$ son mayores que 1. Esto significa que cuando $\mu = 1/2$, debes elegir $\phi > 2$ o equivalente $\sigma < 0.707$.

7voto

Bill Puntos 3605

Me transformo para crear este tipo de variable. Comienza con una variable aleatoria, x, que tiene soporte en toda la línea real (como una normal), y luego la transformas para hacer una nueva variable aleatoria $y=\frac{exp(x)}{1+exp(x)}$. ¡Listo, tienes una variable aleatoria distribuida en el intervalo unitario! Dado que esta transformación particular es creciente, puedes mover la media/mediana/moda de y alrededor moviendo la media/mediana/moda de x alrededor. ¿Quieres hacer que $y$ esté más dispersa (en términos de rango intercuartílico, por ejemplo)? Simplemente haz que $x$ esté más dispersa.

No hay nada especial acerca de la función $\frac{exp(x)}{1+exp(x)}$. Cualquier función de distribución acumulativa funciona para producir una nueva variable aleatoria definida en el intervalo unitario.

Entonces, cualquier variable aleatoria transformada al introducirla en cualquier cdf ($y=F(x)$) hace lo que quieres: una variable aleatoria distribuida en el intervalo unitario cuyas propiedades puedes ajustar convenientemente ajustando los parámetros de la variable aleatoria no transformada de una manera intuitiva. Siempre y cuando $F()$ sea estrictamente monótona, la variable transformada se parecerá, de varias formas, a la no transformada. Por ejemplo, si quieres que $y$ sea una variable aleatoria unimodal en el intervalo unitario. Siempre y cuando $F()$ sea estrictamente creciente y $x$ sea unimodal, obtendrás eso. Aumentar la mediana/media/moda de $x$ aumenta la mediana/media/moda de $y$. Aumentar el rango intercuartílico de $x$ (moviendo el percentil 25 hacia abajo y el percentil 75 hacia arriba) aumenta el rango intercuartílico de $y$. La estricta monotonía es algo útil.

La fórmula para calcular la media y la desviación estándar de $y$ quizás no sea fácil de encontrar, pero para eso están las simulaciones de Monte Carlo. Para obtener distribuciones relativamente bonitas como las que dibujas, quieres que $x$ y $F()$ sean variables aleatorias continuas (funciones de distribución acumulativa de variables aleatorias continuas) con soporte en la línea real.

5voto

Prueba la distribución beta, su rango va de 0 a 1. ¿Ya has probado esto? El valor medio es $\frac{\alpha}{(\alpha + \beta)}$

0voto

Drew Marsh Puntos 22002

Si alguien está interesado en la solución que utilicé en Python para generar un valor aleatorio cercano al número dado como parámetro. Mi solución consta de cuatro etapas. En cada etapa, la probabilidad de que el número generado esté más cerca del número dado es mayor.

Sé que la solución no es tan hermosa como usar una distribución única, pero este fue el método que encontré para resolver mi problema:

number_factory.py:

import random
import numpy as np

class NumberFactory:
    def __init__(self):
        self.functions = [self.__linear, self.__exponential_point_four, self.__exponential_point_three, self.__exponential_point_twenty_five]  
        self.stage = 0

    def next_stage(self):
        self.stage += 1

    def get_mutated_number(self, number):
         # True si el número generado será mayor que el número dado
         # False si el número generado será menor que el número dado
        add = bool(np.random.choice([0,1], p=[number, 1-number]))

        # Genera un número entre 0 y 1 que se utilizará
        # para multiplicar el nuevo número por el cual se restará o sumará el parámetro número
        # Mientras más grande el número de etapa (0-3) más probabilidad de que el número mutado se acerque al parámetro número
        multiply_number_seed = random.uniform(0, 1)
        multiply_number = self.functions[self.stage](multiply_number_seed)

        if (add):
            return number+((1-number)*multiply_number)
        else:
            return number-(number*multiply_number)

    def __linear(self, x):
        return -x+1

    def __exponential_point_four(self, x):
        return 0.4*x**2 - 1.4*x + 1

    def __exponential_point_three(self, x):
        return 0.8*x**2 - 1.8*x + 1

    def __exponential_point_twenty_five(self, x):
        return x**2 - 2*x + 1

    def get_stage(self):
        return self.stage

main.py:

import matplotlib.pyplot as plt
import numpy as np

factory = NumberFactory()
numbers = []

factory.next_stage()
factory.next_stage()
factory.next_stage()

for _ in range(100000):
    numbers.append(factory.get_mutated_number(0.3))

bins = 100

plt.hist(numbers, bins, normed=True)
plt.plot(1, np.ones_like(bins))
plt.show()

el resultado al ejecutar este código se muestra en la imagen de abajo: Gráfico

0voto

Roger Hill Puntos 1

Quizás quieras echar un vistazo a las 'curvas de Johnson'. Ver N.L. Johnson: Sistemas de curvas de frecuencia generadas por métodos de traslación. 1949 Biometrika Volumen 36 pp 149-176. R tiene soporte para ajustarlos a curvas arbitrarias. En particular, sus curvas SB (acotadas) podrían ser útiles.

Han pasado 40 años desde que las usé, pero me resultaron muy útiles en ese momento, y creo que te funcionarán a ti también.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X