2015-02-24 2 views
7

Я не понимаю самих оснований создания логнормальных переменных, как задокументировано here.Журнал Нормальные случайные переменные со Scipy

The log normal distribution takes on mean and variance as parameters. Я хотел бы создать замороженное распределение с использованием этих параметров, а затем получить CDF, PDF и т.д.

Однако в документации, они получают замороженное распределение с помощью

from scipy.stats import lognorm 
s = 0.953682269606 
rv = lognorm(s) 

«s», кажется, стандарт отклонение. Я попытался использовать параметры «loc» и «scale» вместо «s», но это породило ошибку (s является обязательным параметром). Как я могу создать замороженное распространение с параметрами «m», «s» для определения местоположения и масштаба?

ответ

12

тайна решена (править 3)

  • μ соответствует ln(scale) (!)
  • σ соответствует форма (s)
  • loc не требуется для установки любого из σ и ц

Я думаю, что это серьезная проблема, что это явно не документировано. Наверное, многие из них пришли к этому, когда делали простые тесты с логнормальным распределением в SciPy.

Почему?

Модуль статистики обрабатывает loc и scale одинаково для всех распределений (это явно не записывается, но может быть выведено при чтении между строками). Мое подозрение заключалось в том, что loc вычитается из x, а результат делится на scale (и результат обрабатывается как новый x). Я тестировал это, и это оказалось так.

Что это означает для логарифмического распределения? В каноническом определении логнормального распределения появляется выражение ln(x). Очевидно, что тот же термин появляется в реализации SciPy. С выше соображения, это как loc и scale в конечном итоге в логарифм:

ln((x-loc)/scale) 

По общему логарифм исчислении, это то же самое, как

ln(x-loc) - ln(scale) 

В каноническом определении логарифмически нормального распределения термин просто равен ln(x) - μ. Сравнивая подход SciPy и канонический подход, он дает критическое понимание: ln(scale) представляет μ. loc, однако, не имеет соответствия в каноническом определении и лучше остается в 0. Далее я утверждал, что форма (s) равна σ.

Доказательство

>>> import math 
>>> from scipy.stats import lognorm 
>>> mu = 2 
>>> sigma = 2 
>>> l = lognorm(s=sigma, loc=0, scale=math.exp(mu)) 
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std())) 
mean: 54.59815 stddev: 399.71719 

Я использую WolframAlpha в качестве ссылки. Он обеспечивает аналитически определенные значения среднего и стандартного отклонения логнормального распределения.

http://www.wolframalpha.com/input/?i=log-normal+distribution%2C+mean%3D2%2C+sd%3D2

enter image description here

Матч значения.

WolframAlpha, а также SciPy придумывают среднее и стандартное отклонение, оценивая аналитические термины. Выполним эмпирический тест, принимая много образцов из распределения SciPy, и вычислить их среднее значение и стандартное отклонение «вручную» (из всего набора образцов):

>>> import numpy as np 
>>> samples = l.rvs(size=2*10**7) 
>>> print("mean: %.5f stddev: %.5f" % (np.mean(samples), np.std(samples))) 
mean: 54.52148 stddev: 380.14457 

Это все еще не вполне сходился, но я думаю, что достаточно доказательств, что образцы соответствуют тому же распределению, которое предполагал Вольфрам Альфа, при μ = 2 и σ = 2.

И еще один маленькое редактирование: это выглядит как правильное использование поисковой системы помогло бы мы не были первыми, чтобы быть в ловушке этого:

https://stats.stackexchange.com/questions/33036/fitting-log-normal-distribution-in-r-vs-scipy http://nbviewer.ipython.org/url/xweb.geos.ed.ac.uk/~jsteven5/blog/lognormal_distributions.ipynb scipy, lognormal distribution - parameters

Другого редактированием: Теперь что я знаю, как он себя ведет, я понимаю, что поведение в принципе документировано. В the "notes" section мы можем прочитать:

с параметром формы сигмы и масштабного параметра ехр (мю)

Это просто на самом деле не очевидно (мы оба были не в состоянии оценить важность этого небольшого предложения) , Я думаю, причина, по которой мы не могли понять, что это означает, означает, что аналитическое выражение, показанное в разделе примечаний, не включает loc и scale. Думаю, это стоит улучшить отчет об ошибках/документацию.

Оригинальный ответ:

Действительно, тема параметра формы не очень хорошо документирован при взгляде на страницу Документов для конкретного распределения. Я рекомендую иметь взгляд на основной документации статистики - есть раздел о параметрах формы:

http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#shape-parameters

Похоже, что должна быть lognorm.shapes свойства, говоря вам о том, что означает параметр s, в частности.

Редактировать: Существует только один параметр, на самом деле:

>>> lognorm.shapes 
's' 

При сравнении общее определение логарифмически нормального распределения (из Википедии): enter image description here

и формулы дается scipy docs:

lognorm.pdf(x, s) = 1/(s*x*sqrt(2*pi)) * exp(-1/2*(log(x)/s)**2) 

становится очевидно, что s является истинным σ (sigma).

Однако из документов не очевидно, как параметр loc связан с μ (mu).

Это может быть, как и в ln(x-loc), который бы не соответствуют ц в общей формуле, или это может быть ln(x)-loc, которая обеспечивала бы соответствие между loc и μ. Попробуйте! :)

Edit 2

Я сделал сравнение между тем, что говорят WolframAlpha (WA) и SciPy. WA довольно ясно, что он использует μ и σ как обычно понимаемые (как определено в связанной статье Википедии).

>>> l = lognorm(s=2, loc=0) 
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std())) 
mean: 7.38906 stddev: 54.09584 

Это соответствия WA's output.

Теперь, для loc, не являющегося нолем, есть несоответствие. Пример:

>>> l = lognorm(s=2, loc=1) 
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std())) 
mean: 8.38906 stddev: 54.09584 

WA gives среднее 20.08 и стандартное отклонение 147. у вас есть, loc делает не соответствуют ц в классическом определении логарифмически нормального распределения.