2011-04-07 45 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並且正確工作,則假設測試應該可行。