Можно ли расширить функциональность 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 определен для вашего дистрибутива и работает правильно.