Distribuição que varia de 0 a 1 e com pico entre eles?

13

Existe uma distribuição ou posso trabalhar com outra distribuição para criar uma distribuição como essa na imagem abaixo (desculpas pelos desenhos ruins)?

distribuição onde eu forneço um número (0,2, 0,5 e 0,9 nos exemplos) para onde deve estar o pico e um desvio padrão (sigma) que torna a função mais ampla ou menos ampla.

PS: Quando o número fornecido é 0,5, a distribuição é normal.

Stan Callewaert
fonte
19
Note-se que o caso de 0,5 não seria a distribuição normal uma vez que a gama da distribuição normal é ±
8
Se você tirar suas fotos, literalmente, então não há distribuições que olhar assim desde que a área em todos os casos são estritamente menor que 1. Se você estiver indo para restringir o apoio para [0,1], em seguida, você não pode restringir o alcance do pdf para [0,1]bem (exceto no caso uniforme trivial).
John Coleman

Respostas:

29

Uma opção possível é a distribuição beta , mas parametrizada em termos de média e precisão ϕ , ou seja, "para μ fixo , quanto maior o valor de ϕ , menor a variação de y " (ver Ferrari e Cribari- Neto, 2004). A função densidade de probabilidade é construída substituindo os parâmetros padrão da distribuição beta por α = ϕ μ e β = ϕ ( 1 - μ )μϕμϕyα=ϕμβ=ϕ(1μ)

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

onde e V a r ( Y ) = μ ( 1 - μ )E(Y)=μ .Var(Y)=μ(1μ)1+ϕ

Como alternativa, você pode calcular parâmetros e β apropriados que levariam à distribuição beta com média e variância predefinidas. No entanto, observe que existem restrições sobre possíveis valores de variação válidos para a distribuição beta. Para mim, pessoalmente, a parametrização usando precisão é mais intuitiva (pense em xαβ proporções em X binomialmente distribuído, com tamanho de amostra ϕ e probabilidade de sucesso μ ).x/ϕ Xϕμ

A distribuição Kumaraswamy é outra distribuição contínua limitada, mas seria mais difícil parametrizar como acima.

Como outros já perceberam, isso não é normal, pois a distribuição normal tem o suporte ; portanto, na melhor das hipóteses, você pode usar o normal truncado como uma aproximação.(,)

Ferrari, S. & Cribari-Neto, F. (2004). Regressão beta para modelagem de taxas e proporções. Jornal de Estatística Aplicada, 31 (7), 799-815.

Tim
fonte
Eu gosto da sua resposta, eu construí alguns gráficos a partir dela. O único problema que tenho é que parece que não consigo controlar a largura (sigma em uma distribuição normal da curva). Eu gostaria de ter uma fórmula que calcule o valor phi quando um determinado valor sigma é dado. O problema que tenho é que a curva vira de cabeça para baixo ou toma uma forma estranha, esse é o comportamento que quero evitar.
Stan Callewaert
Resumindo: eu gostaria de dar um mu e um sigma à função e obter uma distribuição que seja ampla quando o sigma for grande e fino (mas não vire de cabeça para baixo ou mostre um comportamento estranho) quando o sigma for pequeno .
Stan Callewaert
1
A precisão e o desvio padrão estão relacionados: . Além disso, a distribuição Beta é unimodal (não vai mostrar um comportamento estranho) quando α e β são maiores do que 1. Isso significa que quando μ = 1 / 2 , você deve escolher φ > 2 ou equivalentemente σ < 0,707 . ϕ=μ(1μ)/σ21αβμ=1/2ϕ>2σ<0.707
knrumsey
2
Outra coisa a mencionar é que é claro que você poderia usar misturas de distribuições beta, se uma única distribuição beta não for suficientemente flexível.
Björn
@knrumsey Eu usei a mesma fórmula para phi, o único problema que parece ter é que, quando o sigma é um número grande, phi se torna um número negativo, o que significa que alfa também se torna um número negativo. Alfa não pode ser negativo de acordo com a Wikipedia. Existe uma solução para isso?
Stan Callewaert
5

Experimente a distribuição beta, seu intervalo é de 0 a 1. Você já tentou isso? O valor médio é α(α+β)


fonte
1
Parece muito interessante, mas como posso converter meu número (o valor de pico) e meu sigma nos valores alfa e beta?
Stan Callewaert
1
Basta procurar na wikipedia ... é uma distribuição de dois parâmetros. Entre os dois, eles podem ajustar o seu valor de pico (com um grau extra de liberdade).
5

Eu me transformei para criar esse tipo de variável. Comece com uma variável aleatória, x, que tem suporte em toda a linha real (como normal), e depois a transforme para criar uma nova variável aleatória . Presto, você tem uma variável aleatória distribuída no intervalo da unidade. Como essa transformação específica está aumentando, você pode mover a média / mediana / modo de y ao redor, movendo a média / mediana / modo de x ao redor. Deseja tornarymais disperso (em termos de alcance inter-quartil, por exemplo)? Apenas façaxy=exp(x)1+exp(x)yx mais disperso.

Não há nada de especial na função exp(x)1+exp(x) . Qualquer função de distribuição cumulativa trabalha para produzir uma nova variável aleatória definida no intervalo da unidade.

y=F(x)F()yF()xxyxy . Monotonicidade estrita é uma coisa agradável.

A fórmula para calcular a média e o sd de ytalvez não seja fácil de encontrar, mas é para isso que servem as simulações de Monte Carlo. Para obter distribuições relativamente bonitas como as que você desenha, você querx e F() ser variáveis ​​aleatórias contínuas (cdf de variáveis ​​aleatórias contínuas) com suporte na linha real.

Conta
fonte
0

Se alguém estiver interessado na solução que usei no Python para gerar um valor aleatório próximo ao número fornecido como parâmetro. Minha solução existe de quatro estágios. Cada estágio, a chance de o número gerado estar mais próximo do número especificado é maior.

Sei que a solução não é tão bonita quanto usar uma distribuição, mas foi assim que consegui resolver meu 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()

O resultado ao executar este código é mostrado na figura abaixo: Graph

Stan Callewaert
fonte
0

Você pode dar uma olhada nas 'Curvas de Johnson'. Veja NL Johnson: Sistemas de Curvas de Frequência gerados por métodos de tradução. 1949 Biometrika Volume 36 pp 149-176. R tem suporte para ajustá-los a curvas arbitrárias. Em particular, suas curvas SB (delimitadas) podem ser úteis.

Faz 40 anos desde que os usei, mas eles eram muito úteis para mim na época e acho que eles trabalharão para você.

Roger Hill
fonte