2011-06-15 15 views
8

Tengo archivos PDF y CDF para dos distribuciones personalizadas, un medio para generar RandomVariates para cada uno y un código para ajustar los parámetros a los datos. Algunos de este código que he publicado anteriormente en:DistributionFitTest [] para distribuciones personalizadas en Mathematica

Calculating expectation for a custom distribution in Mathematica

Algunos de los que sigue:

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]]; 

me pueden enviar más de un código, si alguien tiene que verlo, pero creo que el arriba da una buena idea del enfoque hasta ahora.

Ahora necesito una manera de utilizar DistributionFitTest [] con estas distribuciones en algo como esto:

DistributionFitTest[data, dplDist[3.77, 1.34, -2.65, 0.40],"HypothesisTestData"] 

Ah, pero esto no funciona. En su lugar aparece un mensaje de error que comienza como:

"El argumento dplDist [3.77,1.34, -2.65,0.4] debe ser una distribución válida ..."

Por lo tanto, Parece que DistributionFitTest [] no reconoce estas distribuciones como distribuciones.

No veo cómo usar TagSet ayudaría en esta instancia, a menos que uno pueda usar TagSet para dar a DistributionFitTest [] lo que necesita para identificar estas distribuciones personalizadas.

¿Alguien me puede recomendar una forma de hacer que esto funcione? Me gustaría usar DistributionFitTest [] con distribuciones personalizadas como esta o encontrar algún trabajo para evaluar la bondad del ajuste.

Thx - Jagra

Respuesta

15

Dado que esta cuestión ha llegado muchas veces, creo que es hora de máxima audiencia de proporcionar algunas recetas de cómo preparar adecuadamente una distribución personalizada para v8.

Uso TagSet a definir para su distribución:

  1. DistributionParameterQ, DistributionParameterAssumptions, DistributionDomain
  2. Definir PDF, CDF, SurvivalFunction, HazardFunction
  3. Definir generación de números aleatorios código codificando Random`DistributionVector

Hacerlo hará que todo, menos la estimación de parámetros, funcione para su distribución.

Su error fue que no tenían dplDistDistributionDomain definición, y ambos nlDist y dplDist no tenía DistributionParameterQ y DistributionParameterAssumptions definiciones.

que añaden a sus definiciones de lo siguiente:

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 

Y ahora ha funcionado:

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>>] 
+2

Nice! Creo que podría agregar este (junto con más detalles, si lo desea) a [** nuestra pequeña publicación ToolBag **] (http://stackoverflow.com/q/4198961/353410) debajo de _Undocumented (o escasamente documentado)) Características_ sección. –

+0

Reflexivo, informativo y revelador de lo que sucede bajo el capó. Me pregunto si quien escribe los tutoriales podría proporcionar una detallada sobre este tema en su totalidad. También podría cubrir parámetros de ajuste, momentos, etc., todo lo que uno necesita para lograr que las distribuciones personalizadas funcionen de la manera más transparente posible con Mathematica. Nuevamente, muchas gracias - Jagra – Jagra

+0

¿Se aplica lo mismo para LogLikelihood? Básicamente, ¿tiene que usar TagSet para definir cada función posible sobre la distribución personalizada? – jfelectron

Cuestiones relacionadas