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

Jag*_*gra 8 statistics wolfram-mathematica probability

我有两个自定义分布的PDF和CDF,一种为每个分布生成RandomVariates的方法,以及用于将参数拟合到数据的代码.我之前发布的一些代码:

计算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]];
Run Code Online (Sandbox Code Playgroud)

如果有人需要看,我可以发布更多的代码,但我认为上面给出了很好的方法.

现在我需要一种方法来使用DistributionFitTest []和这些分布:

DistributionFitTest[data, dplDist[3.77, 1.34, -2.65, 0.40],"HypothesisTestData"]  
Run Code Online (Sandbox Code Playgroud)

啊,但这不起作用.相反,我收到一条错误消息,开头为:

"争论dplDist [3.77,1.34,-2.65,0.4]应该是有效的分发..."

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

我没有看到使用TagSet如何在这个实例中提供帮助,除非可以使用TagSet为DistributionFitTest []提供识别这些自定义分布所需的内容.

任何人都可以建议我使用这个方法吗?我想将DistributionFitTest []与这样的自定义分布一起使用,或者找一些工作来评估拟合度.

Thx - Jagra

Sas*_*sha 15

由于这个问题多次出现,我认为现在是时候提供一些如何正确烹饪v8自定义发行版的方法.

使用TagSet定义您的分发:

  1. DistributionParameterQ,DistributionParameterAssumptions,DistributionDomain
  2. 定义PDF,CDF,SurvivalFunction,HazardFunction
  3. 通过编码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
Run Code Online (Sandbox Code Playgroud)

现在它起作用了:

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>>]
Run Code Online (Sandbox Code Playgroud)

  • 太好了!我想你可以将这个(以及更多细节,如果你愿意的话)添加到[**我们的小工具包**](http://stackoverflow.com/q/4198961/353410)下的_Undocumented(或者几乎不记录) )Features_部分. (2认同)