Соответствие нормальному логарифмическому распределению в R против SciPy


10

Я снабдил логнормальную модель, используя R набором данных. Полученные параметры были:

meanlog = 4.2991610 
sdlog = 0.5511349

Я бы хотел перенести эту модель на Scipy, которой никогда раньше не пользовался. Используя Scipy, я смог получить форму и масштаб 1 и 3.1626716539637488e + 90 - очень разные числа. Я также пытался использовать exp of meanlog и sdlog, но продолжаю получать причудливый граф.

Я прочитал все документы, которые могу, на scipy, и все еще не понимаю, что означают параметры формы и масштаба в данном случае. Имеет ли смысл самому кодировать функцию? Это кажется склонным к ошибкам, хотя я новичок в scipy.

SCIPY Логнормальный (СИНИЙ) против R Логнормальный (КРАСНЫЙ): Сципи Логнормал (СИНИЙ) против R Логнормал (КРАСНЫЙ)

Есть мысли о том, в каком направлении идти? Кстати, данные очень хорошо подходят для модели R, поэтому, если она выглядит как-то еще в Python, не стесняйтесь делиться.

Спасибо!

Обновить:

Я бегу Scipy 0.11

Вот подмножество данных. Фактическая выборка 38k +, со средним значением 81.53627:

Подмножество:

х
[60, 170, 137, 138, 81, 140, 78, 46, 1, 168, 138, 148, 145, 35, 82, 126, 66, 147, 88, 106, 80, 54, 83, 13, 102, 54, 134, 34]
numpy.mean (x)
99.071428571428569

В качестве альтернативы:

Я работаю над функцией захвата PDF:

def lognoral(x, mu, sigma):
    a = 1 / (x * sigma * numpy.sqrt(2 * numpy.pi) )
    b = - (numpy.log(x) - mu) ^ 2 / (2 * sigma ^ 2)
    p = a * numpy.exp(b)
    return p

Тем не менее, это дает мне следующие цифры (я попробовал несколько на случай, если я перепутал значения sdlog и meanlog):

>>> lognormal(54,4.2991610, 0.5511349)
0.6994656085799437
 >>> lognormal(54,numpy.exp(4.2991610), 0.5511349)
0.9846125119455129
>>> lognormal(54,numpy.exp(4.2991610), numpy.exp(0.5511349))
0.9302407837304372

Какие-нибудь мысли?

Обновить:

перезапуск с предложением UPQuark:

shape, loc, scale (1.0, 50.03445923295007, 19.074457156766517)

Форма графика очень похожа, однако пик приходится на 21.


Этот вопрос и ответ может помочь: stackoverflow.com/questions/8747761/…
jbowman

Спасибо, я нашел это и узнал «примерку» с логнормой. Тем не менее, мои вопросы: почему я получаю такие разные дистрибутивы?
Лилиан Милагрос Карраскильо

Вы используете SciPy 0,9? Кроме того, не могли бы вы опубликовать свои данные или их подмножество?
Jbowman

Обновлено! Кстати, это Scipy 0.11. Так что ошибки, о которых я читал, не должны быть актуальными;)
Лилиан Милагрос Карраскильо

Ответы:


11

Я пробился через исходный код, чтобы прийти к следующей интерпретации рутины scipy lognormal.

xlocscaleLognormal(σ)

где - это параметр "shape". σ

Эквивалентность между параметрами scipy и параметром R следующая:

loc - Нет эквивалента, это вычитается из ваших данных, так что 0 становится инфимумом диапазона данных.

scale - , где - среднее значение логарифма переменной. (При подгонке, как правило, вы используете примерное среднее из журнала данных.) μexpμμ

форма - стандартное отклонение логарифма вариации.

Я вызвал, lognorm.pdf(x, 0.55, 0, numpy.exp(4.29))где аргументы (x, shape, loc, scale) соответственно, и сгенерировал следующие значения:

x pdf

10 0,000106

20 0,002275

30 0,006552

40 0,009979

50 0,114557

60 0,113479

70 0.103327

80 0,008941

90 0,007494

100 0,006155

которые, кажется, очень хорошо соответствуют вашей кривой R.


