可以在Mathematica中扩展PDF,CDF,FindDistributionParameters等功能吗?

时间:2011-04-07 15:19:00

标签: statistics wolfram-mathematica distribution

我开始使用新的Mathematica统计和数据分析功能做越来越多的工作。

我参加了周二的“Mathematica统计与数据分析”在线研讨会(精彩的演讲,我强烈推荐)但我遇到了一些问题,我希望这个论坛上有人可能会有一些时间考虑

我已经创建了一个相当广泛的笔记本来简化我的数据分析,称之为“AnalysisNotebook”。它输出了一系列广泛的图表和数据,包括:直方图,PDFCDF图,Q-Q图,研究尾部拟合的图,假设检验数据等。

只要我使用Mathematica现成的发行版并且可能适用于简单的MixtureDistribution甚至ParameterMixtureDistribution,这种方法效果很好,因为这些Mathematica可能会找出时刻和通过将混合物分解成碎片,PDFCDFFindDistributionParameters等。

当我尝试定义和使用简单的TransformedDistribution

时,我遇到了麻烦
LogNormalNormalDistribution[Gamma_, Sigma_, Delta_] := 
  TransformedDistribution[ u*v + Delta, 
   {Distributed[ u, LogNormalDistribution[ Log[Gamma], Sigma] ],  
    Distributed[ v, NormalDistribution[0, Sqrt[2]]}
   ];

我想按照这种变形分布做很多事情。我很欣赏这样的挑战(我在这个论坛上学到了一些 - 谢谢大家):

  • 他们可能没有封闭的表格;
  • PDFCDF计算可能需要插值,解决方法或自定义方法;
  • FindDistributionParametersDistributionFitTest将不知道如何处理此类事情。

基本上,人们想要使用的标准事物确实不会/不能正常工作,人们不能指望他们这样做。

可以编写自定义代码来做这些事情(这个论坛再次帮助了我很多),但是然后将自定义替代品的所有复杂性结合到我的AnalysisNotebook中,看起来很愚蠢。 AnalysisNotebook会随着每个新的自定义函数而增长。

如果我可以编写PDFCDFFindDistributionParametersDistributionFitTest的自定义版本以及我可能需要的任何其他标准,这对我的努力会有很大帮助更通用的内置版本可以简单地无缝调用。这样,像我的AnalysisNotebook这样的东西可以保持简单和整洁,这是我工具箱中的标准组件。如果你理解我的意思,我可以把时间花在数学而不是管道上。

为了澄清我的意思,类似于如何定义函数的版本来做不同的事情(使用不同数量的参数或其他类型的态势感知),Mathematica必须为使用分布的函数做类似的事情作为知道哪个解决方案用于特定内置分发的参数。我希望能够添加或扩展PDF[]CDF[]FindDistributionParameters[]DistributionFitTest[]的功能以及该级别的相关功能,以添加自定义分发功能及其功能所需的支持代码,内置函数可以/可以无缝调用。

也许只是一个梦想,但如果有人知道我可以采取任何方式,我非常感谢您的反馈。

编辑 - 我遇到过的问题:

以下代码永远不会完成执行

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_] = 
    Sqrt@Total[((Moment[LogNormalNormalDistribution[gamma, sigma, delta],#]&/@Range[5]) - moments)^2]; 
    NMinimize[{costFunction[gamma, sigma, delta], gamma > 0, sigma > 0}, {gamma, sigma, delta}] ]

这本身很好用,但是其他一切都不能很好。

2 个答案:

答案 0 :(得分:8)

您可以使用TagSet指定要将定义关联到的符号。这样,即使PDFPDF,您也可以定义分发的Protected。这是一个简单的例子。请注意,TriangleWave是内置符号,TriangleDistribution是我刚刚编写的内容。这失败了:

PDF[TriangleDistribution[x_]] := TriangleWave[x]

这有效:

TriangleDistribution /: PDF[TriangleDistribution[x_]] := TriangleWave[x]

现在你可以做到:

Plot[PDF[TriangleDistribution[x]], {x, 0, 1}]

答案 1 :(得分:3)

亲爱的Jarga,Mathematica文档中的以下tutorial描述了现在您将为您的发行版启用随机数生成,请查看本文档底部附近的“定义分布式生成器”部分。

这与乔建议的完全相似。您需要定义

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并且工作正常,则假设检验应该有效。