DistributionFitTest []用于Mathematica中的自定义分发

我有两种自定义分布的PDF和CDF,一种为每种分布生成随机变量的方法,以及为数据拟合参数的代码。 我之前发布的一些代码:

计算Mathematica中自定义分布的期望

其中一些如下:

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]];

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

nlDist /: 
    Random`DistributionVector[
    nlDist [alpha_, beta_, mu_, sigma_], n_, prec_] :=
    RandomVariate[ExponentialDistribution[alpha], n, 
        WorkingPrecision -> prec] - 
      RandomVariate[ExponentialDistribution[beta], n, 
        WorkingPrecision -> prec] + 
      RandomVariate[NormalDistribution[mu, sigma], n, 
        WorkingPrecision -> prec];

dplDist /: 
    Random`DistributionVector[
    dplDist[alpha_, beta_, mu_, sigma_], n_, prec_] :=
    Exp[RandomVariate[ExponentialDistribution[alpha], n, 
         WorkingPrecision -> prec] - 
       RandomVariate[ExponentialDistribution[beta], n, 
         WorkingPrecision -> prec] + 
       RandomVariate[NormalDistribution[mu, sigma], n, 
         WorkingPrecision -> prec]];

如果有人需要查看它,我可以发布更多代码,但是我认为上述内容很好地说明了这种方法。

现在我需要一种方法来对这些发行版使用DistributionFitTest [],像这样:

DistributionFitTest[data, dplDist[3.77, 1.34, -2.65, 0.40],"HypothesisTestData"]  

啊,但这不起作用。 相反,我得到一个错误消息,开始为:

“参数dplDist [3.77,1.34,-2.65,0.4]应该是一个有效的分布...”

因此,似乎DistributionFitTest []不会将这些分布识别为分布。

我没有看到在这种情况下如何使用TagSet会有所帮助,除非可以使用TagSet为DistributionFitTest []提供识别这些自定义分布所需的信息。

任何人都可以告诉我一种方法来让这个工作? 我想将DistributionFitTest []用于像这样的自定义分布,或者找到一些解决方法来评估合适的好处。

Thx - Jagra


由于这个问题已经出现了很多次,我认为现在是提供一些食谱以便如何正确烹饪v8自定义分发的最佳时机。

使用TagSet为您的分配定义:

  • DistributionParameterQDistributionParameterAssumptionsDistributionDomain
  • 定义PDFCDFSurvivalFunction HazardFunctionHazardFunction
  • 通过编码Random`DistributionVector来定义随机数生成代码
  • 这样做将会使你的发行版中的所有参数估计工作都完成。

    您的错误是dplDist没有DistributionDomain定义,并且nlDistdplDist没有DistributionParameterQDistributionParameterAssumptions定义。

    我在您的定义中添加了以下内容:

    dplDist /: DistributionDomain[dplDist[alpha_, beta_, mu_, sigma_]] := 
     Interval[{-Infinity, Infinity}]
    
    nlDist /: 
     DistributionParameterQ[nlDist[alpha_, beta_, mu_, sigma_]] := ! 
      TrueQ[Not[
        Element[{alpha, beta, sigma, mu}, Reals] && alpha > 0 && 
         beta > 0 && sigma > 0]]
    
    dplDist /: 
     DistributionParameterQ[dplDist[alpha_, beta_, mu_, sigma_]] := ! 
      TrueQ[Not[
        Element[{alpha, beta, sigma, mu}, Reals] && alpha > 0 && 
         beta > 0 && sigma > 0]]
    
    nlDist /: 
     DistributionParameterAssumptions[
      nlDist[alpha_, beta_, mu_, sigma_]] := 
     Element[{alpha, beta, sigma, mu}, Reals] && alpha > 0 && beta > 0 && 
      sigma > 0
    
    dplDist /: 
     DistributionParameterAssumptions[
      dplDist[alpha_, beta_, mu_, sigma_]] := 
     Element[{alpha, beta, sigma, mu}, Reals] && alpha > 0 && beta > 0 && 
      sigma > 0
    

    现在它工作了:

    In[1014]:= data = RandomVariate[dplDist[3.77, 1.34, -2.65, 0.40], 100];
    
    In[1015]:= DistributionFitTest[data, dplDist[3.77, 1.34, -2.65, 0.40],
      "HypothesisTestData"]
    
    Out[1015]= HypothesisTestData[<<DistributionFitTest>>]
    
    链接地址: http://www.djcxy.com/p/35633.html

    上一篇: DistributionFitTest[] for custom distributions in Mathematica

    下一篇: Mathematica: 3D wire frames