Распределение моментов Джонсона, алгоритм которого был опубликован в 1976 году, реализовано в
theorisk
SuppDists
В Scipy нет его реализации, только дистрибутивы Johnson-SU и -SB, которые не совпадают с дистрибутивом Johnson Moments. Есть ли другая библиотека Python или как ее можно реализовать на Python?
Хилл, И. Д., Р. Хилл и Р. Л. Холдер. 1976. Алгоритм AS99: подбор Джонсон изгибается моментально. Прикладная статистика 25 (2): 180--189
Видите код Matlab, который я добавил, который цитирует статью Хилла? это распределение моментов Джонсона, f_johnson_M
. С другой стороны, в документации пакета R говорится, что параметры «также могут быть оценены по моментам. Алгоритм прикладной статистики 99, созданный Хиллом, Хиллом и Холдером (1976), был переведен на C для этой реализации».
Если у вас даже есть статья, описывающая алгоритм, разве не просто перевести алгоритм в код Python?
вы видели, как долго код Matlab верен
Я столкнулся с той же проблемой в стороннем проекте, над которым сейчас работаю, и нашел решение, которое работает достаточно хорошо.
Прежде всего, я предлагаю вам прочитать статью Прикладная статистика, где алгоритм был впервые опубликован. Вам нужно будет зарегистрировать бесплатную учетную запись, но тогда вы будете получать 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/…
Как я уже говорил выше, я отказался от идеи перевода. Вместо этого я взял исходный код fortran (ссылка выше) и скомпилировал его в плагин Python, используя F2PY (ссылка также выше). Я предлагаю вам сделать то же самое.
Еще кое-что. Там алгоритм возвращает значения «ITYPE» от 1 до 5, где 1 — логнормальный, 2 — Su, 3 — Sb, 4 — нормальный, а 5 — совершенно бесполезный. если вы получаете ITYPE 5, вы как бы застряли. Хуже всего то, что иногда алгоритму не удается сойтись на Sb, поэтому он выбирает возврат либо ITYPE, равного 1, либо ITYPE 5. Ни один из них не очень полезен в этих ситуациях, поэтому внимательно следите за параметром IFAULT, возвращаемым функцией JNSN. !
Было бы очень полезно, если бы вы предоставили пару примеров того, как вы использовали модуль, созданный F2PY, для получения параметров для заданных моментов.
Кроме того, вы говорите, что «бета и гамма соответствуют параметрам SciPy «a» и «b». Разве это не должна быть дельта вместо бета?
Не уверен, что такое распределение Johnson Moments. В предоставленном вами пакете R есть Johnson SU, SB, нормальный и логнормальный, и ничего больше.