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

Changes between Version 1 and Version 2 of OfficialTolArchiveNetworkArimaToolsAutoArima


Ignore:
Timestamp:
Nov 8, 2012, 9:10:23 AM (12 years ago)
Author:
Víctor de Buen Remiro
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OfficialTolArchiveNetworkArimaToolsAutoArima

    v1 v2  
    33La identificación ARIMA automática bayesiana consiste en la búsqueda de un modelo estadístico adecuado para un serie temporal correspondiente a un proceso estocástico lineal, estacionario o no.
    44
    5 Dada una serie de datos reales, lo primero que hay que hacer es filtrar los efectos exógenos mediante un conjunto de inputs lineales dados por el analista y, si existen, un conjunto de outliers detectados automáticamente mediante AIA. Para ello se requiere de un primer proceso de sobrediferenciación muy básico.
     5En el directorio [source:tolp/OfficialTolArchiveNetwork/ArimaTools/doc/wiki/Identify/MacroEconomicSeries/ MacroEconomicSeries] está disponible un ejemplo TOL sencillo de uso de esta potente y compleja herramienta, en el que se identifican modelos ARIMA regulares para series macroeconómicas anuales de distintos países.
    66
     7Antes de nada hay que obtener los datos originales y si fuera necesario transformarlos hasta conseguir que la serie sea homocedástica, es decir, la transformación de Box-Cox se supone ya aplicada. Existen formas de automatizar esto pero en la práctica sólo se usan la transformación logarítmica cuando los datos son positivos por naturaleza y la identidad en caso contrario así que no merece la pena adentrarse en este problema.
     8
     9{{{
     10#!java
     11//////////////////////////////////////////////////////////////////////////////
     12//Carga de datos
     13//////////////////////////////////////////////////////////////////////////////
     14//Nuestras series ya están en una métrica homocedástica
     15// GDP: tasa de variación anual del producto interior bruto
     16// UNM: porcentaje de desempleados en la población activa
     17// POP: tasa de variación anual del número de habitantes
     18Set If(!ObjectExist("Set","MacroEconomicSeries"), MacroEconomicSeries,
     19        MacroEconomicSeries = { Include("MacroEconomicSeries.oza") });
     20Real If(!ObjectExist("Real","concept"),concept= 1, concept); //GDP
     21Real If(!ObjectExist("Real","country"),country=12, country); //ESP
     22
     23Serie output = MacroEconomicSeries[concept][country];
     24Text name = Name(MacroEconomicSeries[concept][country]);
     25}}}
     26
     27La identificación de las estructuras ARIMA es equivalente a la determinación de lso grados de los polinomios
     28que intervienen en ella, y aunque en principio no hay ninguna limitación en dichos grados más allá del tamaño
     29de la serie, en la práctica es conveniente acotarlos superiormente por razones de eficiencia. Pr este motivo
     30definiremos los rangos de grados ARIMA para cada periodicidad. En este caso sólo hay factor regular con periodo 1:
     31{{{
     32#!java
     33Set ARIMADegRange = { [[
     34 @ARIMADegreeRangeStruct(
     35  Period=1,MinAR=0,MaxAR=5,MinMA=0,MaxMA=5,MinDIF=0,MaxDIF=2 )
     36]] };
     37}}}
     38
     39Dada una serie homocedástica de datos reales (la transformación de Box-Cox se supone ya aplicada), lo primero que hay que hacer es filtrar los efectos exógenos mediante un conjunto de inputs lineales dados por el analista y, si existen, un conjunto de outliers detectados automáticamente mediante AIA. Para ello se requiere de un primer proceso de sobrediferenciación muy básico. En este caso no se proponen inputs.
     40{{{
     41#!java
     42//////////////////////////////////////////////////////////////////////////////
     43//Filtro lineal y de outliers
     44//////////////////////////////////////////////////////////////////////////////
     45//Configuración por defecto del filtro lineal y de outliers
     46NameBlock flt.cfg = ArimaTools::Filter::@Config::Default(?);
     47//Adaptación de la configuración al caso particular
     48Real flt.cfg::optMaxOrder := 2;
     49//Filtrado de inputs lineales y AIA
     50NameBlock filter = ArimaTools::Filter::OverDifAIALinear(
     51  Serie output,        //Serie output a modelar
     52  Set ARIMADegRange,   //Rangos de grados ARIMA
     53  Set InputTry,        //Inputs tentativos
     54  NameBlock flt.cfg);  //Configuración del filtro
     55}}}
     56
     57A continuación comienza propiamente la identificación del modelo empezando por las raíces
     58unitarias o polinomios de diferenciación-integración. Se trata de medir la probabilidad
     59de que cada uno de los polinomios propuestos de lugar a un ruido diferenciado estacionario.
     60Este proceso se basa en modelos lineales que son aproximaciones autoregresivas del modelo
     61ARIMA conjunto con las que se generan miles de simulaciones de la distribución t de Student
     62multivariante asociada a los parámetros, para calcular finalmente la probabilidad de
     63estacionariedad como el ratio de polinomios con todas las raíces fuera del círculo unidad,
     64ponderando en cada caso por el inverso del volumen de la región de estacionariedad.
     65En el caso regular se trata de un método asintóticamente exacto de medir esta
     66probablidad. Si hay estacionalidad(es) entonces sólo es una aproximación pero se ha
     67visto empíricamente que funciona bastante bien salvo en algunos casos patológicos.
     68El resultado de este proceso es un ''ranking'' de los polinomios propuestos
     69ordenados de mayor a menor probabilidad de estacionariedad.
     70
     71
     72{{{
     73#!java
     74//////////////////////////////////////////////////////////////////////////////
     75//Identificador de raíces unitarias.
     76//////////////////////////////////////////////////////////////////////////////
     77//Configuración por defecto
     78NameBlock ur.cfg = ArimaTools::UnitRoot::@Config::Default(?);
     79//Adaptación de la configuración al caso particular
     80//Número de simulaciones por polinonio propuesto
     81Real ur.cfg::sampleLength := 10000;
     82//Se descartan los polinomios con menos del 0.01% de probabilidad
     83Real ur.cfg::minProb := 1E-4;
     84//Identificador de raíces unitarias que construye un ranking ordenado según
     85//la probabilidad de cada una de las opciones.
     86NameBlock id.ur = ArimaTools::UnitRoot::Identify(
     87  filter::_.filtered, //Serie filtrada de efectos exógenos
     88  ARIMADegRange,      //Rangos de grados ARIMA
     89  ur.cfg);            //Configuración
     90}}}
     91
     92
     93{{{
     94#!java
     95//////////////////////////////////////////////////////////////////////////////
     96//Identificador de polinomios ARMA
     97//////////////////////////////////////////////////////////////////////////////
     98//Configuración por defecto
     99NameBlock arma.cfg = ArimaTools::@ARMA.Sampler.ACF.Reg.Config::Default(?);
     100//Adaptación de la configuración al caso particular
     101Text arma.cfg::sampler := @ARMA.Sampler.ACF.Reg.Config::Options::Sampler::
     102                          ImportanceSampling;
     103Text arma.cfg::acfCov := @ARMA.Sampler.ACF.Reg.Config::Options::ACFCov::
     104                         TheoricalBartlett;
     105Real arma.cfg::sampleLength = 200;
     106//Identificador de raíces ARMA que construye un ranking ordenado según
     107//la probabilidad de cada una de las opciones.
     108NameBlock id.arma = ArimaTools::@ARMA.Splitter.ACF::Identify(
     109  filter::_.filtered, ARIMADegRange, id.ur, arma.cfg);
     110}}}
     111
     112{{{
     113#!java
     114//////////////////////////////////////////////////////////////////////////////
     115//Identificador de la estructura ARIMA, estimación y diagnosis
     116//////////////////////////////////////////////////////////////////////////////
     117//Configuración por defecto
     118NameBlock arima.cfg = ArimaTools::ARIMA.Identifier::@Config::Default(?);
     119//Adaptación de la configuración al caso particular
     120//Los modelos de este ejemplo son pequeños y rápidos de estimar por lo que
     121//no hay porqué poner un límite de intentos fallidos.
     122Real arima.cfg::maxTry := 1/0;
     123Real arima.cfg::maxTryForGood := 20;
     124Real arima.cfg::maxTryForAcceptable := 50;
     125//Identificador de la estructura ARIMA que recorre el ranking propuesto
     126//estimando y diagnosticando cada modelo hasta que se cumplen las
     127//condiciones mínimas exigidas o se aborta el proceso y devuelve el mejor
     128//modelo encontrado hasta ese momento.
     129Set id.arima = ArimaTools::ARIMA.Identifier::DoAll(
     130// output, id.arma::ranking, (filter::_.model::Definition)->Input, Mercadona::Config::arima.cfg);
     131 output, id.arma::ranking, filter::_.model::Definition->Input, arima.cfg);
     132}}}
     133