Я снабдил логнормальную модель, используя R набором данных. Полученные параметры были:
meanlog = 4.2991610
sdlog = 0.5511349
Я бы хотел перенести эту модель на Scipy, которой никогда раньше не пользовался. Используя Scipy, я смог получить форму и масштаб 1 и 3.1626716539637488e + 90 - очень разные числа. Я также пытался использовать exp of meanlog и sdlog, но продолжаю получать причудливый граф.
Я прочитал все документы, которые могу, на scipy, и все еще не понимаю, что означают параметры формы и масштаба в данном случае. Имеет ли смысл самому кодировать функцию? Это кажется склонным к ошибкам, хотя я новичок в scipy.
SCIPY Логнормальный (СИНИЙ) против 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.
Ответы:
Я пробился через исходный код, чтобы прийти к следующей интерпретации рутины scipy lognormal.
где - это параметр "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.
источник
Логнормальное распределение в 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 и изменять только остальные параметры формы и масштаба.
источник
Scipy lognormal fit возвращает форму, местоположение и масштаб. Я просто запустил следующее на массиве данных о ценах:
Это дает мне разумные оценки 1,0, 0,09, 0,86, и когда вы строите график, вы должны принять во внимание все три параметра.
Параметр формы - это стандартное отклонение лежащего в основе нормального распределения, а масштаб - экспонента от среднего значения нормали.
Надеюсь это поможет.
источник
Похоже, что распределение в 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.
источник