我有两个自定义分布的PDF和CDF,一种为每个分布生成RandomVariates的方法,以及用于将参数拟合到数据的代码。我之前发布的一些代码:
Calculating expectation for a custom distribution in 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
答案 0 :(得分:15)
由于这个问题多次出现,我认为现在是提供一些如何正确烹饪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>>]