Распределение моментов Джонсона в Python

Распределение моментов Джонсона, алгоритм которого был опубликован в 1976 году, реализовано в

В Scipy нет его реализации, только дистрибутивы Johnson-SU и -SB, которые не совпадают с дистрибутивом Johnson Moments. Есть ли другая библиотека Python или как ее можно реализовать на Python?

Хилл, И. Д., Р. Хилл и Р. Л. Холдер. 1976. Алгоритм AS99: подбор Джонсон изгибается моментально. Прикладная статистика 25 (2): 180--189

Не уверен, что такое распределение Johnson Moments. В предоставленном вами пакете R есть Johnson SU, SB, нормальный и логнормальный, и ничего больше.

Severin Pappadeux 22.12.2020 16:32

Видите код Matlab, который я добавил, который цитирует статью Хилла? это распределение моментов Джонсона, f_johnson_M. С другой стороны, в документации пакета R говорится, что параметры «также могут быть оценены по моментам. Алгоритм прикладной статистики 99, созданный Хиллом, Хиллом и Холдером (1976), был переведен на C для этой реализации».

develarist 22.12.2020 16:33

Если у вас даже есть статья, описывающая алгоритм, разве не просто перевести алгоритм в код Python?

mkrieger1 22.12.2020 16:36

вы видели, как долго код Matlab верен

develarist 22.12.2020 16:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
449
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я столкнулся с той же проблемой в стороннем проекте, над которым сейчас работаю, и нашел решение, которое работает достаточно хорошо.

Прежде всего, я предлагаю вам прочитать статью Прикладная статистика, где алгоритм был впервые опубликован. Вам нужно будет зарегистрировать бесплатную учетную запись, но тогда вы будете получать 100 бесплатных статей в месяц. Причина, по которой я предлагаю это, заключается в том, что, основываясь на вашем описании, я чувствую, что вы, возможно, неправильно поняли, что делает алгоритм. Вы упомянули «распределение моментов Джонсона», которое не имеет значения. Алгоритм, описанный в этой статье (такой же, как вы упоминаете в своем посте), описывает функцию с именем JNSN, который принимает среднее значение, стандартное отклонение, асимметрию и эксцесс в качестве входных данных и возвращает предполагаемый тип распределения Джонсона (Su, Sb, нормальный или экспоненциальный) плюс 4 параметра, необходимых для распределения (γ, δ, β и λ). Эти четыре необходимых параметра описаны в литературе о распределениях Джонсона и называются соответственно гамма, бета, сигма и лям (хотя в коде он называет последние 2 как XLAM и XI, а в своей функции они расположены в обратном порядке). подписи).

Учитывая тип вывода, вы можете выбрать нормальную кривую, экспоненциальную кривую, Johnson-SU или Johnson-SB через SciPy. Когда вы делаете это, бета и гамма соответствуют параметрам SciPy «a» и «b», тогда как sigma и lam соответствуют параметрам «местоположение» и «масштаб». Вы можете проверить это, вытащив значения Mean, StdDev, Skewness и Kurtosis из экземпляра дистрибутива SciPy, который вы создали, и проверив, соответствуют ли они входным данным, которые вы передали функции JNSN.

Теперь о реализации на Python... Ее нет. Код там фортран. Я пытался перевести это на Python, но в моем переводе было слишком много ошибок. Кроме того, скорость переведенного кода была ужасной. Итак, я отказался от идеи перевода кода и вместо этого использовал отличный модуль F2PY от numpy для компиляции исходного кода fortran в плагин машинного языка python.

Примечание: http://lib.stat.cmu.edu/apstat также содержит исходный код кучи других модулей fortran.
Последнее примечание: исходный код использовал 4-байтовые числа с плавающей запятой. Я обновил это непосредственно в коде фортрана, затем использовал команду f2py -h ... для генерации, а затем настроил подписи для python.

Вы правы, после написания этого поста я понял, что алгоритм Хилла и др. (1976) предназначен для дополнительной идентификации одного из 4 (или 6) распределений Джонсона как наиболее подходящего, а не только SU, при работе с перекрывающимися конфигурациями параметров между их. может быть, у вас есть готовый перевод их алгоритма на питоне или что-то наиболее близкое к (несуществующему) распределению моментов Джонсона? Сопоставление параметров SU вручную с целевыми моментами является догадкой stackoverflow.com/questions/65567759/…

develarist 06.01.2021 17:41

Как я уже говорил выше, я отказался от идеи перевода. Вместо этого я взял исходный код fortran (ссылка выше) и скомпилировал его в плагин Python, используя F2PY (ссылка также выше). Я предлагаю вам сделать то же самое.

LTZJoe 06.01.2021 17:42

Еще кое-что. Там алгоритм возвращает значения «ITYPE» от 1 до 5, где 1 — логнормальный, 2 — Su, 3 — Sb, 4 — нормальный, а 5 — совершенно бесполезный. если вы получаете ITYPE 5, вы как бы застряли. Хуже всего то, что иногда алгоритму не удается сойтись на Sb, поэтому он выбирает возврат либо ITYPE, равного 1, либо ITYPE 5. Ни один из них не очень полезен в этих ситуациях, поэтому внимательно следите за параметром IFAULT, возвращаемым функцией JNSN. !

LTZJoe 06.01.2021 17:56

Было бы очень полезно, если бы вы предоставили пару примеров того, как вы использовали модуль, созданный F2PY, для получения параметров для заданных моментов.

Milos 10.06.2022 10:55

Кроме того, вы говорите, что «бета и гамма соответствуют параметрам SciPy «a» и «b». Разве это не должна быть дельта вместо бета?

Milos 10.06.2022 10:56

Другие вопросы по теме