Спасибо, @JBowman, это именно то объяснение, которое мне было нужно, а результат - именно мое распространение.
Лилиан Милагрос Карраскильо

8

Логнормальное распределение в SciPy вписывается в общую структуру для всех распределений в SciPy. Все они имеют ключевое слово scale и location (по умолчанию 0 и 1, если явно не указано). Это позволяет смещать и масштабировать все распределения от их нормализованной спецификации с очевидными последствиями для статистики распределения. Распределения обычно имеют также один или несколько параметров «shape» (хотя некоторые, как и нормальное распределение, не нуждаются в дополнительных параметрах).

Хотя этот общий подход хорошо объединяет все дистрибутивы, для логнормального он может создать некоторую путаницу из-за того, как другие пакеты определяют параметры. Тем не менее, очень просто сопоставить любое логнормальное распределение, если вы имеете в виду log (среднее значение базового распределения) и sdlog (стандартное отклонение базового распределения).

Сначала убедитесь, что для параметра location установлено значение 0. Затем установите для параметра shape значение sdlog. Наконец, установите для параметра масштаба значение math.exp (meanlog). Таким образом, rv = scipy.stats.lognorm (0.5511349, scale = math.exp (4.2991610)) создаст объект распределения, pdf которого точно соответствует вашей R-сгенерированной кривой. Так как x = numpy.linspace (0,180,1000); сюжет (x, rv.pdf (x)) проверит.

По сути, логнормальное распределение SciPy является обобщением стандартного логнормального распределения, которое точно соответствует стандарту при установке параметра местоположения на 0.

При подгонке данных с помощью метода .fit вы также можете использовать ключевые слова f0..fn, floc и fshape, чтобы фиксировать любой из параметров формы, местоположения и / или масштаба и подгонять только к другим переменным. Для логнормального распределения это очень полезно, так как обычно вы знаете, что параметр location должен быть установлен на 0. Таким образом, scipy.stats.lognorm.fit (dataset, floc = 0) всегда будет возвращать параметр location как 0 и изменять только остальные параметры формы и масштаба.


3

Scipy lognormal fit возвращает форму, местоположение и масштаб. Я просто запустил следующее на массиве данных о ценах:

shape, loc, scale = st.lognorm.fit(d_in["price"])

Это дает мне разумные оценки 1,0, 0,09, 0,86, и когда вы строите график, вы должны принять во внимание все три параметра.

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

Надеюсь это поможет.


Спасибо за ответ! Как только у меня есть эти значения (loc, scale, shape), я пытаюсь найти pdf (x) для каждого x, который меня интересует (здесь это значения от 0 до 180, исключительные). scipy.stats.lognorm.pdf (i, loc, scale, shape) Однако, нанося их на график, я получаю график выше.
Лилиан Милагрос Карраскильо

Хорошо, я видел, что вы упомянули только форму и масштаб, поэтому я упомянул три параметра, возвращаемых по умолчанию из fit (). Вы также сказали, что не знаете, что означают параметры формы и масштаба, и я попытался решить эту проблему. У меня никогда не было логнормального соответствия, возвращающего абсурдные значения, как в вашем случае, однако, каков параметр location?
upquark

Просто обновил вопрос, чтобы ответить на него. Спасибо, что подумали об этом.
Лилиан Милагрос Карраскильо

Вызовите scipy.stats.lognorm.pdf (x, shape, loc, scale) вместо scipy.stats.lognorm.pdf (i, loc, scale, shape).
upquark

Спасибо, upquark, я сделал это также с похожими результатами. Вся форма графика по-прежнему сильно отличается от ожидаемых результатов, полученных в R. На самом деле распределение выглядит совсем не так, как в R.
Лилиан Милагрос Карраскильо

1

Похоже, что распределение в Scipy для lognormal не такое же, как в R, или вообще не то же самое, что и знакомое мне распределение. John D Кук коснулся этого: http://www.johndcook.com/blog/2010/02/03/statistical-distributions-in-scipy/ http://www.johndcook.com/distributions_scipy.html

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

Мое решение до сих пор состоит в том, чтобы использовать lognormal pdf, оцененный от 0 до 180 (исключая), и используемый в качестве словаря в скрипте python.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.