Вміст нормального розподілу журналу в R проти SciPy


10

Я встановив логічну модель, використовуючи R із набором даних. Отримані параметри:

meanlog = 4.2991610 
sdlog = 0.5511349

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

Я читав кожен документ, який я можу про scipy, і все ще плутаю, що означають параметри форми та масштабу в цьому випадку. Чи було б просто сенс кодувати цю функцію сам? Це здається схильним до помилок, оскільки я новачок у науці.

ЛОГІЧНИЙ СКІП (СІНЬКИЙ) проти Р-логічний (КРАЩИЙ): Scipy Lognormal (BLUE) проти R Lognormal (RED)

Будь-які думки про те, в якому напрямку рухатися? Дані, до речі, добре співпадають з моделлю 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":

форма, лока, масштаб (1.0, 50.03445923295007, 19.074457156766517)

Форма графіка дуже схожа, однак, пік відбувається близько 21 року.


Це питання і відповідь може допомогти: stackoverflow.com/questions/8747761 / ...
jbowman

Дякую, я знайшов це і навчився "підгонки" з лонормальним. Однак мої запитання: чому я отримаю такі різні розподіли?
Ліліан Мілагрос Карраскільо

Ви використовуєте SciPy 0.9? Ви також можете розмістити свої дані чи їх підмножину?
jbowman

Оновлено! До речі, це Scipy 0,11. Тож помилки, про які я читав, не повинні бути актуальними;)
Lillian Milagros Carrasquillo

Відповіді:


11

Я боровся через вихідний код, щоб дійти до наступної інтерпретації логічного нормального режиму scipy.

xlocscaleLognormal(σ)

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

Еквівалентність параметрів scipy та параметра R така:

loc - не еквівалент, це віднімається від ваших даних, так що 0 стає найменшим діапазоном даних.

шкала - , де - середнє значення журналу змінної. (Під час підгонки зазвичай використовується середнє значення зразка журналу даних.) μexpμμ

форма - стандартне відхилення журналу змінної.

Я зателефонував, lognorm.pdf(x, 0.55, 0, numpy.exp(4.29))де аргументи (x, форма, лока, шкала) відповідно, і генерував такі значення:

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. Усі вони мають ключове слово масштабу та місцезнаходження (за замовчуванням - 0 та 1, якщо прямо не вказано). Це дозволяє зміщувати та масштабувати всі дистрибутиви від їх нормованої специфікації з чіткими наслідками для статистики розподілу. У розподілах зазвичай є також один або кілька параметрів "форми" (хоча деякі, як звичайний розподіл, не потребують додаткових параметрів).

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

Спочатку переконайтеся, що ви встановили для параметра параметра розташування значення 0. Потім встановіть параметр фігури значення 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, щоб фіксувати будь-які параметри форми, розташування та / або масштабу і лише підходити до інших змінних. Для лонормального розподілу це дуже корисно, оскільки зазвичай ви знаєте, що параметр місця розташування має бути зафіксовано до 0. Таким чином, scipy.stats.lognorm.fit (набір даних, floc = 0) завжди повертає параметр розташування як 0 і змінює лише інший параметри форми та масштабу.


3

Scipy ненормальна відповідність повертає форму, розташування та масштаб. Я просто запустив наступне на масив зразкових даних про ціни:

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

Це дає мені обґрунтовані оцінки 1,0, 0,09, 0,86, і коли ви плануєте це, ви повинні враховувати всі три параметри.

Параметр форми - це стандартне відхилення основного нормального розподілу, а шкала - показник середнього значення від норми.

Сподіваюсь, це допомагає.


Дякую за відповідь! Коли я отримаю ці значення (локальний, масштаб, форма), я намагаюся знайти pdf (x) для кожного х, який мене хвилює (тут це значення від 0 до 180, виключно). scipy.stats.lognorm.pdf (я, локальний, масштаб, форма) Однак, будуючи їх, я отримую сюжет вище.
Ліліан Мілагрос Карраскільо

Гаразд Я бачив, що ви згадуєте лише форму та масштаб, тому я згадав, що три параметри повернуті за замовчуванням з fit (). Ви також сказали, що ви розгублені щодо того, що означають параметри форми та масштабу, і я намагався вирішити це. Я ніколи не мав ненормальних значень повернення абсурдних значень, як у вашому випадку, який параметр розташування?
upquark

Щойно оновив питання, щоб відповісти на це. Дякую, що подумали про це.
Ліліан Мілагрос Карраскільо

Зателефонуйте scipy.stats.lognorm.pdf (х, форма, лока, масштаб) замість scipy.stats.lognorm.pdf (я, локальний, масштаб, форма).
upquark

Дякую, нагоду, я це теж зробив із подібними результатами. Вся форма графіка продовжує сильно відрізнятися від очікуваних результатів, отриманих в Р. Насправді виглядає абсолютно інше розподіл, ніж у R.
Ліліан Мілагрос Карраскілло

1

Здається, що розподіл у Scipy для лонормального не такий, як у R, або взагалі, не такий, як я знайомий з розподілом. Джон Д Кук торкнувся цього: http://www.johndcook.com/blog/2010/02/03/statistic-distributions-in-scipy/ http://www.johndcook.com/distributions_scipy.html

Однак я не знайшов нічого переконливого в тому, як використовувати функцію лонормальної щільності в Python. Якщо хтось хотів би додати до цього, будь ласка, не соромтеся.

Поки що моє рішення - використовувати лонормальний pdf, оцінений на 0 до 180 (ексклюзивно), і використовувати як словник у сценарії python.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.