случайная величина из асимметричного распределения с помощью scipy

пытаясь извлечь случайное число из распределения в SciPy, как и в случае с stats.norm.rvs. Однако я пытаюсь взять число из имеющегося у меня эмпирического распределения - это искаженный набор данных, и я хочу включить перекос и эксцесс в распределение, из которого я черпаю. В идеале я хотел бы просто вызвать stats.norm.rvs (loc = blah, scale = blah, size = blah), а затем также установить перекос и курт в дополнение к среднему значению и дисперсии. Нормальная функция принимает аргумент `` моменты '', состоящий из некоторого расположения `` mvsk '', где s и k обозначают перекос и эксцесс, но, по-видимому, все, что делает, это просит, чтобы s и k были вычислены из rv, в то время как я хочу Для начала установите s и k как параметры распределения.

В любом случае, я ни в коем случае не специалист по статистике, возможно, это простой или ошибочный вопрос. Был бы признателен за любую помощь.

РЕДАКТИРОВАТЬ: Если четырех моментов недостаточно для достаточно точного определения распределения, есть ли другой способ нарисовать значения, которые состоят из эмпирического распределения, которое выглядит следующим образом: http://i.imgur.com/3yB2Y.png


person eric p    schedule 25.03.2012    source источник


Ответы (4)


Если вас не беспокоит попадание в хвосты распределения, а данные являются плавающими, то вы можете выбрать из эмпирического распределения.

  • Отсортируйте данные.
  • Предварительно поставьте 0 перед данными.
  • Пусть N обозначает длину этого data_array
  • Вычислить q = scipy.rand () * N
  • idx = int (q); ди = q-idx
  • xlo = массив_данных [idx], xhi = массив_данных [idx + 1];
  • вернуть xlo + (xhi-xlo) * di

По сути, это линейная интерполяция в эмпирической функции CDF для получения случайных величин.

Две потенциальные проблемы: (1) если ваш набор данных мал, вы не можете хорошо представить распределение, и (2) вы не сгенерируете значение, превышающее наибольшее в вашем существующем наборе данных.

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

person Dave    schedule 02.07.2012

Нормальное распределение имеет только 2 параметра: среднее значение и дисперсию. Существуют расширения нормального распределения, которые имеют 4 параметра, с дополнительным перекосом и эксцессом. Одним из примеров может быть расширение Грама-Шарлье, но, насколько я помню, в scipy доступен только pdf, а не rvs.

В качестве альтернативы в scipy.stats есть распределения, которые имеют 4 параметра, такие как johnsonsu, которые являются гибкими, но имеют другую параметризацию.

Однако в вашем примере распределение предназначено для значений больше нуля, поэтому приблизительно нормальное распределение не будет работать очень хорошо. Как предложил Эндрю, я думаю, вам следует просмотреть распределения в scipy.stats, у которых нижняя граница равна нулю, например гамма, и вы можете найти что-то близкое.

Другой альтернативой, если ваша выборка достаточно велика, было бы использование gaussian_kde, которое также может создавать случайные числа. Но gaussian_kde также не предназначен для распределения с конечной границей.

person Josef    schedule 25.03.2012

Возможно, я неправильно понял, я, конечно, не эксперт по статистике, но ваше изображение немного похоже на гамму распространение.

Scipy содержит код специально для гамма-распределений - http://www.scipy.org/doc/api_docs/SciPy.stats.distributions.html#gamma

person Andrew Walker    schedule 25.03.2012

короткий ответ при необходимости замените другим дистрибутивом:

n = 100
a_b = [rand() for i in range(n)]
a_b.sort()
# len(a_b[:int(n*.8)])
c = a_b[int(n*.8)]
print c
person Joop    schedule 09.09.2014