[ 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) ',';
input q0 no tday $;
run;
/* Tracé des valeurs */
proc gplot q0n;
plot q0*no;
plot q0*no=tday;
run;
quit;
proc insight q0n ;
scatter q0*no/ 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.');
datepart(dtu);
time=timepart(dtu);
format dtu datetime.
date date.
time time.;
drop no;
run;
/* Vue par heure */
proc insight q0d ;
scatter q0*time / 1;
dist tday;
run;
/* Vue par jour */
proc summary q0d;
var q0;
by date tday;
output q0dd(_type_ _freq_) ;
run;
proc insight q0dd ;
scatter q0*date / 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 prev1;
dist err aerr aperr;
scatter err*dtu / 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 prev2;
dist err aerr aperr;
scatter err*dtu / 1;
scatter q0*prev / 1;
box err*tday;
run;
/* Des valeurs manquantes */
/* Correction des gaps */
proc expand q0d q0dx from=MINUTE30;
id dtu;
convert q0/ none;
run;
data q0m;
set q0dx;
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 prev2m;
scatter q0 prev*dtu / 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 prev3 ;
scatter q0 prev corr*dtu/ 1;
by date;
scatter corr*time;
run;
/* Utilisation du time series viewer */
/* Correction des trous par des splines */
proc expand q0m 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 q0mx ;
scatter q0 corr*dtu / 1;
by date;
scatter corr*time;
run;