Использование DistributionFitTest[] для пользовательских дистрибутивов в Mathematica 8

Я пытаюсь вычислить качество подгонки бимодального распределения Гаусса. Для этого системе Mathematica, по-видимому, требуется символьная функция распределения, с которой можно сравнивать. Поскольку такое бимодальное распределение не является стандартным распределением, я пытаюсь дать ему определение. Очевидное использование

MixtureDistribution[{fs,(1-fs),{NormalDistribution[\[mu]S,\[sigma]S],NormalDistribution[\[mu]L,\[sigma]L]}]

генерирует распределение, которое можно построить, но анализ, используемый DistributionFitTest[], не работает.

Эта тема поднималась в предыдущих вопросах в обсуждениях между @Sasha и @Jagra:

DistributionFitTest[] для пользовательских дистрибутивов в Mathematica

Минимизация NExpectation для пользовательского распределения в Mathematica

но мне не удалось найти разрешение, позволяющее использовать

DistributionFitTest[data,dist,"HypothesisTestData"]

когда dist не является встроенным типом распределения.

Поскольку распределение, которое я моделирую, состоит из простых частей, описать свойства распределения не так уж сложно, и я попытался описать как можно больше функций, чтобы создать хорошо определенное распределение, которое 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]]

Кажется, все работает благодаря определению Ожидания, которое бросает

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[] и передаст выражение прямо из моего modelDist[] в составляющие его NormalDistribution[]s?

(И если это совершенно неправильный способ сделать это, некоторые советы на этот счет будут оценены.)


person KDN    schedule 10.12.2012    source источник
comment
У вас есть значения для fs, mu, sigma, L и S? Когда я их выбираю, я получаю результаты, используя только указанные вами MixtureDistribution. Когда я проверяю RandomVariate данных с увеличением размера, я ожидаю получить значения p, приближающиеся к 1. Мои значения скачут случайным образом. Они делают это, даже если я использую NormalDistribution вместо вашего. Что вы имеете в виду, когда говорите, что анализ провален?   -  person 0xFE    schedule 29.12.2012
comment
Если я запускаю DistributionFitTest[] для модельного набора данных с указанным мной распределением, он никогда не завершается, он просто запускается, запускается и запускается... Если я попытаюсь сопоставить те же данные с обычным гауссовским (не бимодальным) , тогда все работает нормально. Многие другие функции, связанные с дистрибутивом, работают, но DistributionFitTest не работает... поскольку метод довольно непрозрачен, я не уверен, какие аспекты моего пользовательского дистрибутива отсутствуют...   -  person KDN    schedule 29.12.2012