Вычисление ожидания для пользовательского распределения в Mathematica

Этот вопрос основан на замечательных ответах, которые я получил на предыдущий вопрос:

Можно ли расширить функциональность PDF, CDF, FindDistributionParameters и т. д. в системе Mathematica?

Для начала у меня есть PDF-файлы и CDF-файлы для двух пользовательских дистрибутивов: nlDist и dplDist, как вы можете видеть из кода, dplDist основан на nlDist.

    nlDist /: PDF[nlDist[alpha_, beta_, mu_, sigma_], 
   x_] := (1/(2*(alpha + beta)))*alpha* 
   beta*(E^(alpha*(mu + (alpha*sigma^2)/2 - x))* 
      Erfc[(mu + alpha*sigma^2 - x)/(Sqrt[2]*sigma)] + 
     E^(beta*(-mu + (beta*sigma^2)/2 + x))* 
      Erfc[(-mu + beta*sigma^2 + x)/(Sqrt[2]*sigma)]); 

nlDist /: 
  CDF[nlDist[alpha_, beta_, mu_, sigma_], 
   x_] := ((1/(2*(alpha + beta)))*((alpha + beta)*E^(alpha*x)* 
        Erfc[(mu - x)/(Sqrt[2]*sigma)] - 
       beta*E^(alpha*mu + (alpha^2*sigma^2)/2)*
        Erfc[(mu + alpha*sigma^2 - x)/(Sqrt[2]*sigma)] + 
       alpha*E^((-beta)*mu + (beta^2*sigma^2)/2 + alpha*x + beta*x)*
        Erfc[(-mu + beta*sigma^2 + x)/(Sqrt[2]*sigma)]))/ 
   E^(alpha*x);         

dplDist /: PDF[dplDist[alpha_, beta_, mu_, sigma_], x_] := 
  PDF[nlDist[alpha, beta, mu, sigma], Log[x]]/x;
dplDist /: CDF[dplDist[alpha_, beta_, mu_, sigma_], x_] := 
  CDF[nlDist[alpha, beta, mu, sigma], Log[x]];

Plot[PDF[dplDist[3.77, 1.34, -2.65, 0.40], x], {x, 0, .3}, 
 PlotRange -> All]
Plot[CDF[dplDist[3.77, 1.34, -2.65, 0.40], x], {x, 0, .3}, 
 PlotRange -> All]

В моем предыдущем вопросе ответы joebolte и sasha и рекомендации по использованию TagSet помогли мне добиться этого. Теперь мои вопросы относятся к файлу dplDist.

Теперь мне нужно рассчитать ожидание от некоторой точки на оси X PDF. В анализе выживаемости они называют это средней остаточной жизнью. Что-то вроде следующего:

Expectation[X \[Conditioned] X > 0.1, 
  X \[Distributed] dplDist[3.77, 1.34, -2.65, 0.40]] - 0.1

Это не работает, по сути, просто возвращает входные данные в виде текста.

Я понимаю, как я могу использовать TagSet для определения файлов PDF и CDF для пользовательских дистрибутивов, как мне сделать что-то подобное для Expectation[]?


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


Большое спасибо всем.


person Jagra    schedule 09.06.2011    source источник


Ответы (3)


Хотя вы указали и PDF, и CDF для своего кастомного дистрибутива в Mathematica, вы не указали домен, поэтому он не знает границ интеграции, и на самом деле интегрировать или суммировать. Добавление, которое заставляет вещи работать:

In[8]:= nlDist /: 
 DistributionDomain[nlDist[alpha_, beta_, mu_, sigma_]] := 
 Interval[{-Infinity, Infinity}]

In[9]:= NExpectation[Log@X \[Conditioned] Log@X > 0.1, 
  X \[Distributed] nlDist[3.77, 1.34, -2.65, 0.40]] - 0.1

Out[9]= 0.199329

Сравните это с ProbabilityDistribution, имеющим формат ProbabilityDistribution[ pdf, {x, min, max}], где вы явно указываете домен.

