[ Retour aux Travaux Dirigés de SAS ]

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

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

/* Lecture des données */
data q0n;
  length tday $ 1;
  infile donnees(q0n.txt) dlm=',';
  input q0 no tday $;
run;

/* Tracé des valeurs */
proc gplot data=q0n;
  plot q0*no;
  plot q0*no=tday;
run;
quit;

proc insight data=q0n tools;
  scatter q0*no/ ms=1;
run;

data q0d;
  set q0n;
  length wday $ 1;
  dtu=intnx('MINUTE',dhms(mdy(1,1,1990),0,0,0),no*30);
  wday = putn(weekday(datepart(dtu)),'1.');
  date=datepart(dtu);
  time=timepart(dtu);
  format dtu datetime.
    date date.
    time time.;
  drop no;
run;

/* Vue par heure */
proc insight data=q0d tools;
  scatter q0*time / ms=1;
  dist tday;
run;

/* Vue par jour */
proc summary data=q0d;
  var q0;
  by date tday;
  output out=q0dd(drop=_type_ _freq_mean=;
run;

proc insight data=q0dd tools;
  scatter q0*date / ms=3;
  dist tday;
run;

/* Premier modele lag48 */
data prev1;
  set q0d;
  prev=lag48(q0);

  err=prev-q0;
  aerr=abs(err);
  aperr=aerr/q0;
run;

proc insight data=prev1;
  dist err aerr aperr;
  scatter err*dtu / ms=1;
  box err*tday;
run;

/* Deuxieme modele */

data prev2;
  set q0d;
  if tday='L' then prev=lag48(q0);
  else if tday='O' then prev=lag48(q0);
  else if tday='V' then prev=lag48(q0);
  else if tday='S' then prev=lag48(q0);
  else if tday='D' then prev=lag48(q0);

  err=prev-q0;
  aerr=abs(err);
  aperr=aerr/q0;
run;

proc insight data=prev2;
  dist err aerr aperr;
  scatter err*dtu / ms=1;
  scatter q0*prev / ms=1;
  box err*tday;
run;

/* Des valeurs manquantes */
/* Correction des gaps */
proc expand data=q0d out=q0dx from=MINUTE30;
  id dtu;
  convert q0/method=none;
run;

data q0m;
  set q0dx;
  date=datepart(dtu);
  time=timepart(dtu);
  if ranuni(0)<0.1 then q0=.;
run;

data prev2m;
  set q0m;
  if tday='L' then prev=lag48(q0);
  else if tday='O' then prev=lag48(q0);
  else if tday='V' then prev=lag48(q0);
  else if tday='S' then prev=lag48(q0);
  else if tday='D' then prev=lag48(q0);
run;

proc insight data=prev2m;
  scatter q0 prev*dtu / ms=1;
run;

/* Il reste des valeurs manquantes */

data prev3;
  set q0m;
  array past(5,48) _temporary_;
  retain past;
  code=index('LOVSD',tday); drop code;
  dh=time/1800+1; drop dh;
  prev=past(code,dh);
  if q0 ne . then do;
    past(code,dh)=q0;
    tcorr='0';
    corr=q0;
    _obstat_='01101    0    0    0';
  end; else do;
    corr=prev;
    tcorr='1';
    _obstat_='0110165535    0    0';
  end;
run;

proc insight data=prev3 tools;
  scatter q0 prev corr*dtu/ms=1;
  by date;
  scatter corr*time;
run;

/* Utilisation du time series viewer */

/* Correction des trous par des splines */
proc expand data=q0m out=q0mx;
  id dtu;
  convert q0=corr;
run;

data q0mx;
  set q0mx;
  if q0 ne . then do;
    tcorr='0';
    _obstat_='01101    0    0    0';
  end; else do;
    tcorr='1';
    _obstat_='0110165535    0    0';
  end;
run;

proc insight data=q0mx tools;
  scatter q0 corr*dtu / ms=1;
  by date;
  scatter corr*time;
run;