Последующие действия: TransformedDistribution в Mathematica - PullRequest
1 голос
/ 18 марта 2011

У меня есть дополнительный вопрос к ответу Саши на мой предыдущий вопрос по адресу TransformedDistribution в Mathematica .

Поскольку я уже принял ответ некоторое время назад, я подумал, что имеет смысл задать это как новый вопрос.

В рамках ответа Саша определил 2 функции:

LogNormalStableCDF[{alpha_, beta_, gamma_, sigma_, delta_}, x_Real] := 
 Block[{u}, 
  NExpectation[
   CDF[StableDistribution[alpha, beta, gamma, sigma], (x - delta)/u], 
   u \[Distributed] LogNormalDistribution[Log[gamma], sigma]]]

LogNormalStablePDF[{alpha_, beta_, gamma_, sigma_, delta_}, x_Real] := 
 Block[{u}, 
  NExpectation[
   PDF[StableDistribution[alpha, beta, gamma, sigma], (x - delta)/u]/u, 
   u \[Distributed] LogNormalDistribution[Log[gamma], sigma]]]

Функция PDF работает нормально:

Plot[LogNormalStablePDF[{1.5, 1, 1, 0.5, 1}, x], {x, -4, 6}, 
 PlotRange -> All]

Но если я попытаюсь построить вариант CDF:

Plot[LogNormalStableCDF[{1.5, 1, 1, 0.5, 1}, x], {x, -4, 6}, 
 PlotRange -> All]

Оценка, похоже, никогда не заканчивается.

Я сделал нечто похожее со следующим: заменил NormalDistribution на StableDistribution выше:

LogNormalNormalCDF[{gamma_, sigma_, delta_}, x_Real] := 
 Block[{u},
  NExpectation[CDF[NormalDistribution[0, Sqrt[2]], (x - delta)/u], 
   u \[Distributed] LogNormalDistribution[Log[gamma], sigma]]]

LogNormalNormalPDF[{gamma_, sigma_, delta_}, x_Real] := 
 Block[{u}, 
  NExpectation[PDF[NormalDistribution[0, Sqrt[2]], (x - delta)/u]/u, 
   u \[Distributed] LogNormalDistribution[Log[gamma], sigma]]]

Графики версий CDF и PDF работают нормально.

Plot[LogNormalNormalPDF[{0.01, 0.4, 0.0003}, x], {x, -0.10, 0.10}, PlotRange -> All]
Plot[LogNormalNormalCDF[{0.01, 0.4, 0.0003}, x], {x, -0.10, 0.10}, PlotRange -> All]

Это меня озадачило. Очевидно, что общий подход работает в случае LogNormalNormalCDF. Кроме того, LogNormalStablePDF и LogNormalStableCDF практически идентичны. Фактически из самого кода версия CDF, похоже, должна делать меньше, чем версия PDF.

Итак, я надеялся, что кто-то сможет:

  1. объясните, почему LogNormalStableCDF не работает (по крайней мере, в то время, которое я считаю разумным, я попытаюсь запустить его в течение ночи и посмотреть, завершит ли он когда-либо оценку) и

  2. предлагает способ, чтобы get LogNormalStableCDF работал быстрее.

Большое спасибо, J.

1 Ответ

3 голосов
/ 19 марта 2011

Новая функциональность дистрибутива обладает удивительным потенциалом, но ее новизна показывает.Есть несколько ошибок, с которыми я и другие столкнулись, и мы надеемся, что они будут исправлены в следующих исправлениях.Однако, похоже, что это не один из них.

В этом случае проблема заключается в определении переменной x как действительной, в то же время предоставляя диапазон графика в виде целых чисел.Поэтому, когда Plot начинается, он пробует конечные точки, для которых функция возвращает неоцененное значение, потому что нет соответствия.Удаление Real из определения заставляет его работать.

Вторая функция работает, потому что диапазон графика снабжен машинными точными числами.

Будьте готовы немного подождать, потому что функция оценивает довольно медленно.На самом деле, вам нужно немного обуздать MaxRecursion, потому что Plot становится слишком восторженным и добавляет слишком много очков (возможно, из-за неточностей в малом масштабе):

Plot[LogNormalStableCDF[{1.5, 1, 1, 0.5, 1}, x], {x, -4, 6}, 
 PlotRange -> All, PlotPoints -> 10, MaxRecursion -> 4]

дает

enter image description here

Потребовалось около 9 минут для генерации и, как вы можете видеть, потребовалось много точек на боковых сторонах графика.

enter image description here

...