[ Retour aux Travaux Dirigés de SAS ]

/* Séries temporelles avec SAS, Préparation du TD 2 */
/* Jean-Sebastien Roy (js@jeannot.org), 2000-2001 */

%let chemin=//diamant/Data Mi2/sas/series_roy;
libname tables "&chemin/tables";
filename donnees "&chemin/infiles";

/* Format de fichier :

00000000011111111112
12345678901234567890
          AAMMDDd  c

AA : l'année (si AA<60 alors l'année est 20AA sinon 19AA)
MM : le mois
DD : le jour
d : Alternativement 1 ou 2. Les lignes sont répétées deux fois.
c : CDAY

CDAY:
 4=Jour Ferié
 5=Lendemain de JF
 3=Lundi normal
 0=Mardi-Vendredi normal
 1=Samedi normal
 2=Dimanche normal
 7=Veille de JF
 9=Invalide

*/


data cal;
  length cday $ 1;
  infile donnees(France);
  input aa 11-12 mm 13-14 dd 15-16 demi 17 cday $ 20;
  if demi=1;
  if aa<60 then aa=aa+2000;
  else aa=aa+1900;
  date=mdy(mm,dd,aa);
  format date ddmmyy10.;
  keep date cday;
run;

/* Nombre de jours ouvrés par mois */
data vjo;
  set cal;
  mois=intnx('MONTH',date,0);
  format mois MONYY.;

  if cday in ('0'then jo=1;
  else if cday in ('3'then jo=0.5;
  else if cday in ('1'then jo=0.5;
  else if cday in ('7','5'then jo=1;
  else jo=0;
run;

proc summary data=vjo nway;
  by mois;
  var jo;
  output out=jo (drop=_type_ _freq_sum=;
run;

/* Faire par regression */

/* Autre solution */

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;

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 tables.mhhcvs;
  set cvs;
run;

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;