Descomposición de series temporales con SAS

 

En este post vamos a ver un caso práctico de descomposición de series temporales con SAS. Inicialmente introducimos el concepto de serie temporal y su descomposición.

Una serie temporal se define como una colección de observaciones de una variable recogidas secuencialmente en el tiempo. Este tipo de datos son útiles cuando se quiere predecir la evolución de una variable que cambia a lo largo del tiempo. Las series temporales pueden mostrar una gran variedad de patrones. Suele ser útil descomponer una serie en partes, de forma de cada parte represente una parte del comportamiento:

Tendencia: incremento o decremento sostenido a medio o largo plazo en la serie

Estacionalidad: efectos estacionales (momento del año, mes, día de la semana..)

Ciclos: Subidas y bajadas variables e inestables sin aparente periodicidad fija. Puede ser ruido o puede contener información.

Descomposición de serie temporal en estacionalidad, tendencia y resto

Podemos trabajar con series temporales en SAS en distintos módulos: SAS Enterprise Guide, SAS Visual Analytics, SAS Forecast Studio, etc..., el ejemplo que vamos a plantear puede realizarse con SAS Enterprise Guide utilizando procedimientos de SAS/ETS

El siguiente código SAS/BASE nos permite crear nuestro dataset de ejemplo:

data tabpre (keep =  periodo_f periodo val);
length mm $2. periodo $8.;
do a = 2013 to 2016;
if a = 2016 then tope = 6; else tope = 12;
do m = 1 to tope;
mm=put(m,z2.);
periodo = compress(a||mm||'01');
periodo_f = mdy(input(substr(put(periodo,8.),5,2),8.) ,input(substr(put(periodo,8.),7,2),8.) ,input(substr(put(periodo,8.),1,4),8.) );
ten = (a - 2000)*100;
val = ten + round(100*ranuni(1));
if m = 1 then val = 1.35*val;if m = 2 then val = 1.15*val;
if m = 3 then val = 1.22*val;if m = 4 then val = 1.05*val;
if m = 5 then val = 1*val;if m = 6 then val = 0.9*val;
if m = 7 then val = 0.85*val;if m = 8 then val = 0.8*val;
if m = 9 then val = 1.1*val;if m = 10 then val = 1.05*val;
if m = 11 then val = 1.24*val;if m = 12 then val = 1.3*val;
FORMAT periodo_f  MONYY5.;
output;
end;
end;
run;

 

Una vez creado este dataset podemos ver la serie gráficamente empleando el procedimiento gplot:

proc gplot data=tabpre;
plot val*periodo_f;
run;

 

 

A simple vista comprobamos que los datos representan un negocio estacional con correlación interanual, vemos pico en ene-dic y valle en jul-ago, hay tendencia alcista a lo largo de los años.

Es interesante analizar la autocorrelación de la serie. Decimos que en una serie temporal hay autocorrelación cuando existe una correlación entre un periodo dado y periodos anteriores a este:

PROC AUTOREG data=tabpre; 
MODEL val = periodo_f / NLAG=12; 
run;

 

 

Encontramos una correlación positiva alta en t - 12 (interanual) y una correlación negativa alta en t-5 , t-6 y t -7, tal y como se intuía en la gráfica anterior.

Vamos a descomponer la serie en tendencia, estacionalidad y parte irregular. Para ello empleamos el procedimiento proc timeseries.

ods graphics on;
proc timeseries data=tabpre
                   out=series
                   outtrend=trend
                   outseason=season plots=(cc tc ic acf iacf);
   /* cc: estaciona tc: tendencia ic: irregular acf: autocorrelacion */
   /* acf estandarizado no va de -1 a 1 es acf con transformación */
      id periodo_f interval=month ;
      var val;
run;
ods graphics off;

 

La salida de este procedimiento nos muestra la descomposición de la serie:

 

 

 

 

El procedimiento proc timeseries nos puede dar más información útil de la serie temporal que en pasos posteriores puede ser utilizada para modelizar.

Más información en: 

https://www.datademy.es

https://www.youtube.com/@datademyformacion6610