我正在尝试计算双峰高斯分布的拟合优度。为此,Mathematica 似乎需要一个符号分布函数来进行比较。因为这样的双峰分布不是股票分布,所以我试图定义一个。明显的使用
MixtureDistribution[{fs,(1-fs),{NormalDistribution[\[mu]S,\[sigma]S],NormalDistribution[\[mu]L,\[sigma]L]}]
生成一个可以绘制的分布,但使用的分析DistributionFitTest[]
失败。
在@Sasha 和@Jagra 之间的讨论中的先前问题中已经解决了这个主题:
DistributionFitTest[] 用于 Mathematica 中的自定义分布
在 Mathematica 中最小化自定义分布的 NExpectation
但我找不到能够使用的解决方案
DistributionFitTest[data,dist,"HypothesisTestData"]
whendist
不是内置分发类型。
因为我正在建模的分布由简单的部分组成,所以描述分布的属性并不太难,并且我尝试描述尽可能多的特征,以便创建 Mathematica 8 可以识别的定义明确的分布它自己的一个。我尝试定义我能想到的每个参数如下:
modelDist /:
PDF[modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_], x_] :=
PDF[MixtureDistribution[{fS, 1 - fS}, {NormalDistribution[\[Mu]S, \[Sigma]S], NormalDistribution[\[Mu]L, \[Sigma]L]}], x];
modelDist /:
CDF[modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_], x_] :=
CDF[MixtureDistribution[{fS, 1 - fS}, {NormalDistribution[\[Mu]S, \[Sigma]S], NormalDistribution[\[Mu]L, \[Sigma]L]}], x];
modelDist /:
DistributionDomain[modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_]] :=
Interval[{-Infinity, Infinity}];
modelDist /:
Random`DistributionVector[modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_], n_, prec_] :=
RandomVariate[MixtureDistribution[{fS, 1 - fS}, {NormalDistribution[\[Mu]S, \[Sigma]S], NormalDistribution[\[Mu]L, \[Sigma]L]}], n, WorkingPrecision -> prec];
modelDist /:
DistributionParameterQ[modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_]] :=
!TrueQ[Not[Element[{fS, \[Mu]S, \[Sigma]S, \[Mu]L, \[Sigma]L}, Reals] && fS > 0 && fS < 1 && \[Sigma]S > 0 && \[Sigma]L > 0]];
modelDist /:
DistributionParameterAssumptions[modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_]] :=
Element[{fS, \[Mu]S, \[Sigma]S, \[Mu]L, \[Sigma]L}, Reals] && fS > 0 && fS < 1 && \[Sigma]S > 0 && \[Sigma]L > 0;
modelDist /:
MomentGeneratingFunction[modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_], t_] :=
fS E^(t \[Mu]S + (t^2 \[Sigma]S^2)/2) + (1 - fS) E^(t \[Mu]L + (t^2 \[Sigma]L^2)/2);
modelDist /:
CharacteristicFunction[modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_], t_] :=
fS E^(I t \[Mu]S + (t^2 \[Sigma]S^2)/2) + (1 - fS) E^(I t \[Mu]L + (t^2 \[Sigma]L^2)/2)
modelDist /:
Moment[modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_], n_] :=
Piecewise[{{fS*\[Sigma]S^n*(-1 + n)!!*Hypergeometric1F1[-(n/2), 1/2, -(\[Mu]S^2/(2*\[Sigma]S^2))] + (1 - fS) * \[Sigma]L^n*(-1 + n)!! * Hypergeometric1F1[-(n/2), 1/2, -(\[Mu]L^2/(2*\[Sigma]L^2))], Mod[n, 2] == 0}}, \[Mu]S*\[Sigma]S^(-1 + n)*n!!* Hypergeometric1F1[(1 - n)/2, 3/2, -(\[Mu]S^2/(2*\[Sigma]S^2))] + (1 - fS) * \[Mu]L*\[Sigma]L^(-1 + n)*n!! * Hypergeometric1F1[(1 - n)/2, 3/2, -(\[Mu]L^2/(2*\[Sigma]L^2))]];
modelDist /:
Mean[modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_]] :=
fS \[Mu]S + (1 - fS) \[Mu]L
modelDist /:
Expectation[expr_, x_ \[Distributed] modelDist[fS_, \[Mu]S_, \[Sigma]S_, \[Mu]L_, \[Sigma]L_]] :=
fS*Expectation[expr, x \[Distributed] NormalDistribution[\[Mu]S, \[Sigma]S]] + (1 - fS)*Expectation[expr, x \[Distributed] NormalDistribution[\[Mu]L, \[Sigma]L]]
一切似乎都通过 Expectation 的定义进行,它抛出
TagSetDelayed::tagpos: Tag modelDist in Expectation[expr_,x_\[Distributed]modelDist[fS_,\[Mu]S_,\[Sigma]S_,\[Mu]L_,\[Sigma]L_]] is too deep for an assigned rule to be found.
我不知道对期望进行定义会神奇地使一切正常,但这是尝试的下一步,因为期望允许计算方差,据我所知,这是我的最后一个标签需要定义。是否有一种语法可以正确定义这一点Expectation[]
并将表达式直接从 my 传递modelDist[]
到其组成部分NormalDistribution[]
s?
(如果这完全是错误的方法,那么一些建议将不胜感激。)