close Warning: Can't synchronize with repository "(default)" (/var/svn/mms does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 14 years ago

Closed 14 years ago

Last modified 14 years ago

#495 closed doubt (fixed)

Dudas con la transformación Boxcox

Reported by: lmperez Owned by:
Priority: critical Milestone: Maintenance
Component: Models Keywords: BoxCox
Cc:

Description (last modified by Pedro Gea)

Hola MMS, cuando defino un submodelo y escribo la orden

MMS::@Transformation _.transformation = MMS::@Transformation.BoxCox::Default(0,1)

entiendo que la serie output transformada debería ser zt=Log(st+1), sin embargo MMS hace zt=Log(st)

Por otra parte cuando quiero definir transformación identidad:

MMS::@Transformation _.transformation = MMS::@Transformation.BoxCox::Default(1,0)

entiendo que debería hacer zt=st, sin embargo MMS hace zt=st-1

Podéis compilar el projecto de matriculación de vehículos probando las dos transformaciones y ejecutar las ordenes:

Serie original = MMS::Container::GetModel("Mat.Veh__1.0")::GetSubmodel("Veh.Tur.Mat")::GetOutput(?)::GetVariable(?)::GetData(?);
Serie transformada = MMS::Container::GetModel("Mat.Veh__1.0")::GetSubmodel("Veh.Tur.Mat")::GetOutput(?)::GetData(?);

Serie TransLog = BoxCoxTransf(original,@BoxCoxStruct(0,1));
Serie TransId  = BoxCoxTransf(original,@BoxCoxStruct(1,0));

Change History (2)

comment:1 Changed 14 years ago by Pedro Gea

Component: EstimationModels
Description: modified (diff)
Milestone: Maintenance
Resolution: fixed
Status: newclosed
Summary: Problema con la transformacion BoxcoxDudas con la transformación Boxcox
Type: defectdoubt

No hay ningún problema con las transformación BoxCox, simplemente tenemos "viciada" la definición de esta transformación. En MMS hemos intentado ser coherentes con la nomenclatura más habitual en la literatura, donde la definición de la transformación es continua en el parámetro de potencia (lambda). Véase Transformación BoxCox.

La definición que usa MMS es la siguiente:

                           { ((y+alpha)^lambda - 1)/lambda  ;  lambda!=0
BoxCox[lambda, alpha](y) = {
                           { log(y+alpha)                   ;  lambda==0

Así:

BoxCox[0,0](x) = Log(x)
BoxCox[0,1](x) = Log(x+1)
BoxCox[1,0](x) = x-1
BoxCox[1,1](x) = x

comment:2 Changed 14 years ago by lmperez

Bien, no se quien me ha contestado. Primero decir que he vuelto a revisar mi código y he visto dos cosas.

Primera: que efectivamente mms hace las transformaciones que tu dices.

Segunda: que en un sitio de mi proyecto usaba las transformaciones boxcox de tol (no de mms), y estas son diferentes:

Os paso el código de las transformaciones de tol, están definidas en C:\Program Files\Bayes\tolbase-v2.0.1\bin\stdlib\general\grammars/_serie.tol

//////////////////////////////////////////////////////////////////////////////
  Serie  BoxCoxTransform(Serie s, Real bct)
//////////////////////////////////////////////////////////////////////////////
{
  If(bct==1, s+0, If(bct==0, Log(s), s^bct))
};

//////////////////////////////////////////////////////////////////////////////
  Serie  BoxCoxInverseTransform(Serie s, Real bct)
//////////////////////////////////////////////////////////////////////////////
{
  Real invExp = 1/bct;
  If(bct==1, s+0, If(bct==0, Exp(s), s^invExp))
};

Se que seguramente estaréis agobiados a más no poder, pero este tipo de cosas son muy peligrosas. A mi por lo menos me estaban metiendo un sesgo en las previsiones bastante grande.
Aprovecho para comentar, aunque quizá no sea éste el sitio apropiado, y no se de quien es responsabilidad esto, pero entiendo que el código que usemos en las empresa debería tener al menos un mínimo de compatibilidad hacia atrás o hacia delante. Pero no puede ser que si llamo a una funcion de mms me haga una cosa distinta a una función de tol que supuestamente debería hacer lo mismo.

Gracias

Note: See TracTickets for help on using tickets.