= Identificación ARIMA automática bayesiana = La 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. En 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. Antes 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. {{{ #!java ////////////////////////////////////////////////////////////////////////////// //Carga de datos ////////////////////////////////////////////////////////////////////////////// //Nuestras series ya están en una métrica homocedástica // GDP: tasa de variación anual del producto interior bruto // UNM: porcentaje de desempleados en la población activa // POP: tasa de variación anual del número de habitantes Set If(ObjectExist("Set","MacroEconomicSeries"), MacroEconomicSeries, MacroEconomicSeries = { Include("MacroEconomicSeries.oza") }); Real If(ObjectExist("Real","concept"), concept, concept= 1); //GDP Real If(ObjectExist("Real","country"), country, country=12); //ESP Serie output = MacroEconomicSeries[concept][country]; Text name = Name(MacroEconomicSeries[concept][country]); }}} La identificación de las estructuras ARIMA es equivalente a la determinación de lso grados de los polinomios que intervienen en ella, y aunque en principio no hay ninguna limitación en dichos grados más allá del tamaño de la serie, en la práctica es conveniente acotarlos superiormente por razones de eficiencia. Pr este motivo definiremos los rangos de grados ARIMA para cada periodicidad. En este caso sólo hay factor regular con periodo 1: {{{ #!java Set ARIMADegRange = { [[ @ARIMADegreeRangeStruct( Period=1,MinAR=0,MaxAR=5,MinMA=0,MaxMA=5,MinDIF=0,MaxDIF=2 ) ]] }; }}} Dada 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. {{{ #!java ////////////////////////////////////////////////////////////////////////////// //Filtro lineal y de outliers ////////////////////////////////////////////////////////////////////////////// //Configuración por defecto del filtro lineal y de outliers NameBlock flt.cfg = ArimaTools::Filter::@Config::Default(?); //Adaptación de la configuración al caso particular Real flt.cfg::optMaxOrder := 2; //Filtrado de inputs lineales y AIA NameBlock filter = ArimaTools::Filter::OverDifAIALinear( Serie output, //Serie output a modelar Set ARIMADegRange, //Rangos de grados ARIMA Set InputTry, //Inputs tentativos NameBlock flt.cfg); //Configuración del filtro }}} A continuación comienza propiamente la identificación del modelo empezando por las raíces unitarias o polinomios de diferenciación-integración. Se trata de medir la probabilidad de que cada uno de los polinomios propuestos de lugar a un ruido diferenciado estacionario. Este proceso se basa en modelos lineales que son aproximaciones autoregresivas del modelo ARIMA conjunto con las que se generan miles de simulaciones de la distribución t de Student multivariante asociada a los parámetros, para calcular finalmente la probabilidad de estacionariedad como el ratio de polinomios con todas las raíces fuera del círculo unidad, ponderando en cada caso por el inverso del volumen de la región de estacionariedad. En el caso regular se trata de un método asintóticamente exacto de medir esta probablidad. Si hay estacionalidad(es) entonces sólo es una aproximación pero se ha visto empíricamente que funciona bastante bien salvo en algunos casos patológicos. El resultado de este proceso es un ''ranking'' de los polinomios propuestos ordenados de mayor a menor probabilidad de estacionariedad. {{{ #!java ////////////////////////////////////////////////////////////////////////////// //Identificador de raíces unitarias. ////////////////////////////////////////////////////////////////////////////// //Configuración por defecto NameBlock ur.cfg = ArimaTools::UnitRoot::@Config::Default(?); //Adaptación de la configuración al caso particular //Número de simulaciones por polinonio propuesto Real ur.cfg::sampleLength := 10000; //Se descartan los polinomios con menos del 0.01% de probabilidad Real ur.cfg::minProb := 1E-4; //Identificador de raíces unitarias que construye un ranking ordenado según //la probabilidad de cada una de las opciones. NameBlock id.ur = ArimaTools::UnitRoot::Identify( filter::_.filtered, //Serie filtrada de efectos exógenos ARIMADegRange, //Rangos de grados ARIMA ur.cfg); //Configuración }}} {{{ #!java ////////////////////////////////////////////////////////////////////////////// //Identificador de polinomios ARMA ////////////////////////////////////////////////////////////////////////////// //Configuración por defecto NameBlock arma.cfg = ArimaTools::@ARMA.Sampler.ACF.Reg.Config::Default(?); //Adaptación de la configuración al caso particular Text arma.cfg::sampler := ArimaTools::@ARMA.Sampler.ACF.Reg.Config::Options:: Sampler::ImportanceSampling; Text arma.cfg::acfCov := ArimaTools::@ARMA.Sampler.ACF.Reg.Config::Options:: ACFCov::TheoricalBartlett; Real arma.cfg::sampleLength := 200; //Identificador de raíces ARMA que construye un ranking ordenado según //la probabilidad de cada una de las opciones. NameBlock id.arma = ArimaTools::@ARMA.Splitter.ACF::Identify( filter::_.filtered, //Serie filtrada de efectos exógenos ARIMADegRange, //Rangos de grados ARIMA id.ur, //Ranking de raíces unitarias arma.cfg); //Configuración }}} {{{ #!java ////////////////////////////////////////////////////////////////////////////// //Identificador de la estructura ARIMA, estimación y diagnosis ////////////////////////////////////////////////////////////////////////////// //Configuración por defecto NameBlock arima.cfg = ArimaTools::ARIMA.Identifier::@Config::Default(?); //Adaptación de la configuración al caso particular //Los modelos de este ejemplo son pequeños y rápidos de estimar por lo que //no hay porqué poner un límite de intentos fallidos. Real arima.cfg::maxTry := 1/0; Real arima.cfg::maxTryForGood := 20; Real arima.cfg::maxTryForAcceptable := 50; //Identificador de la estructura ARIMA que recorre el ranking propuesto //estimando y diagnosticando cada modelo hasta que se cumplen las //condiciones mínimas exigidas o se aborta el proceso y devuelve el mejor //modelo encontrado hasta ese momento. Set id.arima = ArimaTools::ARIMA.Identifier::DoAll( // output, id.arma::ranking, (filter::_.model::Definition)->Input, Mercadona::Config::arima.cfg); output, id.arma::ranking, filter::_.model::Definition->Input, arima.cfg); }}}