[ Retour aux Travaux Dirigés de SAS ]

/* Séries temporelles avec SAS, Corrigé du TD 3 : Désaisonnalisation */
/* Jean-Sebastien Roy (js@jeannot.org), 2000-2001 */

%let chemin=//diamant/Data Mi2/sas/series_roy;
libname tables "&chemin/tables";
 
/* A la main */

data y;
  set tables.sales;
  m=month(t);
  y=log(x);
run;

proc expand data=out=tc;
  id t;
  convert y=tc / transform=(cmovave 12 cmovave 2);
run;

data si;
  set tc;
  si=y-tc;
run;

/* Sur chaque mois */
proc sort data=si;
  by m t;
run;

proc expand data=si out=s;
  by m;
  id t;
  convert si=s / transform=(cmovave 3 cmovave 3);
run;

proc sort data=s;
  by t;
run;

proc expand data=out=sm;
  id t;
  convert s=sm / transform=(cmovave 12 cmovave 2);
run;

data sa;
  set sm;
  snorm=s-sm;
  sa=y-snorm;
run;

proc expand data=sa out=tc2;
  id t;
  convert sa=h13_p / transform=(cmovave (0 0 0 1100 2475 3600 4032 3600 2475 1100 0 0 0));
  convert sa=h13_n / transform=(cmovave (325 468 0 0 0 0 0 0 0 0 0 468 325));
run;

data tc2;
  set tc2;
  tc2=(h13_p*(+1100 +2475 +3600 +4032 +3600 +2475 +1100)
      -h13_n*(+325 +468 +468 +325))/16796;
run;

data si2;
  set tc2;
  si2=y-tc2;
run;

proc sort data=si2;
  by m t;
run;

proc expand data=si2 out=s2;
  by m;
  id t;
  convert si2=s2 / transform=(cmovave 3 cmovave 5);
run;

proc sort data=s2;
  by t;
run;

proc expand data=s2 out=sm2;
  id t;
  convert s2=sm2 / transform=(cmovave 12 cmovave 2);
run;

data sa2;
  set sm2;
  snorm2=s2-sm2;
  sa2=y-snorm2;
run;

data out;
  set sa2;
  xadj=exp(sa2);
run;

symbol1 i=join c=black v='plus';
symbol2 i=join c=red v='diamond';
symbol3 i=join c=blue v='circle';

proc gplot data=out;
  plot (xadj)*t / overlay legend;
run;
quit;

/* Avec X11 */

proc x11 data=tables.sales noprint;
  monthly date=t;
  var x;
  output out=out2 d11=xadj2;
run;

data out2;
  merge out2 out;
  by t;
run;

proc gplot data=out2;
  plot (xadj xadj2)*t / overlay legend;
run;
quit;

/* Creation d'un indicateur conjoncturel */

data jo;
  set tables.jo_am;
  keep mois jo;
run;

proc sql;
  select mean(jo) into :mjo from jo;
quit;
%put WARNING: Nombre moyen de jours ouvrés : &mjo;

data brut;
  set tables.seriesam;
  brut=mhh;
  keep mois brut;
  if brut ne .;
run;

proc gplot data=brut;
  symbol1 i=join color=black value=none;
  symbol2 i=join color=red value=none;
  symbol3 i=join color=blue value=none;
  symbol4 i=join color=green value=none;
  symbol5 i=join color=orange value=none;
  plot brut*mois;
run;
quit;

data cjo;
  merge brut jo;
  by mois;
  if brut ne . and jo ne .;
  cjo=brut/jo*&mjo;
  keep mois cjo;
run;

proc x11 data=cjo noprint;
    monthly date=mois charts=none;
    output out=cs (keep=cjo mois cs) d10=cs;
    id mois cjo;
    var cjo;
run;

data cvs;
  merge cjo cs;
  by mois;
  cvs=100*cjo/cs;
  keep cvs mois;
run;

data all;
  merge all cvs;
  by mois;
run;

proc gplot data=all;
  plot (brut cvs)*mois / overlay;
run;
quit;

proc forecast
    data=cvs
    out=cvsp(drop=_type_ _lead_)
    interval=month lead=12
    method=winters
    weight=(0.39,0.1)
    outactual;
  id mois;
  var cvs;
run;

proc expand data=cvsp out=lis;
  id mois;
  convert cvs=lis_h13p / transform=(cmovave (0 0 0 1100 2475 3600 4032 3600 2475 1100 0 0 0));
  convert cvs=lis_h13n / transform=(cmovave (325 468 0 0 0 0 0 0 0 0 0 468 325));
  convert cvs=lis_med / transform=(cmovmed 5 cmovmed 5 cmovave (1 2 2 2 1));
run;

data lis;
  set lis;
    lis_h13=(lis_h13p*(+1100 +2475 +3600 +4032 +3600 +2475 +1100)
      -lis_h13n*(+325 +468 +468 +325))/
      (-325 -468 +1100 +2475 +3600 +4032 +3600 +2475 +1100 -468 -325);
  keep mois lis_h13 lis_med;
run;

data all;
  merge brut cjo cvs lis;
  by mois;
run;

proc gplot data=all;
  plot (brut cjo cvs lis_h13 lis_med)*mois / overlay legend;
run;
  plot (brut cjo cvs lis_h13 lis_med)*mois / overlay legend;
  where year(mois)>1990;
run;
  plot (cvs lis_h13 lis_med)*mois / overlay legend;
  where year(mois)>1990;
run;
quit;