Можно ли расширить функциональность PDF, CDF, FindDistributionParameters и т.д. В Mathematica?
Я начал все больше и больше работать с новой статистикой Mathematica и функциями анализа данных.
Я посетил онлайн-семинар "Статистика и анализ данных с помощью математики" во вторник (отличная презентация, я очень рекомендую его), но я столкнулся с некоторыми проблемами, которые, я надеюсь, у кого-то на этом форуме может быть несколько моментов, чтобы рассмотреть.
Я создал довольно обширный ноутбук для оптимизации анализа данных, назовите его "AnalysisNotebook". Он выводит обширную серию диаграмм и данных, включая: гистограммы, графики PDF
и CDF
, графики Q-Q, графики для изучения соответствия хвоста, данные теста гипотез и т.д.
Это отлично работает, пока я остаюсь с готовыми дистрибутивами Mathematica и, вероятно, отлично работает для простых MixtureDistribution
и даже ParameterMixtureDistribution
, так как для этих Mathematica можно определить моменты и PDF
и CDF
, FindDistributionParameters
и т.д., разбивая смеси на кусочки.
У меня возникают проблемы, когда я пытаюсь определить и использовать даже простой TransformedDistribution
i.e.,
LogNormalNormalDistribution[Gamma_, Sigma_, Delta_] :=
TransformedDistribution[ u*v + Delta,
{Distributed[ u, LogNormalDistribution[ Log[Gamma], Sigma] ],
Distributed[ v, NormalDistribution[0, Sqrt[2]]}
];
Я бы хотел сделать много вещей в соответствии с такими Transformed Distributions. Я ценю вызов чего-то подобного этому подарку (некоторые из которых я узнал на этом форуме - спасибо всем):
- У них могут быть закрытые формы;
-
PDF
и CDF
для вычисления может потребоваться интерполяция, обход или пользовательские подходы;
-
FindDistributionParameters
и DistributionFitTest
не будут знать, как бороться с этим.
В основном стандартные вещи, которые хотелось бы использовать, действительно не работают/не могут работать, и нельзя ожидать, что они это сделают.
Можно написать собственный код, чтобы делать такие вещи (снова этот форум мне очень помог), но затем, используя всю сложность пользовательских альтернатив в моем аналитическом журнале, просто кажется глупым. Аналитический журнал будет расти с каждой новой пользовательской функцией.
Это очень помогло бы мне в этом усилии, если бы я мог написать свои пользовательские версии PDF
, CDF
, FindDistributionParameters
, DistributionFitTest
и все, что мне могло бы потребоваться, чтобы стандарты, которые более общие встроенные версии просто звоните без проблем. Таким образом, что-то вроде моего AnalysisNotebook может оставаться простым и незагроможденным, стандартным компонентом в моей панели инструментов. Я мог бы потратить свое время на математику, а не на сантехнику, если вы примете мой смысл.
Чтобы прояснить, что я имею в виду под этим, подобно тому, как можно определить версии функции для выполнения разных вещей (использовать разные количества аргументов или другие виды ситуационной осведомленности), Mathematica должна сделать что-то подобное для функций, которые используют распределения как аргументы, чтобы знать, какое решение использовать для конкретного встроенного дистрибутива. Я хочу возможность добавлять или расширять функциональные возможности PDF[]
, CDF[]
, FindDistributionParameters[]
, DistributionFitTest[]
и связанных функций на этом уровне - добавлять функциональные возможности для пользовательских дистрибутивов и их необходимый поддерживающий код, который встроенный функции могли бы/могли бы звонить плавно.
Возможно, просто мечта, но если кто-нибудь знает, каким образом я мог бы подходить к этому, я очень благодарен за ваши отзывы.
EDIT -. Какие проблемы я столкнулся:
Следующий код никогда не завершает выполнение
r1 = RandomVariate[LogNormalNormalDistribution[0.01, 0.4, 0.0003], 1000];
FindDistributionParameters[r1, LogNormalNormalDistribution[gamma, sigma, delta]]
Чтобы обойти это, я написал следующую функцию
myLNNFit[data_] := Module[{costFunction, moments},
moments = Moment[EmpiricalDistribution[data], #] & /@ Range[5];
costFunction[gamma_, sigma_, delta_] =
[email protected][((Moment[LogNormalNormalDistribution[gamma, sigma, delta],#]&/@Range[5]) - moments)^2];
NMinimize[{costFunction[gamma, sigma, delta], gamma > 0, sigma > 0}, {gamma, sigma, delta}] ]
Это работает отлично само по себе, но не играет хорошо со всем остальным.
Ответы
Ответ 1
Вы можете использовать TagSet
, чтобы указать символ, с которым вы хотите связать определение. Это позволяет определить PDF
для дистрибутива, хотя PDF
- Protected
. Здесь тривиальный пример. Обратите внимание, что TriangleWave
является встроенным символом, а TriangleDistribution
- это то, что я только что составил. Это не удается:
PDF[TriangleDistribution[x_]] := TriangleWave[x]
Это работает:
TriangleDistribution /: PDF[TriangleDistribution[x_]] := TriangleWave[x]
Теперь вы можете сделать:
Plot[PDF[TriangleDistribution[x]], {x, 0, 1}]
Ответ 2
Уважаемый Jarga, ниже tutorial в документации Mathematica описано, что теперь вы включили бы генерацию случайных чисел для своего распространения, посмотрите в нижней части этот документ для раздела "Определение генераторов распределения".
Это очень похоже на то, что предложил Джо. Вам нужно будет определить
In[1]:= Random`DistributionVector[
LogNormalNormalDistribution[gamma_, sigma_, delta_], len_, prec_] ^:=
RandomVariate[LogNormalDistribution[Log[gamma], sigma], len,
WorkingPrecision -> prec]*
RandomVariate[NormalDistribution[0, Sqrt[2]], len,
WorkingPrecision -> prec] + delta
In[2]:= RandomVariate[
LogNormalNormalDistribution[0.01, 0.4, 0.0003], 5]
Out[2]= {-0.0013684, 0.00400979, 0.00960139, 0.00524952, 0.012049}
Мне неизвестно какой-либо документированный способ вставки нового дистрибутива в рамки оценки. Проверка гипотез должна работать, если CDF определен для вашего дистрибутива и работает правильно.