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.

Opened 14 years ago

Closed 14 years ago

#1095 closed doubt (fixed)

Dudas función AIA

Reported by: Iván Robles Owned by: Víctor de Buen Remiro
Priority: normal Milestone:
Component: Math Version: 2.0.1
Severity: normal Keywords:
Cc:

Description

Buenos días,

lo primero decir que no sabemos si estamos cometiendo un fallo en el planteamiento, pero bueno, si no nos corregis.


Estamos intentando utilizar la función AIA para intentar apróximar una serie en función de pulsos, escalones y tendencias. Lo estamos haciendo asi, porque pensamos que poniendo los términos ARIMA como 1, la función AIA nos debería dar esta aproximación. Sabemos que el AIA está pensado para analizar los residuos de un modelo ARIMA, pero pensamos que se la puede dar también esta aplicación. Quizás estemos equivocados. (Todo esto lo estamos haciendo porque nos podría ayudar a elegir la forma de meter ciertas variables continuas en modelos logisticos, si quereis mas detalles os podemos contar mas cosas).

Al usarla de esta manera, e introducir la serie del OZA, ejecutamos el siguiente código, nos devuelve un escalon. Parece que al final de la serie, hay un cambio de tendencia y nos devuelve un escalón, pero sobre todo lo que esperaríamos es que nos devolviera una tendencia de toda la serie. Nos ha chocado mucho esto. ¿No debería dar la tendencia?

Set Ois.Load("C:/ejemplo.oza");
Set AIA(serEjemplo,1/1,[[PulseOut,StepOut,TrendOut]])

Otra duda que nos surge es si la función AIA es recursiva, es decir, si quitamos a la serie lo que nos dice la función AIA, el escalón, y volvemos a aplicar AIA, nos devuelve mas parámetros. Pensábamos que era recursiva. ¿Hay alguna manera de hacerla recursiva?

Set Ois.Load("C:/ejemplo.oza");

Set setAIA = AIA(serEjemplo,1/1,[[PulseOut,StepOut,TrendOut]]);

Serie input = ApplyPolyn(setAIA[1]);

Set setAIA2 = AIA(serEjemplo-input,1/1,[[PulseOut,StepOut,TrendOut]]);

Puede que tengamos que calibrar los parámetros opcionales, o que estemos utilizandola mal ¿nos podeis ayudar con esto?

Si no se puede utilizar la función AIA para descomponer una serie en pulsos, escalones y tendencias, ¿conocéis alguna manera de hacer esto?

Attachments (1)

ejemplo.oza (56.1 KB) - added by Iván Robles 14 years ago.

Download all attachments as: .zip

Change History (6)

Changed 14 years ago by Iván Robles

Attachment: ejemplo.oza added

comment:1 Changed 14 years ago by Víctor de Buen Remiro

El AIA funciona mejor cuanto más realista sea el modelo que se le pasa.
Lo ideal es estimar un modelo pero en principio suele bastar con que la serie que se le pase sea estacionaria.

En este caso funciona correctamente si se le pasa la serie diferenciada estacionalmente.

Set Ois.Load("ejemplo.oza");
Serie serEjemplo;
Serie (1-B):serEjemplo;
Serie (1-B^12):serEjemplo;
Serie ((1-B^12)*(1-B)):serEjemplo;


Set aia = AIA((1-B^12):serEjemplo,((1-B^12))/1,[[PulseOut,StepOut,TrendOut]]);

Serie input = SetSum(EvalSet(aia,ApplyPolyn));

comment:2 Changed 14 years ago by Víctor de Buen Remiro

El AIA es recursivo por sí mismo, pero los criterios de formulación de cada iteración y los criterios de parada debe darlos el usuario si los valores por defecto no resultan como se espera. En la descripción de la función se dice para qué sirve cada uno.

Esos criterios dependen del estado en que se halle la serie de residuos parciales tras cada iteración por lo que no siempre funciona igual si se llama de forma recursiva.

