¿Distribución que tiene un rango de 0 a 1 y con pico entre ellos?

13

¿Hay una distribución o puedo trabajar desde otra distribución para crear una distribución como esa 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 saber dónde debería estar el pico y una desviación estándar (sigma) que hace que la función sea más ancha o menos ancha.

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

Stan Callewaert
fuente
19
tenga en cuenta que el caso 0.5 no sería la distribución normal ya que el rango de la distribución normal es ±
8
Si se toma sus imágenes, literalmente, entonces no hay distribuciones que se parecen a que desde el área en todos los casos son estrictamente inferior a 1. Si se va a restringir el apoyo a [0,1]continuación, no se puede restringir el rango del pdf para [0,1]así (excepto en el caso del uniforme trivial).
John Coleman

Respuestas:

29

Una opción posible es la distribución beta , pero re-parametrizada en términos de media y precisión ϕ , es decir, "para μ fijo , cuanto mayor es el valor de ϕ , menor es 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 distribución beta con α = ϕ μ y β = ϕ ( 1 - μ )μϕμϕyα=ϕμβ=ϕ(1μ)

f(y)=1B(ϕμ,ϕ(1μ))yϕμ1(1y)ϕ(1μ)1

donde y V a r ( Y ) = μ ( 1 - μ )E(Y)=μ .Var(Y)=μ(1μ)1+ϕ

Alternativamente, puede calcular los parámetros y β apropiados que conducirían a una distribución beta con media y varianza predefinidas. Sin embargo, tenga en cuenta que existen restricciones sobre los posibles valores de varianza que son válidos para la distribución beta. Para mí personalmente, la parametrización con precisión es más intuitiva (piense en xαβ proporciones en X distribuido binomialmente, con tamaño de muestra ϕ y la probabilidad de éxito μ ).x/ϕ Xϕμ

La distribución de Kumaraswamy es otra distribución continua limitada, pero sería más difícil volver a parametrizar como anteriormente.

Como otros han notado, es no normal, ya que la distribución normal tiene la de apoyo, por lo que en el mejor de usted podría utilizar el normal truncada como una aproximación.(,)

Ferrari, S. y Cribari-Neto, F. (2004). Regresión beta para modelar tasas y proporciones. Journal of Applied Statistics, 31 (7), 799-815.

Tim
fuente
Me gusta tu respuesta, he construido algunos gráficos a partir de ella. El único problema que tengo es que parece 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 sigma. El problema que tengo es que la curva se da vuelta o toma una forma extraña, ese es el comportamiento que quiero evitar.
Stan Callewaert
En resumen: me gustaría dar un mu y un sigma a la función y luego obtener una distribución que sea amplia cuando el sigma es grande y delgado (pero no se da vuelta o muestra un comportamiento extraño) cuando el sigma es pequeño .
Stan Callewaert
1
La precisión y la desviación estándar están relacionadas: . Además, la distribución beta es unimodal (no se mostrará un comportamiento extraño) cuando α y β son mayores que 1. Esto significa que cuando μ = 1 / 2 , debe elegir φ > 2 o equivalentemente σ < 0,707 . ϕ=μ(1μ)/σ21αβμ=1/2ϕ>2σ<0.707
knrumsey
2
Otra cosa a mencionar es que, por supuesto, podría usar mezclas de distribuciones beta, si una única distribución beta no es lo suficientemente flexible.
Björn
@knrumsey He usado la misma fórmula para phi, el único problema que parece tener es que cuando el sigma es un número grande, phi se convierte en un número negativo, lo que significa que alfa también se convierte en un número negativo. Alfa no puede ser negativo según Wikipedia. ¿Existe alguna solucion para esto?
Stan Callewaert
5

Pruebe la distribución beta, su rango es de 0 a 1. ¿Ya ha probado esto? El valor medio es α(α+β)


fuente
1
Parece muy interesante, pero ¿cómo puedo convertir mi número (el valor máximo) y mi sigma a los valores alfa y beta?
Stan Callewaert
1
Solo búscalo en wikipedia ... es una distribución de dos parámetros. Entre los dos, pueden sintonizar su valor máximo (con un grado adicional de libertad).
5

Me transformo para crear este tipo de variable. Comience con una variable aleatoria, x, que tenga soporte en toda la línea real (como normal), y luego transfórmela para hacer una nueva variable aleatoria . Presto, tiene una variable aleatoria distribuida en el intervalo de la unidad. Dado que esta transformación particular está aumentando, puede mover la media / mediana / modo de y moviendo la media / mediana / modo de x. ¿Quieres hacerymás dispersa (en términos de rango intercuartil, por ejemplo)? Solo hazxmás disperso.y=exp(x)1+exp(x)yx

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

y=F(x)F()yF()xxyxy

yxF()

Cuenta
fuente
0

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 existe de cuatro etapas. En cada etapa, la posibilidad 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, pero esta fue la forma en que pude 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 if the generated number will be higher than the given number
         # False if the generated number will be lower than the given number
        add = bool(np.random.choice([0,1], p=[number, 1-number]))

        # Generate a number between 0 and 1 that will be used
        # to multiply the new number by which the number parameter will be substracted or added
        # The bigger the stage number (0-3) the more change that the mutated number is close to the number parameter
        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 a continuación: Graph

Stan Callewaert
fuente
0

Es posible que desee echar un vistazo a las "curvas de Johnson". Ver NL Johnson: Sistemas de curvas de frecuencia generadas por métodos de traducción. 1949 Biometrika Volumen 36 pp 149-176. R tiene soporte para ajustarlos a curvas arbitrarias. En particular, sus curvas SB (acotadas) pueden ser útiles.

Han pasado 40 años desde que los usé, pero fueron muy útiles para mí en ese momento, y creo que funcionarán para usted.

Roger Hill
fuente