Logo Espacio Linux       
Portada Taller Linux Descargas Foros Buscar Mapa del sitio Ayuda BlogEL
   Iniciar sesión | Registrarse    
 
Principal

Patrocinadores

Anuncios



Boletín Espacio Linux
Las novedades del sitio y el mundo Linux en tu email.


Sitios amigos

Blogs de miembros


Directorio de blogs | Registrarse
Los usuario registrados pueden crear su propio blog y escribir comentarios.

Autocorrelación y correlación cruzada en series de tiempo con C++ en Linux


Por: zeka
Publicado el: 04-17-2008 @ 07:18 pm


Hace algún tiempo, programé en C++ un modelo autoregresivo linear de primer orden para generar elementos climáticos de temperatura máxima, temperatura mínima y radiación solar. Los valores producidos estaban "acoplados" a datos de precipitación comprendidos entre 1970 y 1994 (en total 9131 valores). Las matrices de covarianza empleadas fueron:

Para lag 0:

1.000 0.697 0.249

0.697 1.000 -0.192

0.249 -0.192 1.000

Para lag 1:

0.670 0.632 0.058

0.532 0.700 -0.075

0.102 -0.091 0.240

En consecuencia, el modelo produjo 9.131 valores para cada elemento climático cuyas medias y desviaciones estándares mensuales se correspondían ajustadamente con los valores reales. Sin embargo, en esa época no pude (o no quize) encontrar la forma para analizar las series de tiempo en cuanto a si en realidad presentaban la autocorrelación y la correlación cruzada que sugerían las matrices de covarianza. Recientemente, me decidí a quitarle las tendencias a cada una de las series de tiempo y producir residuales con media cero y varianza uno. Me señalaron que Matlab me podría ayudar a procesar las series de residuales para encontrar los coeficientes de autocorrelación y correlación cruzada pero cuando le introduje esos "pequeños vectores" de 9.131 valores (equivalente a 25 años de registro) Matlab se "desmayó". Ni siquiera con 10 años de registro y, finalmente, terminé probando con sólo 5 años (para mantener las series balanceadas). No obstante, por más que indagué, no pude encontrar que Matlab me determinara los coeficientes de correlación cruzada para lag 1; sólo autocorrelación para lag 1 y correlación cruzada para lag 0 (me faltaban, por tanto, 6 valores). Cansado de buscar que Matlab hiciera lo que yo quería (tardé como dos días en ello) tomé la decisión de elaborar yo mismo el código en C++ (fue lo primero que debí haber hecho) y en un momento tenía todos los coeficientes de correlación cruzada calculados; incluidos los de autocorrelación como caso particular.

Aquí tenemos el código para Linux :

el cual, con muy pequeñas modificaciones, corre en Windows XP usando el Dev-C++ con licencia GNU.

Aquí tenemos una imagen de como corre en Linux Debian:

donde se aprecia el valor de r1(3,1) = 0,100 y r1(1,3) = 0,063 que concuerdan aceptablemente con los valores respectivos de 0,102 y 0,058 que se encuentran en la matriz de covarianza para lag 1.


 

 



Ultima actualización el 04-21-2008 @ 08:09 pm




Añadir un comentario
Añadir un comentario
Ver más artículos
Ver más artículos

Comentarios

Por: cdar     Publicado el 04-23-2008 @ 08:47 am

Señores....esto es la vida real..
La mayora de veces los paquetes que nos venden las empresas simplemente no corresponden a nuestras necesidades; lamentablemente no todos son programadores y no pueden crearse un sistema que les satisfaga... "El software libre es socialismo en accion"
Por: zeka     Publicado el 04-26-2008 @ 07:34 am

MatLab es un software muy útil y versátil pero, en mi caso, no tenía la experiencia ni el conocimiento necesario para ponerlo a trabajar a mi favor. Fue más fácil hacer el programa en C++ que buscar como hacerlo en MatLab que, casi seguro estoy, se puede hacer. Por otra parte, sino viene con la limitación de las hojas de cálculo, es posible que MatLab traiga opciones que permitan manejar arrays más extensos (como los de 9131 datos). Por otra parte, después que resolví mi problema, estuve explorando más detalladamente MatLab y mi conclusión es que es un tremendo software. Sin embargo, el tiempo que tardaría en aprender bien el uso de MatLab probablemente no lo justificaría. Tengo código probado en C++ para una clase Matriz y hacer un programa relativamente complejo no me resulta tan difícil para lo que normalmente hago.

Saludos
Por: zeka     Publicado el 04-26-2008 @ 08:03 am

El código anterior, si estuviese trabajando con simulaciones para 100 años de registro, no funcionaría porque tendría que leer más datos de los que permite la declaración de las variables tipo int. Se soluciona usando el tipo long; que permite manejar enteros hasta de poco más de 2 millardos (y unsigned long más de 4 millardos). Algunos se sorprenderán de por qué tan grandes en algunos casos. Cuando se quieren generar números aleatorios, por ejemplo, se deben usar semillas con esas características para garantizar que la generación, después de un tiempo, no se convierta en ciclica, es decir, no esté correlacionada con los valores anteriores.
Journal ©
 



Copyright | Términos de uso | Política de privacidad | Publicidad | Contáctanos | Blog