Como he dicho antes el comportamiento será más razonable cuanto mejor sea el modelo.

No es trivial de manejar el AIA pero es que lo que se le pide no es en absoluto trivial.

comment:3 Changed 14 years ago by Iván Robles

Buenos días,

los datos que te paso no son de una serie temporal, por eso no hacemos diferencias de orden 12, ni tiene mucho sentido un modelo ARIMA.

En realidad es un conjunto de datos, que pasamos a serie para poder aplicar el AIA.

Te cuento un poco más para poder explicarlo mejor. Imaginate que estamos realizando un modelo logit, para predecir si un coche va a tener una avería el próximo año.

Una de las variables que queremos analizar es el número de kilometros, entonces hacemos un conjuntos de valores x, y que tenga como primer valor el número de kilómetros, y como segundo valor, la probabilidad de avería en función del número de kilómetros de una muestra que hemos observado.

Si nos sale como gráfico de esto una función creciente, nos diría que a mayor número de kilómetros, mayor probabilidad de avería, y meteriamos como input del modelo logit el número de kilómetros.
Si nos sale como gráfico de esto una función tipo escalon a partir de los 10.000 km, diríamos que a partir de 10.000 km, tiene más probabilidad de avería, y meteríamos como variable del modelo logit, una variable dicotomica con valor 1 en el caso de que tenga más de 10.000 km.

Estamos intentado automatizar estas decisiones de como metemos las variables, y se nos había ocurrido hacerlo con AIA, lo pasábamos a serie temporal, y si nos sale una tendencia metemos la variable continua, y si nos sale en forma de escalón, dicotómica.

Si no me equivoco, el AIA prueba las formas que mejor ajustan a la serie, por eso esperábamos una tendencia. Es decir, si necesita una diferencia, esperábamos que nos lo diera el AIA con una tendencia en el ejemplo que te pasamos.

No se como funciona el AIA con detalle, entiendo que no es trivial, y estamos intentandolo usar para una cosa que no son series temporales, quizás estemos intentando usarlo para una cosa que no tiene ningún sentido, pero es con el objetivo de intentar aprovecharlo para automatizar decisiones.

Aprovecho para preguntar, ¿hay alguna manera automática de saber si una serie tiene una diferencia?

comment:4 Changed 14 years ago by Víctor de Buen Remiro

No sé porqué pensé que era una serie mensual, la costumbre imagino. Pero el caso es que funcionaba bien la diferencia de orden 12. He probado con otras diferencias y parece que admite un amplio rango: entre 2 y 20 el AIA da resultados similares.

Signifique lo que signifique, está más que claro que la serie original no es estacionaria, y tampoco lo es su diferencia regular, pues da un ACF[1]=-0.55 que es algo muy difícil de justificar normalmente, lo cual concuerda con el hecho de que el AIA no funcione en esos casos y sí a partir de diferencia "estacional" de orden 2.

Quiero hacer notar que lo que tú llamas "pasar a serie temporal" es en general una aberración surrealista y sólo puede tener cierto sentido para datos en los que se puede establecer una relación de orden estricto, no basta con un orden parcial, en una cierta dimensión distinta del tiempo discreto, pero con características similares a las de los números enteros. Entiendo que en tu caso la dimensión que hace el papel del tiempo es el número de kilómetros recorridos por un vehículo, supongo que discretizados de alguna forma, de 1000 en 1000 o algo así, lo cual entraría dentro de lo razonable.

Pero aún en ese caso, la serie resultante debe ser homocedástica y estacionaria, lo cual no sé muy bien si es traducible a dimensiones no temporales, nunca se me habría ocurrido tal cosa.

Si los datos de origen no son series temporales, o al menos vectores ordenables por otro criterio identificable con el tiempo, entonces no tiene sentido en general utilizar el AIA, ya que está pensado para trabajar sobre series temporales homocedásticas y estacionarias, que es el requisito mínimo para poder aplicar los algoritmos empleados, y que puedes ver en detalle en la documentación de la implementación

