2011-04-07 35 views
3

我已经开始使用新的Mathematica统计和数据分析功能做更多的工作。可以扩展Mathematica中PDF,CDF,FindDistributionParameters等的功能吗?

我周二参加了“Mathematica数据分析统计&”在线研讨会(很棒的介绍,我强烈推荐它),但是我遇到了一些问题,希望有人在这个论坛上可能有一些时间需要考虑。

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

只要我停留在Mathematica的off-the - 对于简单的MixtureDistribution s,甚至ParameterMixtureDistribution s,这些Mathematica可能很容易找到瞬间,并且PDFCDF,FindDistributionParameters等可以通过将混合物分解成小块而工作得很好。

我遇到麻烦时,我试图定义和使用甚至一个简单的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_] = 
    [email protected][((Moment[LogNormalNormalDistribution[gamma, sigma, delta],#]&/@Range[5]) - moments)^2]; 
    NMinimize[{costFunction[gamma, sigma, delta], gamma > 0, sigma > 0}, {gamma, sigma, delta}] ] 

这项工作本身很好,但与其他一切都不一样。

+0

当你使用'TransformedDistribution'时会遇到什么样的问题? (我找到了你以前的问题,也许可以参考他们的简短摘要......)另外,笔记本中使用的任何特殊符号,比如'\ [Gamma]',在我写入时显示出来,以便更易于阅读您可能希望在即将发布帖子之前从任何复制的代码中删除标记。 – rcollyer 2011-04-07 15:37:33

+0

感谢您清理代码。至于我遇到的那种问题:创建随机变量时工作正常:r1 = RandomVariate [LogNormalNormalDistribution [0.01,0.4,0.0003], 1000]; ListLinePlot [%,PlotRange - > All]当一个人尝试FindDistributionParameters [r1, LogNormalNormalDistribution [gamma,sigma,delta]]代码从未完成执行。 – Jagra 2011-04-07 15:44:04

+0

继续......为此我写了(有一点帮助)myLNNFit [data_]:= Module [{costFunction,moments}, moments = Moment [EmpiricalDistribution [data],#]&/ @ Range [5]; ((矩矩对数[5]) - 矩)^ 2];以及其中,[0,1] NMNimize [{costFunction [gamma,sigma,delta],gamma> 0,sigma> 0},{gamma,sigma,delta}]这可以很好地独立工作,但不能很好地与其他任何东西配合使用。 – Jagra 2011-04-07 15:49:48

回答

8

您可以使用TagSet来指定要将定义关联到的符号。这使您可以定义分配的PDF,即使PDFProtected。这是一个简单的例子。请注意,TriangleWave是内置符号,TriangleDistribution是我刚刚编制的。这种失败:

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

这工作:

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

现在你可以这样做:

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

这看起来很有趣也很有用,可能会给我所有我需要的东西。一旦我有机会尝试,我会回过头来认识到这是一个答案。谢谢! – Jagra 2011-04-07 15:57:25

3

亲爱Jarga,数学文档中的以下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并且正确工作,则假设测试应该可行。