Statistics Mathematica中自定义分布的DistributionItemSet[]

Statistics Mathematica中自定义分布的DistributionItemSet[],statistics,wolfram-mathematica,probability,Statistics,Wolfram Mathematica,Probability,我有两个自定义分布的PDF和CDF,一种为每个分布生成随机变量的方法,以及将参数拟合到数据的代码。我之前发布的一些代码: 其中一些内容如下: 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)/

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

其中一些内容如下:

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]应为 有效的分发……”

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

我看不出在这种情况下使用标记集会有什么帮助,除非可以使用标记集为DistributionItemSet[]提供识别这些自定义发行版所需的内容

有人能给我一个办法让它工作吗?我想将DistributionFitTest[]用于像这样的自定义分布,或者找到一些方法来评估拟合优度


Thx--Jagra

由于这个问题已经被多次提出,我认为现在是提供一些如何正确烹饪v8定制发行版的食谱的最佳时机

使用
TagSet
为您的发行版定义:

  • DistributionParameterQ
    DistributionParameterAssumptions
    DistributionDomain
  • 定义
    PDF
    CDF
    SurvivalFunction
    HazardFunction
  • 通过编码随机分布向量定义随机数生成码
  • 这样做将使除参数估计之外的一切都适用于您的分布

    您的错误是
    dplDist
    没有
    DistributionDomain
    定义,而
    nlDist
    dplDist
    都没有定义
    DistributionParameterQ
    DistributionParameterAssumptions
    定义

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

    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>>]
    
    [1014]中的
    :=数据=随机变量[dplDist[3.77,1.34,-2.65,0.40],100];
    在[1015]:=DistributionFitTest[data,dplDist[3.77,1.34,-2.65,0.40]中,
    “假设数据”]
    Out[1015]=假设测试数据[]
    
    不错!我想你可以在“未记录(或几乎没有记录)的功能”部分中添加这一项(如果你愿意,还可以添加更多细节)。深思熟虑,信息丰富,并揭示了引擎盖下发生的事情。我想知道谁写的教程可以提供一个关于整个主题的详细教程?它还可能包括拟合参数、矩等——所有这些都是让自定义分布尽可能无缝地与Mathematica一起工作所需要的。再次,非常感谢——JagraDoes同样适用于Loglike?基本上,您必须使用标记集来定义定制发行版上的所有可能功能吗?@jfelectron是的,同样适用于
    loglikelion
    @Jagra“创建您自己的发行版”研讨会上的Wolfram Technology Conference 2011演示文稿现在可以从