Reconocer que una serie tiene estas características, y poner los medios para arreglarlo en caso de no tenerlas, no es una tarea sencilla, sino que es en sí misma tan complicada o más que el propio AIA. En el Box-Cox y en muchos otros libros de análisis de series temporales puedes encontrar información al respecto. Es algo que se puede catalogar casi más de arte que de ciencia, aunque espero que algún día seamos capaces de construir un sistema que lo haga.

Al margen de todas estas consideraciones, yo creo que el enfoque que me cuentas, si es que me he enterado de algo, aunque bien orientado es demasiado simplista. Si no me equivoco, lo que intentáis buscar es funciones de transferencia no lineal y eso es un tema delicado que no se puede dejar en manos de autómatas así sin más.

En primer lugar, los kilómetros recorridos son sólo una de las causas probables, otras, conocidas o no, podrían ser éstas:

  • la edad, la marca y el modelo del automóvil,
  • la prima del seguro contratado,
  • la edad, el sexo y el historial de multas recibidas por el conductor principal,
  • etc.

Si sólo tienes en cuenta una variable estás viendo a la vez todos los demás efectos aglomerados, lo cual distorsionará sin remedio las apreciaciones sobre la forma del efecto, tanto si se hacen a mano de forma gráfica, como si se involucra cualquier tipo de ingenio más o menos automático.

Por otra parte yo no veo ninguna razón física ni social que pudiera explicar una forma escalonada en la función de transferencia del riesgo de accidentes con respecto a los kilómetros, a no ser que los coches vengan con un chip para se bloqueen la dirección y los frenos cuando el cuentakilómetros alcance cierta cifra consensuada por todas las marcas de automóviles. Esto se llama obsolescencia programada y sí ocurre por ejemplo con muchas impresoras y otros aparatos informáticos y electrodomésticos, lo cual es a mi juicio una práctica inmoral, pero no tanto como provocar accidentes de tráfico a sabiendas. Un caso muy curioso es que todas las bombillas están diseñadas para durar unas 1000 horas, lo cual costó un montón de millones en investigación, pues las bombillas de primeros del siglo XX se obstinaban en durar décadas sin problemas.

Yo tendería a pensar que tanto el tiempo como el uso van mermando la calidad del automóvil y sus componentes de forma más bien continua y monótona creciente, o al menos no decreciente y sin grandes sobresaltos, lo cual aumentaría paulatinamente la probabilidad de accidente debido a una fallo técnico. Mi sensación es que la tendencia sería muy suave al principio y luego iría aumentando. Como mucho podría pensarse en un punto de inflexión a partir del cual disminuyera la pendiente.

Yo probaría a introducir los inputs correspondientes a x, x^2, x^3, donde x serían los kilómetros, así como los y, y^2, y^3, siendo y los meses transcurridos desde la fabricación. Eso sí, hay que meterlos convenientemente escalados para que no salgan números ni muy grandes ni muy pequeños pues no tenemos aritmética infinita. Entiendo que ya hay un input constante en el modelo por lo que no lo incluyo.

Si este diseño da demasiada correlación se puede probar con alguna familia ortogonal como los polinomios de Legendre aunque eso hace más complicada la interpretación posterior. También habría que ver la significación de los parámetros para ver que tiene sentido.

tampoco sería de extrañar que los efectos de la edad y del kilometraje no sean independientes, lo cual se traduciría en que saldrían significativas variables como el producto de ambas, digamos x*y, o quizás x*y^2 ó x^2*y.

Si la función resultante no es como se espera, entonces se puede intentar alguna otra familia de funciones, o bien pasar a un diseño de tramos, en el que es más sencillo forzar la condición de no decrecimiento, aunque es más complicado de introducir.

Si he acertado en algo me alegro y si no espero que sirva para otra vez. Si queréis podéis pasarme datos a ver si veo algo. Me vendría bien para la batería de modelos de pruebas.

comment:5 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.