Чтобы символьные решатели, такие как Probability, Expectation и их числовые аналоги, работали с ними, также рекомендуется установить DistributionParameterQ и DistributionParameterAssumptions.

DistributionParameterQ должен давать False параметры, явно нарушающие предположения, а DistributionParameterAssumptions должен возвращать логическое выражение, представляющее предположения о параметрах вашего распределения.

person Sasha    schedule 09.06.2011
comment
@Sasha: Это не связано с вопросом или ответом, но можете ли вы прокомментировать, ожидается ли v9 в этом году? Я спрашиваю, потому что думал о том, чтобы получить v8, но если v9 не за горами, я лучше подожду его... - person abcd; 10.06.2011
comment
@Sasha Большое спасибо за ответ и дополнительную информацию, а также за внимание к более широким вопросам. Дж - person Jagra; 10.06.2011
comment
@yoda Я не в состоянии делать такие заявления, однако я хотел бы отметить, что покупка v8 даст вам Премьер-сервис на 1 год, который включает бесплатное обновление до самой последней выпущенной версии. Исторические данные о промежутках между выпусками предыдущей версии Mathematica могут помочь вам принять решение. - person Sasha; 10.06.2011
comment
@Саша: Нет проблем, я понимаю. Спасибо за дополнительную информацию о: Премьер-сервис! - person abcd; 10.06.2011
comment
@Sasha: Кажется, что-то не работает. Я скопировал ваш код и использование DistributionDomain вместе с моим исходным кодом в новую записную книжку и перезагрузил компьютер только для того, чтобы иметь чистую среду, но когда я запускаю NExpectation[Log@X [Conditioned] Log@X › 0.1, X [Distributed] nlDist[3.77, 1.34, -2.65, 0.40]] - 0.1 Я получаю следующий результат: -0.1 + NExpectation[Log[X] [Conditioned] Log[X] › 0.1, X [Distributed] nlDist[3.77, 1.34, - 2.65, 0.4]] вместо того, что вы получили: Out[9]= 0.199329 Я должен был понять это раньше. Буду признателен за любые мысли. Благодарить. Дж - person Jagra; 10.06.2011
comment
@Jarga Да, ты прав. Оказывается, необходимы как DistributionParameterQ, так и DistributionParameterAssumptions. - person Sasha; 11.06.2011

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

expectation := Integrate[x #, {x,-Infinity,Infinity}]&;

и используйте его как expectation[f[x]], где f[x] — ваш PDF-файл.

Ваш последний фрагмент кода не работает для меня. Я не знаю, является ли это кодом v8 или он определяется пользователем, или вы пытаетесь сказать, что это то, на что вы хотели бы, чтобы ваша функция была похожа...

Вы также можете попробовать изучить функцию Mathematica ExpectedValue.

ExpectedValue[x, NormalDistribution[m, s], x]
Out[1] = m
person abcd    schedule 09.06.2011
comment
Функция Expectation[] в версии 8 заменяет ExpectedValue[]. Я надеялся найти способ использовать TagSet примерно так: - person Jagra; 09.06.2011
comment
Я хотел прокомментировать: @yoda Функция Expectation[] в версии 8 заменяет ExpectedValue[] Я надеялся найти способ использовать TagSet или что-то подобное примерно так: dplDist /: Expectation[X, X [Distributed] dplDist[alpha_ , бета_, мю_, сигма_]] := ?; - person Jagra; 09.06.2011

На следующей странице приведены некоторые советы по включению пользовательских распределений (т. е. написанных с нуля без TransformedDistribution или ProbabilityDistribution) для использования в CopulaDistribution, RandomVariate и т. д.: https://mathematica.stackexchange.com/questions/20067/efficient-генерацияслучайныхпеременныхизраспределениясвязки/26169#26169

person doug fromoz    schedule 30.05.2013
comment
Пожалуйста, резюмируйте ссылку в своем ответе; таким образом, если ссылка устареет, ответ не будет полностью бесполезным. - person michaelb958--GoFundMonica; 31.05.2013