Распределение, которое имеет диапазон от 0 до 1 и с пиком между ними?

13

Существует ли какой-либо дистрибутив или я могу работать из другого дистрибутива, чтобы создать такой дистрибутив, как на изображении ниже (извините за плохие рисунки)?

распределение где я даю число (0,2, 0,5 и 0,9 в примерах), где должен быть пик, и стандартное отклонение (сигма), которое делает функцию более широкой или менее широкой.

PS: Когда данное число равно 0,5, распределение является нормальным распределением.

Стэн Каллеверт
источник
19
обратите внимание, что случай 0.5 не будет нормальным распределением, поскольку диапазон нормального распределения равен ±
8
Если ваши снимки буквально , то нет распределения , которые выглядят как что , так как область во всех случаях строго меньше 1. Если вы собираетесь ограничить поддержку , [0,1]то вы не можете ограничить диапазон PDF для [0,1]а (кроме как в тривиальном единообразном случае).
Джон Колман

Ответы:

29

Одним из возможных вариантов является бета-распределение , но оно повторно параметризовано в терминах среднего значения и точности ϕ , то есть «для фиксированного значения μ чем больше значение ϕ , тем меньше дисперсия y » (см. Ferrari и Cribari- Нето, 2004). Функция плотности вероятности строится путем замены стандартных параметров бета-распределения на α = ϕ μ и β = ϕ ( 1 - μ )μϕμϕyα=ϕμβ=ϕ(1μ)

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

где и V a r ( Y ) = μ ( 1 - μ )E(Y)=μ .Var(Y)=μ(1μ)1+ϕ

Кроме того, вы можете рассчитать соответствующие параметры и β , которые приведут к бета-распределению с заранее заданным средним значением и дисперсией. Однако обратите внимание, что существуют ограничения на возможные значения дисперсии, которые действительны для бета-распределения. Лично для меня параметризация с использованием точности более интуитивна (подумайте о хαβ пропорции вбиномиально распределенном X , с размером выборки ϕ и вероятностью успеха µ ).x/ϕ Xϕμ

Распределение Кумарасвами является еще одним ограниченным непрерывным распределением, но было бы сложнее повторно параметризовать, как описано выше.

Как уже заметили, это не нормально , так как нормальное распределение имеет поддержку, поэтому в лучшем случае вы могли бы использовать усеченный нормальный как приближение.(,)

Ferrari, S. & Cribari-Neto, F. (2004). Бета-регрессия для моделирования скоростей и пропорций. Журнал прикладной статистики, 31 (7), 799-815.

Тим
источник
Мне нравится ваш ответ, я построил некоторые графики из него. Единственная проблема, которую я имею, состоит в том, что я не могу контролировать ширину (сигма в нормальном распределении кривой). Я хотел бы иметь формулу, которая вычисляет значение фи, когда дается определенное значение сигмы. У меня проблема в том, что кривая переворачивается вверх дном или принимает странную форму, это поведение, которое я хочу избежать.
Стэн
Короче говоря: я хотел бы дать му и сигму для функции, а затем получить распределение, которое является широким, когда сигма большая и тонкая (но не переворачивается или показывает странное поведение), когда сигма мала ,
Стэн
1
Точность и стандартное отклонение связаны: . Кроме того , бета - распределение унимодальна (не будет показывать странное поведение) , когда α и β больше , чем 1. Это означает , что при μ = +1 / +2 , вы должны выбрать ф > 2 или , что эквивалентно σ < 0,707 . ϕ=μ(1μ)/σ21αβμ=1/2ϕ>2σ<0.707
knrumsey
2
Еще одна вещь, которую стоит упомянуть, это то, что вы, конечно, можете использовать смеси бета-дистрибутивов, если один бета-дистрибутив недостаточно гибок.
Бьорн
@knrumsey Я использовал ту же формулу для фи, единственная проблема, с которой я, похоже, сталкиваюсь, заключается в том, что когда сигма является большим числом, фи становится отрицательным числом, что означает, что альфа также становится отрицательным числом. Альфа не может быть отрицательной согласно Википедии. Есть ли решение для этого?
Стэн
5

α(α+β)


источник
1
Выглядит очень интересно, но как я могу преобразовать мое число (пиковое значение) и мою сигму в значения альфа и бета?
Стэн
1
Просто посмотрите в википедии ... это двухпараметрическое распределение. Между ними они могут настроиться на ваше пиковое значение (с дополнительной степенью свободы).
5

y=exp(x)1+exp(x)yx

В функции нет ничего особенногоexp(x)1+exp(x)

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

yxF()

Билл
источник
0

Если кто-то заинтересован в решении, я использовал в Python для генерации случайного значения, близкого к данному числу в качестве параметра. Мое решение существует из четырех этапов. На каждом этапе вероятность того, что сгенерированное число будет ближе к данному числу, больше.

Я знаю, что решение не так красиво, как использование одного дистрибутива, но именно так я смог решить свою проблему:

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()

Результат при выполнении этого кода показан на рисунке ниже: Graph

Стэн Каллеверт
источник
0

Возможно, вы захотите взглянуть на «Кривые Джонсона». См. NL Johnson: Системы частотных кривых, генерируемых методами перевода. 1949 Биометрика Том 36 с. 149-176. R поддерживает их подгонку к произвольным кривым. В частности, его SB (ограниченные) кривые могут быть полезны.

Прошло 40 лет с тех пор, как я их использовал, но они были очень полезны для меня в то время, и я думаю, что они будут работать для вас.

Роджер Хилл
источник