cϽ 1""2"2""2"22""SAS FILESASMACR CATALOG I]AZL}1A @ @o9.0101M2XP_PROIkkkI]A%14&V6gbAV6gbA2123n*04'V6gbAV6gbA2 124n427 -5gbA-5gbA1+*66onSYSRESR PGBITMAPXMACRO UPLOTSMACRO UNIVARIATE MACRO TWOWAYS|MACRO TERRORMACRO TABCODMACRO SUPERSM4MACRO STEMMACRO STATIONARITY MACRO STAMP,MACRO SQCOMB MACRO SAGRAPH MACRO RUNX13MACRO RUNX12V3MACRO RUNX12V2 `MACRO RUNTS MACRO RUNTRAMO`MACRO RESLINE P MACRO QQPLOTMAT MACRO QQPLOT MACRO PAT| MACRO MYFORMATS MACRO MTERROR MACRO MPOLISHMACRO MOVAV $MACRO MEDMOB MACRO LOOKTEST$ MACRO LINKSTS MACRO LETTER MACRO LECTRAMOXMACRO LECTERROR MACRO LECSEATS MACRO HP | MACRO HCAOFTS MACRO GRAPHICSH MACRO EXPAND MACRO EDITAIDES, MACRO DESCRIPTION MACRO DECOMPt MACRO DAINTIES MACRO CLUSTERP MACRO CHECKMODE MACRO CHARACTERISTICS_D MACRO CALENDARPMACRO BOXPLOTMACRO BNELSON XMACRO BKING MACRO BAYSEA MACRO ARIMA 4XLCH, o$(00XLSR ]A33[q1A  XLSR V=AV=A'4 F  XLSRC AC AU4H 4F  XLSR;tAAt2 fF  XLSR33[q1A33[q1AW 7F  XLSRABABA9 0F  XLSR\)ŏA)ŏAg4 F  XLSR}t>At>A~ %F XLSRKAKAh- F  XLSR#sZAsZA+D OF  XLSR  A  AI  F  XLSRffAffA-L QF  XLSRDq1Aq1Ao[ F  XLSR$p+?Ap+?A5D LF  XLSRAA.p@ F  j ` ` ` ` `jj `j` jjjjj j ` j jjjjj "tUPLOTShD9.2  0 >"0DATA"0VAR"0WORD"0DEBUG",FINMACRO/" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;" ":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"&(%LENGTH(&data ) EQ 0)"DATA" _last_""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"(&syserr NE 0)"?/ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;""%(%LENGTH(&var ) EQ 0)"VAR" _numeric_"%"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"%(&syserr NE 0)"=-ERROR: Problme dans le paramtre var (&var )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"%"  PROC CONTENTS DATA=&data(KEEP=&var) NOPRINT OUT=nomvar(KEEP=name type); RUN; DATA _NULL_; SET nomvar END=fin; IF (type=1) THEN DO; n+1; CALL SYMPUT('_var'||LEFT(PUT(n,3.)),name); END; IF fin THEN CALL SYMPUT('_nvar',LEFT(PUT(n,3." ))); RUN;"%/I1&_nvar1" PROC SORT DATA=&data(KEEP=&&_var&i) OUT=_trav_; BY &&_var&i; RUN; DATA _trav_; SET _trav_ END=fin; BY &&_var&i; IF &&_var&i ^=.; RETAIN stack dot maxstack 0; IF FIRST.&&_var&i THEN DO; jitt=0; stack=0; END; IF (&"&_var&i=LAG(&&_var&i)) THEN DO; jitt=RANUNI(0); stack=stack+1; IF (stack > maxstack) THEN maxstack=stack; END; IF fin THEN CALL SYMPUT('mstack',LEFT(PUT(1.1*maxstack,3.))); RUN; PROC GPLOT DATA=_trav_; SYMBOL I=none C=black V="~circle; PLOT dot*&&_var&i; PLOT jitt*&&_var&i; PLOT stack*&&_var&i / VAXIS= 0 TO &mstack BY &mstack ; RUN; QUIT;"%.(%LENGTH(&word) NE 0)" OPTIONS PS=500; DATA _NULL_; SET _trav_; FILE PRINT; IF _N_=1 THEN PUT "&&_var&i ; dot;stack;jitt"; PUT &&_var&i (dot stack jitt)(+1 ';'); RUN; OPTIONS;".""#00`4H,\4Hp "tMTERRORB9.1  tt>"0LIBSAS"0FILETXT"0DDATE"0DEASTER"0DIDUR"0DTRAD"0DVA"0DSENS"0FOUT"0FSUMM"0DDTRAMO"  LIBNAME lib "&libsas"; DATA _null_; xx=TRIM("&libsas") || '\'; xx=TRANWRD(xx,'\\','\'); CALL SYMPUT('libsas',xx); RUN; X "dir / B /S &libsas.*.sas7bdat > &filetxt"; DATA _NULL_; INFILE "&filetxt" END=fin LENGTH=l; INPUT xx $VARYING100. l;" xx=LEFT(TRANWRD(xx,"&libsas",'')); CALL SYMPUT('fich'||LEFT(PUT(_N_,2.)),SCAN(xx,1,'.')); IF fin THEN CALL SYMPUT('nbfich',LEFT(PUT(_N_,2.))); RUN;"'ZZ1&nbfich1" lib.&&fich&zz" %Terror(DATA=lib.&&fich&zz,TSERIES=,ADD=,DATE=&ddate,OUT=_terror_,SUMM=_summ_,DTRAMO=&ddtramo, EASTER=&deaster,TRAD=&dtrad,IDUR=&didur,VA=&dva,SENS=&dsens,EXCEL=,DEBUG=); DATA &fout; SET" (&zz NE 1)" &fout""/# _terror_; RUN; DATA &fsumm;" (&zz NE 1)" SET &fsumm;""rf SET _summ_; RUN; PROC DATASETS LIBRARY=work NOLIST; DELETE _terror_ _summ_; RUN; QUIT;""I= DATA &fsumm; SET &fsumm; Total=SUM(OF _numeric_); RUN;"t#0` P ,\x$p "tLECSEATSC9.1   T>"0DIR"0TABOUT"0TABSER"0PRINT"  DATA sgeneral; INFILE "&dir.\sgeneral.m" FIRSTOBS=5 RECFM=V LRECL=30000; LENGTH nser 4 series $ 32 Model_S $ 15 Preadj Mchanged ApproxNA Spec_Fact Check_ACF Check_CCF DCM_TC DCM_S DCM_U DCM_Tr $ 1; DROP p d q bp bd bq star; INPUT nser" 1-4 star $ 5-7 series $ @; series=LEFT(TRIM(TRANWRD(series,'"',' '))); IF (star^=' ') THEN RETURN; ELSE DO; INPUT Preadj $ Mchanged $ ApproxNA $ S_Mean p d q bp bd bq SD_a Spec_Fact $ Check_ACF $ Check_CCF $ DCM_TC $ DCM_S $ DCM_U $" DCM_Tr $; Model_S=COMPRESS('('||PUT(p,2.)||','||PUT(d,2.)||','||PUT(q,2.)||')('||PUT(bp,2.)||','||PUT(bd,2.)||','||PUT(bq,2.)||')'); END; RUN; DATA _NULL_; INFILE "&dir.\sparami.m" FIRSTOBS=6 LENGTH=l LRECL=30000; LENGTH xx $ 5000;"  INPUT xx $VARYING5000. l @; xx=TRANWRD(xx,'*********',' . '); FILE "&dir.\temptt.txt" RECFM=V LRECL=30000; PUT xx $; RUN; DATA sparami; INFILE "&dir.\temptt.txt" RECFM=V LRECL=30000; LENGTH nser 4 series $ 32 star $ 8; DROP"  star aa; INPUT star $ series $ @; series=LEFT(TRIM(TRANWRD(series,'"',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.); IF (aa^=1) THEN RETURN; ELSE INPUT SDi_TC SDi_S"  SDi_Tr SDi_U SDi_SA SE_est_TC SE_est_SA SE_rev_TC SE_rev_SA T11_TC T11_SA T1Mq_X T1Mq_TC T1Mq_SA; RUN; DATA sparamii; INFILE "&dir.\sparamii.m" FIRSTOBS=6 RECFM=V LRECL=30000; DROP star; LENGTH nser 4 series $ 32 star $ 3; INPUT nser 1-4"  star $ 5-7 series $ @; series=LEFT(TRIM(TRANWRD(series,'"',' '))); IF (star^=' ') THEN RETURN; ELSE INPUT Cv1Y_TC Cv1Y_SA Cv5Y_TC Cv5Y_SA SS_H SS_P SS_F DAA_TC DAA_SA; RUN; DATA &tabout; MERGE sgeneral sparami sparamii; BY nser;"  IF FIRST.nser; RUN; DATA &tabser; INFILE "&dir.\table-s.out" LENGTH=l LRECL=30000 END=fin; RETAIN series; LENGTH m $ 7 series $ 32 per 3 year 4; DROP m; INPUT m $VARYING7. l @; IF INDEX(m,'-') THEN DO; per=INPUT(SCAN(m,1,'-'"),2.); IF (per > 0) THEN DO; INPUT xx TrendCycle SAseries Seasonal Calendar TransIR Preadj Eresid; year=INPUT(SCAN(m,2,'-'),4.); END; ELSE DO; per=.; END; OUTPUT; END; ELSE IF ((m=' ') OR (LEFT(m)=:'DATE'))" THEN DELETE; ELSE DO; INPUT @1 series $; series=SCAN(series,1,'('); series=TRANWRD(series,'"',' '); series=COMPBL(LEFT(series)); END; RUN;"((%UPCASE(&print) EQ YES)"  X "del &dir.\table-s.out"; X "del &dir.\p*.out"; X "copy &dir.\*.out &dir.\series.txt"; OPTIONS LS=250 PS=1000; DATA _NULL_; INFILE "&dir.\series.txt" LENGTH=l END=fin; INPUT xx $VARYING200. l @; FILE PRINT; IF ((xx=' ')"l` AND (LAG(xx)=' ')) THEN DELETE; xx=' ' || SUBSTR(xx,2); PUT xx $VARYING200. l ; RUN;""T#0`   p &"tEXPANDC9.1  L4>"0DATA"0VLIST"0VTYPE"0CONTROL", FINCONTROL;",FINMACROK" (&control NE)" FINCONTROL" "  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index" GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;""&#(%LENGTH(&vlist) EQ 0)";+ERROR: The vtype parameter must be precised"FINMACRO" ;"*"E9 DATA _NULL_; SET &data (KEEP=&vlist OBS=1); RUN;"*(&syserr NE 0)"J:ERROR: There is a problem in the vlist (&vlist ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"*"';(%LENGTH(&vtype ) NE 0)">0.(%LENGTH(%QSCAN(%BQUOTE(&vtype ),2, )) NE 0)"XHERROR: You must precise just one value for the vtype (&vtype ) parameter"FINMACRO" ;"0"+5(%DATATYP(&vtype ) EQ CHAR)"D4ERROR: The vtype (&vtype ) parameter must be numeric"FINMACRO" ;":"1:!((&vtype NE 1) AND (&vtype NE 2))"QAERROR: The vtype (&vtype ) parameter must be choosen among (1 2 )"FINMACRO" ;":";"  OLIST;"ERRTYPE" 0" PROC CONTENTS DATA=&data(KEEP=&vlist) NOPRINT OUT=_nomvar_(KEEP=name type); RUN; DATA _null_; LENGTH liste $ 32000; RETAIN liste ' ' erreur 0; SET _nomvar_ END=fin; liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name));"B (&vtype NE)"* erreur + (type ^= &vtype);"B" IF fin THEN DO; PUT liste=; CALL SYMPUT('olist',TRIM(LEFT(liste))); CALL SYMPUT('errtype',TRIM(LEFT(PUT(erreur,10.)))); END; RUN;"K(&errtype NE 0)"GXLSRAAc F  XLSRUAUA1  F  XLSRAAB@ F  XLSR%A%A% F  XLSRAA^p F  XLSR8A 8A1d F  XLSRCACA(* F  XLSR '1`A&aA {, oF  XLSR ^ItA^ItA8 aF  XLSR{A{A{l F  XLSR|jAjA~; F  XLSRAA_#| *F  XLSRԌAԌAo$ HF  XLSRW3WBA4WBA*u F  XLSRAAyV  <F XLSR46A46A  fF  XLSR~كAكA^d F  XLSR.AA<8 PF  XLSR beBAbeBAE F  XLSR$3A3AB  gF  XLSR`UPA`UPAB  F  XLSRkAkAr F  XLSR!pAtA<qX NF  XLSRr@Ar@AM`4 &F  XLSR)MUAMUAd( @F  XLSRGBAGBA~j# FF  XLSRR}AA>f  F  XLSR"[A`A3X F  XLSRpt0Apt0Ao[ "F  XLSR楽A楽AK&8 gF  XLSR AA) F  XLSRA"AUAT F  XLSRG$A$A4 hF  XLSRPXATXA1? F  XLSR"UA"UAx F XLSR`AbAT=P F   "tGRAPHICSdH9.2  >"0DATA"0DATE"0VAR"0DIF"0LOG"0PARTINV"0SMOOTH"0EPS"0JPG"0DEBUG" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"&(%LENGTH(&data ) NE 0)"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""1% DATA _NULL_; SET &data ; RUN;"(&syserr NE 0)"@0ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;"""DATA" _last_"&(%LENGTH(&date ) NE 0)"=-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre date (&date )"FINMACRO" ;"""DATE" date"VJ DATA _NULL_; SET &data (KEEP=_NUMERIC_); ARRAY _xx_(*) &date ; RUN;"(&syserr NE 0)"@0ERROR: Problme dans le paramtre date (&date )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;""%(%LENGTH(&var ) NE 0)"YM DATA _NULL_; SET &data (KEEP=_NUMERIC_); ARRAY _xx_(*) &var ; RUN;"(&syserr NE 0)">.ERROR: Problme dans le paramtre var (&var )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"""VAR" _NUMERIC_"((%LENGTH(&smooth ) NE 0)"?/(%LENGTH(%QSCAN(%BQUOTE(&smooth ),2, )) NE 0)"`PERROR: Vous devez prciser une seule valeur pour le paramtre smooth (&smooth )"FINMACRO" ;"",(%DATATYP(&smooth ) EQ CHAR)"TDERROR: La valeur du paramtre smooth (&smooth ) doit tre numrique"FINMACRO" ;""4$((&smooth LE 0 ) OR (&smooth GE 1 ))":*ERROR: Vous devez avoir 0 < &smooth < 1"""SMOOTH" 0.25"$(%LENGTH(&dif) EQ 0)"DIF" NO""DIF" YES"$(%LENGTH(&log) EQ 0)"LOG" NO""LOG" YES"((%LENGTH(&partinv) EQ 0)"PARTINV" NO""PARTINV" YES"  PROC FORMAT; VALUE fm "tSTAMPWH9.2   %4>"0DATA"0TSERIES"0DATE"0LAM"1ORDER2"1SORDER1"0VARREG"0REGEFF"0OUT"0OUTTYPE"0DEBUG",FINMACRO" (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;""TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"%"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"%(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"%"%)(%LENGTH(&out ) EQ 0)"OUT" _results_"4"<.,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"."0$ %sasnom(_IN_=&out ,TYPE=DATASET);"4 (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"4")8(%LENGTH(&outtype ) EQ 0)"OUTTYPE" 2"G"@=0(%LENGTH(%QSCAN(%BQUOTE(&outtype ),2, )) NE 0)"\LERROR: You must precise just one value for the outtype (&outtype ) parameter"FINMACRO" ;"="-B(%DATATYP(&outtype ) EQ CHAR)"H8ERROR: The outtype (&outtype ) parameter must be numeric"FINMACRO" ;"G"5G%((&outtype NE 1) AND (&outtype NE 2))"UEERROR: The outtype (&outtype ) parameter must be choosen among (1 2 )"FINMACRO" ;"G")K(%LENGTH(&tseries ) EQ 0)"TSE IM(LEFT(formats)) ^='0') THEN DO; b=INDEX(formats,'$'); IF (((type=1) AND (b^=0)) OR ((type=2) AND (b=0))) THEN error4 +1; END; IF fin THEN DO; CALL SYMPUT('error1',TRIM(LEFT(PUT(error1,5.))));"  CALL SYMPUT('error2',TRIM(LEFT(PUT(error2,5.)))); CALL SYMPUT('error3',TRIM(LEFT(PUT(error3,5.)))); CALL SYMPUT('error4',TRIM(LEFT(PUT(error4,5.)))); CALL SYMPUT('trueform',TRIM(LEFT(listform))); CALL SYMPUT('newform',TRIM(LEFT(newform)));"th CALL SYMPUT('newvar',TRIM(LEFT(newvar))); CALL SYMPUT('groups',TRIM(LEFT(listgrp))); END; RUN;"J:groups= &groups vrank= &vrank grank=&grank nbrank= &nbrank"UEformats= &formats trueform= &trueform newform=&newform newvar=&newvar">.((&error1 + &error2 + &error3 + &error4) NE 0)"(&error1 NE 0)"WGERROR: the GROUPS parameter should have only numeric and integer values""(&error2 NE 0)"TDERROR: the GROUPS parameter should have only positive integer values""(&error3 NE 0)"F6ERROR: 1 is not a valid value for the GROUPS parameter""(&error4 NE 0)"TDERROR: Non valid format ? Format type does not match Variable type ?""FINMACRO" ;""v DATA _trav_; SET &data; KEEP &respvar &vars; IF MISSING(%SCAN(&vars,1))+MISSING(%SCAN(&vars,2)); RUN;"(&nbrank GE 1)"&I1&nbrank1"k_ PROC RANK DATA=_trav_ GROUP=&&grank&i OUT=_trav_; VAR &&vrank&i; RANKS r&i; RUN;"GRANK&I"" %EVAL(&&grank&i-1)""<0 PROC SUMMARY DATA=_trav_ NOPRINT; CLASS"&I1&nbrank1" r&i""; VAR &respvar"&I1&nbrank1" &&vrank&i""; OUTPUT OUT=_table_(DROP=min) &stat=&respvar MIN=min min1-min&nbrank MAX=max max1-max&nbrank; RUN; PROC MEANS DATA=_table_ NOPRINT; VAR max max1-max&nbrank; OUTPUT OUT=maxv MAX=; RUN; DATA _aa_; SET _trav_; ARRAY vvar &respvar"&I1&nbrank1" &&vrank&i""; ARRAY l $ l0-l&nbrank; ARRAY ll ll0-ll&nbrank; ARRAY dd dd0-dd&nbrank; ARRAY ii ii0-ii&nbrank; DO OVER vvar; l=LEFT(PUT(vvar,BEST30.)); ll=LENGTH(TRIM(LEFT(PUT(vvar,BEST30.)))); ii=INDEX(l,'.'); IF ii THEN dd=ll-ii;"  ELSE dd=0; END; RUN; PROC MEANS DATA=_aa_ NOPRINT; VAR ll0-ll&nbrank dd0-dd&nbrank; OUTPUT OUT=maxv MAX=; RUN; DATA _aa_; SET maxv; CALL SYMPUT('nform0',COMPRESS(TRIM(LEFT(PUT(ll0+3,30.))) || '.' || TRIM(LEFT(PUT(dd0+2,"H<30.))))); CALL SYMPUT('maxd',TRIM(LEFT(PUT(dd0+2,30.))));"&I1&nbrank1" CALL SYMPUT("nform&i",COMPRESS(TRIM(LEFT(PUT(ll&i,30.))) || '.' || TRIM(LEFT(PUT(dd&i,30.))))); CALL SYMPUT("max&i",TRIM(LEFT(PUT(ll&i+dd&i+12,30.))));""1% RUN; DATA _null_; SET _table_"(&nbrank GT 1)"/# (WHERE=(NMISS(r1-r&nbrank)=1))"" ;"&I1&nbrank1" IF (r&i^=.) THEN DO; CALL SYMPUT("rmin&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(min&i,&&nform&i)))); CALL SYMPUT("rmax&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(max&i,&&nform&i)))); n&i+1; END;""" RUN; PROC FORMAT;"&I1&nbrank1" VALUE fr&i._"( J0&&grank&i1"7+ & "tLETTERhD9.2  '>"0DATA"0VAR"0ID"0DEC"0SPREAD"0DETAIL"0MEAN"0TRONQ"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"&(%LENGTH(&data ) EQ 0)"DATA" _last_""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"(&syserr NE 0)"?/ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;""%#(%LENGTH(&var ) EQ 0)"VAR" _numeric_"*"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"*(&syserr NE 0)"=-ERROR: Problme dans le paramtre var (&var )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"*"$3(%LENGTH(&id ) NE 0)"[O DATA _NULL_; SET &data (KEEP=&id OBS=1); ARRAY _xx_(*) $ &id ; RUN;"2(&syserr NE 0)";+ERROR: Problme dans le paramtre id (&id )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"2"3"%7(%LENGTH(&dec ) EQ 0)"DEC" 2"F"<<,(%LENGTH(%QSCAN(%BQUOTE(&dec ),2, )) NE 0)"YIERROR: Vous devez prciser une seule valeur pour le paramtre dec (&dec )"FINMACRO" ;"<")A(%DATATYP(&dec ) EQ CHAR)"M=ERROR: La valeur du paramtre dec (&dec ) doit tre numrique"FINMACRO" ;"F"F (&dec LE 0 )"1!ERROR: Vous devez avoir &dec > 0"FINMACRO" ;"F"(J(%LENGTH(&spread ) EQ 0)"SPREAD" oui"Y"?O/(%LENGTH(%QSCAN(%BQUOTE(&spread ),2, )) NE 0)"_OERROR: Vous devez prciser une seule valeur pour le paramtre spread (&spread )"FINMACRO" ;"O"+T(%DATATYP(&spread ) EQ NUM)"SCERROR: La valeur du paramtre spread (&spread ) doit tre caractre"FINMACRO" ;"Y"IY9((%UPCASE(&spread) NE OUI) AND (%UPCASE(&spread) NE NON))"bRERROR: La valeur du paramtre spread (&spread ) doit tre choisie parmi (oui non )"FINMACRO" ;"Y"(](["t DESCRIPTIONgG9.2  8$8>"0DATA"0VAREXP"0CLUSNAME"0FORMAT"0PRINTTO"0DEBUG",FINMACRO" (&debug NE)"C7 OPTIONS MPRINT NOTES NOXWAIT NOCENTER LS=250 PS=500;" "QE OPTIONS NOMPRINT NONOTES NOXWAIT NOSOURCE2 NOCENTER LS=250 PS=500;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_" "=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;" (&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;" "(%(%LENGTH(&varexp ) EQ 0)"YIERROR: You must precise some variables in the varexp (&varexp ) parameter"FINMACRO" ;","F: DATA _NULL_; SET &data (KEEP=&varexp OBS=1); RUN;",(&syserr NE 0)"L<ERROR: There is a problem in the varexp (&varexp ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;","*1(%LENGTH(&clusname ) EQ 0)">.ERROR: You must precise the clusname parameter"FINMACRO" ;"A"A61(%LENGTH(%QSCAN(%BQUOTE(&clusname ),2, )) NE 0)"^NERROR: You must precise just one value for the clusname (&clusname ) parameter"FINMACRO" ;"6"H< DATA _NULL_; SET &data (KEEP=&clusname OBS=1); RUN;"=(&syserr NE 0)"P@ERROR: There is a problem in the clusname (&clusname ) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"=" PROC CONTENTS DATA=&data(KEEP=&clusname) OUT=_nomvar_(KEEP=name type) NOPRINT; RUN; DATA _NULL_; SET _nomvar_; CALL SYMPUT('vtype',TRIM(LEFT(PUT(type,2.)))); RUN;"A (&vtype NE 2)"ueWARNING: The clusname (&clusname) variable is numeric. It will be transformed in a character variable"t LECTERRORB9.1  g@,>"0DIR"0TABOUT"0FSTAT"  DATA _NULL_; INFILE "&dir.\tarmapar.m" LENGTH=l LRECL=30000; LENGTH xx yy $ 5000; INPUT xx $VARYING5000. l @; yy=SCAN(REVERSE(xx),1,'"'); * On peut n'avoir que des blancs !!; IF (yy=' ') THEN DO; xx=TRIM(xx) || ' . . . . . ." . . . . . . . . . .'; END; * Cas usuel ; ELSE DO; xx=TRANWRD(xx,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' '); xx=TRANWRD(xx,',','" '); * les t-values sont imprimes sur 4 positions seulement donc on peut avoir dpassement de format; xx=TRANWRD(xx,'****',' . '); END; xx=TRANWRD(xx,'"',' '); xx=COMPBL(LEFT(xx)); FILE "&dir.\temptt.txt"_S" RECFM=V LRECL=30000; PUT xx $; RUN; DATA tarmapar; INFILE "&dir.\temptt.txt"" FIRSTOBS=2 RECFM=V LRECL=30000; LENGTH nser 4 series $ 32 star $ 8 Phi1 Phi1_t Phi2 Phi2_t Phi3 Phi3_t BPhi Bphi_t Th1 Th1_t Th2 Th2_t Th3 Th3_t BTh Bth_t 8; DROP star aa; INPUT star $ series $ @; series=LEFT(TRIM(TRANWRD(series,'""NB'," "))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789"XL'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.); IF (aa^=1) THEN RETURN; ELSE INPUT Phi1 Phi1_t Phi2 Phi2_t Phi3 Phi3_t BPhi Bphi_t Th1 Th1_t Th2 Th2_t Th3 Th3_t BTh Bth_t; RUN; DATA _NULL_; INFILE "&dir.\tcalend.m" LENGTH=l LRECL=30000; LENGTH xx yy $ 5000; INPUT xx $VARYING5000. l @; yy=SCAN(REVERSE(xx),1,'""'); /* On peut n'avoir que des blancs !! */ IF (yy=' ') THEN DO; xx=TRIM(xx) || ' . . . . . . . . . . . . . . . .'; END; /* Cas usuel */ ELSE DO; xx=TRANWRD(xx,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' '); xx=TRANWRD(xx,',',' '); /* les t-values sont imprimes sur 4 positions seulement donc on peut avoir dpassement de format */ xx=TRANWRD(xx,'****',' . '); END; xx=TRANWRD(xx,'""','" '); xx=COMPBL(LEFT(xx)); FILE "&dir.\temptt.txt" RECFM=V LRECL=30000; PUT xx $; RUN; DATA tcalend; INFILE "&dir.\temptt.txt" FIRSTOBS=2 RECFM=V LRECL=30000; LENGTH nser 4 series $ 32 star $ 8 TDeffect LYeffect Eeffect $ 3 TD1 TD1_t TD2 TD2_t TD3 TD3_t TD4 TD4_t TD5 TD5_t TD6 TD6_t LY LY_t EE EE_t 8; DROP star aa; ARRAY td TD1_t TD2_t TD3_t TD4_t TD5_t TD6_T; INPUT star $ series $ @; series=LEFT(TRIM(TRANWRD(series,'""',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.); IF (aa^=1) THEN RETURN; ELSE INPUT TD1 TD1_t TD2 TD2_t TD3 TD3_t TD4 TD4_t TD5 TD5_t TD6 TD6_t LY LY_t EE EE_t; TDeffect='No '; Eeffect='No '; LYeffect='No '; DO OVER td; IF (ABS(td) > 2) THEN TDeffect='Yes'; END; IF (ABS(LY_t) > 2) THEN LYeffect='Yes'; IF (ABS(EE_t) > 2) THEN Eeffect='Yes'; RUN; DATA _NULL_; INFILE ""&dir.\tdeterm.m" LENGTH=l LRECL=30000; LENGTH xx yy $ 5000; INPUT xx $VARYING5000. l @; yy=SCAN(REVERSE(xx),1,'"'); /* On peut n'avoir que des blancs !! */ IF (yy=' ') THEN DO; xx=TRIM(xx) || ' . . . . . . . . . . . . . . . .'; END;"  ELSE DO; xx=TRANWRD(xx,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' '); xx=TRANWRD(xx,',',' '); END; xx=TRANWRD(xx,'"',' '); xx=COMPBL(LEFT(xx)); FILE "&dir.\temptt.txt" RECFM=V" LRECL=30000; PUT xx $; RUN; DATA tdeterm; INFILE "&dir.\temptt.txt" FIRSTOBS=2 RECFM=V LRECL=30000 END=fin; RETAIN yesreg yesout 0; LENGTH nser 4 series $ 32 star $ 8 TD Easter Outliers AO TC LS REG MO 4; DROP star aa yesreg yesout;" ARRAY varx TD Easter Outliers AO TC LS REG MO; INPUT star $ series $ @; series=LEFT(TRIM(TRANWRD(series,'"',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.); IF (aa^=1)" THEN DO; DO OVER varx;varx=0;END; END; ELSE DO; INPUT TD Easter Outliers AO TC LS REG MO; END; CALL SYMPUT('ao'||LEFT(PUT(nser,5.)),LEFT(PUT(MAX(ao,0),5.))); CALL SYMPUT('tc'||LEFT(PUT(nser,5.)),LEFT(PUT(MAX(tc,0),5.))); CALL"  SYMPUT('ls'||LEFT(PUT(nser,5.)),LEFT(PUT(MAX(ls,0),5.))); CALL SYMPUT('reg'||LEFT(PUT(nser,5.)),LEFT(PUT(MAX(reg,0),5.))); yesreg=MAX(yesreg,MAX(reg,0)); yesout=MAX(yesout,MAX(outliers,0)); IF fin THEN DO; CALL SYMPUT('yesreg',LEFT(PUT((" yesreg > 0),2.))); CALL SYMPUT('yesout',LEFT(PUT((yesout > 0),2.))); END; RUN; DATA _NULL_; INFILE "&dir.\tfit.m" LENGTH=l LRECL=30000; LENGTH xx yy $ 5000; INPUT xx $VARYING5000. l @; yy=SCAN(REVERSE(xx),1,'"'); IF (yy=' ')" THEN DO; xx=TRIM(xx) || ' . . . . . . . . . . . . . . . . . .'; END; ELSE DO; xx=TRANWRD(xx,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' '); xx=TRANWRD(xx,',',' '); xx="TRANWRD(xx,'*****',' . '); xx=TRANWRD(xx,'***',' . '); END; xx=TRANWRD(xx,'"',' '); xx=COMPBL(LEFT(xx)); FILE "&dir.\temptt.txt" RECFM=V LRECL=30000; PUT xx $; RUN; DATA tfit; INFILE "&dir.\temptt.txt" FIRSTOBS=2 LENGTH=l" LRECL=30000 END=fin; LENGTH nser 4 series $ 32 star $ 8 Nobs Lam Mean P D Q BP BD BQ 4 Model_T $ 15 SE_res BIC Qval Norm Skewness Kurtosis RUNS QS Q2val 8; LABEL QS = 'Pierce seasonality test on residuals' ProbQS =" 'P-value (Pierce seasonality test on residuals)' Skewness = 'T-test (H0: Skewness=0)' Kurtosis = 'T-test (H0: Kurtosis=3)' SE_res = 'Standard error of residuals' BIC = 'Bayesian Information Criterion' Runs ="  'T-test for Randomness in signs of residuals' Lam = 'Transformation (0 = Logs, 1 = Levels)' Mean = 'Model with mean (0 = no mean)' Norm = 'Bowman-Shenton normality test' Qval = 'Ljung-Box test on residuals' Q2val ="  'Ljung-Box test on squared residuals' ; DROP star aa; INPUT star $ series $ @; series=LEFT(TRIM(TRANWRD(series,'"',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.); IF (" aa^=1) THEN RETURN; ELSE DO; INPUT Nobs Lam Mean P D Q BP BD BQ SE_res BIC Qval Norm Skewness Kurtosis QS Q2val RUNS; ProbQS=1-PROBCHI(QS,2); END; IF (Lam ^=.) THEN Model_T=COMPRESS('('||PUT(p,2.)||','||PUT(d,2.)||','||PUT(q,2.")||')('||PUT(bp,2.)||','||PUT(bd,2.)||','||PUT(bq,2.)||')'); IF fin THEN CALL SYMPUT('_nser',LEFT(PUT(nser,5.))); RUN; DATA _NULL_; SET &fstat(KEEP=period); CALL SYMPUT('per'||LEFT(PUT(_N_,5.)),LEFT(PUT(period,5.))); RUN; DATA _NULL_;" INFILE "&dir.\toutlier.m" LENGTH=l LRECL=30000; LENGTH xx yy $ 5000; INPUT xx $VARYING5000. l @; yy=SCAN(REVERSE(xx),1,'"'); IF (yy=' ') THEN DO; xx=TRIM(xx) ||" ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .'; END; ELSE DO; xx=TRANWRD(xx,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' '); xx="TRANWRD(xx,',',' '); xx=TRANWRD(xx,';',' '); xx=TRANWRD(xx,'******',' . '); END; xx=TRANWRD(xx,'"',' '); xx=COMPBL(LEFT(xx)); FILE "&dir.\temptt.txt" RECFM=V LRECL=30000; PUT xx $VARYING5000. l; RUN; DATA toutlier;"ui INFILE "&dir.\temptt.txt" RECFM=V LR"tTERRORB9.1  1H>"0DATA"0TSERIES"0ADD"0DATE"0EASTER"0IDUR"0TRAD"0VA"0SENS"0OUT"0SUMM"0DTRAMO"0EXCEL"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  DATA ___tt___; start=DATETIME(); RUN; %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %"LET index=%INDEX(&table,.); %IF (&index GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%" VERIFY(&lib,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY("{&table,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"("=!-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"!"8, DATA _NULL_; SET &data (OBS=1); RUN;"((&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"("%,(%LENGTH(&out ) EQ 0)"OUT" _result_"7"<1,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"1"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"7 (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"7"(;(%LENGTH(&easter ) EQ 0)"EASTER" 0"J"?@/(%LENGTH(%QSCAN(%BQUOTE(&easter ),2, )) NE 0)"ZJERROR: You must precise just one value for the easter (&easter ) parameter"FINMACRO" ;"@",E(%DATATYP(&easter ) EQ CHAR)"F6ERROR: The easter (&easter ) parameter must be numeric"FINMACRO" ;"J"GJ7((&easter NE 0) AND (&easter NE 1) AND (&easter NE -1))"VFERROR: The easter (&easter ) parameter must be choose"tBOXPLOThD9.2  7x>"0DATA"0TYPE"0VAR"0GROUP"0STD"0ID"0FORMATID"0BOXSTY"0NOTCHES"0LABEL"0TITLE"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"%(%LENGTH(&data) EQ 0)"DATA" _last_""<,(%LENGTH(%QSCAN(%BQUOTE(&data),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data) parameter"FINMACRO" ;""5) DATA _NULL_; SET &data(OBS=1) ; RUN;""(&syserr NE 0)"H8ERROR: There is a problem in the data (&data) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"""/# DATA __trav__; SET &data; RUN;"%)(%LENGTH(&var ) EQ 0)"VAR" _NUMERIC_"GROUP" ")"YM DATA _NULL_; SET __trav__ (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"0(&syserr NE 0)"G7ERROR: There is a problem in the var (&var ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"0"%>(%LENGTH(&id ) NE 0)"=6-(%LENGTH(%QSCAN(%BQUOTE(&id ),2, )) NE 0)"UEERROR: You must precise just one value for the data (&id ) parameter"FINMACRO" ;"6"[O DATA _NULL_; SET __trav__ (KEEP=&id OBS=1); ARRAY _xx_(*) &id ; RUN;"=(&syserr NE 0)"E5ERROR: There is a problem in the id (&id ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"=">"&L(%LENGTH(&group) NE 0)"=D-(%LENGTH(%QSCAN(%BQUOTE(&group),2, )) NE 0)"WGERROR: You must precise just one value for the group (&group) parameter"FINMACRO" ;"D"aU DATA _NULL_; SET __trav__ (KEEP=&group OBS=1); ARRAY _xx_(*) &group ; RUN;"K(&syserr NE 0)"K;ERROR: There is a problem in the group (&group ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"K"L"&P(%LENGTH(&type ) EQ 0)"TYPE" 0"d"=U-(%LENGTH(%QSCAN(%BQUOTE(&type ),2, )) NE 0)"WGERROR: You must precise just one value for the type (&type ) parameter"FINMACRO" ;"Uois 1='JAN' 2='FEB' 3='MAR' 4='APR' 5='MAY' 6='JUN' 7='JUL' 8='AUG' 9='SEP' 10='OCT' 11='NOV' 12='DEC'; VALUE ftrim 1='Q1' 2='Q2' 3='Q3' 4='Q4'; VALUE njm 25-35=12 50-70=6 80-100=4 115-135=3 175-195=2;" RUN; PROC CONTENTS DATA=&data(KEEP=&var) NOPRINT OUT=nomvar; RUN; DATA _NULL_; SET nomvar END=fin; IF (UPCASE(name) ^= UPCASE("&date")) THEN DO; n+1; CALL SYMPUT('_var'||LEFT(PUT(n,3.)),TRIM(name)); END; IF fin THEN CALL SYMPUT("*'nvar',LEFT(PUT(n,3.))); RUN;"$I1&nvar1"  TITLE "Variable &&_var&i"; DATA seas; SET &data END=fin; RETAIN neg 0 dtmin dtmax; IF (&&_var&i ^=.) THEN DO; ndon+1; dtmax=&date; IF (ndon=1) THEN dtmin=&date; END; IF fin THEN DO; period=PUT((dtmax-dtmin)/ndon,"njm.); CALL SYMPUT('per',period); CALL SYMPUT('minan','A'||PUT(YEAR(dtmin),4.)); CALL SYMPUT('maxan','A'||PUT(YEAR(dtmax),4.)); END; IF (&&_var&i ^=.); DifVar=DIF(&&_var&i); RUN;" (&per EQ 12)"FORM" fmois."FORMD" MONYY5."MOIS"? /JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC"" (&per EQ 4)"FORM" ftrim."FORMD" YYQ4."MOIS" Q1 Q2 Q3 Q4""O?ERROR: La srie &&_var&i nest ni mensuelle ni trimestrielle"FINSER" ;"  PROC SORT DATA=seas OUT=seas; BY &date; RUN; DATA seas; SET seas END=fin; KEEP &date per mois year an &&_var&i DifVar; IF (&per=4) THEN per=QTR(&date); ELSE per=MONTH(&date); year=YEAR(&date); an='A'||PUT(year,4.);"  mois=PUT(per,&form); RUN; PROC SORT DATA=seas OUT=_a_; BY per year; RUN; PROC TRANSPOSE DATA=_a_ OUT=_b_; ID an; VAR &&_var&i; BY per; RUN; PROC MEANS DATA=_a_ NOPRINT; BY per; VAR &&_var&i; OUTPUT OUT=stats(" DROP=_type_ ) MEAN=avg; RUN; PROC SORT DATA=stats OUT=sort; BY DESCENDING _freq_; RUN; DATA _null_; SET sort(OBS=1); LENGTH tick nper nref $ 200; RETAIN tick nref nper ' '; nmax=2*INT((_freq_+1)/2)+3; jj=INT(nmax/2); kk=&per*"nmax; DO per=1 TO kk BY nmax; per2=per+jj; a=PUT(per2,4.); b=PUT(per,4.); nref=COMPBL(nref || ' ' || b); tick=COMPBL(tick || ' ' || b || ' ' || a); END; c=PUT(kk,4.); nref=COMPBL(nref || ' ' || c); tick=COMPBL(tick ||" ' ' || c); CALL SYMPUT('_nmax_',nmax); CALL SYMPUT('tick',LEFT(TRIM(tick))); CALL SYMPUT('nref',LEFT(TRIM(nref))); RUN; DATA _a_; MERGE _a_ stats;BY per; KEEP &&_var&i nobs per avg; RETAIN n; IF (FIRST.per) THEN DO; n=0;" a=&&_var&i; DO i=1 TO 2; &&_var&i=.; nobs+1; n+1; OUTPUT; END; &&_var&i=a; END; nobs+1; n+1; OUTPUT; IF (LAST.per) THEN DO UNTIL (n=&_nmax_); &&_var&i=.; nobs+1; n+1; OUTPUT; END; RUN; DATA _a_; SET _a_;"0$ IF &&_var&i=. THEN avg=.; RUN;" &SYSVER >= 7"  PROC UNIVARIATE DATA=seas NOPRINT; VAR &&_var&i; OUTPUT OUT=outloess MIN=min MAX=max; RUN; DATA _NULL_; SET outloess; max=MAX(ABS(min),ABS(max)); power=INT(ROUND(LOG10(max)))-4; CALL SYMPUT('power',PUT(MAX(power,1)," 3.)); RUN; DATA seasloess; SET seas; &&_var&i=&&_var&i/(10**&power); RUN; ODS SELECT NONE; ODS OUTPUT FITSUMMARY=sum OUTPUTSTATISTICS=loess; PROC LOESS DATA=seasloess; MODEL &&_var&i = &date / SMOOTH= &smooth DFMETHOD=exact"; RUN; ODS SELECT ALL; DATA loess; SET loess(WHERE=(SmoothingParameter=&smooth))"tTWOWAYSF9.2  46>"0DATA"0OUT"0VARS"0FORMATS"0GROUPS"0RESPVAR"0STAT"0DEBUG",FINMACRO" (&debug NE)"C7 OPTIONS MPRINT NOTES NOXWAIT NOCENTER LS=250 PS=500;""QE OPTIONS NOMPRINT NONOTES NOSOURCE2 NOCENTER NOXWAIT LS=250 PS=500;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;""(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"""%&(%LENGTH(&out ) EQ 0)"OUT" _nway_"1"<+,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"+"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"1 (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"1"&6(%LENGTH(&vars ) EQ 0)"9)ERROR: The var parameter must be precised"FINMACRO" ;"B"&;(%INDEX(&vars,-) NE 0)"UEERROR: No SAS variable list is allowed in the vars (&vars ) parameter"FINMACRO" ;";"D8 DATA _NULL_; SET &data (KEEP=&vars OBS=1); RUN;"B(&syserr NE 0)"H8ERROR: There is a problem in the vars (&vars ) parameter"qaERROR: Non valid SAS dataset? Non valid SAS names? A variable does not exist? Non valid SAS list?"FINMACRO" ;"B"(F(%LENGTH(&groups ) EQ 0)"GROUPS" 0"F")T(%LENGTH(&respvar ) NE 0)"@L0(%LENGTH(%QSCAN(%BQUOTE(&respvar ),2, )) NE 0)"\LERROR:'"t EDITAIDESE9.1  ^x!|>"0DATA"0VKEEP"0NBAXES"0NBPOINTS"0WORD"0GRAPH"0VTYPE"0GLS"0GPS"0OUT"0DEBUG",FINMACRO]" (&debug NE)"D8 OPTIONS MPRINT NOTES NOXWAIT PS=1000 LS=250 NOCENTER;""RF OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT PS=1000 LS=250 NOCENTER;"&(%LENGTH(&vtype) EQ 0)"VTYPE"% OBS SUPOBS VAR SUPVAR""&(%LENGTH(&vkeep) NE 0)"  DATA _vkeep_; ARRAY numx &vkeep; RUN; PROC CONTENTS DATA=_vkeep_ NOPRINT OUT=nomvar(KEEP=name); RUN; DATA _NULL_; SET nomvar END=fin; LENGTH liste $ 30000; RETAIN liste ' '; liste=TRIM(LEFT(COMPRESS(liste||",'"||TRIM(LEFT(UPCASE("name)))||"'"))); IF fin THEN CALL SYMPUT('vkeep',SUBSTR(TRIM(LEFT(COMPRESS(liste))),2)); RUN; DATA _vkeep_; SET &data; IF (_name_ IN(&vkeep)); RUN;"" PROC IML; START edit(coord,ctr,cos,qlt,Iner,vlp,labs,labout) GLOBAL(names); labout=' '; DO i=1 TO &nbaxes; pos=LOC(coord[,i]>=0); neg=LOC(coord[,i]< 0); npos=NCOL(pos); nneg=NCOL(neg); numrows=MAX(npos,nneg);"  result=J(numrows,13,' '); result2=J(numrows,13,' '); result3=J(numrows,13,' '); IF npos > 0 THEN DO; respos=Coord[pos,i]||Ctr[pos,i]||Iner[pos,]||Cos[pos,i]||Qlt[pos,i]; labpos=labs[pos]; *" On cherche les meilleurs CO2 sur un axe (y compris variables supplmentaires); rank=npos-RANK(respos[,4])+1; b=respos; respos[rank,]=b; b=labpos; labpos[rank,]=b; result3[1:npos,13:8]=labpos || CHAR(respos,7,2); * On"  cherche les meilleures contributions sur un axe (variables actives); zz=LOC(respos[,2]^=.); npos=NCOL(zz); IF (npos^=0) THEN DO; respos=respos[zz,]; labpos=labpos[zz,]; END; rank=npos-RANK(respos[,2])+1; b=respos" ; respos[rank,]=b; b=labpos; labpos[rank,]=b; result[1:npos,13:8]=labpos || CHAR(respos,7,2); * puis les contributions significatives (variables actives); dd=LOC(respos[,2]>=respos[,3]); IF (NCOL(dd) > 0) THEN result2[1:"NCOL(dd),13:8]=(labpos || CHAR(respos,7,2))[dd,]; END; IF nneg > 0 THEN DO; resneg=Coord[neg,i]||Ctr[neg,i]||Iner[neg,]||Cos[neg,i]||Qlt[neg,i]; labneg=labs[neg]; * On cherche les meilleurs CO2 sur un axe (y compris variables" supplmentaires); rank=nneg-RANK(resneg[,4])+1; b=resneg; resneg[rank,]=b; b=labneg; labneg[rank,]=b; result3[1:nneg,1:6]=labneg || CHAR(resneg,7,2); * On cherche les meilleures contributions sur un axe (variables"  actives); zz=LOC(resneg[,2]^=.); nneg=NCOL(zz); IF (nneg^=0) THEN DO; resneg=resneg[zz,]; labneg=labneg[zz,]; END; rank=nneg-RANK(resneg[,2])+1; b=resneg; resneg[rank,]=b; b=labneg; labneg[rank,]=b"; * puis les contributions significatives (variables actives); dd=LOC(resneg[,2]>=resneg[,3]); result[1:nneg,1:6]=labneg || CHAR(resneg,7,2); IF (NCOL(dd) > 0) THEN result2[1:NCOL(dd),1:6]=(labneg || CHAR(resneg,7,2))[dECL=30000; LENGTH nser 4 star $ 8 series $ 32; DROP star aa"%(&yesout NE 0)" a per;"%" ;"%XI1&_nser1"' INPUT star $ series $"- (&&ao&i NE 0)"%,J1&&ao&i1"# a $ DAO&j $ AO&j""-"2 (&&ls&i NE 0)"%1J1&&ls&i1"# a $ DLS&j $ LS&j""2"7 (&&tc&i NE 0)"%6J1&&tc&i1"# a $ DTC&j $ TC&j""7"; series=LEFT(TRIM(TRANWRD(series,'"',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.);"= (&&ao&i NE 0)"%<J1&&ao&i1" per=INPUT(SUBSTR(DAO&j,1,2),2.); per=INT((per-1)*12/&&per&i)+1; DAO&j=PUT(MDY(per,1,INPUT(SUBSTR(DAO&j,3,2),2.)),MONYY5.);""="B (&&ls&i NE 0)"%AJ1&&ls&i1" per=INPUT(SUBSTR(DLS&j,1,2),2.); per=INT((per-1)*12/&&per&i)+1; DLS&j=PUT(MDY(per,1,INPUT(SUBSTR(DLS&j,3,2),2.)),MONYY5.);""B"G (&&tc&i NE 0)"%FJ1&&tc&i1" per=INPUT(SUBSTR(DTC&j,1,2),2.); per=INT((per-1)*12/&&per&i)+1; DTC&j=PUT(MDY(per,1,INPUT(SUBSTR(DTC&j,3,2),2.)),MONYY5.);""G" OUTPUT;"M (&&ao&i NE 0)"%L J1&&ao&i1") DAO&j=' '; AO&j=.;" "M"R (&&ls&i NE 0)"%Q J1&&ls&i1") DLS&j=' '; LS&j=.;" "R"W (&&tc&i NE 0)"%V J1&&tc&i1") DTC&j=' '; TC&j=.;" "W"" RUN; DATA _NULL_; INFILE "&dir.\tregvar.m" LENGTH=l LRECL=30000 END=fin; LENGTH xx yy $ 5000; INPUT xx $VARYING5000. l @; yy=SCAN(REVERSE(xx),1,'"'); IF (yy=' ') THEN DO; xx=TRIM(xx) ||" ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .'; END; ELSE DO; xx=TRANWRD(xx,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' ');"  xx=TRANWRD(xx,'*********',' . '); xx=TRANWRD(xx,'******',' . '); END; xx=TRANWRD(xx,'"',' '); xx=TRANWRD(xx,';',' '); xx=TRANWRD(xx,',',' '); xx=COMPBL(LEFT(xx)); FILE "&dir.\temptt.txt" RECFM=V LRECL=30000; PUT xx" $VARYING5000. l; RUN; DATA tregvar; INFILE "&dir.\temptt.txt"; DROP name star aa; LENGTH nser 4 star $ 8 series name $ 32;"%e I1&_nser1"' INPUT star $ series $"c(&®&i NE 0)"&bJ1&®&i1"* name $ Reg&j Reg&j._t""c"; series=LEFT(TRIM(TRANWRD(series,'"',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.); OUTPUT;" "qe RUN; DATA &tabout; MERGE tfit tdeterm tcalend toutlier tregvar tarmapar; BY nser; RUN;"#g0`h xhxH ( 0 <DLT`lt|xtdlp 4Dl   < d !!,!!!$""""" 0n among (0 1 -1 )"FINMACRO" ;"J"&N(%LENGTH(&idur ) EQ 0)"IDUR" 6"]"=S-(%LENGTH(%QSCAN(%BQUOTE(&idur ),2, )) NE 0)"VFERROR: You must precise just one value for the idur (&idur ) parameter"FINMACRO" ;"S"*X(%DATATYP(&idur ) EQ CHAR)"B2ERROR: The idur (&idur ) parameter must be numeric"FINMACRO" ;"]"] (&idur LE 0 )"/ERROR: You must have &idur > 0"FINMACRO" ;"]"&a(%LENGTH(&trad ) EQ 0)"TRAD" 0"p"=f-(%LENGTH(%QSCAN(%BQUOTE(&trad ),2, )) NE 0)"VFERROR: You must precise just one value for the trad (&trad ) parameter"FINMACRO" ;"f"*k(%DATATYP(&trad ) EQ CHAR)"B2ERROR: The trad (&trad ) parameter must be numeric"FINMACRO" ;"p"p((&trad NE 0) AND (&trad NE 1) AND (&trad NE 2) AND (&trad NE 6) AND (&trad NE 7) AND (&trad NE -1) AND (&trad NE -2) AND (&trad NE -6) AND (&trad NE -7))"aQERROR: The trad (&trad ) parameter must be choosen among (0 1 2 6 7 -1 -2 -6 -7 )"FINMACRO" ;"p"&t(%LENGTH(&sens ) EQ 0)"SENS" 1""=y-(%LENGTH(%QSCAN(%BQUOTE(&sens ),2, )) NE 0)"VFERROR: You must precise just one value for the sens (&sens ) parameter"FINMACRO" ;"y"*~(%DATATYP(&sens ) EQ CHAR)"B2ERROR: The sens (&sens ) parameter must be numeric"FINMACRO" ;""@0((&sens NE 0) AND (&sens NE 1) AND (&sens NE 2))"P@ERROR: The sens (&sens ) parameter must be choosen among (0 1 2)"FINMACRO" ;""$(%LENGTH(&va ) NE 0)";+(%LENGTH(%QSCAN(%BQUOTE(&va ),2, )) NE 0)"RBERROR: You must precise just one value for the va (&va ) parameter"FINMACRO" ;""((%DATATYP(&va ) EQ CHAR)">.ERROR: The va (&va ) parameter must be numeric"FINMACRO" ;"" (&va LE 0 )"-ERROR: You must have &va > 0"FINMACRO" ;"""." OPTIONS noxwait;" (&tseries EQ)"TSERIES" _NUMERIC_""_NETTOY_" ___tt___"LFILES" Linear"NBFILES" 1"  PROC CONTENTS DATA=&data(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name label); RUN; DATA _null_; SET _nomvar_ END=f; IF UPCASE(name) ^= UPCASE("&date") THEN DO; ii+1; CALL SYMPUT('_var'!!LEFT(PUT(ii,4.)),TRIM(LEFT(name))); CALL" SYMPUT('_lab'!!LEFT(PUT(ii,4.)),TRIM(LEFT(label))); END; IF f THEN CALL SYMPUT('_nser',LEFT(PUT(ii,4.))); RUN; DATA _nomvar_; LENGTH nser 4 series $ 32 label $ 70;"%I1&_nser1"VJ nser=&i; series=UPCASE("&&_var&i"); #####$$$$$%0%\%d%x%%%%%&(&P&|&&&&'()$*L*t*****+++<,RIES" _numeric_"R"cW DATA _NULL_; SET &data (KEEP=&tseries OBS=1); ARRAY _xx_(*) &tseries ; RUN;"R(&syserr NE 0)"N>ERROR: There is a problem in the tseries (&tseries ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"R"-! OPTIONS noxwait;"_NETTOY_" " PROC CONTENTS DATA=&data(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _nomvar_; LENGTH liste $ 10000; RETAIN liste ' '; SET _nomvar_ END=fin; name=UPCASE(name); IF (name ^= UPCASE("&date")) THEN DO; n+1; CALL" SYMPUT('_var'!!LEFT(PUT(n,4.)),TRIM(LEFT(name))); liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); END; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(n,4.))); CALL SYMPUT('tseries',TRIM(LEFT(liste))); END; RUN;"_NETTOY_"" &_nettoy_ _nomvar_"(](%LENGTH(&varreg ) NE 0)" PROC CONTENTS DATA=&data(KEEP=&varreg) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _nomvar_; LENGTH liste $ 10000; RETAIN liste ' '; SET _nomvar_ END=fin; liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); IF fin THEN DO; CALL"?3 SYMPUT('varreg',TRIM(LEFT(liste))); END; RUN;"]"K? PROC IML; USE &data; READ all VAR{&tseries} INTO x;"'a(%LENGTH(&varreg) NE 0)"3' READ all VAR{&varreg} INTO varreg;"a" READ all VAR{&date} INTO date; CLOSE &data; nvar=NCOL(x); Series={&tseries}; first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0); miss=J(nvar,1,0); mean=T(x[:,]); max=T(x[<>,]); min=T(x[><,]); period=J(nvar,1,.);"e (&lam EQ 0)" x=LOG(x);"e"  DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL(LOC(aa^=.)); miss[i]=NCOL(LOC(aa=-99999)); END; END; DO i=1 TO"  nvar; jj=(last[i]-first[i])/nobs[i]; IF ((25<=jj) & (jj<=35)) THEN period[i]=12; ELSE IF ((50<=jj) & (jj<=70)) THEN period[i]=6; ELSE IF ((80<=jj) & (jj<=100)) THEN period[i]=4; ELSE IF ((115<=jj) & (jj<=135)) THEN period[i]=3; ELSE IF"  ((175<=jj) & (jj<=195)) THEN period[i]=2; ELSE IF ((345<=jj) & (jj<=375)) THEN period[i]=1; END; nbyear=INT(nobs/period); results=period || first || last || nobs || nbyear || miss || max || min || mean; nomcols={period first last nobs nbyear" nmiss max min mean}; CREATE &out FROM results[COLNAME=nomcols ROWNAME=Series]; APPEND FROM results[ROWNAME=Series]; CLOSE &out; DO i=1 TO nvar; y=date || x[,i] || varreg; name=J(NROW(varreg),1,Series[i]); IF (i=1) THEN DO;"  ForStamp=y; Labels=name; END; ELSE DO; ForStamp=ForStamp // y; Labels=Labels // Name; END; END; CREATE _series_ FROM ForStamp[COLNAME={"&date" "val" &varreg} ROWNAME=Labels]; APPEND FROM ForStamp[ROWNAME=Labels]; CLOSE" _series_; QUIT;"_NETTOY_"" &_nettoy_ _series_"  DATA &out; LENGTH data $ 50 series $ 32 firstdat lastdat $ 5 period 8; SET &out END=fin; firstdat=PUT(first,MONYY5.); lastdat=PUT(last,MONYY5.); CALL SYMPUT('_var'||LEFT(PUT(_N_,5.)),TRIM(LEFT(series))); IF INDEX("&data",'.') THEN data="SCAN("&data",2,'.'); ELSE data="&data"; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(_N_,5.))); CALL SYMPUT('period',LEFT(PUT(period,5.))); IF (period=12) THEN CALL SYMPUT('in terval','month'); IF (period=4) THEN CALL SYMPUT('interval',"'qtr'); END; RUN; PROC SORT DATA=_series_; BY Labels &date; RUN; PROC UCM DATA=_series_ NOPRINT; BY Labels; ID &date INTERVAL=&interval; MODEL val; IRREGULAR; LEVEL; SLOPE; SEASON LENGTH=&period TYPE=TRIG; ESTIMATE OUTEST="1%estimates; FORECAST OUTFOR=outforS;"'t(%LENGTH(&varreg) NE 0)"" RANDOMREG &varreg;"t" RUN; DATA outfor; SET outfors(RENAME=(s_series=Series s_season=Season s_irreg=Irregular)); KEEP Labels val Series date TrendCycle Season Saseries Irregular; Saseries=Series - Season; TrendCycle=Saseries - Irregular;"x (&lam EQ 0)" Saseries=EXP(Saseries); Series=EXP(Series); Season=Series/Saseries; TrendCycle=EXP(TrendCycle); Irregular=Saseries/Trend;"x"h\ IF val^=.; LABEL Series=' ' TrendCycle=' ' Season=' ' Saseries=' ' Irregular=' '; RUN;"(&outtype EQ 1)" DATA"%~I1&_nser1" &&_var&i""; SET outfor;"%I1&_nser1"F: IF (Labels=SCAN("&tseries",&i)) THEN OUTPUT &&_var&i;"" RUN;""(&outtype EQ 2)" PROC SORT DATA=outfor(RENAME=(Labels=_NAME_)); BY &date _NAME_; RUN; PROC TRANSPOSE DATA=outfor OUT=TrendCycle(DROP=_name_); BY &date; VAR trendcycle; RUN; PROC TRANSPOSE DATA=outfor OUT=Saseries(DROP=_name_); BY &date; VAR" saseries; RUN; PROC TRANSPOSE DATA=outfor OUT=Irregular(DROP=_name_); BY &date; VAR irregular; RUN; PROC TRANSPOSE DATA=outfor OUT=Season(DROP=_name_); BY &date; VAR season; RUN;""&(%LENGTH(&debug) EQ 0)"VJ PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_; RUN; QUIT;""4#0`(XD` 4 h $ @ T P p , D X l  0 D t 0 $8 x @hp8l| 8\hpt (!H!\!!!!!!0"8"L"`""#`$t$$$%3"tDECOMPWH9.2  +L>"0DATA"0TSERIES"0DATE"0LAM"1ORDER2"1SORDER1"0OUTLIERS"0TDAYS"0VARREG"0REGEFF"0OUT"0OUTTYPE"0DEBUG",FINMACRO" (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;""TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"'"= -(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;" "8, DATA _NULL_; SET &data (OBS=1); RUN;"'(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"'"%+(%LENGTH(&out ) EQ 0)"OUT" _results_"6"<0,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"0"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"6 (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"6"):(%LENGTH(&outtype ) EQ 0)"OUTTYPE" 2"I"@?0(%LENGTH(%QSCAN(%BQUOTE(&outtype ),2, )) NE 0)"\LERROR: You must precise just one value for the outtype (&outtype ) parameter"FINMACRO" ;"?"-D(%DATATYP(&outtype ) EQ CHAR)"H8ERROR: The outtype (&outtype ) parameter must be numeric"FINMACRO" ;"I"5I%((&outtype NE 1) AND (&outtype NE 2))"UEERROR: The outtype (&outtype ) parameter must be choosen among (1 2 )"FINMACRO"1"tBAYSEAF9.2  }!>"0DATA"0TSERIES"0DATE"0TDDAYS"0LAM"1ORDER2"1SORDER1"0VA"0OUT"0OUTTYPE"0DEBUG",FINMACRO|" (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;""TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"%"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"%(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"%"%)(%LENGTH(&out ) EQ 0)"OUT" _results_"4"<.,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"."0$ %sasnom(_IN_=&out ,TYPE=DATASET);"4 (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"4")8(%LENGTH(&outtype ) EQ 0)"OUTTYPE" 2"G"@=0(%LENGTH(%QSCAN(%BQUOTE(&outtype ),2, )) NE 0)"\LERROR: You must precise just one value for the outtype (&outtype ) parameter"FINMACRO" ;"="-B(%DATATYP(&outtype ) EQ CHAR)"H8ERROR: The outtype (&outtype ) parameter must be numeric"FINMACRO" ;"G"5G%((&outtype NE 1) AND (&outtype NE 2))"UEERROR: The outtype (&outtype ) parameter must be choosen among (1 2 )"FINMACRO" ;"G")K(%LENGTH(&tseries ) EQ 0)"TSE+"tSQCOMBE9.2  !>"0DATA"0COLS"0LIGNES"0DIAGN"0FORMAT"0POWER"0CRES"0CREG"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"&(%LENGTH(&data ) EQ 0)"DATA" _last_""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"(&syserr NE 0)"?/ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;""&#(%LENGTH(&cols ) EQ 0)"COLS" _numeric_"*"]Q DATA _NULL_; SET &data (KEEP=&cols OBS=1); ARRAY _xx_(*) &cols ; RUN;"*(&syserr NE 0)"?/ERROR: Problme dans le paramtre cols (&cols )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"*"(8(%LENGTH(&lignes ) NE 0)"?0/(%LENGTH(%QSCAN(%BQUOTE(&lignes ),2, )) NE 0)"_OERROR: Vous devez prciser une seule valeur pour le paramtre lignes (&lignes )"FINMACRO" ;"0"cW DATA _NULL_; SET &data (KEEP=&lignes OBS=1); ARRAY _xx_(*) $ &lignes ; RUN;"7(&syserr NE 0)"C3ERROR: Problme dans le paramtre lignes (&lignes )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"7"8"'E(%LENGTH(&diagn ) NE 0)"2>"(%SYSFUNC(FILEEXIST(&diagn)) EQ 0)"YIERROR: Problme dans le paramtre diagn (&diagn). Le rpertoire existe ??"FINMACRO" ;">"<A,(%SYSFUNC(FILEEXIST(&diagn.\stem.sas)) EQ 0)"J:WARNING: Pas de macro stem.sas dans le directory (&diagn)."A"?D/(%SYSFUNC(FILEEXIST(&diagn.\resline.sas)) EQ 0)"M=WARNING: Pas de macro resline.sas dans le directory (&diagn)."D"E"'I(%LENGTH(&format) EQ 0)"FORMAT" 5.1"I"'M(%LENGTH(&power ) EQ 0)"POWER" 1"W">R.(%LENGTH(%QSCAN(%BQUOTE(&power ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre power (&power )"FINMACRO" ;"R"+W(%DATATYP(&power ) EQ CHAR)"QAERROR: La valeur du paramtre power (&power ) doit tre numrique"FINMACRO""t MYFORMATShD9.2  z>"0DATA"0VARX"0NGRP"0PREFIX"0OUT"0DEBUG",FINMACROy" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;" ":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"&(%LENGTH(&data ) EQ 0)"DATA" _last_""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;""&!(%LENGTH(&varx ) EQ 0)":*ERROR: The varx parameter must be precised"FINMACRO" ;"("]Q DATA _NULL_; SET &data (KEEP=&varx OBS=1); ARRAY _xx_(*) &varx ; RUN;"((&syserr NE 0)"H8ERROR: There is a problem in the varx (&varx ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"("&,(%LENGTH(&ngrp ) EQ 0)"NGRP" 5","%2(%LENGTH(&out ) EQ 0)"OUT" _tabfff_"DELOUT" yes"?"DELOUT" "<9,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"9"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"? (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"?"_NETTOY" "  PROC CONTENTS DATA=&data(KEEP=&varx) OUT=_nomvar_(KEEP=name) NOPRINT; RUN; DATA _NULL_; SET _nomvar_ END=f; LENGTH numx $ 30000; RETAIN numx ' '; numx=TRIM(LEFT(numx))||' '||TRIM(LEFT(name)); IF f THEN DO; CALL SYMPUT('varx',TRIM(LEFT("RFnumx))); CALL SYMPUT('nvarx',TRIM(LEFT(PUT(_N_,5.)))); END; RUN;"_NETTOY"! &_nettoy _nomvar_"ERREUR" 0"  PROC IML; ngrp={&ngrp}; nbg=NCOL(ngrp); IF (nbg < &nvarx) THEN DO; ngrp=ngrp || J(1,&nvarx-nbg,ngrp[nbg]); END; IF (nbg > &nvarx) THEN DO; ngrp=ngrp[1:&nvarx]; END; IF NCOL(LOC(INT(ngrp) ^= ngrp)) THEN CALL SYMPUT('erreur','1'); IF"z (MIN(ngrp) <= 0) THEN CALL SYMPUT('erreur','2'); CALL SYMPUT('ngrp',TRIM(LEFT(COMPBL(ROWCAT(CHAR(ngrp,5,0)))))); QUIT;"N (&syserr)";+ERROR: the ngrp parameter should be numeric"FINMACRO" ;"N"X(&erreur NE 0)"R(&erreur EQ 1)"I9ERROR: the NGRP parameter should have only integer values"Rb"tBOXPLOTG9.2  -<>"0DATA"0TYPE"0VAR"0POWER"0GROUP"0STD"0ID"0FORMATID"0BOXSTY"0NOTCHES"0LABEL"0TITLE"0DEBUG",FINMACRO," (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"%(%LENGTH(&data) EQ 0)"DATA" _last_""-! DATA _NULL_; SET &data; RUN;"(&syserr NE 0)"H8ERROR: There is a problem in the data (&data) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;""%$(%LENGTH(&var ) EQ 0)"VAR" _NUMERIC_"GROUP" "$"VJ DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"+(&syserr NE 0)"G7ERROR: There is a problem in the var (&var ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"+"'/(%LENGTH(&power ) EQ 0)"POWER" 1"9"=4-(%LENGTH(%QSCAN(%BQUOTE(&power),2, )) NE 0)"WGERROR: You must precise just one value for the power (&power) parameter"FINMACRO" ;"4"+9(%DATATYP(&power ) EQ CHAR)"C3ERROR: The power (&power) parameter must be numeric"FINMACRO" ;"9"%G(%LENGTH(&id ) NE 0)"=?-(%LENGTH(%QSCAN(%BQUOTE(&id ),2, )) NE 0)"UEERROR: You must precise just one value for the data (&id ) parameter"FINMACRO" ;"?"XL DATA _NULL_; SET &data (KEEP=&id OBS=1); ARRAY _xx_(*) &id ; RUN;"F(&syserr NE 0)"E5ERROR: There is a problem in the id (&id ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"F"G"&U(%LENGTH(&group) NE 0)"=M-(%LENGTH(%QSCAN(%BQUOTE(&group),2, )) NE 0)"WGERROR: You must precise just one value for the group (&group) parameter"FINMACRO" ;"M"^R DATA _NULL_; SET &data (KEEP=&group OBS=1); ARRAY _xx_(*) &group ; RUN;"T(&syserr NE 0)"K;ERROR: There is a problem in the group (&group ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"T"U"E9 DATA __trav__; SET &data(KEEP=&grou̗V "tDAINTIESF9.2  B>"0DATA"0TSERIES"0DATE"0ORDRE"0EXVA"0FACTOR"0MISSING"0OUT"0OUTTYPE"0DEBUG",FINMACRO" (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;""TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"  DATA ___tt___; start=DATETIME(); RUN; %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %"LET index=%INDEX(&table,.); %IF (&index GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%" VERIFY(&lib,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY("{&table,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"$"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"$(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"$"%((%LENGTH(&out ) EQ 0)"OUT" _results_"3"<-,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"-"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"3 (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"3")7(%LENGTH(&outtype ) EQ 0)"OUTTYPE" 2"F"@<0(%LENGTH(%QSCAN(%BQUOTE(&outtype ),2, )) NE 0)"\LERROR: You must precise just one value for the outtype (&outtype ) parameter"FINMACRO" ;"<"-A(%DATATYP(&outtype ) EQ CHAR)"H8ERROR: The outtype (&outtype ) parameter must be numeric"FINMACRO" ;"F"5F%((&outtype NE 1) AND (&outtype NE 2))"UEERROR: The outtype (&outtype ) parameter must be choosen among (1 2 )"FINMACRO" ;"F")J(%LENGTH(&tseries ) EQ 0)"TSERIES͗(!"tARIMAhD9.2  ;|T>"0DATA"0OUT"0VAR"0DATE"0MAXPQ"0DIFF"0ALPHA"0METHOD"0MAXITER"0PRINT"0DEBUG",FINMACRO:" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"%"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"%(&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"%"%)(%LENGTH(&out ) EQ 0)"OUT" _result_"4"<.,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"."0$ %sasnom(_IN_=&out ,TYPE=DATASET);"4 (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"4"%9(%LENGTH(&var ) EQ 0)"9)ERROR: The var parameter must be precised"FINMACRO" ;"E"<>,(%LENGTH(%QSCAN(%BQUOTE(&var ),2, )) NE 0)"UEERROR: You must precise just one value for the var (&var ) parameter"FINMACRO" ;">"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"E(&syserr NE 0)"G7ERROR: There is a problem in the var (&var ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"E"&J(%LENGTH(&date ) EQ 0)":*ERROR: The date parameter must be precisedΗ""tBNELSONhD9.2  R>"0DATA"0OUT"0VAR"0DATE"0MAXPQ"0PAR"0QMA"0METHOD"0MAXITER"0MCOEF"0MINMOD"0PRINT"0GRAPH"0CRAW"0CTREND"0CCYCLE"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"+"=$-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"$"8, DATA _NULL_; SET &data (OBS=1); RUN;"+(&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"+"%/(%LENGTH(&out ) EQ 0)"OUT" _result_":"<4,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"4"0$ %sasnom(_IN_=&out ,TYPE=DATASET);": (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;":"%?(%LENGTH(&var ) EQ 0)"9)ERROR: The var parameter must be precised"FINMACRO" ;"K"<D,(%LENGTH(%QSCAN(%BQUOTE(&var ),2, )) NE 0)"UEERROR: You must precise just one value for the var (&var ) parameter"FINMACRO" ;"D"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"K(&syserr NE 0)"G7ERROR: There is a problem in ϗ8#"t UNIVARIATED9.1  (D>"0DATA"0OUT"0VAR"0BY"0HISTOG"0WORD"0PRINT"0NDEC"0EXCEL"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"$"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"$(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"$"%((%LENGTH(&out ) EQ 0)"OUT" _result_"3"<-,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"-"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"3 (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"3"%7(%LENGTH(&var ) EQ 0)"VAR" _numeric_">"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;">(&syserr NE 0)"F6ERROR: There is a problem in the var (&var ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;">"$L(%LENGTH(&by ) NE 0)";D+(%LENGTH(%QSCAN(%BQUOTE(&by ),2, )) NE 0)"RBERROR: You must precise just one value for the BY (&by ) parameter"FINMACRO" ;"D"[O DATA _NULL_; SET &data (KEEP=&by OBS=1); ARRAY _xx_(*) $ &by ; RUN;"K(&syserr NE 0)"D4ERROR: There is a problem in the ȗ?$"t CHECKMODEC9.1  2D>"0DATA"0TSERIES"0DATE"0OUT"0METHOD"0OUTLS"0MAXAR"0TRUNC"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"#"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"#(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"#"%'(%LENGTH(&out ) EQ 0)"OUT" _results_"2"<,,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;","0$ %sasnom(_IN_=&out ,TYPE=DATASET);"2 (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"2")6(%LENGTH(&tseries ) EQ 0)"TSERIES" _NUMERIC_"="cW DATA _NULL_; SET &data (KEEP=&tseries OBS=1); ARRAY _xx_(*) &tseries ; RUN;"=(&syserr NE 0)"N>ERROR: There is a problem in the tseries (&tseries ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"="&B(%LENGTH(&date ) EQ 0)":*ERROR: The date parameter must be precised"FINMACRO" ;"N"=G-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"VFERROR: You must precise just one value for the date (&date ) parameter"FINMACRO" ;"G"]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ɗ%; KEEP &date depvar pred; depvar=depvar*(10**&power); pred=pred*(10**&power); RENAME depvar=&&_var&i pred=loess; RUN;""  PROC ARIMA DATA=seas(KEEP=&&_var&i); IDENTIFY VAR=&&_var&i NLAG=%EVAL(3*&per) OUTCOV=_cov_ NOPRINT; IDENTIFY VAR=&&_var&i(1) NLAG=%EVAL(3*&per) OUTCOV=_cov1_ NOPRINT; IDENTIFY VAR=&&_var&i(1,&per) NLAG=%EVAL(3*&per) OUTCOV=_cov2_ NOPRINT;"  IDENTIFY VAR=&&_var&i(&per) NLAG=%EVAL(3*&per) OUTCOV=_cov3_ NOPRINT; RUN; QUIT; DATA _dcov_; SET _cov_(KEEP=n corr lag RENAME=(n=n0 corr=corr0)); SET _cov1_(KEEP=n corr lag RENAME=(n=n1 corr=corr1)); SET _cov2_(KEEP=n corr lag RENAME=" (n=n2 corr=corr2)); SET _cov3_(KEEP=n corr lag RENAME=(n=n3 corr=corr3)); KEEP lag corr0-corr3 up0-up3 low0-low3; RETAIN nobs0-nobs3; ARRAY num(4) n0-n3; ARRAY numobs(4) nobs0-nobs3; ARRAY auto(4) corr0-corr3; ARRAY tot(4) tot0-tot3;"  ARRAY up(4) up0-up3; ARRAY low(4) low0-low3; IF _N_=1 THEN DO i=1 TO 4; numobs(i)=num(i); up(i)=0; low(i)=0; END; ELSE DO i=1 TO 4; tot(i)+auto(i)**2; up(i)=1.96*SQRT((1+2*tot(i))/numobs(i)); low(i)=-up(i); END;" RUN;"!(&partinv EQ YES)" DATA _pcov_; SET _cov_(KEEP=n partcorr lag RENAME=(n=n0 partcorr=pcorr0)); SET _cov1_(KEEP=n partcorr lag RENAME=(n=n1 partcorr=pcorr1)); SET _cov2_(KEEP=n partcorr lag RENAME=(n=n2 partcorr=pcorr2)); SET _cov3_(KEEP=n partcorr lag"  RENAME=(n=n3 partcorr=pcorr3)); KEEP lag pcorr0-pcorr3 up0-up3 low0-low3; RETAIN nobs0-nobs3; ARRAY num(4) n0-n3; ARRAY numobs(4) nobs0-nobs3; ARRAY up(4) up0-up3; ARRAY low(4) low0-low3; IF _N_=1 THEN DO i=1 TO 4; numobs" (i)=num(i); up(i)=0; low(i)=0; END; ELSE DO i=1 TO 4; up(i)=1.96/SQRT(numobs(i)); low(i)=-up(i); END; RUN; DATA _icov_; SET _cov_(KEEP=n invcorr lag RENAME=(n=n0 invcorr=icorr0)); SET _cov1_(KEEP=n invcorr lag"  RENAME=(n=n1 invcorr=icorr1)); SET _cov2_(KEEP=n invcorr lag RENAME=(n=n2 invcorr=icorr2)); SET _cov3_(KEEP=n invcorr lag RENAME=(n=n3 invcorr=icorr3)); KEEP lag icorr0-icorr3 up0-up3 low0-low3; RETAIN nobs0-nobs3; ARRAY num(4) n0-n3;"  ARRAY numobs(4) nobs0-nobs3; ARRAY up(4) up0-up3; ARRAY low(4) low0-low3; IF _N_=1 THEN DO i=1 TO 4; numobs(i)=num(i); up(i)=0; low(i)=0; END; ELSE DO i=1 TO 4; up(i)=1.96/SQRT(numobs(i)); low(i)=-up(i);" END; RUN;"" (&dif EQ YES)"VARSPEC" DifVar""VARSPEC" &&_var&i"  PROC IML; START moymob(xserie,movav,coef); movav=J(NROW(xserie),1,0); mmob1=xserie[LOC(xserie ^= .)]; nobs=NROW(mmob1); mmob2=J(nobs,1,.); ordre=NROW(coef); ncols=NCOL(coef); nb=INT(ordre / 2); IF (ordre <= nobs)" THEN DO; mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef[,ncols]),T(mmob1))[ordre:nobs]); END; ELSE mmob2=J(nobs,1,mmob1[:]); mmob2[1:nb]=T(T(mmob1[1:ordre])*coef[,1:nb]); mmob2[nobs:nobs-nb+1]=T(T(mmob1[nobs:nobs-ordre+1])*coef[,1:nb]);"  movav[LOC(xserie ^= .)]=mmob2; FINISH moymob; START Periodogram(xserie,Periodogram,freq,per); pi=2*ARCOS(0); nvar=NCOL(xserie); nfrq=NROW(freq); Periodogram=J(nfrq,nvar,0); nq=INT(2*(nfrq**(1/5))/3); ww=T(DO(-nq" ,nq,1))/(2*nq+1); ww2=(1+cos(pi*ww))/2; ww=ww2/ww2[+]; DO i=1 TO nvar; cc=LOC(xserie[,i]^=.); IF (NCOL(cc)^=0) THEN DO; xx=xserie[cc,i]; nobs=NROW(xx); END; dd=2*pi*REPEAT(DO(0,nobs-1,1),nfrq,1)#REPEAT(freq,1,"nobs); xsin=SIN(dd)*xx; xcos=COS(dd)*xx; ʗN&(&errtype EQ 1)">.ERROR: a variable is not of the requested type"H"G7ERROR: &errtype variables are not of the requested type"FINMACRO" ;"K"4#L0`8Tht`h$<P$\| 0Dl,L  , @ h  ( < h  p   < P ,l˗*'d,]; END;" vp=vlp[i];"&(&nbpoints NE )"z zz=MIN(NROW(result),&nbpoints); result=result[1:zz,]; result2=result2[1:zz,]; result3=result3[1:zz,];"&"nb labout=labout//result[,1]//result[,13]//result2[,1]//result2[,13]//result3[,1]//result3[,13];"+ (&word NE)"  zz1=J(NROW(result),NCOL(result)-1,';')||J(NROW(result),1,' '); zz2=J(NROW(result2),NCOL(result2)-1,';')||J(NROW(result2),1,' '); zz3=J(NROW(result3),NCOL(result3)-1,';')||J(NROW(result3),1,' '); result=COMPRESS(ROWCAT(COMPBL(CONCAT("result,zz1)))); result2=COMPRESS(ROWCAT(COMPBL(CONCAT(result2,zz2)))); result3=COMPRESS(ROWCAT(COMPBL(CONCAT(result3,zz3))));"+" Axe=LEFT(COMPBL(ROWCAT(COMPRESS(ROWCAT('Axe' || CHAR(i,1,0))) || COMPRESS(ROWCAT('(' || CHAR(vp,5,1) || '%)'))))); PRINT Axe; *PRINT "Classement par contribution dcroissante"; *PRINT result[COLNAME=names]; *PRINT"  "Classement par contribution significative dcroissante"; *PRINT result2[COLNAME=names]; *PRINT "Classement par CO2 dcroissants"; PRINT "Plus fortes contributions significatives et plus forts CO2"; PRINT result3[COLNAME=names]; END;"F: FINISH edit; USE &data(FIRSTOBS=2); READ all VAR {"&1I1&nbaxes1" Dim&i"")} INTO Dim; READ all VAR {"&5I1&nbaxes1" Contr&i"", } INTO Contr; READ all VAR {"&9 I1&nbaxes1" SqCos&i" " } INTO SqCos; READ all VAR {Inertia} INTO Inertia; READ all VAR {_name_} INTO labels; READ all VAR {_type_} INTO type; CLOSE &data; USE &data(OBS=1); READ all VAR {"&= I1&nbaxes1" Contr&i" "  } INTO valp; READ all VAR {Inertia} INTO Inert; CLOSE &data; RESET NONAME; valp=100*valp[1,]/Inert; Contr=100*Contr; Inertia=100*Inertia; Qlt=SqCos; DO i=2 TO &nbaxes; Qlt[,i]=Qlt[,i-1]+Qlt[,i]; END; vtype="&vtype"; names={Label"F: Coord CTR Iner CO2 QLT ' ' QLT CO2 Iner CTR Coord Label};"B (&word NE)"UI names={'Label;Coord;CTR;Iner;CO2;QLT;;QLT;CO2;Iner;CTR;Coord;Label'};"B" IF (INDEX(vtype,'VAR')) THEN DO; cc=LOC((type='VAR')|(type='SUPVAR')); labvar=labels[cc]; dimvar=Dim[cc,]; Ctrvar=Contr[cc,]; Cosvar=SqCos[cc,]; Qltvar=Qlt[cc,]; Inevar=Inertia[cc,]; PRINT"  "Aides l'interptation pour les variables"; RUN Edit(dimvar,ctrvar,cosvar,qltvar,Inevar,valp,labvar,edvars); IF (NCOL(labels2)=0) THEN labels2=edvars; ELSE labels2=labels2//edvars; END; IF (INDEX(vtype,'OBS')) THEN DO; cc=LOC(("type='OBS')|(type='SUPOBS')); labobs=labels[cc]; dimobs=Dim[cc,]; Ctrobs=Contr[cc,]; Cosobs=SqCos[cc,]; Qltobs=Qlt[cc,]; Ineobs=Inertia[cc,]; PRINT "Aides l'interptation pour les observations"; RUN Edit(dimobs,ctrobs,cosobs," qltobs,Ineobs,valp,labobs,edobs); IF (NCOL(labels2)=0) THEN labels2=edobs; ELSE labels2=labels2//edobs; END; CREATE EditLabel FROM labels2[COLNAME={_Name_}]; APPEND FROM labels2; CLOSE EditLabel; QUIT; PROC SORT DATA=EditLabel(WHERE="(_Name_^=' ')) OUT=EditLabel NODUP; BY _Name_; RUN; PROC SORT DATA=&data OUT=&out; BY _Name_; RUN; DATA &out; MERGE EditLabel(IN=in1) &out; BY _Name_; IF in1; RUN;"&J(%LENGTH(&vkeep) NE 0)"nb DATA &out; SET &out _vkeep_; RUN; PROC SORT DATA=&out NODUP; BY _Type_ _Name_; RUN;"J" ;"&\(%LENGTH(&graphė=("FINMACRO" ;"V"=O-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"WGERROR: You must precise just one value for the date (&date ) parameter"FINMACRO" ;"O"]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"V(&syserr NE 0)"I9ERROR: There is a problem in the date (&date ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"V"'Z(%LENGTH(&maxpq ) EQ 0)"MAXPQ" 8"i">_.(%LENGTH(%QSCAN(%BQUOTE(&maxpq ),2, )) NE 0)"YIERROR: You must precise just one value for the maxpq (&maxpq ) parameter"FINMACRO" ;"_"+d(%DATATYP(&maxpq ) EQ CHAR)"E5ERROR: The maxpq (&maxpq ) parameter must be numeric"FINMACRO" ;"i"i(&maxpq LE 0 )"0 ERROR: You must have &maxpq > 0"FINMACRO" ;"i"%m(%LENGTH(&diff) EQ 0)"DIFF" 0"|"=r-(%LENGTH(%QSCAN(%BQUOTE(&diff ),2, )) NE 0)"WGERROR: You must precise just one value for the diff (&diff ) parameter"FINMACRO" ;"r"*w(%DATATYP(&diff ) EQ CHAR)"C3ERROR: The diff (&diff ) parameter must be numeric"FINMACRO" ;"|"Q|A((&diff NE 0) AND (&diff NE 1) AND (&diff NE 2) AND (&diff NE 3))"SCERROR: The diff (&diff ) parameter must be choosen among (0 1 2 3)"FINMACRO" ;"|"&(%LENGTH(&alpha) EQ 0)"ALPHA" 0.05"">.(%LENGTH(%QSCAN(%BQUOTE(&alpha ),2, )) NE 0)"WGERROR: You must precise just one value for the par (&alpha ) parameter"FINMACRO" ;""+(%DATATYP(&alpha ) EQ CHAR)"D4ERROR: The alpha (&alpha ) parameter must be numeric"FINMACRO" ;""1!((&alpha LE 0 ) OR (&alpha GE 1))"2"ERROR: You must have 0 < alpha < 1"FINMACRO" ;""((%LENGTH(&method ) EQ 0)"METHOD" CLS""METHOD" %UPCASE(&method)"?/(%LENGTH(%QSCAN(%BQUOTE(&method ),2, )) NE 0)"[KERROR: You must precise just one value for the method (&method ) parameter"FINMACRO" ;""+(%DATATYP(&method ) EQ NUM)"I9ERROR: The method (&method ) parameter must be character"FINMACRO" ;""K;((&method NE CLS) AND (&method NE ULS) AND (&method NE ML))"ZJERROR: The method (&method ) parameter must be choosen among (CLS ULS ML)"FINMACRO" ;"")(%LENGTH(&maxiter ) EQ 0)"MAXITER" 100""@0(%LENGTH(%QSCAN(%BQUOTE(&maxiter ),2,ŗ/)"tSAGRAPHF9.2  c&>"0DATA"0CATG"0DATE"0RAW"0XLIN"0SA"0SEASON"0IRR"0TREND"0TDAYS"0OUTL"0USR"0DEBUG",FINMACROb" (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;""TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;" (&catg EQ)"CATG" &raw""  DATA __trav0__; SET &data END=fin; KEEP &date &raw &xlin dxlin &sa &irr &tdays &outl &season &trend &usr; DROP per ndon neg dtmin dtmax; RETAIN per 0 neg 0 dtmin dtmax; per=DIF(&date); IF (_N_=2) THEN DO; IF ((25<=per) & (per<=35)) THEN" per=12; ELSE IF ((50<=per) & (per<=70)) THEN per=6; ELSE IF ((80<=per) & (per<=100)) THEN per=4; ELSE IF ((115<=per) & (per<=135)) THEN per=3; ELSE IF ((175<=per) & (per<=195)) THEN per=2; ELSE IF ((345<=per) & (per<=375)) THEN per=1;" CALL SYMPUT('per',TRIM(LEFT(PUT(per,2.)))); a=(per NOT IN(1,2,3,4,5,6,7,12)); CALL SYMPUT('errper',PUT(a,2.)); END; dxlin=DIF(&xlin); IF (&raw ^=.) THEN DO; ndon+1; IF (&season < 0) THEN neg=1; dtmax=&date; IF (ndon=1) THEN" dtmin=&date; END; IF fin THEN DO; CALL SYMPUT('minan','A'||PUT(YEAR(dtmin),4.)); CALL SYMPUT('maxan','A'||PUT(YEAR(dtmax),4.)); CALL SYMPUT('mode',LEFT(PUT((neg = 0) ,2.))); END; IF (&raw ^=.); RUN;" (&errper NE 0)"SCERROR: The periodicity should be equal to (1, 2, 3, 4, 5, 6, 7, 12)"FINMACRO" ;" "+ PROC FORMAT; VALUE fper"$ (&per EQ 12)"ui 1='JAN' 2='FEB' 3='MAR' 4='APR' 5='MAY' 6='JUN' 7='JUL' 8='AUG' 9='SEP' 10='OCT' 11='NOV' 12='DEC';"*"' (&per EQ 4)"-! 1='Q1' 2='Q2' 3='Q3' 4='Q4';"*"#*I1&per1" &i="P&i"""; RUN;"FORM" fper."MOIS" "7 (&per EQ 12)"FORMD" MONYY5."MOIS"? /Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"HREF"8 ((30, 60, 90, 120, 125.325, 150, 155.325)"E"? (&per EQ 4)"FORMD" YYQ4."MOIS" Q1 Q2 Q3 Q4"HREF". (90, 105.975, 121.95, 137.925)"E"FORMD" MONYY5."#E I1&per1"MOIS"  &mois P&i" "  DATA __trav0__; SET __trav0__; KEEP &date per mois year an &raw &xlin dxlin &sa &irr &outl &season &tdays &trend &usr __irreg__; IF (&per=4) THEN per=QTR(&date); ELSE per=MONTH(&date); year=YEAR(&date); an='A'||PUT(year,4.); mois=PUT(" per,&form); __irreg__=&irr - &mode; RUN; PROƗ~*) NE 0)" OPTIONS LS=&gls PS=&gps; PROC IML; x={&graph}; CALL SYMPUT('ming',CHAR(MIN(x),2,0)); CALL SYMPUT('maxg',CHAR(MAX(x),2,0)); RUN;"&P(%LENGTH(&vtype) NE 0)" DATA _NULL_; LENGTH vtype $ 200; vtype=TRIM(LEFT(COMPBL("&vtype"))); vtype=TRIM(LEFT(COMPRESS("'"||TRANWRD(TRIM(LEFT(vtype)),' ',"','")||"'"))); CALL SYMPUT('vtype',TRIM(LEFT(vtype))); RUN;"P"& PROC PLOT DATA=EditData"&T(%LENGTH(&vtype) NE 0)", (WHERE=(_TYPE_ IN (&vtype)))"T" NOLEGEND ;"3ZI&ming%EVAL(&maxg - 1)1"/Y J%EVAL(&i +1)&maxg1"ui PLOT Dim&j * Dim&i $ _Name_ /HREF=0 VREF=0; LABEL Dim&i = Axe&i; LABEL Dim&j=Axe&j; RUN;""" QUIT; OPTIONS;"\" ;"|#^0` P<X,Dldx 0<0Xlt8LT@T\h$8 ,4@( , D x !(!0!P!d!t!ǗH+ ;"W"'[(%LENGTH(&diagn ) EQ 0)"DIAGN" non"j">`.(%LENGTH(%QSCAN(%BQUOTE(&diagn ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre diagn (&diagn )"FINMACRO" ;"`"*e(%DATATYP(&diagn ) EQ NUM)"RBERROR: La valeur du paramtre diagn (&diagn ) doit tre caractre"FINMACRO" ;"j"Gj7((%UPCASE(&diagn) NE OUI) AND (%UPCASE(&diagn) NE NON))"aQERROR: La valeur du paramtre diagn (&diagn ) doit tre choisie parmi (oui non )"FINMACRO" ;"j"&n(%LENGTH(&cres ) EQ 0)"CRES" red"x"=s-(%LENGTH(%QSCAN(%BQUOTE(&cres ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre cres (&cres )"FINMACRO" ;"s")x(%DATATYP(&cres ) EQ NUM)"O?ERROR: La valeur du paramtre cres (&cres ) doit tre caractre"FINMACRO" ;"x"&|(%LENGTH(&creg ) EQ 0)"CREG" black""=-(%LENGTH(%QSCAN(%BQUOTE(&creg ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre creg (&creg )"FINMACRO" ;"")(%DATATYP(&creg ) EQ NUM)"O?ERROR: La valeur du paramtre creg (&creg ) doit tre caractre"FINMACRO" ;""  PROC CONTENTS DATA=&data(KEEP=&cols) NOPRINT OUT=nomvar; RUN; DATA _NULL_; LENGTH listvar $ 250; RETAIN listvar ' '; SET nomvar END=fin; listvar=COMPBL(TRIM(LEFT(listvar)) || ' ' || TRIM(LEFT(name))); IF fin THEN CALL SYMPUT" ('cols',listvar); RUN; DATA _don_; SET &data(KEEP=&cols &lignes) END=fin; ARRAY cols(*) &cols; IF fin THEN DO; CALL SYMPUT('_nlign_',LEFT(PUT(_n_,8.))); CALL SYMPUT('_ncols_',LEFT(PUT(DIM(cols),8.))); END; RUN; PROC"  IML; START effect(mat,effet); numeff=NCOL(mat); matdif=J(numeff,numeff,0); DO i=1 TO numeff-1; IF (i=1) THEN n=0; DO j=i+1 TO numeff; n=n+1; matdif[j,i]=MEDIAN(mat[,i]-mat[,j]); matdif[i,j]=-matdif[j,i];"{o END; END; effet=matdif[:,]; FINISH effect; USE _don_; READ all VAR{&cols} INTO _donnee_;" (&lignes NE)"4( READ all VAR{&lignes} INTO lignoms;"" CLOSE _don_;" (&lignes EQ)" lignoms= {"'I1&_nlign_1" LIG&i""};""ma PRINT 'Tableau de donnes'; PRINT _donnee_[FORMAT=&format]; _donnee_=_donnee_ ## &power;" (&power NE 1)"cW PRINT ,,"Donnes transformes (Power=&power)"; PRINT _donnee_[FORMAT=&format];"" _a_=J(&_nlign_,1,0); _b_=J(1,&_ncols_,0); _m_=J(1,1,0); ; ; RUN effect(_donnee_,_b_); RUN effect(T(_donnee_),_a_); _a_=T(_a_); _residu_=_donnee_-REPEAT(_a_,1,&_ncols_)-REPEAT(_b_,&_nlign_,1); _m_=MEDIAN(COLVEC(_residu_));" _residu_=_residu_-_m_; PRINT 'Rsultat du Polissage',,; PRINT _residu_[FORMAT=&format] _a_[FORMAT=&format]; PRINT _b_[FORMAT=&format] _m_[FORMAT=&format];"&(%LENGTH(&d, fft=(xcos#xcos+xsin#xsin)/nobs; RUN moymob(fft,mfft,ww); fft=mfft; cc=LOC(fft > 0);" (&log EQ YES)"PD IF (NCOL(cc) ^= 0) THEN Periodogram[cc,i]=10*LOG10(fft[cc,]);""F: IF (NCOL(cc) ^= 0) THEN Periodogram[cc,i]=fft[cc,];"  END; FINISH Periodogram; USE seas(WHERE=(&varspec ^=.)); READ all VAR{&varspec} INTO x; READ all VAR{&date} INTO date; CLOSE seas; nvar=NCOL(x); nobs=NROW(x); period=&per; pi=2*ARCOS(0); frq=T(DO(0,0.5,1/"300)); IF (period=12) THEN DO; specfreq={0.348125 0.431458}; END; IF (period=4) THEN DO; specfreq={0.044375 0.088750 0.294375 0.338750 0.383125}; END; nfrq=NROW(frq); FreqN=T(CONCAT(J(1,nfrq,'Freq'),LEFT(CHAR(1:nfrq,5))));"  nbtd=NCOL(specfreq); nametd=T(CONCAT(J(1,nbtd,'TD'),LEFT(CHAR(1:nbtd,5)))); DO i=1 TO nbtd; min=ABS(frq-specfreq[i])[>:<]; frq[min]=specfreq[i]; frq[min+1]=frq[min]+frq[2]; frq[min-1]=frq[min]-frq[2]; FreqN[min]=CONCAT('TD',"LEFT(CHAR(i,5))); END; frq0=LOC((frq^=0) & (MOD(ROUND(360*frq,10**-5),360/period)=0)); nbseas=NCOL(frq0); nameseas=T(CONCAT(J(1,nbseas,'Seas'),LEFT(CHAR(1:nbseas,5)))); FreqN[frq0]=nameseas; RUN Periodogram(x,newvar1,frq,period);" Ident={'Freq'} || {'Freq2'} || {"s_01"}; Frq2=360*Frq; Periodogram=Frq2 || Frq || newvar1; CREATE __spect1__ FROM Periodogram[ROWNAME=FreqN COLNAME=Ident]; APPEND FROM Periodogram[ROWNAME=FreqN]; CLOSE __spect1__; QUIT; DATA"  __spect2__; LENGTH listf $ 2000; SET __spect1__ END=fin; DROP a listf; LABEL Freq='Frequency 0 to 180'; s_02=s_01; RETAIN listf ' '; IF ((FreqN=:'T') OR (FreqN=:'S')) THEN listf=TRIM(LEFT(COMPBL(TRIM(LEFT(listf))||', '||TRIM(LEFT(PUT"(Freq,6.2)))))); IF fin THEN DO; a=INDEX(listf,','); listf=TRIM(LEFT(SUBSTR(listf,a+1))); CALL SYMPUT('listf',TRIM(LEFT(listf))); END; RUN;" (&log EQ NO)"  PROC UNIVARIATE DATA=__spect1__ NOPRINT; VAR s_01; OUTPUT OUT=p90 P90=P90; RUN; DATA _NULL_; SET p90; pp=INT(LOG10(p90)); p90=ROUND(p90,10**(pp-2)); CALL SYMPUT('p90',TRIM(LEFT(PUT(p90,20.5)))); RUN; DATA __spect2__"^R; SET __spect2__; degre=90*freq/ARCOS(0); s_02=MIN(s_01,&p90); RUN;"" GOPTIONS CBACK=white BORDER NODISPLAY NOPROMPT DEVMAP=winansi KEYMAP=winansi DEVICE=win FTITLE=swiss FTEXT=swissb GUNIT=pct HTITLE=5 HTEXT=2.5; DATA _null_; IF (CEXIST("&&_var&i")) THEN CALL SYMPUT('_catalg','1');"9- ELSE CALL SYMPUT('_catalg','0'); RUN;" (&_catalg)"6* PROC CATALOG C=&&_var&i KILL; QUIT;"" SYMBOL1 I=join COLOR=black WIDTH=1 VALUE=none ; SYMBOL2 I=join COLOR=red WIDTH=1 VALUE=none ; PROC GPLOT DATA=seas(WHERE=(&&_var&i ^=.)) GOUT=&&_var&i UNIFORM; PLOT &&_var&i*&date = 1 / NAME="brute" VAXIS=axis1; AXIS1 LABEL=(R=0 a=90);"UI FORMAT &date &formd; TITLE "Srie brute &&_var&i"; RUN; QUIT;" &SYSVER >= 7" DATA _null_; CALL SYMPUT('smooth2',LEFT(COMPRESS('('||PUT(100*&smooth,3.)||'%)'))); RUN; PROC GPLOT DATA=loess GOUT=&&_var&i UNIFORM; PLOT (&&_var&i loess)*&date / NAME="loess" VAXIS=axis1 OVERLAY; FORMAT &date &formd; AXIS1"l` LABEL=(a=90); TITLE "Srie brute &&_var&i et lissage par LOESS &smooth2"; RUN; QUIT;""@4 PROC GPLOT DATA=__spect2__ GOUT=&&_var&i UNIFORM;" (&per EQ 12)" PLOT s_02*freq / NAME="spectre" OVERLAY HREF=(&listf) LHREF=33 HAXIS=(0, 30, 60, 90, 120, 150, 180) VAXIS=axis1;- You must precise just one value for the respvar (&respvar ) parameter"FINMACRO" ;"L"cW DATA _NULL_; SET &data (KEEP=&respvar OBS=1); ARRAY _xx_(*) &respvar ; RUN;"S(&syserr NE 0)"N>ERROR: There is a problem in the respvar (&respvar ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"S"T"&X(%LENGTH(&stat ) EQ 0)"STAT" N"g"=]-(%LENGTH(%QSCAN(%BQUOTE(&stat ),2, )) NE 0)"VFERROR: You must precise just one value for the stat (&stat ) parameter"FINMACRO" ;"]")b(%DATATYP(&stat ) EQ NUM)"D4ERROR: The stat (&stat ) parameter must be character"FINMACRO" ;"g"go((%UPCASE(&stat) NE N) AND (%UPCASE(&stat) NE SUM) AND (%UPCASE(&stat) NE MEAN) AND (%UPCASE(&stat) NE MEDIAN))"\LERROR: The stat (&stat ) parameter must be choosen among (N SUM MEAN MEDIAN)"FINMACRO" ;"g"_NETTOY_" "VRANK" 0"GRANK" 0"NBRANK" 0"  PROC CONTENTS DATA=&data(KEEP=&vars) NOPRINT OUT=nomvar(KEEP=name type format informat); RUN; DATA nomvar; LENGTH list $ 30000; RETAIN list ' '; SET nomvar END=fin; DROP list; name=UPCASE(name); list=COMPBL(TRIM(LEFT(list)) || ' ' || TRIM"(LEFT(name))); IF fin THEN DO; *CALL SYMPUT('vars',TRIM(LEFT(list))); CALL SYMPUT('nvars',TRIM(LEFT(PUT(_N_,5.)))); END; RUN;"v (&nvars NE 2)"QAERROR: You must precise exactly 2 variables in the parameter VARS"FINMACRO" ;"v"  DATA tout; LENGTH name formats groups $ 32; KEEP name formats groups; vars=TRIM(LEFT(COMPBL(UPCASE("&vars")))); nvars=COUNT(vars,' ')+1; DO i=1 TO nvars; groups=SCAN("&groups",i,' '); formats=SCAN("&formats",i,' '); name=SCAN(vars,i);"PD OUTPUT; END; CALL SYMPUT('nvars',LEFT(PUT(nvars,5.))); RUN;"_NETTOY_"% &_nettoy_ tout nomvar" PROC SORT DATA=nomvar; BY name; RUN; PROC SORT DATA=tout; BY name; RUN; DATA nomvar; MERGE nomvar tout END=fin; BY name; LENGTH listform listgrp newform newvar $ 30000; RETAIN listform listgrp newform newvar ' '; IF groups=' ' THEN"  groups='0'; IF formats=' ' THEN formats='0'; IF (type=2) THEN groups='0'; IF (TRIM(LEFT(formats)) ^='0') THEN DO; groups='0'; newform=TRIM(LEFT(newform))||' '||TRIM(LEFT(name)) || ' '||TRIM(LEFT(formats)); trueform=formats; END; ELSE"  DO; trueform=groups; END; IF ((type=1) AND (TRIM(LEFT(groups)) ^='0')) THEN DO; n+1; newform=TRIM(LEFT(newform))||' '||TRIM(LEFT(COMPRESS('r'||PUT(n,5.)))) || ' '||TRIM(LEFT(COMPRESS('fr'||PUT(n,5.)||'_.'))); newvar=TRIM(LEFT(newvar))||"' '||TRIM(LEFT(COMPRESS('r'||PUT(n,5.)))); CALL SYMPUT('vrank'||LEFT(PUT(n,5.)),name); CALL SYMPUT('grank'||LEFT(PUT(n,5.)),groups); CALL SYMPUT('nbrank',LEFT(PUT(n,5.))); END; ELSE DO; newvar=TRIM(LEFT(newvar))||' '||TRIM(LEFT(name));" END; listform=TRIM(LEFT(listform))||' '||TRIM(LEFT(trueform)); listgrp=TRIM(LEFT(listgrp))||' '||TRIM(LEFT(groups)); IF NOTDIGIT(TRIM(LEFT(groups))) THEN error1 +1; ELSE DO; a=INPUT(TRIM(LEFT(groups)),20.); IF (a<0) THEN error2 +1;"—6."tLINKSTSUE9.1   :8>"0DATA"0VARY"0VARX"0DATE"0OUTSER"0NLAGX"0NLAGY"0 NOCONTROL"0DEBUG", FINCONTROL",FINMACRO" (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;""TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"(&nocontrol NE)" FINCONTROL""  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index" GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"'"= -(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;" "8, DATA _NULL_; SET &data (OBS=1); RUN;"'(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"'"(+(%LENGTH(&outser ) EQ 0)"OUTSER" _outser_"6"?0/(%LENGTH(%QSCAN(%BQUOTE(&outser ),2, )) NE 0)"ZJERROR: You must precise just one value for the outser (&outser ) parameter"FINMACRO" ;"0"3' %sasnom(_IN_=&outser ,TYPE=DATASET);"6 (&_ret_ NE 0)"WGERROR: The outser (&outser ) parameter must be a valid SAS dataset name"FINMACRO" ;"6"&;(%LENGTH(&vary ) EQ 0)"<,ERROR: You must precise a dependent variable"FINMACRO" ;"G"<@,(%LENGTH(%QSCAN(%BQUOTE(&vary),2, )) NE 0)"UEERROR: You must precise just one value for the vary (&vary) parameter"FINMACRO" ;"@"\P DATA _NULL_; SET &data (KEEP=&vary OBS=1); ARRAY _xx_(*) &vary; RUN;"G(&syserr NE 0)"G7ERROR: There is a problem in the vary (&vary) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"G"&×@/C SORT DATA=__trav0__ OUT=_a_; BY per year; RUN; PROC MEANS DATA=_a_ NOPRINT; BY per; VAR &season; OUTPUT OUT=stats(DROP=_type_ ) MEAN=avg; RUN; PROC SORT DATA=stats OUT=sort; BY DESCENDING" _freq_; RUN; DATA _null_; SET sort(OBS=1); LENGTH tick nper nref $ 200; RETAIN tick nref nper ' '; nmax=2*INT((_freq_+1)/2)+3; jj=INT(nmax/2); kk=&per*nmax; DO per=1 TO kk BY nmax; per2=per+jj; a=PUT(per2,4.); b=PUT(per,4.);"  nref=COMPBL(nref || ' ' || b); tick=COMPBL(tick || ' ' || b || ' ' || a); END; c=PUT(kk,4.); nref=COMPBL(nref || ' ' || c); tick=COMPBL(tick || ' ' || c); CALL SYMPUT('_nmax_',nmax); CALL SYMPUT('tick',LEFT(TRIM(tick))); CALL SYMPUT(" 'nref',LEFT(TRIM(nref))); RUN; DATA _a_; MERGE _a_ stats;BY per; KEEP &season nobs per avg; RETAIN n; IF (FIRST.per) THEN DO; n=0; a=&season; DO i=1 TO 2; &season=.; nobs+1; n+1; OUTPUT; END; &season=a; END; nobs+1; n+1;"  OUTPUT; IF (LAST.per) THEN DO UNTIL (n=&_nmax_); &season=.; nobs+1; n+1; OUTPUT; END; RUN; DATA _a_; SET _a_; IF &season=. THEN avg=.; RUN; PROC SPECTRA DATA=__trav0__ CENTER OUT=spectre s ; VAR dxlin &sa &irr; WEIGHTS TUKEY; RUN" ; DATA spectre; SET spectre; ARRAY varx s_01 s_02 s_03; ARRAY vary s_01a s_02a s_03a; DO OVER varx; vary=10*LOG(varx); END; degre=90*freq/ARCOS(0); LABEL degre='Frequency 0 to 180'; RUN; PROC ARIMA DATA=__trav0__; IDENTIFY VAR=" &irr NLAG=%EVAL(3*&per) OUTCOV=_cov_ NOPRINT; RUN; QUIT; DATA _cov_; SET _cov_(KEEP=n corr lag); KEEP lag corr up low; RETAIN numobs; IF _N_=1 THEN DO; numobs=n; up=0; low=0; END; ELSE DO;; tot+corr**2; up=1.96" *SQRT((1+2*tot)/numobs); low=-up; END; RUN; GOPTIONS CBACK=white BORDER NOPROMPT NODISPLAY DEVMAP=winansi KEYMAP=winansi DEVICE=win FTITLE=swiss FTEXT=swissb GUNIT=pct HTITLE=5 HTEXT=2.5; DATA _null_; IF (CEXIST("&catg"))"_S THEN CALL SYMPUT('_catalg','1'); ELSE CALL SYMPUT('_catalg','0'); RUN;"R (&_catalg)"3' PROC CATALOG C=&catg KILL; QUIT;"R" SYMBOL1 I=join COLOR=black WIDTH=1 VALUE=none ; SYMBOL2 I=join COLOR=red WIDTH=1 VALUE=none ; PROC GPLOT DATA=__trav0__ GOUT=&catg UNIFORM; PLOT &raw*&date &trend*&date / NAME="raw" OVERLAY VAXIS=axis1; AXIS1 LABEL=(R=0 a=90); FORMAT" &date &formd; TITLE "&raw Raw data & Trend-cycle"; RUN; QUIT; PROC GPLOT DATA=__trav0__ GOUT=&catg UNIFORM; PLOT &sa*&date / NAME="sa" OVERLAY VAXIS=axis1; AXIS1 LABEL=(R=0 a=90); FORMAT &date &formd; TITLE" "Seasonally adjusted series"; RUN; QUIT; PROC GPLOT DATA=__trav0__ GOUT=&catg UNIFORM; PLOT &tdays*&date / NAME="tday" OVERLAY VAXIS=axis1; AXIS1 LABEL=(R=0 a=90); FORMAT &date &formd; TITLE "Trading-day component"; RUN; QUIT;" PROC GPLOT DATA=__trav0__ GOUT=&catg UNIFORM; PLOT &outl*&date / NAME="outl" OVERLAY VAXIS=axis1; AXIS1 LABEL=(R=0 a=90); FORMAT &date &formd; TITLE "Outlier component"; RUN; QUIT; PROC GPLOT DATA=__trav0__ GOUT=&catg UNIFORM;" PLOT &usr*&date / NAME="usr" OVERLAY VAXIS=axis1; AXIS1 LABEL=(R=0 a=90); FORMAT &date &formd; TITLE "Userreg component"; RUN; QUIT; SYMBOL1 I=needle COLOR=black WIDTH=1 VALUE=none ; PROC GPLOT DATA=__trav0__ GOUT=&catg UNIFORM;" PLOT __irreg__*&date / NAME="irr" OVERLAY VAXIS=axis1; AXIS1 LABEL=(R=0 a=90); FORMAT &date &formd; TITLE "Irregular"; RUN; QUIT; DATA _NULL_; LENGTH haxis $ 10000; mois=TRIM(LEFT(COMPBL("&mois"))); haxis='(0'; freq=360/"&per; DO i=1 TO INT(&per/2); haxis=TRIM(LEFT(COMPBL(TRIM(LEFT(haxis)) || ', ' || PUT(ROUND(i*freq),6.)))); END; haxis=TRܗ40 label="&&_lab&i"; OUTPUT;""@4 RUN; PROC IML; USE &data; READ all VAR{"%I1&_nser1" &&_var&i""`T} INTO x; READ all VAR{&date} INTO date; CLOSE &data; nvar=NCOL(x); names={"%I1&_nser1" &&_var&i"" }; first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0); miss=J(nvar,1,0); mean=T(x[:,]); max=T(x[<>,]); min=T(x[><,]); period=J(nvar,1,.); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]];"  last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL(LOC(aa^=.)); dd=LOC(aa=.); miss[i]=NCOL(dd); IF (miss ^=0) THEN x[dd,i]=-99999; END; END; DO i=1 TO nvar; jj=(last[i]-first[i]+1)/nobs[i]; IF ((0&_nettoy_ tfit tdeterm tcalend toutlier tregvar tarmapar tramo"  DATA &out; MERGE statdes tramo; BY nser; DROP nser; RUN; DATA _NULL_; INFILE "&dtramo.\output\list.out" LENGTH=l LRECL=30000 END=fin; INPUT xx $VARYING5000. l @; xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'*********',' . '); FILE"^R "&dtramo.\output\temptt.txt" RECFM=V LRECL=30000; PUT xx $VARYING5000. l; RUN;"NBPBS" -1"  DATA listout(DROP=n xx yy nser &indata label) &summ(KEEP=&indata label); RETAIN n 0; LENGTH label $ 50 &indata 5 series $ 32 date results $ 8; INFILE "&dtramo.\output\temptt.txt" FIRSTOBS=6 LENGTH=l LRECL=30000 END=fin; INPUT xx $VARYING5000. l"  @; IF (LEFT(xx)=:'Summary Statistics') THEN DO; FILE PRINT; PUT "File &indata" /; n=1; END; IF ((LEFT(xx)=:'SERIES TITLE') AND INDEX(xx,'Date')) THEN n=-1; IF ((LEFT(xx)=:'SERIES TITLE') AND (INDEX(xx,'Date')=0)) THEN n=-2; IF (xx=' ')"  THEN n=0; IF (n=1) THEN DO; IF (LEFT(xx)^='Summary Statistics') THEN DO; yy=LEFT(xx); &indata=INPUT(SCAN(yy,1),5.); label=TRIM(LEFT(SݗF1RIES" _numeric_"R"cW DATA _NULL_; SET &data (KEEP=&tseries OBS=1); ARRAY _xx_(*) &tseries ; RUN;"R(&syserr NE 0)"N>ERROR: There is a problem in the tseries (&tseries ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"R"-! OPTIONS noxwait;"_NETTOY_" " PROC CONTENTS DATA=&data(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _nomvar_; LENGTH liste $ 10000; RETAIN liste ' '; SET _nomvar_ END=fin; name=UPCASE(name); IF (name ^= UPCASE("&date")) THEN DO; n+1; CALL" SYMPUT('_var'!!LEFT(PUT(n,4.)),TRIM(LEFT(name))); liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); END; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(n,4.))); CALL SYMPUT('tseries',TRIM(LEFT(liste))); END; RUN;"_NETTOY_"" &_nettoy_ _nomvar_"  PROC IML; USE &data; READ all VAR{&tseries} INTO x; READ all VAR{&date} INTO date; CLOSE &data; nvar=NCOL(x); series={&tseries}; first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0); miss=J(nvar,1,0); mean=T(x[:,]); max=T" (x[<>,]); min=T(x[><,]); period=J(nvar,1,.); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL(LOC(aa^=.)); miss[i]=" NCOL(LOC(aa=-99999)); END; END; DO i=1 TO nvar; jj=(last[i]-first[i])/nobs[i]; IF ((25<=jj) & (jj<=35)) THEN period[i]=12; ELSE IF ((50<=jj) & (jj<=70)) THEN period[i]=6; ELSE IF ((80<=jj) & (jj<=100)) THEN period[i]=4; ELSE IF ((115" <=jj) & (jj<=135)) THEN period[i]=3; ELSE IF ((175<=jj) & (jj<=195)) THEN period[i]=2; ELSE IF ((345<=jj) & (jj<=375)) THEN period[i]=1; END; nbyear=INT(nobs/period); results=period || first || last || nobs || nbyear || miss || max || min ||"  mean; nomcols={period first last nobs nbyear nmiss max min mean}; trend=J(NROW(x),nvar,.); season=J(NROW(x),nvar,.); saseries=J(NROW(x),nvar,.); smooth=J(NROW(x),nvar,.); irregular=J(NROW(x),nvar,.); abic=J(nvar,1,.); order=ℴ"K? sorder=&sorder; rigid=1; npred=0; opt={0 0 0 0 4 1 0};"#b(%LENGTH(&va) NE 0)" opt[4]=&va;"b"e (&lam EQ 0)" opt[7]=1;"e"eY print=0; DO i=1 TO nvar; cc=LOC(x[,i]^=.); data=x[cc,i]; opt[1]=period[i];"'i(%LENGTH(&tddays) NE 0)"C7 opt[2]=YEAR(first[i]); opt[3]=MONTH(first[i]);"i" CALL tsbaysea(tc,sf,ser,sa,bic,data,order, sorder, rigid, npred, opt, , print); trend[cc,i]=tc; season[cc,i]=sf; saseries[cc,i]=sa; smooth[cc,i]=ser;"m (&lam EQ 0)"' irregular[cc,i]=sa/tc;"n"' irregular[cc,i]=sa-tc;" abic[i]=bic; END; results=results || abic; nomcols=nomcols || 'BIC'; CREATE &out FROM results[COLNAME=nomcols ROWNAME=series]; APPEND FROM results[ROWNAME=series]; CLOSE &out; trend=date || trend; season=date||season;" saseries=date||saseries; smooth=date||smooth; irregular=date || irregular; series="&date" || series; CREATE TrendCycle FROM trend[COLNAME=series]; APPEND FROM trend; CLOSE TrendCycle; CREATE saseries FROM saseries[COLNAME=series];"  APPEND FROM saseries; CLOSE saseries; CREATE season FROM season[COLNAME=series]; APPEND FROM season; CLOSE season; CREATE smoޗ2""ma PLOT s_02*freq / NAME="spectre" OVERLAY HREF=(&listf) LHREF=33 HAXIS=(0,90,180) VAXIS=axis1;"  AXIS1 LABEL=none" (&log EQ NO)"& ORDER=(0 TO &p90 BY &p90)""; TITLE "Spectre de la srie &&_var&i"; RUN; QUIT; SYMBOL2 I=join COLOR=black WIDTH=1 VALUE=none ; PROC GPLOT DATA=_b_ GOUT=&&_var&i UNIFORM; PLOT (&minan - &maxan)*per = 2 /FRAME OVERLAY NAME="annee" VAXIS=axis1;; AXIS1 LABEL=none;" TITLE "Evolution de chaque anne"; FORMAT per &form.; RUN; QUIT; PROC GPLOT DATA= _a_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(a=90); AXIS2 ORDER=(&tick) LABEL=none MINOR=none MAJOR=(H=0.05) VALUE=(" (&per EQ 12)" ' ' 'Jan' ' ' 'Feb' ' ' 'Mar' ' ' 'Apr' ' ' 'May' ' ' 'Jun' ' ' 'Jul' ' ' 'Aug' ' ' 'Sep' ' ' 'Oct' ' ' 'Nov' ' ' 'Dec' ' '"":. ' ' 'Q1' ' ' 'Q2' ' ' 'Q3' ' ' 'Q4' ' '"v); PLOT &&_var&i*nobs avg*nobs / OVERLAY FRAME SKIPMISS NAME="seas" HAXIS=axis2 HREF=(&nref) LHREF=33 VAXIS=axis1;" (&per EQ 12)"2& TITLE "Evolution de chaque mois";""7+ TITLE "Evolution de chaque trimestre";" RUN; QUIT;" &SYSVER >= 7" PROC BOXPLOT DATA=seas(WHERE=(&&_var&i ^=.)) GOUT=&&_var&i; PLOT &&_var&i* year / CAXIS = black CTEXT = black CBOXES = black VAXIS=axis1 BOXSTYLE=schematic BOXCONNECT=median BOXWIDTHSCALE=1 CCONNECT=blue" IDCOLOR = black IDSYMBOL=dot NAME="boxpan"; TITLE "Variable &&_var&i : Boxplots par anne"; SYMBOL1 C=black H=0.5; AXIS1 LABEL=none MAJOR=none VALUE=none; RUN; QUIT;""  SYMBOL1 I=needle CI=grey WIDTH=10 V=none HEIGHT=3; SYMBOL2 I=join V=none CI=black; SYMBOL3 I=join V=none CI=black; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr0 up0 low0) * lag /"  OVERLAY VAXIS=axis1 NAME="corr0"; TITLE "ACF de la variable &&_var&i"; RUN; QUIT; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr1 up1 low1) * lag / OVERLAY VAXIS=axis1 NAME="corr1";" TITLE "ACF de la variable &&_var&i diffrencie I(1,0)"; RUN; QUIT; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr2 up2 low2) * lag / OVERLAY VAXIS=axis1 NAME="corr11"; TITLE1" "ACF de la variable &&_var&i diffrencie I(1,1)"; RUN; QUIT; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr3 up3 low3) * lag / OVERLAY VAXIS=axis1 NAME="corr01"; TITLE1"OC "ACF de la variable &&_var&i diffrencie I(0,1)"; RUN; QUIT;"!(&partinv EQ YES)"  SYMBOL1 I=needle CI=grey WIDTH=10 V=none HEIGHT=3; SYMBOL2 I=join V=none CI=black; SYMBOL3 I=join V=none CI=black; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr0 up0 low0) *" lag / OVERLAY VAXIS=axis1 NAME="pcorr0"; TITLE "PACF de la variable &&_var&i"; RUN; QUIT; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr1 up1 low1) * lag / OVERLAY VAXIS=" axis1 NAME="pcorr1"; TITLE "PACF de la variable &&_var&i diffrencie I(1,0)"; RUN; QUIT; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr2 up2 low2) * lag / OVERLAY VAXIS=axis1" NAME="pcorr11"; TITLE1 "PACF de la variable &&_var&i diffrencie I(1,1)"; Rߗ93 ;"I")M(%LENGTH(&tseries ) EQ 0)"TSERIES" _numeric_"T"cW DATA _NULL_; SET &data (KEEP=&tseries OBS=1); ARRAY _xx_(*) &tseries ; RUN;"T(&syserr NE 0)"N>ERROR: There is a problem in the tseries (&tseries ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"T"-! OPTIONS noxwait;"_NETTOY_" " PROC CONTENTS DATA=&data(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _nomvar_; LENGTH liste $ 10000; RETAIN liste ' '; SET _nomvar_ END=fin; name=UPCASE(name); IF (name ^= UPCASE("&date")) THEN DO; n+1; CALL" SYMPUT('_var'!!LEFT(PUT(n,4.)),TRIM(LEFT(name))); liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); END; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(n,4.))); CALL SYMPUT('tseries',TRIM(LEFT(liste))); END; RUN;"_NETTOY_"" &_nettoy_ _nomvar_"MA DATA __travz__; SET &data(KEEP=&date &tseries &varreg); RUN;"+b(%UPCASE(&outliers) EQ YES)" %RunTramo(DATA=__travz__,TSERIES=&tseries,RSA=9,OUTTYPE=2,FORECAST=0,DATE=&date, DTRAMO=c:\tramo,CONTROL=,OUT=_OutTS,DEBUG=); PROC TRANSPOSE DATA=_OutTS(KEEP=Series Lam) OUT=_OutTS(DROP=_Label_ _Name_); ID Series; VAR Lam; RUN;"  PROC IML; USE Xorig; READ all VAR{&date} INTO Date; READ all VAR{&tseries} INTO x; CLOSE Xorig; USE Outliers; READ all VAR{&tseries} INTO out; CLOSE Outliers; USE _OutTS; READ all VAR{&tseries} INTO lam; CLOSE _OutTS;"  NewData=J(NROW(x),NCOL(x),.); DO i=1 TO NCOL(x); cc=LOC(out[,i]^=.); IF lam[i]=0 THEN DO; NewData[cc,i]=x[cc,i]/out[cc,i]; END; ELSE IF lam[i]=1 THEN DO; NewData[cc,i]=x[cc,i]-out[cc,i]; END; END; NewData=Date ||" NewData; Names={&date} || {&tseries}; CREATE __travz__ FROM NewData[COLNAME=Names]; APPEND FROM NewData; CLOSE __travz__; QUIT;"b"qe PROC IML; USE __travz__; READ all VAR{&tseries} INTO x; READ all VAR{&date} INTO date;"'f(%LENGTH(&varreg) NE 0)"3' READ all VAR{&varreg} INTO varreg;"f" CLOSE __travz__; nvar=NCOL(x); series={&tseries}; first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0); miss=J(nvar,1,0); lam=J(nvar,1,0); mean=T(x[:,]); max=T(x[<>,]); min=T(x[><,]); period=J(nvar,1,.); DO i=1 TO nvar;"  cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL(LOC(aa^=.)); miss[i]=NCOL(LOC(aa=-99999)); END; END; DO i=1 TO nvar; jj=(last[i]-" first[i])/nobs[i]; IF ((25<=jj) & (jj<=35)) THEN period[i]=12; ELSE IF ((50<=jj) & (jj<=70)) THEN period[i]=6; ELSE IF ((80<=jj) & (jj<=100)) THEN period[i]=4; ELSE IF ((115<=jj) & (jj<=135)) THEN period[i]=3; ELSE IF ((175<=jj) & (jj<=195)") THEN period[i]=2; ELSE IF ((345<=jj) & (jj<=375)) THEN period[i]=1; END; nbyear=INT(nobs/period); results=period || first || last || nobs || nbyear || miss || max || min || mean; nomcols={period first last nobs nbyear nmiss max min mean};"  trend=J(NROW(x),nvar,.); season=J(NROW(x),nvar,.); saseries=J(NROW(x),nvar,.); irregular=J(NROW(x),nvar,.); aic=J(nvar,1,.); order=ℴ sorder=&sorder; npred=0; nar=0; opt={0 0 0 12 0 200 1 2 0 100}; icmp={1 2}; print=1;"(n(%UPCASE(&tdays) EQ YES)"!ؗ 4UBSTR(yy,INDEX(yy,' ')+1))); OUTPUT &summ; END; FILE PRINT; PUT xx $CHAR80. ; END; IF ("(n=-1) AND (LEFT(xx)^=:'SERIES TITLE')) THEN DO; nser+1; INPUT series $ 1-40 date $ Nvalue Forecast LogNV LogF diff StdDev Tvalue Results $; OUTPUT listout; END; IF fin THEN CALL SYMPUT('nbpbs',LEFT(PUT(nser,4.))); RUN; DATA sum2(KEEP="&indata label); LENGTH label $ 50 &indata 5; INFILE "&dtramo.\output\sumodels.out" LENGTH=l LRECL=30000 END=fin; INPUT xx $VARYING5000. l @; IF (LEFT(xx)=:'Nz Too Small') THEN DO; label='Nz too small for complete AMI'; INPUT @26 &indata;" OUTPUT; END; IF (LEFT(xx)=:'Airline Model (Default)') THEN DO; label='Airline Model (Default)'; INPUT @26 &indata; OUTPUT; END; RUN; DATA &summ; SET &summ sum2; RUN;" (&nbpbs GT 0)" PROC SORT DATA=&out; BY series; RUN; PROC SORT DATA=listout; BY SERIES; RUN; DATA &out; MERGE &out listout; BY series; RUN;""_NETTOY_"& &_nettoy_ listout sum2" (&debug EQ)"u X "cd &dtramo"; X "del &dtramo.\serie /Q"; X "del &dtramo.\OUTPUT\*.* /Q"; X "del &dtramo.\GRAPH\*.* /S /Q";""i] DATA ___tt___; SET ___tt___; end=DATETIME(); time=end-start; PUT time= time.; RUN;" (&debug EQ)"VJ PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_; RUN; QUIT;""H#0` P@p(dpx 4H`t $4H0 H X l  h H ` p , 8 P ` t ,<PxLdt 4T$d$h\$8L` 4` p `x,@\ ,D`t DL4\t| !"#$%%&0&&&,'8(((()*+,-../////x0001l11ٗ5j = "de &&rmin&i._&j &&rmax&i._&j""" ;"" RUN;"" PROC MEANS DATA=_trav_ NOPRINT MISSING COMPLETETYPES NWAY; CLASS &newvar ; VAR &respvar; OUTPUT OUT=_&stat._(DROP=_type_ _freq_) &stat=&respvar;" (&newform NE)"  FORMAT &newform;""3' RUN; DATA _&stat._ ; SET _&stat._;"(&nbrank GE 1)" RENAME"&"I1&nbrank1" r&i=&&vrank&i""" ;""0$ LABEL &respvar="&respvar (&stat)""(&nbrank GE 1)"&#I1&nbrank1" r&i=' '"#""u; RUN; DATA _&stat._ ; SET _&stat._; LENGTH _Label_ Rows $ 50; _Label_=%SCAN(&vars,1); Rows=%SCAN(&vars,2);"(&nbrank GE 1)"&$I1&nbrank1" IF (TRIM(LEFT("&&vrank&i"))=SCAN(UPCASE("&vars"),1)) THEN _Label_=TRIM(LEFT(PUT(&&vrank&i,fr&i._.))); IF (TRIM(LEFT("&&vrank&i"))=SCAN(UPCASE("&vars"),2)) THEN Rows=TRIM(LEFT(PUT(&&vrank&i,fr&i._.)));"$"" RUN;"NAME" %SCAN(&vars,1)" PROC SORT DATA= _&stat._; BY &name; RUN; DATA _&stat._; LENGTH Columns $ 32; SET _&stat._ END=fin; BY &name; RETAIN n 0; DROP n; IF FIRST.&name THEN DO; n=n+1; CALL SYMPUT("_label_"||TRIM(LEFT(PUT(n,5.))),TRIM(LEFT(_Label_)));" END; Columns = TRIM(LEFT(COMPRESS("&name"||'_'||PUT(n,5.)))); IF fin THEN CALL SYMPUT('nbcols',TRIM(LEFT(PUT(n,5.)))); RUN;"NAME" %SCAN(&vars,2)" PROC SORT DATA= _&stat._; BY &name; RUN; PROC TRANSPOSE DATA=_&stat._ OUT=MyTable(DROP=_Name_ _Label_); BY Rows NOTSORTED; ID Columns; VAR &respvar; IDLABEL _Label_; RUN;"NAME" %SCAN(&vars,1)" %mpolish(DATA=MyTable,COLS=&name._1-&name._&nbcols,LIGNES=Rows,DIAGN=oui,PRINT=non,ITER=,FORMAT=,POWER=,CRES=,CREG=,DEBUG=&debug);" (&debug NE)"C7 OPTIONS MPRINT NOTES NOXWAIT NOCENTER LS=250 PS=500;""QE OPTIONS NOMPRINT NONOTES NOSOURCE2 NOCENTER NOXWAIT LS=250 PS=500;"s PROC PRINT DATA=MyTable NOOBS LABEL; TITLE "Raw Table (&vars)"; RUN; DATA _mpolish_; SET _mpolish_; LABEL"&'I1&nbcols1") &name._&i ="&&_label_&i""'"{o; PROC PRINT DATA=_mpolish_ NOOBS LABEL; TITLE "Result of the Median Polish Analysis (&vars)"; RUN; TITLE;"5  0)"9)ERROR: The var parameter must be precised"FINMACRO" ;"B"&;(%INDEX(&vars,-) NE 0)"UEERROR: No SAS variable list is allowed in the vars (&vars ) parameter"FINMACRO" ;";"D8 DATA _NULL_; SET &data (KEEP=&vars OBS=1); RUN;"B(&syserr NE 0)"H8ERROR: There is a problem in the vars (&vars ) parameter"qaERROR: Non valid SAS dataset? Non valid SAS names? A variable does not exist? Non valid SAS list?"FINMACRO" ;"B"(F(%LENGTH(&groups ) EQ 0)"GROUPS" 0"F")T(%LENGTH(&respvar ) NE 0)"@L0(%LENGTH(%QSCAN(%BQUOTE(&respvar ),2, )) NE 0)"\LERROR:ڗ:6L(%LENGTH(&date ) EQ 0)";+ERROR: You must precise a SAS date variable"FINMACRO" ;"X"<Q,(%LENGTH(%QSCAN(%BQUOTE(&date),2, )) NE 0)"WGERROR: You must precise just one variable in the date (&date) parameter"FINMACRO" ;"Q"]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"X(&syserr NE 0)"H8ERROR: There is a problem in the date (&date ) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"X"%\(%LENGTH(&varx) EQ 0)"VARX" _numeric_"c"[O DATA _NULL_; SET &data (KEEP=&varx OBS=1); ARRAY _xx_(*) &varx; RUN;"c(&syserr NE 0)"G7ERROR: There is a problem in the varx (&varx) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"c"'u(%LENGTH(&nlagx ) NE 0)">i.(%LENGTH(%QSCAN(%BQUOTE(&nlagx ),2, )) NE 0)"XHERROR: You must precise just one value for the nlagx (&nlagx ) parameter"FINMACRO" ;"i"+n(%DATATYP(&nlagx ) EQ CHAR)"D4ERROR: The nlagx (&nlagx ) parameter must be numeric"FINMACRO" ;"t"s(&nlagx LE 0 )"0 ERROR: You must have &nlagx > 0"FINMACRO" ;"t"pd DATA _NULL_; nlagx=INT(&nlagx); CALL SYMPUT('nlagx',TRIM(LEFT(PUT(nlagx,10.)))); RUN;"u"'y(%LENGTH(&nlagy ) EQ 0)"NLAGY" 2"">~.(%LENGTH(%QSCAN(%BQUOTE(&nlagy ),2, )) NE 0)"XHERROR: You must precise just one value for the nlagy (&nlagy ) parameter"FINMACRO" ;"~"+(%DATATYP(&nlagy ) EQ CHAR)"D4ERROR: The nlagy (&nlagy ) parameter must be numeric"FINMACRO" ;""(&nlagy LE 0 )"0 ERROR: You must have &nlagy > 0"FINMACRO" ;""pd DATA _NULL_; nlagy=INT(&nlagy); CALL SYMPUT('nlagy',TRIM(LEFT(PUT(nlagy,10.)))); RUN;"OC DATA _trav_; SET &data; KEEP &date &vary &varx; RUN;"_NETTOY" _trav_"  PROC CONTENTS DATA=_trav_(KEEP=&varx) OUT=_nomvar_(KEEP=name label) NOPRINT; RUN; DATA _nomvar_; SET _nomvar_ END=f; KEEP name label; RENAME name=series; IF ((UPCASE(name)^=UPCASE("&date")) AND (UPCASE(name)^=UPCASE("&vary"))) THEN DO;" ii+1; CALL SYMPUT('_var'!!LEFT(PUT(ii,6.)),TRIM(LEFT(name))); OUTPUT; END; IF f THEN CALL SYMPUT('_nvar',LEFT(PUT(ii,6.))); RUN; PROC SORT DATA=_nomvar_; BY series; RUN;"LISTVAR" "%I1&_nvar1"LISTVAR"! &listvar &&_var&i""_NETTOY"! &_nettoy _nomvar_"  PROC IML; USE _trav_; READ all VAR{&listvar &vary} INTO x; READ all VAR{&date} INTO date; CLOSE _trav_; nvar=NCOL(x); nobs=NROW(x); series=T({&listvar &vary}); mean=x[:,]; std=SQRT((x-REPEAT(mean,nobs,1))[##ۗ7UN; QUIT; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr3 up3 low3) * lag / OVERLAY VAXIS=axis1" NAME="pcorr01"; TITLE1 "PACF de la variable &&_var&i diffrencie I(0,1)"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr0 up0 low0) * lag / OVERLAY VAXIS=axis1"  NAME="icorr0"; TITLE "IACF de la variable &&_var&i"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr1 up1 low1) * lag / OVERLAY VAXIS=axis1 NAME="icorr1"; TITLE" "IACF de la variable &&_var&i diffrencie I(1,0)"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr2 up2 low2) * lag / OVERLAY VAXIS=axis1 NAME="icorr11"; TITLE1" "IACF de la variable &&_var&i diffrencie I(1,1)"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr3 up3 low3) * lag / OVERLAY VAXIS=axis1 NAME="icorr01"; TITLE1"RF "IACF de la variable &&_var&i diffrencie I(0,1)"; RUN; QUIT;""! GOPTIONS display;" (&eps NE)"cW GOPTIONS DEVICE=psepsf GSFNAME=grafout GSFMODE=replace; FILENAME grafout "&eps";"GRAFOUT" grafout"" (&jpg NE)"aU GOPTIONS DEVICE=jpeg GSFNAME=grafout GSFMODE=replace; FILENAME grafout "&jpg";"GRAFOUT" grafout""GRAFOUT" &&_var&i"  PROC GREPLAY IGOUT=&&_var&i TC=&&_var&i NOFS GOUT=&grafout; TDEF newfour DES='four squares of equal size' 1/LLX=1 LLY=1 ULX=1 ULY=49 URX=49 URY=49 LRX=49 LRY=1 color=grey 2/LLX=51 LLY=1 ULX=51 ULY=49 URX=99 URY=49 LRX="99 LRY=1 color=grey 3/LLX=1 LLY=51 ULX=1 ULY=99 URX=49 URY=99 LRX=49 LRY=51 color=grey 4/LLX=51 LLY=51 ULX=51 ULY=99 URX=99 URY=99 LRX=99 LRY=51 color=grey ; TEMPLATE newfour;" &SYSVER >= 7"aU TREPLAY 1:boxpan 2:spectre 3:loess 4:seas NAME=%CMPRES("&&_var&i.._1"); RUN;""`T TREPLAY 1:annee 2:spectre 3:brute 4:seas NAME=%CMPRES("&&_var&i.._1"); RUN;"`T TREPLAY 1:corr01 2:corr11 3:corr0 4:corr1 NAME=%CMPRES("&&_var&i.._2"); RUN;"!(&partinv EQ YES)" TREPLAY 1:pcorr01 2:pcorr11 3:pcorr0 4:pcorr1 NAME=%CMPRES("&&_var&i.._3"); RUN; TREPLAY 1:icorr01 2:icorr11 3:icorr0 4:icorr1 NAME=%CMPRES("&&_var&i.._4"); RUN;""' QUIT; TITLE; SYMBOL;"" (&debug EQ)"VJ PROC DATASETS LIB=work NOLIST; DELETE _a_ _b_ stats sort nomvar seas" &SYSVER >= 7"-! outloess seasloess sum loess""cW _cov_ _cov1_ _cov2_ _cov3_ _dcov_ _icov_ _pcov_ __spect1__ __spect2__ p90; RUN;"" QUIT;"7ԗM8by (&by ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"K"L"&P(%LENGTH(&word ) EQ 0)"WORD" no"_"=U-(%LENGTH(%QSCAN(%BQUOTE(&word ),2, )) NE 0)"VFERROR: You must precise just one value for the word (&word ) parameter"FINMACRO" ;"U")Z(%DATATYP(&word ) EQ NUM)"D4ERROR: The word (&word ) parameter must be character"FINMACRO" ;"_"D_4((%UPCASE(&word) NE YES) AND (%UPCASE(&word) NE NO))"RBERROR: The word (&word ) parameter must be choosen among (YES NO )"FINMACRO" ;"_"'c(%LENGTH(&print ) EQ 0)"PRINT" yes"r">h.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"XHERROR: You must precise just one value for the print (&print ) parameter"FINMACRO" ;"h"*m(%DATATYP(&print ) EQ NUM)"F6ERROR: The print (&print ) parameter must be character"FINMACRO" ;"r"Fr6((%UPCASE(&print) NE YES) AND (%UPCASE(&print) NE NO))"TDERROR: The print (&print ) parameter must be choosen among (YES NO )"FINMACRO" ;"r"(v(%LENGTH(&histog ) EQ 0)"HISTOG" no""?{/(%LENGTH(%QSCAN(%BQUOTE(&histog ),2, )) NE 0)"ZJERROR: You must precise just one value for the histog (&histog ) parameter"FINMACRO" ;"{"+(%DATATYP(&histog ) EQ NUM)"H8ERROR: The histog (&histog ) parameter must be character"FINMACRO" ;""H8((%UPCASE(&histog) NE YES) AND (%UPCASE(&histog) NE NO))"VFERROR: The histog (&histog ) parameter must be choosen among (YES NO )"FINMACRO" ;""%(%LENGTH(&ndec) NE 0)"*(%DATATYP(&ndec ) EQ CHAR)"D4ERROR: The ndec (&ndec ) parameter must be character"FINMACRO" ;"""'(%LENGTH(&excel ) NE 0)"*(%DATATYP(&excel ) EQ NUM)"F6ERROR: The excel (&excel ) parameter must be character"FINMACRO" ;""" PROC FORMAT; VALUE $ fstat 'N'='1' 'Missing values'='2' 'Mean','Moyenne'='3' 'Median','Mdiane'='4' 'Mode'='5' 'Std Deviation','Ecart-type'='6' 'Variance'='7' 'Range','Intervalle'='8' 'Interquartile Range'," 'Ecart interquartile'='9' '100% Max'='10' '99%'='11' '95%'='12' '90%'='13' '75% Q3'='14' '50% Median','50% Mdiane'='15' '25% Q1'='16' '10%'='17' '5%'='18' '1%'='19' '0% Min'='20'; RUN; ODS SELECT NONE; ODS OUTPUT BasicMeasures="ym_measures Quantiles=quantiles MissingValues=Missing Moments=Moments; PROC UNIVARIATE DATA=&data; VAR &var;"(&by NE)" CLASS &by;"")(%UPCASE(&histog) EQ YES)"." HISTOGRAM / KERNEL(COLOR=red);"" ՗Q9 icmp=icmp || {4};"n"'q(%LENGTH(&varreg) NE 0)"! icmp=icmp || {6};"q"D8 DO i=1 TO nvar; cc=LOC(x[,i]^=.); data=x[cc,i];"(u(%UPCASE(&tdays) EQ YES)"5) opt[2]=1; opt[3]=YEAR(first[i]);"u"  opt[5]=0; IF ((min[i] > 0) & (&lam = 0)) THEN DO; opt[5]=1; END; ELSE IF (min[i] > 0) & (&lam = -1) THEN DO; nblags=2*period[i]; CALL TSUNIMAR(arcoef,ev,nar,aic1,data,nblags,{1 0}); Nparms=nblags+1; NumResid=nobs[i]-Nparms" ; LogLik=aic1-2*Nparms; sbc=LogLik+LOG(NumResid)*Nparms; AICC=LogLik+2*Nparms/(1-(Nparms+1)/NumResid); HQ=LogLik+2*Nparms*LOG(LOG(NumResid)); y=LOG(data); CALL TSUNIMAR(arcoef,ev,nar,aic2,y,nblags,{1 0}); SumLog=y[37:NROW(y)][+" ]; LogLik=aic2-2*Nparms+2*SumLog; aic_log=LogLik+2*Nparms; sbc_log=LogLik+LOG(NumResid)*Nparms; AICC_log=LogLik+2*Nparms/(1-(Nparms+1)/NumResid); HQ_log=LogLik+2*Nparms*LOG(LOG(NumResid)); opt[5]=(AICC_Log < AICC); END; opt[4"nb]=period[i]; lam[i]=1-opt[5]; opt[10]=MIN(nobs[i],100); CALL tsdecomp(comp,est,aaic,data,"'|(%LENGTH(&varreg) NE 0)" varreg"|"  ,order,sorder,nar,npred,,opt,icmp,print); trend[cc,i]=comp[,1]; season[cc,i]=comp[,2]; IF (opt[5]=1) THEN DO; trend[cc,i]=EXP(trend[cc,i]); saseries[cc,i]=EXP(LOG(data)-comp[,2]); season[cc,i]=x[cc,i]/saseries[cc,i]; irregular"[cc,i]=saseries[cc,i]/trend[cc,i]; END; ELSE DO; saseries[cc,i]=data-comp[,2]; irregular[cc,i]=saseries[cc,i]-comp[,1]; END; comp2=comp;"'(%LENGTH(&varreg) NE 0)"RF comp2[,3:(2+NCOL(varreg))]=varreg[cc,]#comp[,3:(2+NCOL(varreg))];"" aic[i]=aaic; sum=comp[,+]; *PRINT date [FORMAT=MONYY7.] x comp sum; sum=comp2[,+]; *PRINT date [FORMAT=MONYY7.] x comp2 sum; END; results=results || lam || aic; nomcols=nomcols || 'Lam' || 'AIC'; CREATE &out FROM results[" COLNAME=nomcols ROWNAME=series]; APPEND FROM results[ROWNAME=series]; CLOSE &out; trend=date || trend; season=date||season; saseries=date||saseries; irregular=date||irregular; series="&date" || series; CREATE TrendCycle FROM trend[" COLNAME=series]; APPEND FROM trend; CLOSE TrendCycle; CREATE saseries FROM saseries[COLNAME=series]; APPEND FROM saseries; CLOSE saseries; CREATE season FROM season[COLNAME=series]; APPEND FROM season; CLOSE season; CREATE irregular"  FROM irregular[COLNAME=series]; APPEND FROM irregular; CLOSE irregular; QUIT; DATA &out; LENGTH data $ 50 series $ 32 firstdat lastdat $ 5 period 3; SET &out; firstdat=PUT(first,MONYY5.); lastdat=PUT(last,MONYY5.); IF INDEX("&data",'.')"J> THEN data=SCAN("&data",2,'.'); ELSE data="&data"; RUN;"_NETTOY_"  &_nettoy_"(&outtype EQ 1)"%I1&_nser1" DATA &&_var&i; MERGE &data(KEEP=&date &&_var&i) TrendCycle(KEEP=&date &&_var&i RENAME=(&&_var&i=TrendCycle)) saseries(KEEP=&date &&_var&i RENAME=(&&_var&i=Sadjust)) season(KEEP=&date &&_var&i RENAME=(&&_var&i=Season))"nb irregular(KEEP=&date &&_var&i RENAME=(&&_var&i=Irregular)); IF (&&_var&i ^=.); RUN;"_NETTOY_"5 %&_nettoy_ trend season sadjust smooth"""SG PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_; RUN; QUIT;"L#0`(XHxp|dl(@T֗K:,]); first=J("nvar,1,.); last=J(nvar,1,.); numobs=J(nvar,1,0); nmiss=J(nvar,1,0); max=x[<>,]; min=x[><,]; period=J(nvar,1,.); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]];"  aa=x[cc,i]; numobs[i]=NCOL(cc); nmiss[i]=(cc[NCOL(cc)]-cc[1]+1)-numobs[i]; jj=(last[i]-first[i])/numobs[i]; IF ((25<=jj) & (jj<=35)) THEN period[i]=12; ELSE IF ((50<=jj) & (jj<=70)) THEN period[i]=6; ELSE IF ((80<=jj) & (jj<=" 100)) THEN period[i]=4; ELSE IF ((115<=jj) & (jj<=135)) THEN period[i]=3; ELSE IF ((175<=jj) & (jj<=195)) THEN period[i]=2; ELSE IF ((345<=jj) & (jj<=375)) THEN period[i]=1; END; END; nbyear=INT(numobs/period); results=period || first" || last || numobs || nmiss || nbyear || T(max) || T(min) || T(mean) || T(std); nomcols={period first last nobs nmiss nbyear max min mean std}; CREATE &outser FROM results[ROWNAME=series COLNAME=nomcols]; APPEND FROM results[ROWNAME=series];" CLOSE &outser; CALL SYMPUT('nbmiss',TRIM(LEFT(CHAR(MAX(nmiss),5,0)))); CALL SYMPUT('nbper',TRIM(LEFT(CHAR(RANGE(period),5,0)))); QUIT;"(&nbmiss NE 0)"QAERROR: No series should have missing values (see &outser dataset)"FINMACRO" ;"" (&nbper NE 0)"P@ERROR: Mixed periodicities are not allowed (see &outser dataset)"FINMACRO" ;"" PROC SORT DATA=&outser; BY Series; RUN; DATA _trav_; SET _trav_; IF NMISS(OF &vary &varx)=0; RUN; DATA _NULL_; SET &outser(OBS=1); LENGTH per $ 15; IF (period=12) THEN per='month'; ELSE IF (period=6) THEN per='month1.2';" ELSE IF (period=4) THEN per='qtr'; ELSE IF (period=3) THEN per='month1.4'; ELSE IF (period=2) THEN per='semiyear'; ELSE IF (period=1) THEN per='year'; CALL SYMPUT('period',TRIM(LEFT(per)));"&(%LENGTH(&nlagx) EQ 0)"A5 CALL SYMPUT('nlagx',TRIM(LEFT(PUT(period,10.))));""  RUN; PROC TIMESERIES DATA=_trav_ OUT=_null_ OUTCROSSCORR=_crosscorr_(WHERE=(lag>=0)); ID &date INTERVAL=. VAR &vary; CROSSVAR &listvar; CROSSCORR LAG CCF CCF2STD / NLAGS=&nlagx; RUN; DATA _crosscorr_; SET _crosscorr_; ccf2=ABS(ccf"); RUN; PROC SORT DATA=_crosscorr_; BY _Name_ _Cross_ DESCENDING ccf2; RUN; DATA _crosscorr_; SET _crosscorr_; BY _Name_ _Cross_ DESCENDING ccf2; DROP ccf2; IF FIRST._cross_; RUN; DATA &outser; LENGTH Series $ 32; MERGE &outser"u _crosscorr_(RENAME=(_CROSS_=Series) DROP=_Name_); BY Series; LABEL Series=' ' Lag=' ' CCF=' ' CCF2STD=' '; RUN;"_NETTOY"$ &_nettoy _crosscorr_" DATA _aaa_; SET _trav_; ARRAY numx &vary &listvar; DO OVER numx; numx=SIGN(DIF(numx)*numx); END; RUN; PROC TIMESERIES DATA=_aaa_ OUT=_null_ OUTCROSSCORR=_crosscorr_(WHERE=(lag>=0)); ID &date INTERVAL=. VAR &vary;"  CROSSVAR &listvar; CROSSCORR LAG CCF CCF2STD / NLAGS=&nlagx; RUN; DATA _crosscorr_; SET _crosscorr_; ccf2=ABS(ccf); RUN; PROC SORT DATA=_crosscorr_; BY _Name_ _Cross_ DESCENDING ccf2; RUN; DATA _crosscorr_; SET _crosscorr_; BY _Name_" _Cross_ DESCENDING ccf2; RENAME ccf=CCF_GR lag=LAG_GR CCF2STD=CCF2STD_GR; DROP ccf2; IF FIRST._cross_; RUN; DATA &outser; LENGTH Series $ 32; MERGE &outser _crosscorr_(RENAME=(_CROSS_=Series) DROP=_Name_); BY Series; LABEL Series=' '"8, Lag_GR=' ' CCF_GR=' ' CCF2STD_GR=' '; RUN;"_NETTOY" &_nettoy _aaa_"-%SYSFUNC(EXIST(work.Granger))"TH PROC DATASETS LIBRARY=work NOLIST; ח_;"tMPOLISHE9.2  \/>"0DATA"0COLS"0LIGNES"0OUT"0DIAGN"0ITER"0PRINT"0FORMAT"0POWER"0CRES"0CREG"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"&"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"&(&syserr NE 0)"?/ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;"&"&*(%LENGTH(&cols ) EQ 0)"COLS" _numeric_"1"]Q DATA _NULL_; SET &data (KEEP=&cols OBS=1); ARRAY _xx_(*) &cols ; RUN;"1(&syserr NE 0)"?/ERROR: Problme dans le paramtre cols (&cols )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"1"(?(%LENGTH(&lignes ) NE 0)"?7/(%LENGTH(%QSCAN(%BQUOTE(&lignes ),2, )) NE 0)"_OERROR: Vous devez prciser une seule valeur pour le paramtre lignes (&lignes )"FINMACRO" ;"7"cW DATA _NULL_; SET &data (KEEP=&lignes OBS=1); ARRAY _xx_(*) $ &lignes ; RUN;">(&syserr NE 0)"C3ERROR: Problme dans le paramtre lignes (&lignes )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;">"?"%C(%LENGTH(&out ) EQ 0)"OUT" _mpolish_"N"<H,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one З< IF (a=1) THEN error3 +1; END; IF (TRIM(LEFT(formats)) ^='0') THEN DO; b=INDEX(formats,'$'); IF (((type=1) AND (b^=0)) OR ((type=2) AND (b=0))) THEN error4 +1; END; IF fin THEN DO; CALL SYMPUT('error1',TRIM(LEFT(PUT(error1,5.))));"  CALL SYMPUT('error2',TRIM(LEFT(PUT(error2,5.)))); CALL SYMPUT('error3',TRIM(LEFT(PUT(error3,5.)))); CALL SYMPUT('error4',TRIM(LEFT(PUT(error4,5.)))); CALL SYMPUT('trueform',TRIM(LEFT(listform))); CALL SYMPUT('newform',TRIM(LEFT(newform)));"th CALL SYMPUT('newvar',TRIM(LEFT(newvar))); CALL SYMPUT('groups',TRIM(LEFT(listgrp))); END; RUN;"J:groups= &groups vrank= &vrank grank=&grank nbrank= &nbrank"UEformats= &formats trueform= &trueform newform=&newform newvar=&newvar">.((&error1 + &error2 + &error3 + &error4) NE 0)"(&error1 NE 0)"WGERROR: the GROUPS parameter should have only numeric and integer values""(&error2 NE 0)"TDERROR: the GROUPS parameter should have only positive integer values""(&error3 NE 0)"F6ERROR: 1 is not a valid value for the GROUPS parameter""(&error4 NE 0)"TDERROR: Non valid format ? Format type does not match Variable type ?""FINMACRO" ;""dX DATA _trav_; SET &data; KEEP &respvar &vars; IF MISSING(OF &vars); RUN;"(&nbrank GE 1)"&I1&nbrank1"k_ PROC RANK DATA=_trav_ GROUP=&&grank&i OUT=_trav_; VAR &&vrank&i; RANKS r&i; RUN;"GRANK&I"" %EVAL(&&grank&i-1)""<0 PROC SUMMARY DATA=_trav_ NOPRINT; CLASS"&I1&nbrank1" r&i""; VAR &respvar"&I1&nbrank1" &&vrank&i""; OUTPUT OUT=_table_(DROP=min) &stat=&respvar MIN=min min1-min&nbrank MAX=max max1-max&nbrank; RUN; PROC MEANS DATA=_table_ NOPRINT; VAR max max1-max&nbrank; OUTPUT OUT=maxv MAX=; RUN; DATA _aa_; SET _trav_; ARRAY vvar &respvar"&I1&nbrank1" &&vrank&i""; ARRAY l $ l0-l&nbrank; ARRAY ll ll0-ll&nbrank; ARRAY dd dd0-dd&nbrank; ARRAY ii ii0-ii&nbrank; DO OVER vvar; l=LEFT(PUT(vvar,BEST30.)); ll=LENGTH(TRIM(LEFT(PUT(vvar,BEST30.)))); ii=INDEX(l,'.'); IF ii THEN dd=ll-ii;"  ELSE dd=0; END; RUN; PROC MEANS DATA=_aa_ NOPRINT; VAR ll0-ll&nbrank dd0-dd&nbrank; OUTPUT OUT=maxv MAX=; RUN; DATA _aa_; SET maxv; CALL SYMPUT('nform0',COMPRESS(TRIM(LEFT(PUT(ll0+3,30.))) || '.' || TRIM(LEFT(PUT(dd0+2,"H<30.))))); CALL SYMPUT('maxd',TRIM(LEFT(PUT(dd0+2,30.))));"&I1&nbrank1" CALL SYMPUT("nform&i",COMPRESS(TRIM(LEFT(PUT(ll&i,30.))) || '.' || TRIM(LEFT(PUT(dd&i,30.))))); CALL SYMPUT("max&i",TRIM(LEFT(PUT(ll&i+dd&i+12,30.))));""1% RUN; DATA _null_; SET _table_"(&nbrank GT 1)"/# (WHERE=(NMISS(r1-r&nbrank)=1))"" ;"&I1&nbrank1" IF (r&i^=.) THEN DO; CALL SYMPUT("rmin&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(min&i,&&nform&i)))); CALL SYMPUT("rmax&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(max&i,&&nform&i)))); n&i+1; END;""" RUN; PROC FORMAT;"&I1&nbrank1" VALUE fr&i._"( J0&&grank&i1ї>= )) NE 0)"]MERROR: You must precise just one value for the maxiter (&maxiter ) parameter"FINMACRO" ;""-(%DATATYP(&maxiter ) EQ CHAR)"I9ERROR: The maxiter (&maxiter ) parameter must be numeric"FINMACRO" ;"" (&maxiter LE 0 )"1!ERROR: You must have maxiter > 0"FINMACRO" ;""'(%LENGTH(&print ) EQ 0)"PRINT" YES""PRINT" %UPCASE(&print)">.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"WGERROR: You must precise just one value for the print (&print) parameter"FINMACRO" ;""*(%DATATYP(&print ) EQ NUM)"E5ERROR: The print (&print) parameter must be character"FINMACRO" ;""4$((&print NE YES) AND (&print NE NO))"RBERROR: The print (&print) parameter must be choosen among (YES NO)"FINMACRO" ;""ERREUR" 0" DATA _NULL_; IF (INT(&maxpq ) ^= &maxpq ) THEN CALL SYMPUT('erreur','1'); IF (INT(&maxiter ) ^= &maxiter ) THEN CALL SYMPUT('erreur','1'); RUN;"(&erreur EQ 1)"FINMACRO"H8ERROR: the parameters maxiter and maxpq must be integer.""ui PROC FORMAT; VALUE njm 25-35=12 50-70=6 80-100=4 115-135=3 175-195=2; RUN;"_MISS_" 0"  DATA _trav_; SET &data END=fin; KEEP &date &var difvar; RETAIN dtmin dtmax; IF (&var ^=.) THEN DO; ndon+1; dtmax=&date; IF (ndon=1) THEN dtmin=&date; END; IF ((&var ^= .) AND (LAG(&var) =.) AND (ndon > 1)) THEN CALL SYMPUT('_miss_',"'1'); IF fin THEN DO; period=PUT((dtmax-dtmin)/ndon,njm.); CALL SYMPUT('period',period); END; IF (&diff > 0) THEN difvar=DIF&diff(&var); ELSE difvar=&var; IF (&var ^=.); RUN;" (&period EQ )"wgERROR: Problem with the automatic determination of the series periodicity. Check your SAS date variable"FINMACRO" ;""(&_miss_ EQ 1)"4$ERROR: Missing values in series &var"FINMACRO" ;""+ PROC ARIMA DATA=_trav_;"(&print NE YES)"  ODS SELECT NONE;"" ODS OUTPUT TentativeOrders=_bic_ MINIC=_minic_; IDENTIFY VAR=&var(&diff) P=&maxpq Q=&maxpq ALPHA=&alpha ESACF SCAN MINIC; RUN; QUIT; ODS SELECT ALL;"NBIC" 0"  DATA _bic_; LENGTH Method Arima $ 8; SET _bic_; KEEP Method Arima; IF (scan_AR >=0) THEN DO; Method='SCAN'; Arima=COMPRESS('('|| PUT(scan_AR,2.) || ',' || PUT(scan_MA,2.) || ')'); nmod+1; OUTPUT; END; IF (esacf_AR >=0) THEN DO;"  Method='ESACF'; Arima=COMPRESS('('|| PUT(esacf_AR,2.) || ',' || PUT(esacf_MA,2.) || ')'); nmod+1; OUTPUT; END; CALL SYMPUT('nbic',LEFT(PUT(nmod,3.))); RUN; PROC IML SYMSIZE=200; USE _minic_; READ all VAR _num_ INTO matbic; CLOSE"  _minic_; USE _trav_(WHERE=(difvar NE .)); READ all VAR{difvar} INTO donnees; CLOSE _trav_; nobs=NROW(donnees); nmod=J(1,9,0); nrows=NROW(matbic); matodq=J(nrows,nrows,0); odq=J(nrows*nrows,9,' '); a=1:nrows; cst=LOG(nobsҗE>" )/nobs; sumij=2#(REPEAT(T(a),1,nrows)+ REPEAT(a,nrows,1)-2)#cst; matodq=nobs#(EXP(matbic-sumij)-EXP(matbic[nrows,nrows]- 2*(2*&maxpq)*cst)); DO k=1 TO 9; mat=matodq -(nobs **(k/10)); DO i=2 TO nrows; DO j=2 TO nrows; IF ((mat[i,j] <0)" & (mat[i-1,j] >0) & (mat[i,j-1] >0))THEN DO; nmod[k]=nmod[k]+1; odq[nmod[k],k]= COMPRESS(LEFT(CONCAT('(',CHAR(i-1,2),',',CHAR(j-1,2),')'))); END; END; END; DO i=2 TO nrows; IF ((mat[i,1] <0) & (mat[i-1,1] >0))THEN DO;"  nmod[k]=nmod[k]+1; odq[nmod[k],k]= COMPRESS(LEFT(CONCAT('(',CHAR(i-1,2),',',CHAR(0,2),')'))); END; IF ((mat[1,i] <0) & (mat[1,i-1] >0))THEN DO; nmod[k]=nmod[k]+1; odq[nmod[k],k]= COMPRESS(LEFT(CONCAT('(',CHAR(0,2),',',CHAR(i-1" ,2),')'))); END; END; END; max=MAX(nmod); CALL SYMPUT('nodq',CHAR(max,3)); nom={'Method' 'Arima'}; IF (max > 0) THEN DO; odq=odq[1:max,]; odq=COLVEC(T(odq)); num=REPEAT(CHAR(1:9,1),max,1); num=COLVEC(T(num)); odq=CONCAT(J(" NROW(num),1,'ODQ'),num) || odq; cc=LOC(odq[,2]^=' '); odq=odq[cc,]; CREATE _odq_ FROM odq [COLNAME=nom]; APPEND FROM odq ; CLOSE _odq_; END; maxp=INT(&maxpq); maxq=INT(&maxpq); dimmax=INT((INT((nobs-1)/3)-1)/3); IF (maxp"  > dimmax) THEN DO; maxp=dimmax; maxq=dimmax; END; kk=2*maxp+maxq+1; pstud=PROBIT(1-&alpha/2); pchi2=CINV(1-&alpha,3); autocorr=COVLAG(donnees,3*kk+1) / ((donnees-donnees[:])##2)[:]; rho=autocorr[1,3*kk+1:2] || autocorr; s=J(1,"2*kk+1,0); sig=J(kk,kk,0); DO d=0 TO 2*kk; s[d+1]=rho[1,2*kk+1:4*kk+1] * rho[2*kk+1+d:4*kk+1+d]; END; DO k=1 TO kk; DO l=k TO kk; sig[k,l]=s[k+l+1]+s[l-k+1]-2*autocorr[k+1]*s[l+1]-2*autocorr[l+1]*s[k+1] +2*autocorr[k+1]*" autocorr[l+1]*s[1]; sig[l,k]=sig[k,l]; END; END; det=J(maxp+1,maxq+1,0); sigma=J(maxp+1,maxq+1,0); student=J(maxp+1,maxq+1,0); chi2=J(maxp+1,maxq+1,0); dpartiel=J((maxp+1)*(maxq+1),kk,0); DO j=1 TO maxq+1; DO i=1 TO maxp+1;"  mat=J(i,i,0); DO l=1 TO i; DO c=1 TO i; mat[l,c]=autocorr[ABS(j+l-c)+1]; END; END; det[i,j]=DET(mat); cofac=det[i,j]*T(INV(mat[,i:1])); DO l=1 TO i; DO c=1 TO i; dpartiel[(maxq+1)*(i-1)+j,maxp+i+j-l-c+1]" = dpartiel[(maxq+1)*(i-1)+j,maxp+i+j-l-c+1]+cofac[l,c]; END; END; sigma[i,j]=SQRT(ABS((dpartiel[(maxq+1)*(i-1)+j,]*sig *T(dpartiel[(maxq+1)*(i-1)+j,])))/NROW(donnees)); END; END; cc=LOC(sigma^=0); student[cc]=" ABS(det[cc]) / sigma[cc]; DO i=1 TO maxp; DO j=1 TO maxq; gamma=det[i,j]||det[i+1,j]||det[i,j+1]; a=dpartiel[(maxq+1)*(i-1)+j,] // dpartiel[(maxq+1)*i+j,] // dpartiel[(maxq+1)*(i-1)+j+1,]; chi2[i,j]=NROW(donnees)*gamma*INV(a*sig*T(a))*T("nbgamma); END; END; stud=CHOOSE(student > pstud,1,0); chi=CHOOSE(chi2 > pchi2,1,0);"(&print EQ YES)"  IF (dimmax < &maxpq) THEN PRINT "Warning: The maximum values for P and Q have been reduced to be compatible with the number of observations",; RESET NONAME; imp=({' MA'}||CHAR((0:maxq),7)) // SHAPE({'AR '},1,maxq+2,' ') //"  (CHAR(T(0:maxp),2)||CHAR(det,7,2)); PRINT "Matrix of Determinants" , imp; imp=({' MA'}||CHAR((0:maxq),7)) // SHAPE({'AR '},1,maxq+2,' ') // (CHAR(T(0:maxp),2)||CHAR(student,7,2)); PRINT "Student Values Matrix" , imp; imp=" ({' MA'}||CHAR((0:maxq),7)) // SHAPE({'AR '},1,maxq+2,' ') // (CHAR(T(0:maxp),2)||CHAR(stud,7,0)); PRINT "Student Test: Results" , imp; imp=({' MA'}||CHAR((0:maxq),7)) // SHAPE({'AR '},1,maxq+2,' ') // (CHAR(T("0:maxp),2)||CHAR(chi2,7,2)); PRINT "Chi2 Values Matrix" , imp; imp=({' MA'ӗC? ARRAY _xx_(*) &date ; RUN;"N(&syserr NE 0)"I9ERROR: There is a problem in the date (&date ) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"N"(R(%LENGTH(&method ) EQ 0)"METHOD" 3"a"?W/(%LENGTH(%QSCAN(%BQUOTE(&method ),2, )) NE 0)"ZJERROR: You must precise just one value for the method (&method ) parameter"FINMACRO" ;"W",\(%DATATYP(&method ) EQ CHAR)"F6ERROR: The method (&method ) parameter must be numeric"FINMACRO" ;"a"Fa6((&method NE 1) AND (&method NE 2) AND (&method NE 3))"XHERROR: The method (&method ) parameter must be choosen among (1, 2 or 3)"FINMACRO" ;"a"'e(%LENGTH(&outls ) EQ 0)"OUTLS" NO"v"OUTLS" %UPCASE(&outls)">l.(%LENGTH(%QSCAN(%BQUOTE(&outls ),2, )) NE 0)"WGERROR: You must precise just one value for the outls (&outls) parameter"FINMACRO" ;"l"*q(%DATATYP(&outls ) EQ NUM)"E5ERROR: The outls (&outls) parameter must be character"FINMACRO" ;"v"4v$((&outls NE YES) AND (&outls NE NO))"RBERROR: The outls (&outls) parameter must be choosen among (YES NO)"FINMACRO" ;"v"'(%LENGTH(&maxar ) NE 0)">|.(%LENGTH(%QSCAN(%BQUOTE(&maxar ),2, )) NE 0)"XHERROR: You must precise just one value for the maxar (&maxar ) parameter"FINMACRO" ;"|"+(%DATATYP(&maxar ) EQ CHAR)"D4ERROR: The maxar (&maxar ) parameter must be numeric"FINMACRO" ;""(&maxar LT 0 )"0 ERROR: You must have &maxar > 0"FINMACRO" ;"""'(%LENGTH(&trunc ) EQ 0)"TRUNC" 10"">.(%LENGTH(%QSCAN(%BQUOTE(&trunc ),2, )) NE 0)"XHERROR: You must precise just one value for the trunc (&trunc ) parameter"FINMACRO" ;""+(%DATATYP(&trunc ) EQ CHAR)"D4ERROR: The trunc (&trunc ) parameter must be numeric"FINMACRO" ;""2"((&trunc LT 0 ) OR (&trunc GT 45))"5%ERROR: You must have 0 < &trunc < 45"FINMACRO" ;""_NETTOY_" "  PROC CONTENTS DATA=&data(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _null_; LENGTH liste $ 30000; RETAIN liste ' '; SET _nomvar_ END=fin; IF (UPCASE(name) ^= UPCASE("&date")) THEN DO; n+1; CALL SYMPUT('_varx'||TRIM(LEFT("PUT(n,5.))),TRIM(LEFT(name))); liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); END; IF fin THEN DO; CALL SYMPUT('tseries',TRIM(LEFT(liste))); CALL SYMPUT('_nbvarx',TRIM(LEFT(PUT(n,5.)))); END; RUN; DATA __trav__(KEEP=&date &tseries)"UI __period__(KEEP=period); SET &data END=fin; period=DIF(& @IM(LEFT(COMPBL(haxis || ')'))); CALL SYMPUT('haxis',TRIM(LEFT(haxis))); IF (&per NOT IN(4,12)) THEN CALL SYMPUT("'href',TRIM(LEFT(haxis))); value="' ' '" || TRANWRD(COMPBL(TRIM(LEFT(COMPBL("&mois")))),' ',"' ' ' '") || "' ' '"; CALL SYMPUT('value',TRIM(LEFT(value))); RUN; SYMBOL1 I=join COLOR=black WIDTH=1 VALUE=none ; PROC GPLOT DATA= _a_ GOUT=&catg"  UNIFORM; AXIS1 LABEL=(a=90); AXIS2 ORDER=(&tick) LABEL=none MINOR=none MAJOR=(H=0.05) VALUE=(&value); PLOT &season*nobs avg*nobs / OVERLAY FRAME SKIPMISS NAME="seas" HAXIS=axis2 HREF=(&nref) LHREF=33 VAXIS=axis1; TITLE "Seasonal component";" RUN; QUIT; PROC GPLOT DATA=spectre GOUT=&catg UNIFORM; PLOT s_01a*degre / NAME="spraw" OVERLAY HREF=&href LHREF=33 HAXIS=&haxis VAXIS=axis1; AXIS1 LABEL=none; TITLE "&raw spectrum"; RUN; QUIT; PROC GPLOT DATA=spectre GOUT=&catg"  UNIFORM; PLOT s_02a*degre / NAME="spsa" OVERLAY HREF=&href LHREF=33 HAXIS=&haxis VAXIS=axis1; AXIS1 LABEL=none; TITLE "&sa spectrum"; RUN; QUIT; PROC GPLOT DATA=spectre GOUT=&catg UNIFORM; PLOT s_03a*degre / NAME="spirr" OVERLAY HREF=" &href LHREF=33 HAXIS=&haxis VAXIS=axis1; AXIS1 LABEL=none; TITLE "&irr spectrum"; RUN; QUIT; SYMBOL1 I=needle CI=grey WIDTH=10 V=none HEIGHT=3; SYMBOL2 I=join V=none CI=black; SYMBOL3 I=join V=none CI=black; PROC GPLOT DATA=_cov_ GOUT="&catg UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr up low) * lag / OVERLAY VAXIS=axis1 NAME="corr"; TITLE "&irr autocorrelogram"; RUN; QUIT; TITLE; SYMBOL; GOPTIONS DISPLAY; PROC GREPLAY IGOUT=&catg TC=&catg"  NOFS GOUT=&catg; TDEF newfour DES='four squares of equal size' 1/LLX=1 LLY=1 ULX=1 ULY=49 URX=49 URY=49 LRX=49 LRY=1 color=grey 2/LLX=51 LLY=1 ULX=51 ULY=49 URX=99 URY=49 LRX=99 LRY=1 color=grey 3/LLX=1 LLY=51"  ULX=1 ULY=99 URX=49 URY=99 LRX=49 LRY=51 color=grey 4/LLX=51 LLY=51 ULX=51 ULY=99 URX=99 URY=99 LRX=99 LRY=51 color=grey ; TEMPLATE newfour; TREPLAY 1:seas 2:irr 3:raw 4:sa NAME='series'; TREPLAY 1:usr 3:"vtday 4:outl NAME='outl'; TREPLAY 1:spirr 2:corr 3:spraw 4:spsa NAME='spectra'; RUN; QUIT; TITLE; SYMBOL;"#c0` P@ph8P`t4 H d   0 D T p  @ T p  ( @ X | | !("4#<$H%T&&BA"tTWOWAYSF9.2  6>"0DATA"0OUT"0VARS"0FORMATS"0GROUPS"0RESPVAR"0STAT"0DEBUG",FINMACRO" (&debug NE)"C7 OPTIONS MPRINT NOTES NOXWAIT NOCENTER LS=250 PS=500;""QE OPTIONS NOMPRINT NONOTES NOSOURCE2 NOCENTER NOXWAIT LS=250 PS=500;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;""(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"""%&(%LENGTH(&out ) EQ 0)"OUT" _nway_"1"<+,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"+"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"1 (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"1"&6(%LENGTH(&vars ) EQ 0)"9)ERROR: The var parameter must be precised"FINMACRO" ;"B"&;(%INDEX(&vars,-) NE 0)"UEERROR: No SAS variable list is allowed in the vars (&vars ) parameter"FINMACRO" ;";"D8 DATA _NULL_; SET &data (KEEP=&vars OBS=1); RUN;"B(&syserr NE 0)"H8ERROR: There is a problem in the vars (&vars ) parameter"qaERROR: Non valid SAS dataset? Non valid SAS names? A variable does not exist? Non valid SAS list?"FINMACRO" ;"B"(F(%LENGTH(&groups ) EQ 0)"GROUPS" 0"F")T(%LENGTH(&respvar ) NE 0)"@L0(%LENGTH(%QSCAN(%BQUOTE(&respvar ),2, )) NE 0)"\LERROR:xB You must precise just one value for the respvar (&respvar ) parameter"FINMACRO" ;"L"cW DATA _NULL_; SET &data (KEEP=&respvar OBS=1); ARRAY _xx_(*) &respvar ; RUN;"S(&syserr NE 0)"N>ERROR: There is a problem in the respvar (&respvar ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"S"T"&X(%LENGTH(&stat ) EQ 0)"STAT" N"g"=]-(%LENGTH(%QSCAN(%BQUOTE(&stat ),2, )) NE 0)"VFERROR: You must precise just one value for the stat (&stat ) parameter"FINMACRO" ;"]")b(%DATATYP(&stat ) EQ NUM)"D4ERROR: The stat (&stat ) parameter must be character"FINMACRO" ;"g"go((%UPCASE(&stat) NE N) AND (%UPCASE(&stat) NE SUM) AND (%UPCASE(&stat) NE MEAN) AND (%UPCASE(&stat) NE MEDIAN))"\LERROR: The stat (&stat ) parameter must be choosen among (N SUM MEAN MEDIAN)"FINMACRO" ;"g"_NETTOY_" "VRANK" 0"GRANK" 0"NBRANK" 0"  PROC CONTENTS DATA=&data(KEEP=&vars) NOPRINT OUT=nomvar(KEEP=name type format informat); RUN; DATA nomvar; LENGTH list $ 30000; RETAIN list ' '; SET nomvar END=fin; DROP list; name=UPCASE(name); list=COMPBL(TRIM(LEFT(list)) || ' ' || TRIM"(LEFT(name))); IF fin THEN DO; CALL SYMPUT('vars',TRIM(LEFT(list))); CALL SYMPUT('nvars',TRIM(LEFT(PUT(_N_,5.)))); END; RUN;"v (&nvars NE 2)"QAERROR: You must precise exactly 2 variables in the parameter VARS"FINMACRO" ;"v"  DATA tout; LENGTH name formats groups $ 32; KEEP name formats groups; vars=TRIM(LEFT(COMPBL(UPCASE("&vars")))); DO i=1 TO &nvars; groups=SCAN("&groups",i,' '); formats=SCAN("&formats",i,' '); name=SCAN(vars,i); OUTPUT; END; RUN;"_NETTOY_"% &_nettoy_ tout nomvar" PROC SORT DATA=nomvar; BY name; RUN; PROC SORT DATA=tout; BY name; RUN; DATA nomvar; MERGE nomvar tout END=fin; BY name; LENGTH listform listgrp newform newvar $ 30000; RETAIN listform listgrp newform newvar ' '; IF groups=' ' THEN"  groups='0'; IF formats=' ' THEN formats='0'; IF (type=2) THEN groups='0'; IF (TRIM(LEFT(formats)) ^='0') THEN DO; groups='0'; newform=TRIM(LEFT(newform))||' '||TRIM(LEFT(name)) || ' '||TRIM(LEFT(formats)); trueform=formats; END; ELSE"  DO; trueform=groups; END; IF ((type=1) AND (TRIM(LEFT(groups)) ^='0')) THEN DO; n+1; newform=TRIM(LEFT(newform))||' '||TRIM(LEFT(COMPRESS('r'||PUT(n,5.)))) || ' '||TRIM(LEFT(COMPRESS('fr'||PUT(n,5.)||'_.'))); newvar=TRIM(LEFT(newvar))||"' '||TRIM(LEFT(COMPRESS('r'||PUT(n,5.)))); CALL SYMPUT('vrank'||LEFT(PUT(n,5.)),name); CALL SYMPUT('grank'||LEFT(PUT(n,5.)),groups); CALL SYMPUT('nbrank',LEFT(PUT(n,5.))); END; ELSE DO; newvar=TRIM(LEFT(newvar))||' '||TRIM(LEFT(name));" END; listform=TRIM(LEFT(listform))||' '||TRIM(LEFT(trueform)); listgrp=TRIM(LEFT(listgrp))||' '||TRIM(LEFT(groups)); IF NOTDIGIT(TRIM(LEFT(groups))) THEN error1 +1; ELSE DO; a=INPUT(TRIM(LEFT(groups)),20.); IF (a<0) THEN error2 +1;" IF (a=1) THEN error3 +1; END; IF (TRIM(LEFT(formats)) ^='0') THEN DO; bLCdate); RUN;"_NETTOY_"7 '&_nettoy_ __trav__ __period__ _nomvar_"  PROC SUMMARY DATA=__period__; VAR period; OUTPUT OUT=_means_ MEAN=period; RUN; DATA _NULL_; SET _means_; IF ((25<=period) AND (period<=35)) THEN period=12; ELSE IF ((50<=period) AND (period<=70)) THEN period=6; ELSE IF ((80<=period) AND (" period<=100)) THEN period=4; ELSE IF ((115<=period) AND (period<=135)) THEN period=3; ELSE IF ((175<=period) AND (period<=195)) THEN period=2; ELSE IF ((345<=period) AND (period<=375)) THEN period=1; CALL SYMPUT('period',TRIM(LEFT(PUT(period,2.)))");"&(%LENGTH(&maxar) EQ 0)"B6 CALL SYMPUT('maxar',TRIM(LEFT(PUT(3*period,5.))));"" RUN;"_NETTOY_"" &_nettoy_ _means_"(&method EQ 1)"'"I1&_nbvarx1"  DATA __trav2__; SET __trav__(KEEP=&date &&_varx&i RENAME=(&&_varx&i=Raw)); Log=LOG(Raw); RUN; PROC ARIMA DATA=__trav2__ ; IDENTIFY VAR=Raw(1,&period) NOPRINT; ESTIMATE P=0 Q=(1,&period) METHOD=ML NOPRINT OUTSTAT=StatsRaw MAXITER="1000;"<,((&SYSVER > 8) AND (%UPCASE(&outls) EQ YES))"-! OUTLIER ALPHA=0.01 NOPRINT;"" RUN; IDENTIFY VAR=Log(1,&period) NOPRINT; ESTIMATE P=0 Q=(1,&period) METHOD=ML NOPRINT OUTSTAT=StatsLog MAXITER=1000;"<,((&SYSVER > 8) AND (%UPCASE(&outls) EQ YES))"-! OUTLIER ALPHA=0.01 NOPRINT;"" RUN; QUIT; DATA Statistics; MERGE StatsRaw(RENAME=(_VALUE_=Raw)) StatsLog(RENAME=(_VALUE_=Log)); DROP _TYPE_; LABEL Raw=' ' Log=' '; RUN; PROC TRANSPOSE DATA=Statistics OUT=Stats; VAR Log Raw; ID _STAT_; RUN;"  DATA _NULL_; SET Stats(OBS=1); CALL SYMPUT('ndifs',LEFT(PUT(ndifs,5.))); RUN; PROC MEANS DATA=__trav2__(FIRSTOBS=%EVAL(&ndifs+1)) NOPRINT; VAR Log; OUTPUT OUT=Sum SUM=SumLog; RUN; DATA Stats; SET Stats(KEEP=_NAME_ AIC" SBC LOGLIK NUMRESID NPARMS NDIFS); RETAIN SumLog; IF (_N_=1) THEN SET Sum(KEEP=SumLog); IF (_NAME_='Log') THEN LogLik=LogLik-SumLog; AIC=-2*LogLik+2*Nparms; SBC=-2*LogLik+LOG(NumResid)*Nparms; AICC=-2*LogLik+2*Nparms/(1-("Nparms+1)/NumResid); HQ=-2*LogLik+2*Nparms*LOG(LOG(NumResid)); RUN; DATA Stats; LENGTH Series $ 32 Mode 3; SET Stats(WHERE=(_NAME_='Log') KEEP= _NAME_ AIC SBC AICC HQ RENAME=(AIC=AIC_Log SBC=SBC_Log AICC=AICC_Log HQ=HQ_Log)); SET" Stats(WHERE=(_NAME_='Raw') KEEP= _NAME_ AIC SBC AICC HQ ); DROP _NAME_; Series="&&_varx&i"; Mode=(AICC_Log < AICC); RUN; PROC APPEND BASE=&out DATA=Stats; RUN;""""_NETTOY_"K ;&_nettoy_ __trav2__ Statistics StatsRaw StatsLog Stats Sum"(&method EQ 2)" PROC IML; USE __trav__; READ all VAR{&tseries} INTO x; CLOSE __trav__; nblags=&maxar; nvar=NCOL(x); Names={'Mode' 'AIC' 'AIC_Log' 'SBC' 'SBC_Log' 'AICC' 'AICC_Log' 'HQ' 'HQ_Log'}; Series={&tseries}; DO i=1 TO nvar;"  cc=LOC(x[,i] ^=.); a=x[cc,i]; Nobs=NROW(a); CALL TSUNIMAR(arcoef,ev,nar,aic,a,nblags,{1 0}); Nparms=nblags+1; NumResid=Nobs-Nparms; LogLik=aic-2*Nparms; sbc=LogLik+LOG(NumResid)*Nparms; AICC=LogLik+2*Nparms/(1" -(Nparms+1)/NumResid); HQ=LogLik+2*Nparms*LOG(LOG(NumResid)); y=LOG(a); CALL TSUNIMAR(arcoef,ev,nar,aic2,y,nblags,{1 0}); SumLog=y[37:NROW(y)][+]; LogLik=aic2-2*Nparms+2*SumLog; aic_log=LogLik+2*Nparms; sbc_log=LogLik+" LOG(NumResid)*Nparms; AICC_log=LogLik+2*Nparms/(1-(NpID"tGRAPHICSdH9.2  X>"0DATA"0DATE"0VAR"0DIF"0LOG"0PARTINV"0SMOOTH"0EPS"0JPG"0DEBUG",FINSER",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"&(%LENGTH(&data ) NE 0)"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""1% DATA _NULL_; SET &data ; RUN;"(&syserr NE 0)"@0ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;""!"DATA" _last_"&((%LENGTH(&date ) NE 0)"='-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre date (&date )"FINMACRO" ;"'"*"DATE" date"VJ DATA _NULL_; SET &data (KEEP=_NUMERIC_); ARRAY _xx_(*) &date ; RUN;"1(&syserr NE 0)"@0ERROR: Problme dans le paramtre date (&date )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"1"%:(%LENGTH(&var ) NE 0)"YM DATA _NULL_; SET &data (KEEP=_NUMERIC_); ARRAY _xx_(*) &var ; RUN;"9(&syserr NE 0)">.ERROR: Problme dans le paramtre var (&var )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"9"<"VAR" _NUMERIC_"(K(%LENGTH(&smooth ) NE 0)"?B/(%LENGTH(%QSCAN(%BQUOTE(&smooth ),2, )) NE 0)"`PERROR: Vous devez prciser une seule valeur pour le paramtre smooth (&smooth )"FINMACRO" ;"B",G(%DATATYP(&smooth ) EQ CHAR)"TDERROR: La valeur du paramtre smooth (&smooth ) doit tre numrique"FINMACRO" ;"J"4J$((&smooth LE 0 ) OR (&smooth GE 1 ))":*ERROR: Vous devez avoir 0 < &smooth < 1"J"M"SMOOTH" 0.25"$Q(%LENGTH(&dif) EQ 0)"DIF" NO"S"DIF" YES"$W(%LENGTH(&log) EQ 0)"LOG" NO"Y"LOG" YES"(](%LENGTH(&partinv) EQ 0)"PARTINV" NO"_JE}||CHAR((0:maxq),7)) // SHAPE({'AR '},1,maxq+2,' ') // (CHAR(T(0:maxp),2)||CHAR(chi,7,0)); PRINT "Chi2 Test: Results" , imp; RESET NAME;""  DO i=1 TO maxp+1; DO j=1 TO maxq+1; stud[i,j]=SUM(stud[i:maxp+1,j:maxq+1]); chi[i,j]=SUM(chi[i:maxp+1,j:maxq+1]); END; END; corner=J(nrows*nrows,2,' '); nmod=0; DO j=2 TO maxq+1; IF (stud[1,j]=0 & stud[1,j-1]^=0) THEN" DO; nmod=nmod+1; corner[nmod,1]='CORNER_S'; corner[nmod,2]=COMPRESS(LEFT(CONCAT('(',CHAR(0,2),',',CHAR(j-1,2),')'))); END; IF (chi[1,j]=0 & chi[1,j-1]^=0) THEN DO; nmod=nmod+1; corner[nmod,1]='CORNER_C'; corner[nmod,2]=" COMPRESS(LEFT(CONCAT('(',CHAR(0,2),',',CHAR(j-1,2),')'))); END; END; DO i=2 TO maxp+1; IF (stud[i,1]=0 & stud[i-1,1]^=0) THEN DO; nmod=nmod+1; corner[nmod,1]='CORNER_S'; corner[nmod,2]=COMPRESS(LEFT(CONCAT('(',CHAR(i-1,2),',',CHAR(0," 2),')'))); END; IF (chi[i,1]=0 & chi[i-1,1]^=0) THEN DO; nmod=nmod+1; corner[nmod,1]='CORNER_C'; corner[nmod,2]=COMPRESS(LEFT(CONCAT('(',CHAR(i-1,2),',',CHAR(0,2),')'))); END; END; DO i=2 TO maxp+1; DO j=2 TO maxq+1; IF (" stud[i,j]=0 & stud[i-1,j] ^=0 & stud[i,j-1] ^=0) THEN DO; nmod=nmod+1; corner[nmod,1]='CORNER_S'; corner[nmod,2]=COMPRESS(LEFT(CONCAT('(',CHAR(i-1,2),',',CHAR(j-1,2),')'))); END; IF (chi[i,j]=0 & chi[i-1,j]^=0 & chi[i,j-1]^=0) THEN" DO; nmod=nmod+1; corner[nmod,1]='CORNER_C'; corner[nmod,2]=COMPRESS(LEFT(CONCAT('(',CHAR(i-1,2),',',CHAR(j-1,2),')'))); END; END; END; CALL SYMPUT('ncorner',CHAR(nmod,3)); IF (nmod > 0) THEN DO; corner=corner[1:nmod,];"th CREATE _corner_ FROM corner [COLNAME=nom]; APPEND FROM corner ; CLOSE _corner_; END; QUIT;"6 &(%EVAL(&nbic + &nodq + &ncorner) EQ 0)"\LERROR: None of the automatic methods suggests an ARIMA model for series &var"FINMACRO" ;":"" DATA Models; SET" (&nbic NE 0)" _bic_"" (&nodq NE 0)" _odq_""(&ncorner NE 0)" _corner_""; par=INPUT(SCAN(Arima,1,'(,)'),3.); RUN; PROC SORT DATA=Models; BY par Arima Method; RUN; DATA Models; LENGTH Methods $ 50 Meth $ 50 Arima $ 10; SET Models; BY par Arima Method; RETAIN ar ma 0 Methods; DROP Method ar ma" index par; ar=MAX(ar,INPUT(SCAN(Arima,1,'(,)'),3.)); ma=MAX(ma,INPUT(SCAN(Arima,2,'(,)'),3.)); IF FIRST.Arima THEN Methods=' '; Methods=LEFT(COMPBL(Methods || Method)); IF LAST.Arima THEN DO; Arima= LEFT(COMPRESS('('||SCAN(Arima,1,"'(,)')||",&diff,"||SCAN(Arima,2,'(,)')||')')); index=INDEX(Methods,'ODQ'); IF index THEN Meth=SUBSTR(Methods,1,INDEX(Methods,'ODQ')+2); ELSE Meth=Methods; Meth=TRANWRD(Meth,'CORNER_C CORNER_S','CORNER'); Meth=TRANWRD(Meth," 'CORNER_C','CORNER'); Meth=TRANWRD(Meth,'CORNER_S','CORNER'); Model+1; CALL SYMPUT('model'||LEFT(PUT(Model,3.)),Arima); CALL SYMPUT('_ar'||LEFT(PUT(Model,3.)),SCAN(Arima,1,'(,)')); CALL SYMPUT('_ma'||LEFT(PUT(Model,3.)),SCAN(Arima,3,"'(,)')); OUTPUT; END; CALL SYMPUT('_nmod',LEFT(PUT(Model,3.))); CALL SYMPUT('_maxar',LEFT(PUT(ar,3.))); CALL SYMPUT('_maxma',LEFT(PUT(ma,3.))); RUN;"(&print EQ YES)"u PROC PRINT DATA=Models; ID Model; VAR Arima Methods; TITLE "Possible ARIMA Models"; RUN; TITLE;"" PROC ARIMA DATA=_trav_; ODS SELECT NONE; ODS OUTPUT ChiSqAuto=ChiSq ParameterEstimates=ParEstFoth FROM smooth[COLNAME=series]; APPEND FROM smooth; CLOSE smooth; CREATE irregular FROM irregular[COLNAME="series]; APPEND FROM irregular; CLOSE irregular; QUIT; DATA &out; LENGTH data $ 50 series $ 32 firstdat lastdat $ 5 period 3; SET &out; firstdat=PUT(first,MONYY5.); lastdat=PUT(last,MONYY5.); IF INDEX("&data",'.') THEN data=SCAN("7+"&data",2,'.'); ELSE data="&data"; RUN;"{(&outtype EQ 1)"%zI1&_nser1"  DATA &&_var&i; MERGE &data(KEEP=&date &&_var&i) trend(KEEP=&date &&_var&i RENAME=(&&_var&i=TrendCycle)) saseries(KEEP=&date &&_var&i RENAME=(&&_var&i=Saseries)) season(KEEP=&date &&_var&i RENAME=(&&_var&i=Season)) irregular(KEEP="&date &&_var&i RENAME=(&&_var&i=Irregular)) smooth(KEEP=&date &&_var&i RENAME=(&&_var&i=Smoothed)); IF (&&_var&i ^=.); RUN;"_NETTOY_"@ 0&_nettoy_ trend season irregular saseries smooth""{"SG PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_; RUN; QUIT;"#}0`$XD` 4 h $ @ T P p , D X l  0 D t 0 $8 x @LXdp|8Th<P H\$0 !!0!!ZG"tHP7F9.2  1>"0DATA"0OUT"0VAR"0DATE"0LAMBDA"0PRINT"0WORD"0FORMAT"0GRAPH"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"$"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"$(&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"$"%((%LENGTH(&out ) EQ 0)"OUT" _result_"3"<-,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"-"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"3 (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"3"'D(%LENGTH(&lambda) NE 0)"?9/(%LENGTH(%QSCAN(%BQUOTE(&lambda ),2, )) NE 0)"[KERROR: You must precise just one value for the lambda (&lambda ) parameter"FINMACRO" ;"9",>(%DATATYP(&lambda ) EQ CHAR)"G7ERROR: The lambda (&lambda ) parameter must be numeric"FINMACRO" ;"C"C(&lambda LT 0 )":*ERROR: You must have lambda (&lambda) > 0"FINMACRO" ;"C"D"'H(%LENGTH(&print ) EQ 0)"PRINT" yes"W">M.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"YIERROR: You must precise just one value for the print (&print ) parametHiagn) NE 0)"  _res_=SHAPE(_residu_,&_ncols_ * &_nlign_,1); _ra_=REPEAT(_a_,1,&_ncols_); _ra_=SHAPE(_ra_,&_ncols_ * &_nlign_,1); _rb_=SHAPE(_b_,&_ncols_ * &_nlign_,1); _diag_=(_ra_ # _rb_) / _m_; _l_=J(&_ncols_ * &_nlign_,5,'1'); DO i=1 TO &_ncols_"  * &_nlign_; _l_[i,1]='('; _l_[i,3]=','; _l_[i,5]=')'; j=INT((i-1)/&_ncols_) +1; _l_[i,2]=CHAR(j,1,0); j=MOD(i,&_ncols_); IF j= 0 THEN j=&_ncols_; _l_[i,4]=CHAR(j,1,0); END; noms= ROWCATC(_l_); CREATE _residu_ VAR"8, { noms _res_ _ra_ _rb_ _diag_ }; APPEND;"" QUIT;"&(%LENGTH(&diagn) NE 0)"% FILENAME pgm "&diagn";"5%%SYSFUNC(FILEEXIST(&diagn.\stem.sas))"F: %INCLUDE pgm(stem); %STEM(DATA=_residu_,VAR=_res_);""8(%SYSFUNC(FILEEXIST(&diagn.\resline.sas))"k_ %INCLUDE pgm(resline); %RESLINE(DATA=_residu_,YY=_res_,XX=_diag_,FILE=&diagn,GRAPH=non);"" GOPTIONS CBACK=white; PROC GPLOT DATA=_result_; SYMBOL1 COLOR=&cres INTERPOL=none VALUE=circle; SYMBOL2 COLOR=&creg INTERPOL=join VALUE=none; PLOT _res_*_diag_ _fit_*_diag_ / frame overlay; TITLE " "; RUN; QUIT; SYMBOL1;"SYMBOL2;""UI PROC DATASETS NOLIST; DELETE _residu_ _result_ nomvar; QUIT;"#0` P$8tx L$8d|h(l  ( P   X H \ p  , @   H ,@H $d(x\ pLh,@HXl`tx0Xdp XX l t!!!!XI"PARTINV" YES"  PROC FORMAT; VALUE fmois 1='JAN' 2='FEB' 3='MAR' 4='APR' 5='MAY' 6='JUN' 7='JUL' 8='AUG' 9='SEP' 10='OCT' 11='NOV' 12='DEC'; VALUE ftrim 1='Q1' 2='Q2' 3='Q3' 4='Q4'; VALUE njm 25-35=12 50-70=6 80-100=4 115-135=3 175-195=2;" RUN; PROC CONTENTS DATA=&data(KEEP=&var) NOPRINT OUT=nomvar; RUN; DATA _NULL_; SET nomvar END=fin; IF (UPCASE(name) ^= UPCASE("&date")) THEN DO; n+1; CALL SYMPUT('_var'||LEFT(PUT(n,3.)),TRIM(name)); END; IF fin THEN CALL SYMPUT("*'nvar',LEFT(PUT(n,3.))); RUN;"$I1&nvar1"  TITLE "Variable &&_var&i"; DATA seas; SET &data END=fin; RETAIN neg 0 dtmin dtmax; IF (&&_var&i ^=.) THEN DO; ndon+1; dtmax=&date; IF (ndon=1) THEN dtmin=&date; END; IF fin THEN DO; period=PUT((dtmax-dtmin)/ndon,"njm.); CALL SYMPUT('per',period); CALL SYMPUT('minan','A'||PUT(YEAR(dtmin),4.)); CALL SYMPUT('maxan','A'||PUT(YEAR(dtmax),4.)); END; IF (&&_var&i ^=.); DifVar=DIF(&&_var&i); RUN;"m (&per EQ 12)"FORM" fmois."FORMD" MONYY5."MOIS"? /JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC"x"u (&per EQ 4)"FORM" ftrim."FORMD" YYQ4."MOIS" Q1 Q2 Q3 Q4"x"O?ERROR: La srie &&_var&i nest ni mensuelle ni trimestrielle"FINSER" ;"  PROC SORT DATA=seas OUT=seas; BY &date; RUN; DATA seas; SET seas END=fin; KEEP &date per mois year an &&_var&i DifVar; IF (&per=4) THEN per=QTR(&date); ELSE per=MONTH(&date); year=YEAR(&date); an='A'||PUT(year,4.);"  mois=PUT(per,&form); RUN; PROC SORT DATA=seas OUT=_a_; BY per year; RUN; PROC TRANSPOSE DATA=_a_ OUT=_b_; ID an; VAR &&_var&i; BY per; RUN; PROC MEANS DATA=_a_ NOPRINT; BY per; VAR &&_var&i; OUTPUT OUT=stats(" DROP=_type_ ) MEAN=avg; RUN; PROC SORT DATA=stats OUT=sort; BY DESCENDING _freq_; RUN; DATA _null_; SET sort(OBS=1); LENGTH tick nper nref $ 200; RETAIN tick nref nper ' '; nmax=2*INT((_freq_+1)/2)+3; jj=INT(nmax/2); kk=&per*"nmax; DO per=1 TO kk BY nmax; per2=per+jj; a=PUT(per2,4.); b=PUT(per,4.); nref=COMPBL(nref || ' ' || b); tick=COMPBL(tick || ' ' || b || ' ' || a); END; c=PUT(kk,4.); nref=COMPBL(nref || ' ' || c); tick=COMPBL(tick ||" ' ' || c); CALL SYMPUT('_nmax_',nmax); CALL SYMPUT('tick',LEFT(TRIM(tick))); CALL SYMPUT('nref',LEFT(TRIM(nref))); RUN; DATA _a_; MERGE _a_ stats;BY per; KEEP &&_var&i nobs per avg; RETAIN n; IF (FIRST.per) THEN DO; n=0;" a=&&_var&i; DO i=1 TO 2; &&_var&i=.; nobs+1; n+1; OUTPUT; END; &&_var&i=a; END; nobs+1; n+1; OUTPUT; IF (LAST.per) THEN DO UNTIL (n=&_nmax_); &&_var&i=.; nobs+1; n+1; OUTPUT; END; RUN; DATA _a_; SET _a_;"0$ IF &&_var&i=. THEN avg=.; RUN;" &SYSVER >= 7"  PROC UNIVARIATE DATA=seas NOPRINT; VAR &&_var&i; OUTPUT OUT=outloess MIN=min MAX=max; RUN; DATA _NULL_; SET outloess; max=MAX(ABS(min),ABS(max)); power=INT(ROUND(LOG10(max)))-4; CALL SYMPUT('power',PUT(MAX(power,1)," 3.)); RUN; DATA seasloess; SET seas; &&_var&i=&&_var&i/(10**&power); RUN; ODS SELECT NONE; ODS OUTPUT FITSUMMARY=sum OUTPUTSTATISTICS=loess; PROC LOESS DATA=seasloess; MODEL &&_var&i = &date / SMOOTH= &smooth DFMETHOD=exact"NJ; IDENTIFY VAR=&var(&diff);"% 4I1&_nmod1" ESTIMATE P=&&_ar&i Q=&&_ma&i METHOD=&method MAXITER=&maxiter; FORECAST ID=&date OUT=for&i(KEEP=&date &var residual) LEAD=0;"4"L@ RUN; QUIT; ODS SELECT ALL; DATA _arima_; MERGE"%$5K1&_nmod1"2& for&k(RENAME=(residual=Resid&k))"5"* ; BY &date; LABEL"%(6K1&_nmod1" resid&k=' '"6"  ; RUN; DATA ParEst; SET ParEst; RETAIN model 0; IF Parameter=:'MU' THEN model=model+1; Parameter=SUBSTR(Parameter,1,2)||LEFT(PUT(Lag,3.)); RUN; PROC TRANSPOSE DATA=ParEst(KEEP=Estimate Parameter Model) OUT=ParEst; BY" model; ID Parameter; RUN; DATA ChiSq; LENGTH Lag $ 8; SET ChiSq; KEEP Lag ProbChiSq Model ToLags; RETAIN Model -1 n; IF (ToLags=6) THEN DO; model=model+1; n=0; END; LAG='PLjung'; IF model > 0; IF df; IF (((" &period=12) AND (ToLags=12)) OR ((&period^=12) AND (ToLags=6)) OR ((n=0) AND (ToLags > &period))) THEN DO; OUTPUT; n=1; END; RUN; PROC TRANSPOSE DATA=ChiSq OUT=ChiSq; BY model; ID Lag; COPY ToLags; RUN; DATA ChiSq;"?3 SET ChiSq; LjungBox= (PLjung > 0.05); RUN;"_SELMOD" 0"  DATA &out; RETAIN n 0; LENGTH Model 8 Arima $ 10; MERGE Models(DROP=Methods RENAME=(Meth=Methods)) ParEst ChiSq; DROP _NAME_ _LABEL_ n; BY Model; SumMA=SUM(OF MA1-MA&_maxma); SumAR=SUM(OF AR1-AR&_maxar); IF (LjungBox) THEN DO;"th IF (n=0) THEN CALL SYMPUT('_selmod',LEFT(PUT(Model,2.))); n=n+1; selmod='*'; END; RUN;"5(&print EQ YES)"  DATA _bic1_; LENGTH Arima $ 10 Selmod $ 1 LjungBox PLjung ToLags SumAR SumMA MU AR1-AR&_maxar MA1-MA&_maxma 8; SET &out(RENAME=(MU0=MU)); ARRAY num{*} _NUMERIC_; DROP i model; DO i= 1 TO DIM(num); num(i)=ROUND(num(i),0.001);" END; RUN; PROC TRANSPOSE DATA=_bic1_ OUT=_bic1_(DROP=_LABEL_) PREFIX=Model; VAR _all_; RUN; DATA _bic1_; SET _bic1_; DROP i; ARRAY model{*} $ model1-model&_nmod; DO i= 1 TO DIM(model); model(i)=RIGHT(model(i));" END; LABEL _name_=' '; RENAME _name_=Description; RUN; PROC PRINT DATA=_bic1_; ID Description; TITLE "Possible ARIMA models"; RUN; TITLE;"5"pd PROC DATASETS NOLIST; DELETE _bic_ Chisq _odq_ _arima_ ParEst _minic_ _bic1_ _corner_ _trav_"%98K1&_nmod1" for&k"8" ; QUIT;"#;0` P<XPxPhx0t  T  8 , D T h  $ 8 h  0DxPhx4@Xh|0DXl,@l@$8x 8| 8H\<Ldt0HXlx0HXl$<Pd|4L\p T !!!!4"H""""#$$l%%%%%%&$&8&d&&&&d'x''()*+,-./0134 5,666789::<=> ?,@4AAA1) THEN x=J(nobs,1,1) || maty[cc,2:i] || matx[cc,1:j]; ELSE x=J(nobs,1,1) || matx[cc,1:j]; END; res =y-x*INV(T(x)*x)*(T(x)*y); sse=SSQ(res);"  fpe=sse*(nobs+i+j-1)/(nobs-i-j+1); test=test // ((i-1)||(j-1)||fpe); END; END; test=test[2:NROW(test),]; FINISH Hsiao; USE _trav_ ; READ all VAR {&vary} INTO y; READ all VAR {&listvar} INTO x; CLOSE _trav_; Series={"&listvar}; nlags=MAX(&nlagy,&nlagx); nobs=NROW(y); Granger=J(1,6,.); Coherence=.; Hsiao=J(1,3,.); NamesHsiao=' '; ylag=J(nobs,nlags+1,.); DO i=1 TO nlags+1; ylag[i:nobs,i]=y[1:nobs-i+1]; END;" signgry=SIGN(ylag[,2]-ylag[,1]); ylag=ylag[,2:nlags+1]; nvar=NCOL(x); DO i=1 TO nvar; xlag=J(nobs,nlags+1,.); DO j=1 TO nlags+1; xlag[j:nobs,j]=x[1:nobs-j+1,i]; END; signgrx=SIGN(xlag[,2]-xlag[,1]); xlag2= ylag || xlag;"  nmissx=(NMISS(xlag2))[,+]; cc=LOC(nmissx=0); IF NCOL(cc) THEN DO; xlag2=J(NCOL(cc),1,1) || xlag2[cc,]; ylag2=J(NCOL(cc),1,1) || ylag[cc,]; END; vary=y[cc]; RUN TestC(vary,ylag2,xlag2,test,nlags,0.05); Granger=Granger // test;"  aa=(signgry[cc,]#signgrx[cc,] > 0)[:]; Coherence=Coherence // aa; vary=ylag[,1:(&nlagy+1)]; varx=xlag[,1:(&nlagx+1)]; RUN Hsiao(vary,varx,Htest); NamesHsiao=NamesHsiao // J(NROW(Htest),1,Series[i]); Hsiao=Hsiao // Htest; END" ; Granger=Granger[2:NROW(Granger),] || Coherence[2:NROW(Granger),]; CREATE Granger FROM Granger[COLNAME={'Ftest' 'Pval_F' 'Chi2' 'Pval_C' 'Wald' 'Pval_W' 'Coherence'} ROWNAME=Series]; APPEND FROM Granger[ROWNAME=Series]; CLOSE Granger; Hsiao=" Hsiao[2:NROW(Hsiao),]; Series=NamesHsiao[2:NROW(NamesHsiao),]; CREATE Hsiao FROM Hsiao[COLNAME={'Ylag' 'Xlag' 'FPE'} ROWNAME=Series]; APPEND FROM Hsiao[ROWNAME=Series]; CLOSE Hsiao; QUIT; PROC SORT DATA=Hsiao; BY Series FPE; RUN; PROC SORT" DATA=Granger; BY Series; RUN; DATA &outser; MERGE &outser Granger Hsiao; BY Series; IF FIRST.Series; FORMAT First Last MONYY7. CCF CCF_GR Pval_F Pval_C Pval_W Coherence 7.4; RUN;"_NETTOY"& &_nettoy Granger Hsiao"&(%LENGTH(&debug) EQ 0)"WK PROC DATASETS LIB=WORK NOLIST; DELETE &_nettoy ; RUN; QUIT;"" QUIT;"8#0` P$l$0$ L8 ( @ X l  0 D x   , T  ` x  Larms+1)/NumResid); HQ_log=LogLik+2*Nparms*LOG(LOG(NumResid)); Mode=(AICC_Log < AICC); IF (i=1) THEN Stats=Mode || AIC || AIC_Log || SBC || SBC_Log || AICC || AICC_Log || HQ ||" HQ_Log; ELSE Stats=Stats // (Mode || AIC || AIC_Log || SBC || SBC_Log || AICC || AICC_Log || HQ || HQ_Log); END; CREATE Models FROM Stats[COLNAME=names ROWNAME=series]; APPEND FROM Stats[ROWNAME=series]; CLOSE Models; QUIT;""(&method EQ 3)" PROC IML; USE __trav__; READ all VAR{&tseries} INTO data; CLOSE __trav__; nvar=NCOL(data); Names={'Mode' 'Slope' 'Student' 'P_value'}; Series={&tseries}; DO i=1 TO nvar; cc=LOC(data[,i] ^=.); a=data[cc,i];"  Nobs=NROW(a); Nbyear=INT(Nobs/&period); y=J(Nbyear-1,1,.); x=J(Nbyear-1,1,.); DO j=1 TO Nbyear-1; zz=a[(j-1)*&period+1:(j+1)*&period]; nobsz=NROW(zz); remove=INT(&trunc*nobsz/100); b=zz; zz[RANK(zz)]" =b; y[j]=zz[nobsz-remove]-zz[remove+1]; x[j]=(zz[&period+1]+zz[&period])/2; END; x=J(Nbyear-1,1,1)||x; xpxi=INV(T(x)*x); beta=xpxi*T(x)*y; yhat=x*beta; sse=SSQ(y-yhat); dfe=NROW(x)-NCOL(x); mse=sse/dfe;" stdb=SQRT(VECDIAG(xpxi)*mse); t=beta/stdb; prob=1-PROBF(t#t,1,dfe); Mode=(prob[2] < 0.05); IF (i=1) THEN Stats=Mode || beta[2] || t[2] || prob[2]; ELSE Stats=Stats // (Mode || beta[2] || t[2] || prob[2]); END;" CREATE Models FROM Stats[COLNAME=names ROWNAME=series]; APPEND FROM Stats[ROWNAME=series]; CLOSE Models; QUIT;"" (&debug EQ)"VJ PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_; RUN; QUIT;""D#0` P$8thp,DX,d(8LtH ` p ( @ P d < \  0 @ T | 4 (H(Ph|,DTh`4H\t,DThLDH`p$Ldx$<L` @xH`,@Tl 4!d!x!"D"t""#$%&l't'''' () *,+8,@-T-t-x./01$282T222OMRUN; ODS SELECT ALL; DATA _Measures; LENGTH Statistic $ 20; SET _Measures(KEEP=Varname LocMeasure LocValue &by RENAME=(LocMeasure=Statistic LocValue=Value)) _Measures(KEEP=Varname VarMeasure VarValue &by RENAME=(VarMeasure=Statistic"  VarValue=Value)); nobs=_N_; IF Statistic ^=' '; RUN; PROC SORT DATA=_Measures; BY &by Varname nobs; RUN; DATA _Measures; LENGTH Varname $ 32 Statistic $ 30 Value 8; SET Moments(KEEP=Varname Label1 nValue1 &by WHERE=(Statistic='N') RENAME=(", Label1=Statistic nValue1=Value))"(%SYSFUNC(EXIST(Missing))"PD Missing(KEEP=Varname count &by RENAME=(count=Value) In=in1)""^R _Measures(DROP=nobs) Quantiles(RENAME=(Quantile=Statistic Estimate=Value));"(%SYSFUNC(EXIST(Missing))"9- IF in1 THEN Statistic='Missing values';""K? nq=INPUT(PUT(statistic,$fstat.),2.); FORMAT Value BEST30.;" (&ndec NE)"1% Value=ROUND(Value,10**(- &ndec));"" RUN; PROC SORT DATA=_Measures OUT=&out.1; BY &by VarName nq; RUN; PROC SORT DATA=&out.1; BY nq; RUN; PROC TRANSPOSE DATA=&out.1 OUT=&out.1(DROP=_name_); BY &by Statistic NOTSORTED; ID Varname; VAR Value; RUN;"(&by NE)"7+ PROC SORT DATA=&out.1; BY &by; RUN;""%(%UPCASE(&print)=YES)"$(%UPCASE(&word)=YES)" DATA _NULL_; SET &out.1; FILE PRINT; LENGTH listvar $ 1000; IF (_N_=1) THEN DO; listvar=COMPRESS('Statistic;'||TRANWRD(TRIM(LEFT(COMPBL("&var"))),' ',';'));"(&by NE)"^R listvar=COMPRESS(TRANWRD(TRIM(LEFT(COMPBL("&by"))),' ',';')||';'||listvar);""' PUT listvar; END;"(&by NE)"<0 PUT &by ';' Statistic (&var)(';' BEST20.);""4( PUT Statistic (&var)(';' BEST20.);" RUN;""' PROC PRINT DATA=&out.1;"(&by NE)"/# ID &by; VAR Statistic &var;""( ID Statistic; VAR &var;"* FORMAT &var BEST20.; RUN;""ZN PROC SORT DATA=_Measures OUT=&out.2(DROP=nq); BY Varname nq &by; RUN;"(&by NE)"y PROC TRANSPOSE DATA=&out.2 OUT=&out.2(DROP=_name_); BY Varname Statistic NOTSORTED; ID &by; VAR Value; RUN;""%(%UPCASE(&print)=YES)"$(%UPCASE(&word)=YES)"}q DATA _NULL_; SET &out.2; FILE PRINT; PUT Varname ';' Statistic (_numeric_)(';' BEST10.3); RUN;""ui PROC PRINT DATA=&out.2; ID Varname; VAR Statistic _numeric_; FORMAT _numeric_ BEST10.3; RUN;""&(%LENGTH(&excel) NE 0)" OPTIONS noxwait; x "del ""&excel"""; PROC EXPORT DBMS=EXCEL DATA=&out.1 OUTFILE="&excel"; SHEET=out1; RUN; PROC EXPORT DBMS=EXCEL DATA=&out.2 OUTFILE="&excel"; SHEET=out2; RUN;""D#0` P (Th H\t 8H\@Xh| t T l | X x , D T h  4 D X $8x 8|Phx4<Tdx,<PxTl|,@Dp,NDEFGTHtHH IIIdJlJJJKKHKpKKKLMNNO$O0PPPQRSST"0DATA"0OUT"0BKOUT"0VAR"0DATE"0LOW"0HIGH"0ENDRULE"0ORDER"0PRINT"0WORD"0FORMAT"0GRAPH"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"("=!-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"!"8, DATA _NULL_; SET &data (OBS=1); RUN;"((&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"("%,(%LENGTH(&out ) EQ 0)"OUT" _result_"7"<1,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"1"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"7 (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"7"';(%LENGTH(&bkout ) EQ 0)"BKOUT" _bkfilter_"F">@.(%LENGTH(%QSCAN(%BQUOTE(&bkout ),2, )) NE 0)"YIERROR: You must precise just one value for the bkout (&bkout ) parameter"FINMACRO" ;"@"2& %sasnom(_IN_=&bkout ,TYPE=DATASET);"F (&_ret_ NE 0)"VFERROR: The bkout (&bkout ) parameter must be a valid SAS dataset name"FINMACRO" ;"F"%K(%LENGTH(&var ) EQ 0)"9)ERROR: The var parameter must be precised"FINMAS"tGRAPHICSdH9.2  X>"0DATA"0DATE"0VAR"0DIF"0LOG"0PARTINV"0SMOOTH"0EPS"0JPG"0DEBUG",FINSER",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"&(%LENGTH(&data ) NE 0)"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""1% DATA _NULL_; SET &data ; RUN;"(&syserr NE 0)"@0ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;""!"DATA" _last_"&((%LENGTH(&date ) NE 0)"='-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre date (&date )"FINMACRO" ;"'"*"DATE" date"VJ DATA _NULL_; SET &data (KEEP=_NUMERIC_); ARRAY _xx_(*) &date ; RUN;"1(&syserr NE 0)"@0ERROR: Problme dans le paramtre date (&date )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"1"%:(%LENGTH(&var ) NE 0)"YM DATA _NULL_; SET &data (KEEP=_NUMERIC_); ARRAY _xx_(*) &var ; RUN;"9(&syserr NE 0)">.ERROR: Problme dans le paramtre var (&var )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"9"<"VAR" _NUMERIC_"(K(%LENGTH(&smooth ) NE 0)"?B/(%LENGTH(%QSCAN(%BQUOTE(&smooth ),2, )) NE 0)"`PERROR: Vous devez prciser une seule valeur pour le paramtre smooth (&smooth )"FINMACRO" ;"B",G(%DATATYP(&smooth ) EQ CHAR)"TDERROR: La valeur du paramtre smooth (&smooth ) doit tre numrique"FINMACRO" ;"J"4J$((&smooth LE 0 ) OR (&smooth GE 1 ))":*ERROR: Vous devez avoir 0 < &smooth < 1"J"M"SMOOTH" 0.25"$Q(%LENGTH(&dif) EQ 0)"DIF" NO"S"DIF" YES"$W(%LENGTH(&log) EQ 0)"LOG" NO"Y"LOG" YES"(](%LENGTH(&partinv) EQ 0)"PARTINV" NO"_T"tRUNTRAMOfE9.1   i>"0DATA"0TSERIES"0PERIOD"0TDROP"0ADD"0VARREG"0REGEFF"0LAM"0EASTER"0TRAD"0RSA"0IDUR"0MODEL"0VA"4LIMAR0.98"4LIMMA0.98"0OUT"0OUTTYPE"0FORECAST"0DATE"0PRINT"0DTRAMO"0CONTROL"0DEBUG", FINCONTROLH",FINMACRO" (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;""TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"7+ DATA ___tt___; start=DATETIME(); RUN;"# (&control NE)" FINCONTROL"#"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index" GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&+(%LENGTH(&data ) EQ 0)"DATA" _last_"7"=0-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"0"8, DATA _NULL_; SET &data (OBS=1); RUN;"7(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"7"%;(%LENGTH(&out ) EQ 0)"OUT" _results_"F"<@,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"@"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"F (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACROU"tLOOKTESTeE9.1  l[t>"0DATA"0OUTMOD"0OUTFOR"0VARY"0VARX"0DATE"0VARSUP"0MAXVAR"0FIRSTDAT"0LASTDAT"0NLAGX"0NLAGY"0NLAGS"0CRIT"0NBMOD"0ALPHA"0CONTROL"0DEBUG", FINCONTROL",FINMACRO" (&debug NE)"OC OPTIONS MPRINT NOTES NOXWAIT NOCENTER NOMACROGEN PS=1000 LS=250;""]Q OPTIONS NOMPRINT NONOTES NOSOURCE2 NOCENTER NOXWAIT NOMACROGEN PS=1000 LS=250;" (&control NE)" FINCONTROL""  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index" GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&$(%LENGTH(&data ) EQ 0)"DATA" _last_"0"=)-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;")"8, DATA _NULL_; SET &data (OBS=1); RUN;"0(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"0"(4(%LENGTH(&outmod ) EQ 0)"OUTMOD" _outmod_"?"?9/(%LENGTH(%QSCAN(%BQUOTE(&outmod ),2, )) NE 0)"ZJERROR: You must precise just one value for the outmod (&outmod ) parameter"FINMACRO" ;"9"3' %sasnom(_IN_=&outmod ,TYPE=DATASET);"? (&_ret_ NE 0)"WGERROR: The outmod (&outmod ) parameter must be a valid SAS dataset name"FINMACRO" ;"?"(C(%LENGTH(&outfor ) EQ 0)"OUTFOR" _outfor_"N"?H/(%LENGTH(%QSCAN(%BQUOTE(&outfor ),2, )) NE 0)"ZJERROR: You must precise just one value for the outfor (&outfor ) parameter"aV" _numeric_"Q"cW DATA _NULL_; SET &data (KEEP=&tseries OBS=1); ARRAY _xx_(*) &tseries ; RUN;"Q(&syserr NE 0)"N>ERROR: There is a problem in the tseries (&tseries ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"Q"U (&ordre EQ)"ORDRE" 0"f"'f(%LENGTH(&ordre ) NE 0)">[.(%LENGTH(%QSCAN(%BQUOTE(&ordre ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre ordre (&ordre )"FINMACRO" ;"["+`(%DATATYP(&ordre ) EQ CHAR)"RBERROR: La valeur du paramtre ordre (&ordre ) doit tre numrique"FINMACRO" ;"e"Ce3((&ordre NE 3) AND (&ordre NE 4) AND (&ordre NE 5))"]MERROR: La valeur du paramtre ordre (&ordre ) doit tre choisie parmi (3 4 5)"FINMACRO" ;"e"f")w(%LENGTH(&missing ) NE 0)"@l0(%LENGTH(%QSCAN(%BQUOTE(&missing ),2, )) NE 0)"bRERROR: Vous devez prciser une seule valeur pour le paramtre missing (&missing )"FINMACRO" ;"l"-q(%DATATYP(&missing ) EQ CHAR)"VFERROR: La valeur du paramtre missing (&missing ) doit tre numrique"FINMACRO" ;"v"]vM((&missing NE 0) AND (&missing NE 1) AND (&missing NE 2) AND (&missing NE 3))"dTERROR: La valeur du paramtre missing (&missing ) doit tre choisie parmi (0 1 2 3)"FINMACRO" ;"v"y"MISSING" 0"} (&factor EQ)"FACTOR" 2.7""((%LENGTH(&factor ) NE 0)"?/(%LENGTH(%QSCAN(%BQUOTE(&factor ),2, )) NE 0)"`PERROR: Vous devez prciser une seule valeur pour le paramtre factor (&factor )"FINMACRO" ;"",(%DATATYP(&factor ) EQ CHAR)"TDERROR: La valeur du paramtre factor (&factor ) doit tre numrique"FINMACRO" ;""2"((&factor LT 1) OR (&factor GT 5))"`PERROR: La valeur du paramtre factor (&factor ) doit tre comprise entre 1 et 5"FINMACRO" ;"""-! OPTIONS noxwait;"_NETTOY_" " (&ordre EQ 0)"MINL" 3""MINL" &ordre" PROC CONTENTS DATA=&data(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _nomvar_; LENGTH liste $ 10000; RETAIN liste ' '; SET _nomvar_ END=fin; name=UPCASE(name); IF (name ^= UPCASE("&date")) THEN DO; n+1; CALL" SYMPUT('_var'!!LEFT(PUT(n,4.)),TRIM(LEFT(name))); liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); END; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(n,4.))); CALL SYMPUT('tseries',TRIM(LEFT(liste))); END; RUN;"_NETTOY_"" &_nettoy_ _nomvar_"ERRPER" 0"ERRMISS" 0{W"tCHARACTERISTICS_DF9.2  )|r>"0VARRAW"0VARLIN"0VARSA"0VARTCY"0VARSF"0VARTD"0VARIRR"0VAROUT"0VARAO"0VARTC"0VARLS"0VDROP"0DATE"0 TRANSPOSE"0OUTSTATS"0DEBUG",FINMACRO(" (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;""TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;" __NETTOY__" "-! DATA __varraw__; SET &varraw"&(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)""; RUN;"VARRAW" __varraw__" DATA __varlin__;"' (&varlin EQ)" SET &varraw"&%(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"%" ;"," SET &varlin"&+(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"+" ;" RUN;"VARLIN" __varlin__"* DATA __varsa__; SET &varsa"&3(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"3"; RUN;"VARSA" __varsa__"* DATA __varsf__; SET &varsf"&:(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)":"; RUN;"VARSF" __varsf__", DATA __varirr__; SET &varirr"&A(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"A"; RUN;"VARIRR" __varirr__", DATA __vartcy__; SET &vartcy"&H(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"H"; RUN;"VARTCY" __vartcy__" DATA __vartd__;"S (&vartd EQ)" SET &varraw"&Q(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"Q" ;"X" SET &vartd"&W(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"W" ;" RUN;"VARTD" __vartd__" DATA __vartc__;"c (&vartc EQ)" SET &varraw"&a(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"a" ;"h" SET &vartc"&g(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"g" ;" RUN;"VARTC" __vartc__" DATA __varao__;"s (&varao EQ)" SET &varraw"&q(%LENGTH(qX; RUN; ODS SELECT ALL; DATA loess; SET loess(WHERE=(SmoothingParameter=&smooth)); KEEP &date depvar pred; depvar=depvar*(10**&power); pred=pred*(10**&power); RENAME depvar=&&_var&i pred=loess; RUN;""  PROC ARIMA DATA=seas(KEEP=&&_var&i); IDENTIFY VAR=&&_var&i NLAG=%EVAL(3*&per) OUTCOV=_cov_ NOPRINT; IDENTIFY VAR=&&_var&i(1) NLAG=%EVAL(3*&per) OUTCOV=_cov1_ NOPRINT; IDENTIFY VAR=&&_var&i(1,&per) NLAG=%EVAL(3*&per) OUTCOV=_cov2_ NOPRINT;"  IDENTIFY VAR=&&_var&i(&per) NLAG=%EVAL(3*&per) OUTCOV=_cov3_ NOPRINT; RUN; QUIT; DATA _dcov_; SET _cov_(KEEP=n corr lag RENAME=(n=n0 corr=corr0)); SET _cov1_(KEEP=n corr lag RENAME=(n=n1 corr=corr1)); SET _cov2_(KEEP=n corr lag RENAME=" (n=n2 corr=corr2)); SET _cov3_(KEEP=n corr lag RENAME=(n=n3 corr=corr3)); KEEP lag corr0-corr3 up0-up3 low0-low3; RETAIN nobs0-nobs3; ARRAY num(4) n0-n3; ARRAY numobs(4) nobs0-nobs3; ARRAY auto(4) corr0-corr3; ARRAY tot(4) tot0-tot3;"  ARRAY up(4) up0-up3; ARRAY low(4) low0-low3; IF _N_=1 THEN DO i=1 TO 4; numobs(i)=num(i); up(i)=0; low(i)=0; END; ELSE DO i=1 TO 4; tot(i)+auto(i)**2; up(i)=1.96*SQRT((1+2*tot(i))/numobs(i)); low(i)=-up(i); END;" RUN;"!(&partinv EQ YES)" DATA _pcov_; SET _cov_(KEEP=n partcorr lag RENAME=(n=n0 partcorr=pcorr0)); SET _cov1_(KEEP=n partcorr lag RENAME=(n=n1 partcorr=pcorr1)); SET _cov2_(KEEP=n partcorr lag RENAME=(n=n2 partcorr=pcorr2)); SET _cov3_(KEEP=n partcorr lag"  RENAME=(n=n3 partcorr=pcorr3)); KEEP lag pcorr0-pcorr3 up0-up3 low0-low3; RETAIN nobs0-nobs3; ARRAY num(4) n0-n3; ARRAY numobs(4) nobs0-nobs3; ARRAY up(4) up0-up3; ARRAY low(4) low0-low3; IF _N_=1 THEN DO i=1 TO 4; numobs" (i)=num(i); up(i)=0; low(i)=0; END; ELSE DO i=1 TO 4; up(i)=1.96/SQRT(numobs(i)); low(i)=-up(i); END; RUN; DATA _icov_; SET _cov_(KEEP=n invcorr lag RENAME=(n=n0 invcorr=icorr0)); SET _cov1_(KEEP=n invcorr lag"  RENAME=(n=n1 invcorr=icorr1)); SET _cov2_(KEEP=n invcorr lag RENAME=(n=n2 invcorr=icorr2)); SET _cov3_(KEEP=n invcorr lag RENAME=(n=n3 invcorr=icorr3)); KEEP lag icorr0-icorr3 up0-up3 low0-low3; RETAIN nobs0-nobs3; ARRAY num(4) n0-n3;"  ARRAY numobs(4) nobs0-nobs3; ARRAY up(4) up0-up3; ARRAY low(4) low0-low3; IF _N_=1 THEN DO i=1 TO 4; numobs(i)=num(i); up(i)=0; low(i)=0; END; ELSE DO i=1 TO 4; up(i)=1.96/SQRT(numobs(i)); low(i)=-up(i);" END; RUN;"" (&dif EQ YES)"VARSPEC" DifVar""VARSPEC" &&_var&i"  PROC IML; START moymob(xserie,movav,coef); movav=J(NROW(xserie),1,0); mmob1=xserie[LOC(xserie ^= .)]; nobs=NROW(mmob1); mmob2=J(nobs,1,.); ordre=NROW(coef); ncols=NCOL(coef); nb=INT(ordre / 2); IF (ordre <= nobs)" THEN DO; mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef[,ncols]),T(mmob1))[ordre:nobs]); END; ELSE mmob2=J(nobs,1,mmob1[:]); mmob2[1:nb]=T(T(mmob1[1:ordre])*coef[,1:nb]); mmob2[nobs:nobs-nb+1]=T(T(mmob1[nobs:nobs-ordre+1])*coef[,1:nb]);"  movav[LOC(xserie ^= .)]=mmob2; FINISH moymob; START Periodogram(xserie,Periodogram,freq,per); pi=2*ARCOS(0); nvar=NCOL(xserie); nfrq=NROW(freq); Periodogram=J(nfrq,nvar,0); nq=INT(2*(nfrq**(1/5))/3); ww=T(DO(-nq" ,nq,1))/(2*nq+1); ww2=(1+cos(pi*ww))/2; ww=ww2/ww2[+]; DO i=1 TO nvar; cc=LOC(xserie[,i]^=.); IF (NCOL(cc)^=0) THEN DO; xx=xserie[cc,i]; nobs=NROW(xx); END; dd=2*pi*REPEAT(DO(0,noY"*Z(%DATATYP(&type ) EQ CHAR)"C3ERROR: The type (&type ) parameter must be numeric"FINMACRO" ;"_"_q((&type NE 0) AND (&type NE 1) AND (&type NE 2) AND (&type NE 3) AND (&type NE 4) AND (&type NE 5))"WGERROR: The type (&type ) parameter must be choosen among (0 1 2 3 4 5)"FINMACRO" ;"_"Kd;(((&type EQ 1) OR (&type EQ 4)) AND (%LENGTH(&group) EQ 0))"eUERROR: If the parameter Type is equal to 1 or 4, the parameter Group must be precised"FINMACRO" ;"d"(l(%LENGTH(&boxsty ) EQ 0)"#i(%LENGTH(&id) NE 0)"BOXSTY" schematicid"k"BOXSTY" schematic""?q/(%LENGTH(%QSCAN(%BQUOTE(&boxsty ),2, )) NE 0)"[KERROR: You must precise just one value for the boxsty (&boxsty ) parameter"FINMACRO" ;"q",v(%DATATYP(&boxsty ) EQ CHAR)"G7ERROR: The boxsty (&boxsty ) parameter must be numeric"FINMACRO" ;"{"F{6((&boxsty NE 1) AND (&boxsty NE 2) AND (&boxsty NE 3))"UEERROR: The boxsty (&boxsty ) parameter must be choosen among (1 2 3)"FINMACRO" ;"{"(&boxsty EQ 1)"BOXSTY" schematic""(&boxsty EQ 2)"BOXSTY" schematicid""(&boxsty EQ 3)"BOXSTY" schematicidfar"")(%LENGTH(¬ches ) NE 0)"@0(%LENGTH(%QSCAN(%BQUOTE(¬ches ),2, )) NE 0)"\LERROR: You must precise just one value for the notches (¬ches ) parameter"FINMACRO" ;"",(%DATATYP(¬ches ) EQ NUM)"J:ERROR: The notches (¬ches ) parameter must be character"FINMACRO" ;""J:((%UPCASE(¬ches) NE YES) AND (%UPCASE(¬ches) NE NO))"XHERROR: The notches (¬ches ) parameter must be choosen among (YES NO )"FINMACRO" ;"""+(%UPCASE(¬ches ) EQ YES)"NOTCHES" notches""(&id EQ)"FORMATID" ""^R GOPTIONS CBACK=white BORDER NOPROMPT DEVMAP=winansi KEYMAP=winansi DEVICE=win;"((%UPCASE(&title) NE YES)" TITLE " ";"" PROC CONTENTS DATA=__trav__ (KEEP=&var) OUT=nomvar(KEEP=name label) NOPRINT; RUN; DATA nomvar; SET nomvar; CALL SYMPUT('_var'||LEFT(PUT(_N_,3.)),TRIM(name)); label=TRANWRD(label,"''","'"); label=TRANWRD(label,'"',"'"); CALL"ma SYMPUT('_lab'||LEFT(PUT(_N_,3.)),TRIM(label)); CALL SYMPUT('_nvar',LEFT(PUT(_N_,3.))); RUN;"VAR" "%I1&_nvar1"VAR"& %CMPRES(&var &&_var&i)"" (&type EQ 0)" DATA _tabtrav_; SET __trav__(KEEP=&var &id); vargroup=1; RUN; PROC BOXPLOT DATA=_tabtrav_; PLOT (&var)* vargroup / CAXIS = black CTEXT = black`Zer"FINMACRO" ;"M"*R(%DATATYP(&print ) EQ NUM)"G7ERROR: The print (&print ) parameter must be character"FINMACRO" ;"W"4W$((&print NE yes) AND (&print NE no))"UEERROR: The print (&print ) parameter must be choosen among (yes no )"FINMACRO" ;"W"&[(%LENGTH(&word ) EQ 0)"WORD" no"j"=`-(%LENGTH(%QSCAN(%BQUOTE(&word ),2, )) NE 0)"WGERROR: You must precise just one value for the word (&word ) parameter"FINMACRO" ;"`")e(%DATATYP(&word ) EQ NUM)"E5ERROR: The word (&word ) parameter must be character"FINMACRO" ;"j"2j"((&word NE yes) AND (&word NE no))"SCERROR: The word (&word ) parameter must be choosen among (yes no )"FINMACRO" ;"j"'n(%LENGTH(&format) EQ 0)"FORMAT" 10.2"n"'r(%LENGTH(&graph ) EQ 0)"GRAPH" yes"">w.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"YIERROR: You must precise just one value for the graph (&graph ) parameter"FINMACRO" ;"w"*|(%DATATYP(&graph ) EQ NUM)"G7ERROR: The graph (&graph ) parameter must be character"FINMACRO" ;""4$((&graph NE yes) AND (&graph NE no))"UEERROR: The graph (&graph ) parameter must be choosen among (yes no )"FINMACRO" ;""F: DATA &out; SET &data; KEEP &date &var; RUN;"_NETTOY_" "pd PROC FORMAT; VALUE njm 25-35=12 50-70=6 80-100=4 115-135=3 175-195=2; RUN;"_MISS_" 0" DATA &out; SET &data END=fin; KEEP &date &var; RETAIN dtmin dtmax; IF (&var ^=.) THEN DO; ndon+1; dtmax=&date; IF (ndon=1) THEN dtmin=&date; END; IF ((&var ^= .) AND (LAG(&var) =.) AND (ndon > 1)) THEN DO; PUT" "Error: Missing value in variable &var"; CALL SYMPUT('_miss_','1'); END; IF fin THEN DO; period=PUT((dtmax-dtmin)/ndon,njm.); CALL SYMPUT('period',period);" (&lambda EQ)"?3 CALL SYMPUT('lambda',PUT(100*(period**2),6.));""* END; IF (&var ^=.); RUN;" (&period EQ )"wgERROR: Problem with the automatic determination of the series periodicity. Check your SAS date variable"FINMACRO" ;""(&_miss_ EQ 1)"FINMACRO""  PROC IML; USE &out; READ all VAR{&var} INTO y; READ all VAR{&date} INTO date; CLOSE &out; n=NROW(y); v=J(n,3,.); t=J(n,1,.); d=J(n,1,.); v11=1; v22=1; v12=0; DO i=3 TO n; x=v11; z=v12; v11=1/"&lambda + 4*(x-z) + v22; v12=2*x - z; v22=x; det=v11*v22-v12*v12; v[i,1]=v22/det; v[i,3]=v11/det; v[i,2]=-v12/det; x=v11+1; z=v11; v11=v11-v11*v11/x; v22=v22-v12*v12/x; v12=v12-z*v12/x; END; m1=y[2]; m2=y[1];" DO i=3 TO n; x=m1; m1=2.0*m1-m2; m2=x; t[i-1]= v[i,1]*g["A"'E(%LENGTH(&format) EQ 0)"FORMAT" 15.3"E" FORMCHARS" "(J(%LENGTH(&printto) NE 0)"{ DATA _NULL_; aa="FORMCHAR='; '"; CALL SYMPUT('formchars', TRIM(LEFT(aa))); RUN; X "del ""&printto""";"J"@4 DATA _trav_; SET &data(KEEP=&varexp &clusname);"N (&vtype NE 2)" IF &clusname ^=.; IF (&clusname < 10) THEN ClusterVar=TRIM(LEFT(COMPRESS('CL0'||PUT(&clusname,5.)))); ELSE ClusterVar=TRIM(LEFT(COMPRESS('CL'||PUT(&clusname,5.)))); DROP &clusname; RENAME ClusterVar=&clusname;"N" RUN;"_NETTOY" _trav_"_NUMX" "_CHARX" "_RNUMX" "  PROC CONTENTS DATA=_trav_(KEEP=&varexp) OUT=_nomvar_(KEEP=name label type) NOPRINT; RUN; DATA _NULL_; SET _nomvar_ END=f; LENGTH numx rnumx charx charxall $ 30000; RETAIN numx rnumx charx charxall ' '; IF (type=1) THEN DO; numx=TRIM(LEFT(" numx))||' '||TRIM(LEFT(name)); rnumx=TRIM(LEFT(rnumx))||' R_'||TRIM(LEFT(name)); END; ELSE IF (type=2) THEN DO; charx=TRIM(LEFT(charx))||' '||TRIM(LEFT(name)); charxall=TRIM(LEFT(charxall))||' '||TRIM(LEFT(name))||' all'; END; IF f THEN" DO; CALL SYMPUT('_numx',TRIM(LEFT(numx))); CALL SYMPUT('_rnumx',TRIM(LEFT(rnumx))); CALL SYMPUT('_charx',TRIM(LEFT(charx))); CALL SYMPUT('_charxall',TRIM(LEFT(charxall))); END; RUN;"_NETTOY"! &_nettoy _nomvar_"Da4((%LENGTH(&_numx) EQ 0) AND (%LENGTH(&_charx) EQ 0))"8(ERROR: There is no explanatory variables"FINMACRO" ;"a"(d(%LENGTH(&printto) NE 0)"8, PROC PRINTTO NEW PRINT="&printto"; RUN;"d"&g(%LENGTH(&_numx) NE 0)"aU PROC RANK DATA=_trav_ OUT=_trav_ GROUPS=5; VAR &_numx; RANKS &_rnumx; RUN;"g"VJ PROC TABULATE DATA=_trav_ &formchars; CLASS &clusname &_charx &_rnumx;"&k(%LENGTH(&_numx) NE 0)" VAR &_numx;"k"# TABLE all*(N*F=5.0)"&o(%LENGTH(&_numx) NE 0)"& (&_numx)*(MEAN*F=5.1)"o"y (&_charxall &_rnumx all)*(COLPCTN*F=5.1),&clusname all/RTS=20 ROW=float; KEYLABEL COLPCTN=' ' MEAN=' ' N=' '; RUN;"(w(%LENGTH(&printto) NE 0)"  PROC PRINTTO; RUN; DATA _printto_; LENGTH xx yy x1 x2 a $ 5000; INFILE "&printto" LENGTH=l; INPUT xx $VARYING5000. l; DROP yy a x1 x2; yy=COMPRESS(TRANWRD(xx,';',' ')); IF (yy=' ') THEN DELETE; IF INDEX(xx,'System') THEN DELETE"; xx=SUBSTR(TRIM(LEFT(xx)),2); xx=REVERSE(SUBSTR(TRIM(LEFT(REVERSE(xx))),2)); a=INDEX(xx,';'); IF (a=1) THEN x1=' '; ELSE x1=SCAN(xx,1,';'); x2=SUBSTR(xx,a); xx=TRIM(LEFT(x1)) || COMPRESS(TRIM(LEFT(x2))); RUN; DATA _NULL_;"ZN SET _printto_; FILE "&printto" RECFM=V LRECL=30000; PUT xx $; RUN;"_NETTOY"" &_nettoy _printto_"w"&(%LENGTH(&_numx) NE 0)"  PROC SUMMARY DATA=_trav_; CLASS &clusname; VAR &_numx; OUTPUT OUT=mean MEAN=; OUTPUT OUT=Variance VAR=; RUN; DATA Mean; LENGTH liste $ 10000; SET Mean END=fin; RETAIN liste ' '; IF &ClusName=' ' THEN &ClusName='Total';"  ELSE DO; liste= COMPBL(TRIM(LEFT(liste)) || ' ' || TRIM(LEFT(&ClusName))); n+]\"tCALENDAR|G9.2  1>"0START"0END"0OUT"0STARTM"0ENDM"0STAT"0PER"0WORD"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"%(%LENGTH(&out ) EQ 0)"OUT" _regressor_"""<,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;""0$ %sasnom(_IN_=&out ,TYPE=DATASET);"" (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"""''(%LENGTH(&start ) EQ 0)";+ERROR: The start parameter must be precised"FINMACRO" ;"1">,.(%LENGTH(%QSCAN(%BQUOTE(&start ),2, )) NE 0)"XHERROR: You must precise just one value for the start (&start ) parameter"FINMACRO" ;","+1(%DATATYP(&start ) EQ CHAR)"D4ERROR: The start (&start ) parameter must be numeric"FINMACRO" ;"1"%6(%LENGTH(&end ) EQ 0)"9)ERROR: The end parameter must be precised"FINMACRO" ;"E"<;,(%LENGTH(%QSCAN(%BQUOTE(&end ),2, )) NE 0)"TDERROR: You must precise just one value for the end (&end ) parameter"FINMACRO" ;";")@(%DATATYP(&end ) EQ CHAR)"@0ERROR: The end (&end ) parameter must be numeric"FINMACRO" ;"@" E(&end LE &start)"bRERROR: The end (&end ) parameter must be greater than the start (&start) parameter"FINMACRO" ;"E"(I(%LENGTH(&startm ) EQ 0)"STARTM" &start"S"?N/(%LENGTH(%QSCAN(%BQUOTE(&startm ),2, )) NE 0)"ZJERROR: You must precise just one value for the i]startm (&startm ) parameter"FINMACRO" ;"N",S(%DATATYP(&startm ) EQ CHAR)"F6ERROR: The startm (&startm ) parameter must be numeric"FINMACRO" ;"S"&W(%LENGTH(&endm ) EQ 0)"ENDM" &end"f"=\-(%LENGTH(%QSCAN(%BQUOTE(&endm ),2, )) NE 0)"VFERROR: You must precise just one value for the endm (&endm ) parameter"FINMACRO" ;"\"*a(%DATATYP(&endm ) EQ CHAR)"B2ERROR: The endm (&endm ) parameter must be numeric"FINMACRO" ;"a""f(&endm LE &startm)"fVERROR: The endm (&endm ) parameter must be greater than the startm (&startm) parameter"FINMACRO" ;"f"STAT" %UPCASE(&stat)"&y(%LENGTH(&stat ) NE 0)"=n-(%LENGTH(%QSCAN(%BQUOTE(&stat ),2, )) NE 0)"VFERROR: You must precise just one value for the stat (&stat ) parameter"FINMACRO" ;"n")s(%DATATYP(&stat ) EQ NUM)"D4ERROR: The stat (&stat ) parameter must be character"FINMACRO" ;"x"/x((&stat NE M) AND (&stat NE Q))"N>ERROR: The stat (&stat ) parameter must be choosen among (M Q)"FINMACRO" ;"x"y"~(&end < &start)"XHERROR: The start parameter must be smaller or equal to the end parameter"FINMACRO" ;"~"CLEAN" "  DATA &out; LENGTH Date 5 year month qtr NbDays Day1-Day7 Off1-Off7 In1-In7 TD1-TD6 WD Monday_B Friday_B PH TD Bridges LeapYear WeekDays 8 EasterG $ 9; KEEP Date year month qtr NbDays Day1-Day7 Off1-Off7 In1-In7 TD1-TD6 WD Monday_B Friday_B PH TD" Bridges LeapYear EasterG WeekDays; ARRAY days(7) Day1-Day7; ARRAY Off(7) Off1-Off7; ARRAY in(7) In1-In7; ARRAY Tdays(6) TD1-TD6; LABEL Day1="# Sunday" Day2="# Monday" Day3="# Tuesday" Day4="# Wednesday" Day5=""# Thursday" Day6="# Friday" Day7="# Saturday" Off1="# Sunday off" Off2="# Monday off" Off3="# Tuesday off" Off4="# Wednesday off" Off5="# Thursday off" Off6="# Friday off" Off7="# Saturday off" In1="# Sunday in""  In2="# Monday in" In3="# Tuesday in" In4="# Wednesday in" In5="# Thursday in" In6="# Friday in" In7="# Saturday in" Monday_B='# Monday bridge' Friday_B='# Friday bridge' PH="Public Holidays, except Sat. & Sun." TD="'Trading Week Days' LeapYear='Leap Year' EasterG='Easter date' ; Firstyear=MIN(&start,&startm); Lastyear=MAX(&end,&endm); Date=MDY(12,1,Firstyear-1); DO k=1 TO (Lastyear-Firstyear+1)*12; Date=INTNX('month',date,1); Year=" YEAR(date); Month=MONTH(date); Qtr=QTR(date); Nbdays=INTNX('month',date,1)-date; DO i=1 TO DIM(days); days(i)=0; off(i)=0; in(i)=0; END; DO i=1 TO NbDays; jj=WEEKDAY(date+i-1); days(jj)=days(jj)+1; END;"  G = MOD(year,19); C = INT(year/100); H = MOD(C - INT(C/4) - INT((8*C+13)/25) + 19*G + 15,30); I = H - INT(H/28)*(1 - INT(H/28)*INT(29/(H + 1))*INT((21 - G)/11)); J = MOD((year + INT(year/4) + I + 2 - C + INT(C/4)),7); L = I"  - J; mois = 3 + INT((L + 40)/4^" ;"F"%J(%LENGTH(&add ) EQ 0)"ADD" 0"T"<O,(%LENGTH(%QSCAN(%BQUOTE(&add ),2, )) NE 0)"TDERROR: You must precise just one value for the add (&add ) parameter"FINMACRO" ;"O")T(%DATATYP(&add ) EQ CHAR)"@0ERROR: The add (&add ) parameter must be numeric"FINMACRO" ;"T")X(%LENGTH(&outtype ) EQ 0)"OUTTYPE" 1"g"@]0(%LENGTH(%QSCAN(%BQUOTE(&outtype ),2, )) NE 0)"\LERROR: You must precise just one value for the outtype (&outtype ) parameter"FINMACRO" ;"]"-b(%DATATYP(&outtype ) EQ CHAR)"H8ERROR: The outtype (&outtype ) parameter must be numeric"FINMACRO" ;"g"5g%((&outtype NE 1) AND (&outtype NE 2))"UEERROR: The outtype (&outtype ) parameter must be choosen among (1 2 )"FINMACRO" ;"g")k(%LENGTH(&tseries ) EQ 0)"TSERIES" _numeric_"r"cW DATA _NULL_; SET &data (KEEP=&tseries OBS=1); ARRAY _xx_(*) &tseries ; RUN;"r(&syserr NE 0)"N>ERROR: There is a problem in the tseries (&tseries ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"r"){(%LENGTH(&tseries ) NE 0)"E9 DATA _NULL_; SET &data (KEEP=&tdrop OBS=1); RUN;"z(&syserr NE 0)"J:ERROR: There is a problem in the tdrop (&tdrop ) parameter"UEERROR: Non valid SAS dataset? Non valid SAS name? Non valid SAS list?"FINMACRO" ;"z"{"&(%LENGTH(&date ) EQ 0)":*ERROR: The date parameter must be precised"FINMACRO" ;""=-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"VFERROR: You must precise just one value for the date (&date ) parameter"FINMACRO" ;""]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"(&syserr NE 0)"I9ERROR: There is a problem in the date (&date ) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;""((%LENGTH(&varreg ) NE 0)"aU DATA _NULL_; SET &data (KEEP=&varreg OBS=1); ARRAY _xx_(*) &varreg ; RUN;"(&syserr NE 0)"L<ERROR: There is a problem in the varreg (&varreg ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"""((%LENGTH(®eff ) EQ 0)"REGEFF" 0""?/(%LENGTH(%QSCAN(%BQUOTE(®eff ),2, )) NE 0)"ZJERROR: You must precise just one value for the regeff (®eff ) parameter"FINMACRO" ;"",(%DATATYP(®eff ) EQ CHAR)c_value for the out (&out ) parameter"FINMACRO" ;"H"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"N (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"N"'R(%LENGTH(&print ) EQ 0)"PRINT" OUI"a">W.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre print (&print )"FINMACRO" ;"W"*\(%DATATYP(&print ) EQ NUM)"RBERROR: La valeur du paramtre print (&print ) doit tre caractre"FINMACRO" ;"a"daT((%UPCASE(&print) NE OUI) AND (%UPCASE(&print) NE NON) AND (%UPCASE(&print) NE ALL))"dTERROR: La valeur du paramtre print (&print ) doit tre choisie parmi (oui non all)"FINMACRO" ;"a"'e(%LENGTH(&format) EQ 0)"FORMAT" 5.1"e"&i(%LENGTH(&iter ) EQ 0)"ITER" 5"s"=n-(%LENGTH(%QSCAN(%BQUOTE(&iter ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre iter (&iter )"FINMACRO" ;"n"*s(%DATATYP(&iter ) EQ CHAR)"O?ERROR: La valeur du paramtre iter (&iter ) doit tre numrique"FINMACRO" ;"s"'w(%LENGTH(&power ) EQ 0)"POWER" 1"">|.(%LENGTH(%QSCAN(%BQUOTE(&power ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre power (&power )"FINMACRO" ;"|"+(%DATATYP(&power ) EQ CHAR)"QAERROR: La valeur du paramtre power (&power ) doit tre numrique"FINMACRO" ;""'(%LENGTH(&diagn ) EQ 0)"DIAGN" non"">.(%LENGTH(%QSCAN(%BQUOTE(&diagn ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre diagn (&diagn )"FINMACRO" ;""*(%DATATYP(&diagn ) EQ NUM)"RBERROR: La valeur du paramtre diagn (&diagn ) doit tre caractre"FINMACRO" ;""G7((%UPCASE(&diagn) NE OUI) AND (%UPCASE(&diagn) NE NON))"aQERROR: La valeur du paramtre diagn (&diagn ) doit tre choisie parmi (oui non )"FINMACRO" ;""&(%LENGTH(&cres ) EQ 0)"CRES" red""=-(%LENGTH(%QSCAN(%BQUOTE(&cres ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre cres (&cres )"FINMACRO" ;"")(%DATATYP(&cres ) EQ NUM)"O?ERROR: La valeur du paramtre cres (&cres ) doit tre caractre"FINMACRO" ;""&(%LENGTH(&creg ) EQ 0)"CREG" black""=-(%LENGTH(%QSCAN(%h`m1+v[i,2]*m2; d[i-1]= v[i,2]*m1+v[i,3]*m2; det=v[i,1]*v[i,3]-v[i,2]*v[i,2]; v11=v[i,3]/det; v12=-v[i,2]/det; z=(y[i]-m1)/(v11+1); m1=m1+v11*z; m2=m2+v12*z; END;"  t[n]=m1; t[n-1]=m2; m1=y[n-1]; m2=y[n]; DO i=n-2 TO 1 by -1; i1=i+1; ib=n-i+1; x=m1; m1=2*m1 - m2; m2=x; IF (i > 2) THEN DO; E1=v[ib,3]*m2 + v[ib,2]*m1 + t[i]; E2=v[ib,2]*m2 + v[ib,1]*m1 + d[i]; b11=v[ib,"3]+v[i1,1]; b12=v[ib,2]+v[i1,2]; b22=v[ib,1]+v[i1,3]; det=b11*b22-b12*b12; t[i]=(-b12*E1+b11*E2)/det; END; det=v[ib,1]*v[ib,3]-v[ib,2]*v[ib,2]; v11=v[ib,3]/det; v12=-v[ib,2]/det; z=(y[i]-m1)/(v11+1); m1=m1+v11*z;" m2=m2+v12*z; END; t[1]=m1; t[2]=m2; namevar={&date &var HP_&var D_&var}; result=date || y || t || (y-t); CREATE &out FROM result[COLNAME=namevar]; APPEND FROM result; CLOSE &out; CALL SYMPUT('namevar',namevar); QUIT;"(&period EQ 4)"FORMDAT" YYQ4.""FORMDAT" MONYY5."((%UPCASE(&print) EQ YES)") PROC FORMAT; VALUE fdat"(&period = 12)"th 1='JAN' 2='FEB' 3='MAR' 4='APR' 5='MAY' 6='JUN' 7='JUL' 8='AUG' 9='SEP' 10='OCT' 11='NOV' 12='DEC';"" (&period = 6)"YM 1='JAN_FEB' 2='MAR_APR' 3='MAY_JUN' 4='JUL_AUG' 5='SEP_OCT' 6='NOV_DEC';"" (&period = 4)"-! 1='Q1' 2='Q2' 3='Q3' 4='Q4';"" (&period = 3)"5) 1='JAN_APR' 2='MAY_AUG' 3='SEP_DEC';"" (&period = 2)"-! 1='SEMESTER1' 2='SEMESTER2';"" RUN; DATA _trav_; SET &out; per=PUT(CEIL(MONTH(&date)*&period/12),fdat.); year=YEAR(&date); RUN; PROC TRANSPOSE DATA=_trav_ OUT=_aa1_(DROP=_NAME_); ID per; BY year; VAR &var; RUN;"_NETTOY_"& &_nettoy_ _trav_ _aa1_"pd PROC TRANSPOSE DATA=_trav_ OUT=_aahp_(DROP=_NAME_); ID per; BY year; VAR hp_&var; RUN;"_NETTOY_" &_nettoy_ _aahp_"(&period = 12)"MONTHS"? /JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC"" (&period = 6)"MONTHS"? /JAN_FEB MAR_APR MAY_JUN JUL_AUG SEP_OCT NOV_DEC"" (&period = 4)"MONTHS" Q1 Q2 Q3 Q4"" (&period = 3)"MONTHS"' JAN_APR MAY_AUG SEP_DEC"" (&period = 2)"MONTHS"# SEMESTER1 SEMESTER2""'(%UPCASE(&word) EQ YES)"  DATA _NULL_; FILE PRINT; SET &out; IF (_N_=1) THEN PUT "&date;&var;HP_&var;D_&var"; PUT &date &formdat (&var HP_&var D_&var)(';' &format); RUN; TITLE "Variable &var"; DATA _NULL_; FILE PRINT; SET _aa1_; IF (_N_=1)" THEN DO; nom='Year;' ||TRANWRD("&months",' ',';'); PUT nom; END; PUT year 4. (&months)(';' &format); RUN; TITLE "Variable &var Trend - Estimation by Hoodrick-Prescott filter (lambda= &lambda)"; DATA _NULL_; FILE PRINT;" SET _aahp_; IF (_N_=1) THEN DO; nom='Year;' ||TRANWRD("&months",' ',';'); PUT nom; END; PUT year 4. (&months)(';' &format); RUN;""  TITLE "Variable &var"; PROC PRINT DATA=_aa1_; ID year; VAR &months; FORMAT _numeric_ &format year 4.; ja"ERRORD" 0"  PROC IML; USE &data; READ all VAR{&tseries} INTO x; READ all VAR{&date} INTO date; CLOSE &data; nvar=NCOL(x); series={&tseries}; first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0); miss=J(nvar,1,0); mean=T(x[:,]); max=T" (x[<>,]); min=T(x[><,]); period=J(nvar,1,.); _01_=J(NROW(x),nvar,0); cc=LOC(min > 0); IF (NCOL(cc)^=0) THEN _01_[,cc]=1; _01_=date || CHOOSE(x=.,.,_01_); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date" [cc[1]]; last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL(LOC(aa^=.)); miss[i]=NCOL(LOC(aa=.)); END; END; DO i=1 TO nvar; jj=(last[i]-first[i])/nobs[i]; IF ((25<=jj) & (jj<=35)) THEN period[i]=12; ELSE"  IF ((80<=jj) & (jj<=100)) THEN period[i]=4; ELSE IF ((175<=jj) & (jj<=195)) THEN period[i]=2; END; nbyear=INT(nobs/period); results=period || first || last || nobs || nbyear || miss || max || min || mean; nomcols={period first last nobs nbyear"  nmiss max min mean}; cc=LOC(period=.); IF (NCOL(cc)^=0) THEN CALL SYMPUT('errper','1'); cc=LOC(miss > 0); IF (NCOL(cc)^=0) THEN CALL SYMPUT('errmiss','1'); cc=LOC((nobs - (&minl # period +1)) < 0); IF (NCOL(cc)^=0) THEN CALL SYMPUT('errord',"CHAR(NCOL(cc),5.)); CREATE &out FROM results[COLNAME=nomcols ROWNAME=series]; APPEND FROM results[ROWNAME=series]; CLOSE &out; series={&date &tseries}; CREATE _01_ FROM _01_[COLNAME=series]; APPEND FROM _01_; CLOSE _01_; QUIT;"(&errmiss EQ 1)":*ERROR: Missing values in one of the series"FINMACRO" ;""(&errper EQ 1)"I9ERROR: The periodicity of the series should be 2, 4 or 12"FINMACRO" ;""(&errord NE 0)"ui DATA _zeros_; SET &data; ARRAY numx &tseries; DO OVER numx;IF numx^=. THEN numx=0;END; RUN;"_NETTOY_"! &_nettoy_ _zeros_"_OWARNING: At least one series is too short for the order of the chosen smoother."B2WARNING: The following series will not be adjusted" DATA _NULL_; LENGTH liste $ 30000; RETAIN liste ' '; SET &out END=fin; IF (nobs >= (&minl*period +1)) THEN DO; n+1; CALL SYMPUT('_var'!!LEFT(PUT(n,4.)),TRIM(LEFT(series))); liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(series));" END; ELSE PUT series=; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(n,4.))); CALL SYMPUT('tseries',TRIM(LEFT(liste))); END; RUN;" (&_nser EQ 0)"WGERROR: All series are too short to be adjusted with the chosen smoother"FINMACRO" ;"""  PROC IML; START smooth(entree,cvs,trend,span,period); nobs=NROW(entree); tend=REPEAT(T(1:span),1,4)##REPEAT((0:3),span,1); seas=I(period)-(J(1,period,0)//I(period))[1:period,1:period]; seas=REPEAT(seas," (span-1)/period+1,1)[1:span,1:period-1]; z=(tend || seas)[1:span,]; proj=INV(T(z)*z)*T(z); zstar=J(span,4,0) || seas[1:span,]; lis1=I(span)-zstar*proj; zstar=tend[1:span,] || J(span,period-1,0); lis2=zstar*proj; cvs=J(nobs,NCOL"(entree),.); trend=J(nobs,NCOL(entree),.); cvs[1:span,]=lis1 * entree[1:span,]; trend[1:span,]=lis2 * entree[1:span,]; DO i=span+1 TO nobs; cvs[i,]=lis1[span,]*entree[i-span+1:i,]; trend[i,]=lis2[span,]*entree[i-span+1:i,];"  END; FINISH smooth; START residu(entree,sortie,span); nobs=NROW(entree); z=sbp &id &var); RUN;"&Z(%LENGTH(&type ) EQ 0)"TYPE" 0"n"=_-(%LENGTH(%QSCAN(%BQUOTE(&type ),2, )) NE 0)"WGERROR: You must precise just one value for the type (&type ) parameter"FINMACRO" ;"_"*d(%DATATYP(&type ) EQ CHAR)"C3ERROR: The type (&type ) parameter must be numeric"FINMACRO" ;"i"iq((&type NE 0) AND (&type NE 1) AND (&type NE 2) AND (&type NE 3) AND (&type NE 4) AND (&type NE 5))"WGERROR: The type (&type ) parameter must be choosen among (0 1 2 3 4 5)"FINMACRO" ;"i"Kn;(((&type EQ 1) OR (&type EQ 4)) AND (%LENGTH(&group) EQ 0))"eUERROR: If the parameter Type is equal to 1 or 4, the parameter Group must be precised"FINMACRO" ;"n"(v(%LENGTH(&boxsty ) EQ 0)"#s(%LENGTH(&id) NE 0)"BOXSTY" schematicid"u"BOXSTY" schematic""?{/(%LENGTH(%QSCAN(%BQUOTE(&boxsty ),2, )) NE 0)"[KERROR: You must precise just one value for the boxsty (&boxsty ) parameter"FINMACRO" ;"{",(%DATATYP(&boxsty ) EQ CHAR)"G7ERROR: The boxsty (&boxsty ) parameter must be numeric"FINMACRO" ;""F6((&boxsty NE 1) AND (&boxsty NE 2) AND (&boxsty NE 3))"UEERROR: The boxsty (&boxsty ) parameter must be choosen among (1 2 3)"FINMACRO" ;""(&boxsty EQ 1)"BOXSTY" schematic""(&boxsty EQ 2)"BOXSTY" schematicid""(&boxsty EQ 3)"BOXSTY" schematicidfar"")(%LENGTH(¬ches ) NE 0)"@0(%LENGTH(%QSCAN(%BQUOTE(¬ches ),2, )) NE 0)"\LERROR: You must precise just one value for the notches (¬ches ) parameter"FINMACRO" ;"",(%DATATYP(¬ches ) EQ NUM)"J:ERROR: The notches (¬ches ) parameter must be character"FINMACRO" ;""J:((%UPCASE(¬ches) NE YES) AND (%UPCASE(¬ches) NE NO))"XHERROR: The notches (¬ches ) parameter must be choosen among (YES NO )"FINMACRO" ;"""+(%UPCASE(¬ches ) EQ YES)"NOTCHES" notches""(&id EQ)"FORMATID" ""^R GOPTIONS CBACK=white BORDER NOPROMPT DEVMAP=winansi KEYMAP=winansi DEVICE=win;"((%UPCASE(&title) NE YES)" TITLE " ";"" PROC CONTENTS DATA=__trav__ (KEEP=&var) OUT=nomvar(KEEP=name label) NOPRINT; RUN; DATA nomvar; SET nomvar; CALL SYMPUT('_var'||LEFT(PUT(_N_,3.)),TRIM(name)); label=TRANWRD(label,"''","'"); label=TRANWRD(label,'"',"'"); CALL"ma SYMPUT('_lab'||LEFT(PUT(_N_,3.)),TRIM(label)); CALL SYMPUT('_nvar',LEFT(PUT(_N_,3.))); RUN;fcBQUOTE(&creg ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre creg (&creg )"FINMACRO" ;"")(%DATATYP(&creg ) EQ NUM)"O?ERROR: La valeur du paramtre creg (&creg ) doit tre caractre"FINMACRO" ;""ERREUR" 0"]Q DATA _NULL_; IF (INT(&iter ) ^= &iter ) THEN CALL SYMPUT('erreur','1'); RUN;"(&erreur EQ 1)"N>ERROR: Vrifiez le type entier souhait des paramtres (iter )"FINMACRO" ;""  PROC CONTENTS DATA=&data(KEEP=&cols) NOPRINT OUT=nomvar; RUN; DATA _NULL_; LENGTH listvar $ 250; RETAIN listvar ' '; SET nomvar END=fin; listvar=COMPBL(TRIM(LEFT(listvar)) || ' ' || TRIM(LEFT(name))); IF fin THEN CALL SYMPUT"('cols',listvar); RUN; DATA _don_; SET &data(KEEP=&cols &lignes) END=fin; ARRAY cols(*) &cols; IF fin THEN DO; CALL SYMPUT('_nlign_',LEFT(PUT(_n_,8.))); CALL SYMPUT('_ncols_',LEFT(PUT(DIM(cols),8.))); END; RUN;"  PROC IML; START median2(xx,yy); ncols=NCOL(xx); nrows=NROW(xx); yy=J(1,ncols,.); DO i=1 TO ncols; aa=xx[,i]; cc=LOC(aa^=.); IF (NCOL(cc)^=0) THEN DO; zz=aa[cc]; bb=zz; rank=RANK(zz);" zz[rank]=bb; n=NROW(zz); n2=INT((n+1)/2); yy[i]=zz[n2:n-n2+1][:]; END; END; FINISH median2; USE _don_; READ all VAR{&cols} INTO _donnee_;" (&lignes NE)"1% READ all VAR{&lignes} INTO Rows;"" CLOSE _don_;" (&lignes EQ)" Rows= T({"'%I1&_nlign_1" LIG&i"%"});"" colnoms={&cols}; lign1=SUBSTR(' ',1,MAX(LENGTH(Rows) // {8})); _residu_=_donnee_ ## &power; _a_=J(&_nlign_,1,0); _b_=J(1,&_ncols_,0); _m_=J(1,1,0); _d_=J(&_nlign_,&_ncols_,0); _da_=J(1,&_nlign_,0);"H< _db_=J(1,&_ncols_,0); _dma_=J(1,1,0); _dmb_=J(1,1,0);"F6((%UPCASE(&print) EQ OUI) OR (%UPCASE(&print) EQ ALL))" PRINT _donnee_[FORMAT=&format COLNAME=colnoms ROWNAME=Rows] _a_[FORMAT=&format]; PRINT _b_[FORMAT=&format ROWNAME=lign1] _m_[FORMAT=&format];"" ; ;"('NITER1&iter1"  RUN median2(T(_residu_),_da_); _da_=T(_da_); RUN median2(T(_db_),_dmb_); _d_=_residu_ - T(SHAPE(_da_,&_ncols_,&_nlign_)); _z_= T(SHAPE(_da_,&_ncols_,&_nlign_)); RUN median2(_d_,_db_); RUN median2(_a_+_da_,_dma_); _residu_= _d_ -"w SHAPE(_db_,&_nlign_,&_ncols_); _m_ = _m_ + _dma_ + _dmb_; _a_ = _a_ + _da_ - _dma_; _b_ = _b_ + _db_ - _dmb_;"((%UPCASE(&print) EQ ALL)" PRINT _residu_[FORMAT=&format COLNAME=colnoms ROWNAME=Rows] _a_[FORMAT=&format]; PRINT _b_[FORMAT=&format ROWNAME=lign1] _m_[FORMAT=&format];""'"H< _m_=_m_+MEDIAN(T(_b_)); _b_=_b_-MEDIAN(T(_b_));"F6((%UPCASE(&print) EQ OUI) OR (%UPCASE(&print) EQ ALL))" PRINT _residu_[FORMAT=&format COLNAME=colnoms ROWNAME=Rows] _a_[FORMAT=&format]; PRINT _b_[FORMAT=&format ROWNAME=lign1] _m_[FORMAT=&format];""&(%LENGTH(&diagn) NE 0)"  _res_=SHAPE(_residu_,&_ncols_ * &_nlign_,1); _ra_=REPEAT(_a_,1,&_ncols_); _ra_=SHAPE(_ra_,&_ncols_ * &_nlign_,1); _rb_=SHAPE(_b_,&_ncols_ * &_nlign_,1); _diag_=(_ra_ # _rb_) / _m_; _l_=J(&_ncols_ * &_nlign_,5,dPROC TREE DATA=&outcah._&jj NOPRINT NCLUSTERS=&nbclus OUT=_outtree_&jj(RENAME=(_name_=series)); RUN; PROC SORT DATA=_outtree_&jj(KEEP=Series Cluster); BY series; RUN; DATA &outdata; LENGTH Series $ 32; MERGE &outdata"  _outtree_&jj(RENAME=(Cluster=Cluster&jj)); BY series; LABEL Series=' ' Cluster&jj=' '; RUN; PROC SORT DATA=_outtree_&jj; BY Cluster; RUN; PROC TRANSPOSE DATA=_outtree_&jj OUT=_t1_; VAR series; BY Cluster; RUN; PROC"y TRANSPOSE DATA=_t1_(DROP=_name_ _label_ Cluster) OUT=&clusters._&jj(DROP=_name_) PREFIX=CL; VAR _CHARACTER_; RUN;"((%UPCASE(&print) EQ YES)"nb PROC PRINT DATA=&clusters._&jj; TITLE 'Composition of the Clusters'; RUN; TITLE;""_NETTOY"% &_nettoy _outtree_&jj"4$(%SYSFUNC(EXIST(work.Medoids)) EQ 1)"RF PROC DATASETS LIBRARY=work NOLIST; DELETE Medoids; QUIT;""  DATA _NULL_; SET _outtree_&jj END=fin; LENGTH liste $ 30000; RETAIN liste; BY Cluster; IF FIRST.Cluster THEN DO; liste=' '; n+1; NbCl=0; END; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series)))" )); NbCl+1; IF LAST.Cluster THEN DO; CALL SYMPUT('ListCl'||TRIM(LEFT(PUT(Cluster,5.))),TRIM(LEFT(liste))); CALL SYMPUT('NbCl'||TRIM(LEFT(PUT(Cluster,5.))),TRIM(LEFT(PUT(NbCl,5.)))); END; IF fin THEN CALL SYMPUT('NumCl',TRIM(LEFT("!PUT(n,5.)))); RUN;" (&jj NE 0)"j^ PROC TRANSPOSE DATA=&outnew._&jj OUT=Factor; VAR _numeric_; ID Series; RUN;""=1 DATA Factor; SET &outnew._&jj; RUN;"F: DATA &outmed._&jj; SET _trav_(KEEP=&date); RUN;"&dIK1&NumCl1" (&&NbCl&ik GT 1)" PROC FACTOR DATA=Factor(KEEP=&&ListCl&ik) NOPRINT NFACTORS=1 OUTSTAT=Fstat(WHERE=(_TYPE_=:'PATTERN')); VAR &&ListCl&ik; RUN; PROC TRANSPOSE DATA=Fstat OUT=Fstat(KEEP=_Name_ Factor1 RENAME=(_Name_=Series)); VAR _NUMERIC_;" RUN; PROC RANK DATA=Fstat OUT=Fstat TIES=LOW DESCENDING; VAR Factor1; RANKS Medoids&jj; RUN; PROC APPEND BASE=Medoids DATA=Fstat; RUN; DATA _NULL_; SET Fstat END=fin; LENGTH liste $ 30000;"  RETAIN liste ' '; IF (Medoids&jj <= &medoids) THEN liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series))))); IF fin THEN CALL SYMPUT('ListCl',TRIM(LEFT(liste))); RUN; DATA _NULL_; IF (&&NbCl&ik <= &summary)"  THEN nbfact=&&NbCl&ik -1; ELSE nbfact=&summary; CALL SYMPUT('nbfact',TRIM(LEFT(PUT(nbfact,5.)))); RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT NFACTORS=&nbfact OUT=FactorX(KEEP=&date Factor1-"OCFactor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"(&syserr NE 0)" PROC PRINCOMP DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT N=&nbfact PREFIX=Factor OUT=FactorX(KEEP=&date Factor1-Factor&nbfact); VAR &&ListCl&ik; RUN;""ui DATA &outmed._&jj; MERGE &outmed._&jj _trav_(KEEP=&date &ListCl) FactorX(RENAME=("'gIJ1&nbfact1"( Factor&ij=M&jj._CL&ik._F&ij"g"))); BY &date; RUN;""wk DATA &outmed._&jj; MERGE &outmed._&jj _trav_(KEEP=&date &&ListCl&ik); BY &date; RUN;"d" PROC SORT DATA=Medoids; BY series; RUN; DATA &outdata(DROP=Factor1) Medoids(KEEP=Series Cluster&jj teCRO" ;"W"<P,(%LENGTH(%QSCAN(%BQUOTE(&var ),2, )) NE 0)"UEERROR: You must precise just one value for the var (&var ) parameter"FINMACRO" ;"P"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"W(&syserr NE 0)"G7ERROR: There is a problem in the var (&var ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"W"&[(%LENGTH(&date ) EQ 0)"DATE" date"g"=`-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"WGERROR: You must precise just one value for the date (&date ) parameter"FINMACRO" ;"`"]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"g(&syserr NE 0)"I9ERROR: There is a problem in the date (&date ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"g"Bl2((%LENGTH(&low ) EQ 0) AND (%LENGTH(&high) EQ 0) )"QAERROR: At least one of the LOW or HIGH parameter must be precised"FINMACRO" ;"l"%p(%LENGTH(&low ) EQ 0)"LOW" 0""<u,(%LENGTH(%QSCAN(%BQUOTE(&low ),2, )) NE 0)"UEERROR: You must precise just one value for the low (&low ) parameter"FINMACRO" ;"u")z(%DATATYP(&low ) EQ CHAR)"A1ERROR: The low (&low ) parameter must be numeric"FINMACRO" ;"" (&low LT 0 )"4$ERROR: You must have low (&low) > 0"FINMACRO" ;""%(%LENGTH(&high) EQ 0)"HIGH" 0""=-(%LENGTH(%QSCAN(%BQUOTE(&high ),2, )) NE 0)"WGERROR: You must precise just one value for the high (&high ) parameter"FINMACRO" ;""*(%DATATYP(&high ) EQ CHAR)"C3ERROR: The high (&high ) parameter must be numeric"FINMACRO" ;"" (&high LT 0 )"6&ERROR: You must have high (&high) > 0"FINMACRO" ;"")(%LENGTH(&endrule ) EQ 0)"ENDRULE" 1""@0(%LENGTH(%QSCAN(%BQUOTE(&endrule ),2, )) NE 0)"]MERROR: You must precise just one value for the endrule (&endrule ) parameter"FINMACRO" ;""-(%DATATYP(&endrule ) EQ CHAR)"I9ERROR: The endrule (&endrule ) parameter must be numeric"FINMACRO" ;""5%((&endrule NE 0) AND (&endrule NE 1))"UEERROR: The endrule (&endrule ) parameter must be choosen among (0 1)"FINMACRO" ;""'(%LENGTH(&order ) EQ 0)";+ERROR: The order parameter must be precised"FINMACRO"2f'1'); DO i=1 TO &_ncols_"  * &_nlign_; _l_[i,1]='('; _l_[i,3]=','; _l_[i,5]=')'; j=INT((i-1)/&_ncols_) +1; _l_[i,2]=CHAR(j,1,0); j=MOD(i,&_ncols_); IF j= 0 THEN j=&_ncols_; _l_[i,4]=CHAR(j,1,0); END; noms= ROWCATC(_l_); CREATE _residu_ VAR"8, { noms _res_ _ra_ _rb_ _diag_ }; APPEND;"" Rows=LEFT(Rows) // {'ColEffect'}; colnoms=colnoms || {'RowEffect'}; table=(_residu_ || _a_) // (_b_ || _m_); CREATE &out FROM table[COLNAME=colnoms ROWNAME=Rows]; APPEND FROM table[ROWNAME=Rows]; CLOSE &out; QUIT;"&(%LENGTH(&diagn) NE 0)" %STEM(DATA=_residu_,VAR=_res_); %RESLINE(DATA=_residu_,YY=_res_,XX=_diag_,GRAPH=non); PROC GPLOT DATA=_result_; SYMBOL1 COLOR=&cres INTERPOL=none VALUE=circle; SYMBOL2 COLOR=&creg INTERPOL=join VALUE=none; PLOT _res_*_diag_ _fit_*"UI_diag_ / frame overlay; TITLE " "; RUN; QUIT; SYMBOL1;SYMBOL2;""UI PROC DATASETS NOLIST; DELETE _residu_ _result_ nomvar; QUIT;"#0` P@l(X  0 D  p  t  4 x 4 \ p 0HXl(8LtTl|(8L,<Px\ pTpTpXp8Ldt0D\l ,| !|"""""#4#\#p#x###$$4%%%%$&0'''((((,)))*+ ,X,l,d--../X/ g1; END; DROP n _type_ liste; RENAME _FREQ_=Frequency; IF fin THEN DO; CALL SYMPUT('vvlistx',TRIM(LEFT(liste))); CALL SYMPUT('nbclus',TRIM(LEFT"(PUT(n,5.)))); END; RUN; PROC SORT DATA=Mean; BY &Clusname; RUN; PROC TRANSPOSE DATA=Mean OUT=Mean2; ID &ClusName; RUN; DATA Mean2; SET Mean2 END=fin; LENGTH st1-st&nbclus $ 8 plus1-plus&nbclus moins1-moins&nbclus $ 1000 ;" RETAIN plus1-plus&nbclus moins1-moins&nbclus; ARRAY cl &vvlistx; ARRAY ec ec1-ec&nbclus; ARRAY st $ st1-st&nbclus; ARRAY plus $ plus1-plus&nbclus; ARRAY moins $ moins1-moins&nbclus; KEEP _Name_ Total &vvlistx st1-st&nbclus;"((%LENGTH(&printto) NE 0)"9- FILE "&printto" RECFM=V LRECL=30000 MOD;"" P='++++++++'; M='--------'; IF (_Name_^='Frequency') THEN DO; DO OVER cl; ec=cl-Total; END; std=IQR(OF ec1-ec&nbclus); IF std THEN DO OVER ec; a=MIN(INT(ABS(ec/std)),8); IF ((a>0) AND (ec >0)) THEN DO; st="SUBSTR(P,1,a); IF (a>1) THEN plus=TRIM(LEFT(COMPBL(TRIM(LEFT(plus))||' '||TRIM(LEFT(_Name_))))); END; IF ((a>0) AND (ec <0)) THEN DO; st=SUBSTR(M,1,a); IF (a>1) THEN moins=TRIM(LEFT(COMPBL(TRIM(LEFT(moins))||' '||TRIM(LEFT("_Name_))))); END; END; END; IF fin THEN DO OVER plus; PUT 'Cluster' _i_ @10 '+ =' plus $; PUT 'Cluster' _i_ @10 '- =' moins $; END; RUN;"_NETTOY", &_nettoy Mean Mean2 Variance"" (&debug EQ)"RF PROC DATASETS LIB=WORK NOLIST; DELETE &_nettoy; RUN; QUIT;""((%LENGTH(&printto) NE 0)"# PROC PRINTTO; RUN;"" QUIT;"8#0` Lh 8$lp `  4 t T l | H 4Hp4Ldt0h@8Thx(L` $ ,!4"""(#<#X#### $ $4$W h RUN; TITLE "Variable &var Trend - Estimation by Hoodrick-Prescott filter (lambda= &lambda)"; PROC PRINT DATA=_aahp_; ID"QE year; VAR &months; FORMAT _numeric_ &format year 4.; RUN;" TITLE;""((%UPCASE(&graph) EQ YES)"&%SYSFUNC(CEXIST(&var))"2& PROC CATALOG C=&var KILL; QUIT;"" GOPTIONS CBACK=white BORDER noDISPLAY DEVICE=win FTEXT=swissb noPROMPT HTITLE=1.5; SYMBOL1 I=join COLOR=black WIDTH=1 VALUE=none ; SYMBOL2 I=join COLOR=red WIDTH=1 VALUE=none ; AXIS1 LABEL=NONE; PROC GPLOT DATA= &out GOUT=&var UNIFORM;" TITLE "Variable &var and Estimated Trend (HP filter, lambda=&lambda)"; PLOT &var*&date hp_&var * &date /FRAME OVERLAY VAXIS=axis1 NAME="raw"; FORMAT &date &formdat; RUN; QUIT; PROC GPLOT DATA= &out GOUT=&var UNIFORM; TITLE" "Variable &var, Detrended Series (HP filter, lambda=&lambda)"; PLOT D_&var*&date /FRAME VAXIS=axis1 NAME="detrend"; FORMAT &date &formdat; RUN; QUIT; GOPTIONS display; PROC GREPLAY IGOUT=&var TC=&var NOFS GOUT=&var; TDEF newtwo DES=" 'two squares of equal size' 1/LLX=1 LLY=50 ULX=1 ULY=99 URX=99 URY=100 LRX=99 LRY=50 color=grey 2/LLX=1 LLY=1 ULX=1 ULY=50 URX=99 URY=50 LRX=99 LRY=1 color=grey ; TEMPLATE newtwo; TREPLAY 1:raw 2:detrend; RUN; QUIT; TITLE;" SYMBOL;""(&_nettoy_ NE)"UI PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_; RUN; QUIT;""#0` P (Th H\t 8H\D\l$ |  \ t \ t $ 4 H h  4 H \  4`pPXp4DX(h,t<TdxXp|4Ph   @ X p !(!!!!,"@"`"""""#0#`#t#P$h$$%%8%X%p%%%%%<&P&p&&&&&&','L'd''''()**+,,,,T,|,,,-./001(111i4); jour = L + 28 - 31*INT(mois/4); deaster=MDY(mois,jour,year); EasterG=PUT(deaster,DATE9.); jascen=deaster+39; lpent=deaster+50; IF (MONTH(deaster+1)="month) THEN Off(WEEKDAY(deaster+1))=Off(WEEKDAY(deaster+1))+1; ELSE EasterG=' '; IF ((MONTH(jascen)=month) AND (jascen^=MDY(5,1,year)) AND (jascen^=MDY(5,8,year))) THEN Off(WEEKDAY(jascen))=Off(WEEKDAY(jascen))+1;"  IF (MONTH(lpent)=month) THEN DO; IF (year^=2005) THEN Off(WEEKDAY(lpent))=Off(WEEKDAY(lpent))+1; ELSE Off(WEEKDAY(lpent))=Off(WEEKDAY(lpent))+0.5; END; a=WEEKDAY(MDY(1,1,year)); IF (month=1) THEN Off(a" )=Off(a)+1; a=WEEKDAY(MDY(5,1,year)); IF ((month=5) AND (year>=1947)) THEN Off(a)=Off(a)+1; a=WEEKDAY(MDY(5,8,year)); IF ((month=5) AND (year>=1982)) THEN Off(a)=Off(a)+1; a=WEEKDAY(MDY(7,14,year)); IF (month=7)" THEN Off(a)=Off(a)+1; a=WEEKDAY(MDY(8,15,year)); IF (month=8) THEN Off(a)=Off(a)+1; a=WEEKDAY(MDY(11,1,year)); IF (month=11) THEN Off(a)=Off(a)+1; a=WEEKDAY(MDY(11,11,year)); IF ((month=11) AND (year>=1922))"  THEN Off(a)=Off(a)+1; a=WEEKDAY(MDY(12,25,year)); IF (month=12) THEN Off(a)=Off(a)+1; Monday_B=Off3; Friday_B=Off5; Bridges=Off3+Off5; LeapYear=0; IF (month=2) THEN DO;"  LeapYear=-0.25; IF (MOD(year,4)=0 & MOD(year,100) NE 0) OR MOD(year,400)=0 THEN LeapYear=0.75; END; DO i=1 TO 7; in(i)=days(i)-off(i); END; DO i=1 TO 6; Tdays(i)=days" (i+1)-days(1); END; WD=SUM(OF day2-day6) - 5*(Day1+Day7)/2; PH=SUM(OF Off2-Off6); TD=SUM(OF In2-In6); WeekDays=TD - 5*(PH+Day1+Day7)/2; OUTPUT; END; RUN; PROC SORT DATA=&out" OUT=sorted; BY month; RUN; PROC MEANS DATA=sorted NOPRINT; WHERE &startm <= year <= &endm; VAR Day1-Day7 Off1-Off7; CLASS month; OUTPUT OUT=means MEAN=mean1-mean14; RUN;"CLEAN"# &clean sorted means" DATA &out._C; MERGE sorted means(FIRSTOBS=2 DROP=_type_ _freq_); BY month; DROP i mean1-mean14; ARRAY all(*) Day1-Day7 Off1-Off7; ARRAY meanx(*) mean1-mean14; DO i=1 TO DIM(all); all(i)=all(i)-meanx(i); END; ARRAY days(7)"  Day1-Day7; ARRAY off(7) Off1-Off7; ARRAY in(7) In1-In7; ARRAY Tdays(6) TD1-TD6; ARRAY reg(6) Monday Tuesday Wednesday Thursday Friday Saturday; DO i=1 TO 7; in(i)=days(i)-off(i); END; PH=SUM(OF Off2-" Off6); TD=SUM(OF In2-In6); DO i=1 TO 6; reg(i)=in(i+1)-(Day1+PH+Off7); END; WeekDays=TD - 5*(PH+Day1+Day7)/2; DO i=1 TO 6; Tdays(i)=days(i+1)-"days(1); END; WD=SUM(OF day2-day6) - 5*(Day1+Day7)/2; IF (&start <= year <= &end); RUN; PROC SORT DATA=&out._C; BY year month; RUN; DATA &out; SET &out; IF (&start <= year <= &end); RUN;" (&stat NE)" (&stat EQ M)"CRIT" month"NB" 12""CRIT" qtr"NB" 4"  DATA _null_; LENGTH list $ 100; list=' '; DO i=1 TO &nb; list=COMPRESS(LEFT(TRIM(list)) || ";&stat" || PUT(i,2.)); END; CALL SYMPUT('varlist',LEFT(TRIM(list))); RUN; PROC MEANS DATA=&out(KEEP=year &crit NbDays PH Off1-" Off7 In1-In7 TD) SUM NOPRINT; WHERE &start <= yjJ(span,1,1)||T(1:span); filter=I(span)-z*INV(T(z)*z)*T(z); sortie=J(nobs,NCOL(entree),.); DO i=span TO nobs; sortie" [i,]=(filter*entree[i-span+1:i,])[##,]; END; sortie[1:span-1,]= sortie[span,]; FINISH residu; START exva(entree,sortie,date,period); nobs=NROW(entree); tend=J(nobs,1,1)||T(1:nobs); seas=REPEAT(I("period),INT(nobs/period)+1,1)[1:nobs,1:period-1]; z=tend || seas; filter=z*INV(T(z)*z)*T(z); IF ((MIN(entree) > 0) & (MAX(entree) > 2*MIN(entree))) THEN DO; log=1; y=LOG(entree); END; ELSE DO; log=0; y="entree; END; yhat=filter*y; absres=ABS(y-yhat); median=MEDIAN(absres); cc=LOC(absres > &factor*median/0.6745); limit=&factor*median/0.6745; sortie=J(nobs,1,.); IF (NCOL(cc)^=0) THEN DO; IF (log=0)" THEN sortie[cc]=yhat[cc]; * ELSE sortie[cc]=entree[cc]-EXP(y[cc]-yhat[cc]); ELSE sortie[cc]=EXP(yhat[cc]); END; FINISH exva; USE &data; READ all VAR { &tseries} INTO donnees; READ all VAR { &date} INTO"  date; CLOSE &data; USE &out(WHERE=(nobs >= (&minl*period +1))); READ all VAR {nobs} INTO nobs; READ all VAR {period} INTO period; READ all VAR {min} INTO min; CLOSE &out; nvar=NCOL(donnees); numobs=NROW(donnees); nomvar={"&date &tseries}; sadjust=J(numobs,nvar,.); outliers=CHOOSE(donnees=.,.,0); trendc=J(numobs,nvar,.); Irregular=J(numobs,nvar,.); Season=J(numobs,nvar,.); DO i=1 TO nvar;"&(%LENGTH(&debug) NE 0)"2& aa=nomvar[i+1]; PRINT i aa;""XL dd=LOC(donnees[,i]^=.); xx=donnees[dd,i]; cas=MAX(period[i],4);"%(%LENGTH(&exva) NE 0)" IF (nobs[i] > 3*period[i]+2) THEN DO; RUN exva(xx,exva,date,period[i]); outliers[dd,i]=CHOOSE(exva=.,0,exva); cc=LOC(exva^=.); IF (NCOL(cc)^=0) THEN DO; xx[cc]=exva[cc]; END; END;""  IF (&ordre=0) THEN DO; IF (nobs[i] >= 3*period[i]+1) THEN spans=3*period[i]+1; IF (nobs[i] >= 4*period[i]+1) THEN spans=spans || 4*period[i]+1; IF (nobs[i] >= 5*period[i]+1) THEN spans=spans || 5*period[i]+1; END; ELSE" spans=&ordre*period[i]+1; nbcas=NCOL(spans); cvs=J(nobs[i],nbcas,.); trend=J(nobs[i],nbcas,.); residus=J(nobs[i],nbcas,.); epsilon=J(nobs[i],nbcas,.);"&(%LENGTH(&debug) NE 0)" nomliss=COMPRESS(CONCAT(J(1,nbcas,'L'),CHAR(spans,2.))); IF (min[i] > 0) THEN nomliss=nomliss || CONCAT(J(1,nbcas,'M'),nomliss); PRINT 'Lisseurs et modles utiliss : ' nomliss;""  DO j=1 TO nbcas; RUN smooth(xx,liss,tend,spans[j],period[i]); cvs[,j]=liss; trend[,j]=tend; RUN residu(liss,eps,cas); epsilon[,j]=eps; END; IF (min[i] > 0) THEN DO j=1 TO nbcas; RUN smooth(LOG(xx)," liss,tend,spans[j],period[i]); exp=EXP(liss); cvs=cvs || exp; trend=trend || EXP(tend); RUN residu(exp,eps,cas); epsilon=epsilon || eps; END; poids=J(nobs[i],NCOL(cvs),1); IF (min[i] > 0) THEN DO; addbar=(" epsilon[,1:nbcas])[,:]; poids[,nbcas+1:2*nbcas]=(epsilon[,nbcas+1:2*nbcas] <= 0.8*REPEAT(addbar,1,nbcas)); END; cc=LOC(epsilon#poids ^= 0); IF (NCOL(cc)^=0) THEN poids[cc]=1/epsilon[cc]; cc=LOC(epsilon=0); IF (NCOL(" cc)^=0) THEN DO; lignes=INT((cc-1)/NCOL(epsilon))+1; poids[lignes,]=(poids[lignes,]=0); END; poids=poids / REPEAT(poids[,+],1,NCOL(poids)); sa=(cvs # poids)[,+]; sadjust[dd,i]=sa; td=(trend # poids)[,+]; trendc[dd"k"&(%LENGTH(&excel) NE 0)"%MI1&_ntyp1" PROC EXPORT DATA= &&_typ&i OUTFILE= "&excel" DBMS=EXCEL REPLACE; SHEET="&&_typ&i"; RUN;"M""_NETTOY_", &_nettoy_ _nomser_ _seriesc_""0 ((&errx12 EQ 0) AND (&debug EQ))"oc X "del &dx12ar.\data\*.* /Q"; X "del &dx12ar.\graph\*.* /Q"; X "del &dx12ar.\output\*.* /Q";""j^ DATA ___tt___; SET ___tt___; end=DATETIME(); time=end-start; PUT time= time.; RUN;"0 ((&errx12 EQ 0) AND (&debug EQ))"_S PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_ ___tt___; RUN; QUIT;""k  "0XX"0DATE"0GRAPH"0CRAW"0CLIS"0DEBUG",FINMACRO+" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"'&(%LENGTH(&order ) EQ 0)";+ERROR: The order parameter must be precised"FINMACRO" ;"5">+.(%LENGTH(%QSCAN(%BQUOTE(&order ),2, )) NE 0)"WGERROR: You must precise just one value for the order (&order) parameter"FINMACRO" ;"+"+0(%DATATYP(&order ) EQ CHAR)"C3ERROR: The order (&order) parameter must be numeric"FINMACRO" ;"5"5(&order LE 0 )"/ERROR: You must have &order > 0"FINMACRO" ;"5"#9(%LENGTH(&d ) EQ 0)"D" 0"H":>*(%LENGTH(%QSCAN(%BQUOTE(&d ),2, )) NE 0)"O?ERROR: You must precise just one value for the d (&d) parameter"FINMACRO" ;">"'C(%DATATYP(&d ) EQ CHAR)";+ERROR: The d (&d) parameter must be numeric"FINMACRO" ;"H"EH5((&d NE 0) AND (&d NE 1) AND (&d NE 2) AND (&d NE 3))"N>ERROR: The d (&d ) parameter must be choosen among (0 1 2 3 )"FINMACRO" ;"H"#L(%l"tMOVAV!H9.2  r>"0ORDER"0D"0S"0DS"0MOY"0TABMOY"0CRIT"0ALPHA"0BETA"0ENDRULE"0START"0END"0NBINT"0PRINT"0GAIN"0DATA"0OUT"0XX"0DATE"0GRAPH"0CRAW"0CLIS"0DEBUG",FINMACRO" (&debug NE)"!OPTIONS MPRINT NOTES;""  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"'%(%LENGTH(&order ) EQ 0)";+ERROR: The order parameter must be precised"FINMACRO" ;"4">*.(%LENGTH(%QSCAN(%BQUOTE(&order ),2, )) NE 0)"WGERROR: You must precise just one value for the order (&order) parameter"FINMACRO" ;"*"+/(%DATATYP(&order ) EQ CHAR)"C3ERROR: The order (&order) parameter must be numeric"FINMACRO" ;"4"4(&order LE 0 )"/ERROR: You must have &order > 0"FINMACRO" ;"4"#8(%LENGTH(&d ) EQ 0)"D" 0"G":=*(%LENGTH(%QSCAN(%BQUOTE(&d ),2, )) NE 0)"O?ERROR: You must precise just one value for the d (&d) parameter"FINMACRO" ;"="'B(%DATATYP(&d ) EQ CHAR)";+ERROR: The d (&d) parameter must be numeric"FINMACRO" ;"G"EG5((&d NE 0) AND (&d NE 1) AND (&d NE 2) AND (&d NE 3))"N>ERROR: The d (&d ) parameter must be choosen among (0 1 2 3 )"FINMACRO" ;"G"#K(%LENGTH(&s ) EQ 0)"S" 1"mFINMACRO" ;"H"3' %sasnom(_IN_=&outfor ,TYPE=DATASET);"N (&_ret_ NE 0)"WGERROR: The outfor (&outfor ) parameter must be a valid SAS dataset name"FINMACRO" ;"N"&S(%LENGTH(&vary ) EQ 0)"<,ERROR: You must precise a dependent variable"FINMACRO" ;"_"<X,(%LENGTH(%QSCAN(%BQUOTE(&vary),2, )) NE 0)"UEERROR: You must precise just one value for the vary (&vary) parameter"FINMACRO" ;"X"\P DATA _NULL_; SET &data (KEEP=&vary OBS=1); ARRAY _xx_(*) &vary; RUN;"_(&syserr NE 0)"G7ERROR: There is a problem in the vary (&vary) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"_"&d(%LENGTH(&date ) EQ 0)";+ERROR: You must precise a SAS date variable"FINMACRO" ;"p"<i,(%LENGTH(%QSCAN(%BQUOTE(&date),2, )) NE 0)"WGERROR: You must precise just one variable in the date (&date) parameter"FINMACRO" ;"i"]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"p(&syserr NE 0)"H8ERROR: There is a problem in the date (&date ) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"p"(y(%LENGTH(&varsup ) NE 0)"aU DATA _NULL_; SET &data (KEEP=&varsup OBS=1); ARRAY _xx_(*) &varsup ; RUN;"x(&syserr NE 0)"L<ERROR: There is a problem in the varsup (&varsup ) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"x"y"%}(%LENGTH(&varx) EQ 0)"VARX" _numeric_""[O DATA _NULL_; SET &data (KEEP=&varx OBS=1); ARRAY _xx_(*) &varx; RUN;"(&syserr NE 0)"G7ERROR: There is a problem in the varx (&varx) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;""'(%LENGTH(&nlagx ) EQ 0)"NLAGX" 3""eY PROC IML; x={&nlagx}; CALL SYMPUT('_TypeX',UPCASE(TRIM(LEFT(TYPE(x))))); QUIT;"(&_TypeX NE N)"D4ERROR: The nlagx (&nlagx ) parameter must be numeric"FINMACRO" ;""h\ PROC IML; x={&nlagx}; minx=MIN(x); CALL SYMPUT('_MinX',CHAR(minx,10,0)); QUIT;"(&_MinX LT 0 )"0 ERROR: You must have &nlagx > 0"FINMACRO" ;""xl PROC IML; x=INT({&nlagx}); CALL SYMPUT('nlagx',TRIM(LEFT(COMPBL(ROWCAT(CHAR(x,5,0)))))); RUN;"'(%LENGTH(&nlagy ) EQ 0)"NLAGY" 2"">.(%LENGTH(%QSCAN(%BQUOTE(&nlagy ),2, )) NE 0)"XHERROR: You must precise just one value for the nlagy (&nlagy ) parameter"FINMACRO" ;"n"PARTINV" YES"  PROC FORMAT; VALUE fmois 1='JAN' 2='FEB' 3='MAR' 4='APR' 5='MAY' 6='JUN' 7='JUL' 8='AUG' 9='SEP' 10='OCT' 11='NOV' 12='DEC'; VALUE ftrim 1='Q1' 2='Q2' 3='Q3' 4='Q4'; VALUE njm 25-35=12 50-70=6 80-100=4 115-135=3 175-195=2;" RUN; PROC CONTENTS DATA=&data(KEEP=&var) NOPRINT OUT=nomvar; RUN; DATA _NULL_; SET nomvar END=fin; IF (UPCASE(name) ^= UPCASE("&date")) THEN DO; n+1; CALL SYMPUT('_var'||LEFT(PUT(n,3.)),TRIM(name)); END; IF fin THEN CALL SYMPUT("*'nvar',LEFT(PUT(n,3.))); RUN;"$I1&nvar1"  TITLE "Variable &&_var&i"; DATA seas; SET &data END=fin; RETAIN neg 0 dtmin dtmax; IF (&&_var&i ^=.) THEN DO; ndon+1; dtmax=&date; IF (ndon=1) THEN dtmin=&date; END; IF fin THEN DO; period=PUT((dtmax-dtmin)/ndon,"njm.); CALL SYMPUT('per',period); CALL SYMPUT('minan','A'||PUT(YEAR(dtmin),4.)); CALL SYMPUT('maxan','A'||PUT(YEAR(dtmax),4.)); END; IF (&&_var&i ^=.); DifVar=DIF(&&_var&i); RUN;"m (&per EQ 12)"FORM" fmois."FORMD" MONYY5."MOIS"? /JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC"x"u (&per EQ 4)"FORM" ftrim."FORMD" YYQ4."MOIS" Q1 Q2 Q3 Q4"x"O?ERROR: La srie &&_var&i nest ni mensuelle ni trimestrielle"FINSER" ;"  PROC SORT DATA=seas OUT=seas; BY &date; RUN; DATA seas; SET seas END=fin; KEEP &date per mois year an &&_var&i DifVar; IF (&per=4) THEN per=QTR(&date); ELSE per=MONTH(&date); year=YEAR(&date); an='A'||PUT(year,4.);"  mois=PUT(per,&form); RUN; PROC SORT DATA=seas OUT=_a_; BY per year; RUN; PROC TRANSPOSE DATA=_a_ OUT=_b_; ID an; VAR &&_var&i; BY per; RUN; PROC MEANS DATA=_a_ NOPRINT; BY per; VAR &&_var&i; OUTPUT OUT=stats(" DROP=_type_ ) MEAN=avg; RUN; PROC SORT DATA=stats OUT=sort; BY DESCENDING _freq_; RUN; DATA _null_; SET sort(OBS=1); LENGTH tick nper nref $ 200; RETAIN tick nref nper ' '; nmax=2*INT((_freq_+1)/2)+3; jj=INT(nmax/2); kk=&per*"nmax; DO per=1 TO kk BY nmax; per2=per+jj; a=PUT(per2,4.); b=PUT(per,4.); nref=COMPBL(nref || ' ' || b); tick=COMPBL(tick || ' ' || b || ' ' || a); END; c=PUT(kk,4.); nref=COMPBL(nref || ' ' || c); tick=COMPBL(tick ||" ' ' || c); CALL SYMPUT('_nmax_',nmax); CALL SYMPUT('tick',LEFT(TRIM(tick))); CALL SYMPUT('nref',LEFT(TRIM(nref))); RUN; DATA _a_; MERGE _a_ stats;BY per; KEEP &&_var&i nobs per avg; RETAIN n; IF (FIRST.per) THEN DO; n=0;" a=&&_var&i; DO i=1 TO 2; &&_var&i=.; nobs+1; n+1; OUTPUT; END; &&_var&i=a; END; nobs+1; n+1; OUTPUT; IF (LAST.per) THEN DO UNTIL (n=&_nmax_); &&_var&i=.; nobs+1; n+1; OUTPUT; END; RUN; DATA _a_; SET _a_;"0$ IF &&_var&i=. THEN avg=.; RUN;" &SYSVER >= 7"  PROC UNIVARIATE DATA=seas NOPRINT; VAR &&_var&i; OUTPUT OUT=outloess MIN=min MAX=max; RUN; DATA _NULL_; SET outloess; max=MAX(ABS(min),ABS(max)); power=INT(ROUND(LOG10(max)))-4; CALL SYMPUT('power',PUT(MAX(power,1)," 3.)); RUN; DATA seasloess; SET seas; &&_var&i=&&_var&i/(10**&power); RUN; ODS SELECT NONE; ODS OUTPUT FITSUMMARY=sum OUTPUTSTATISTICS=loess; PROC LOESS DATA=seasloess; MODEL &&_var&i = &date / SMOOTH= &smooth DFMETHOD=exact"o"+(%DATATYP(&nlagy ) EQ CHAR)"D4ERROR: The nlagy (&nlagy ) parameter must be numeric"FINMACRO" ;""(&nlagy LE 0 )"0 ERROR: You must have &nlagy > 0"FINMACRO" ;""pd DATA _NULL_; nlagy=INT(&nlagy); CALL SYMPUT('nlagy',TRIM(LEFT(PUT(nlagy,10.)))); RUN;"'(%LENGTH(&nlags ) EQ 0)"NLAGS" 3""eY PROC IML; x={&nlags}; CALL SYMPUT('_TypeS',UPCASE(TRIM(LEFT(TYPE(x))))); QUIT;"(&_TypeS NE N)"D4ERROR: The nlags (&nlags ) parameter must be numeric"FINMACRO" ;""h\ PROC IML; x={&nlags}; minx=MIN(x); CALL SYMPUT('_MinS',CHAR(minx,10,0)); QUIT;"(&_MinS LT 0 )"0 ERROR: You must have &nlags > 0"FINMACRO" ;""xl PROC IML; x=INT({&nlags}); CALL SYMPUT('nlags',TRIM(LEFT(COMPBL(ROWCAT(CHAR(x,5,0)))))); RUN;"_NETTOY" "  PROC CONTENTS DATA=&data(KEEP=&varx) OUT=_nomvarx_(KEEP=Name) NOPRINT; RUN; PROC SORT DATA=_nomvarx_; BY Name; RUN; PROC CONTENTS DATA=&data(KEEP=&date &vary) OUT=_nomvary_(KEEP=Name) NOPRINT; RUN; PROC SORT DATA=_nomvary_; BY Name; RUN" ;"_NETTOY", &_nettoy _nomvarx_ _nomvary_"'(%LENGTH(&varsup) NE 0)" PROC CONTENTS DATA=&data(KEEP=&varsup) OUT=_nomvars_(KEEP=Name) NOPRINT; RUN; PROC SORT DATA=_nomvars_; BY Name; RUN;"_NETTOY"" &_nettoy _nomvars_""I= DATA _nomvarx_; MERGE _nomvarx_(IN=inx) _nomvary_(IN=iny)"'(%LENGTH(&varsup) NE 0)"! _nomvars_(IN=ins)""  END=f; BY Name; LENGTH Name Series $ 32; KEEP Name Series; IF (iny) THEN DO; IF (UPCASE(name)=UPCASE("&vary")) THEN DO; Series='YVAR'; OUTPUT; END; END; ELSE DO; IF (ins) THEN DO; is+1; CALL SYMPUT('_vars'!!LEFT(" PUT(is,6.)),TRIM(LEFT(name))); Series=TRIM(LEFT(COMPRESS('S'||TRIM(LEFT(PUT(is,10.)))))); OUTPUT; END; ELSE IF (inx) THEN DO; ix+1; CALL SYMPUT('_varx'!!LEFT(PUT(ix,6.)),TRIM(LEFT(name))); Series=TRIM(LEFT(COMPRESS('X'||TRIM(LEFT"(PUT(ix,10.)))))); OUTPUT; END; END; IF f THEN DO; CALL SYMPUT('_nvarx',LEFT(PUT(ix,6.))); CALL SYMPUT('_nvars',LEFT(PUT(is,6.))); END; RUN;"VARX" "LISTX" "&)I1&_nvarx1"VARX" &varx &&_varx&i"LISTX"  &listx X&i")"VARSUP" "LISTS" "(&_nvars NE 0)"&*I1&_nvars1"VARSUP"! &varsup &&_vars&i"LISTS"  &lists S&i"*""_NETTOY"! &_nettoy _nomvar_"  PROC IML; x={&nlagx}; nlags=NCOL(x); IF (nlags < &_nvarx) THEN x=x || J(1,&_nvarx-nlags,x[nlags]); CALL SYMPUT('nlagx',TRIM(LEFT(COMPBL(ROWCAT(CHAR(x,5,0)))))); x={&nlags}; nlags=NCOL(x); IF (nlags < &_nvars) THEN x=x || J(1,&_nvars-" nlags,x[nlags]); CALL SYMPUT('nlags',TRIM(LEFT(COMPBL(ROWCAT(CHAR(x,5,0)))))); QUIT; DATA __travx__(DROP=&varsup &varx DifDate) _DifDate_(KEEP=pDifDate); SET &data(KEEP=&date &varx &vary &varsup); DifDate=DIF(Date); RENAME &date=Date &vary=Yvar;" LABEL &vary=' ';" (&nlagy GT 1)"%+I1&nlagy1"# Y_&i=LAG&i(&vary);"+""(&_nvars NE 0)"&,I1&_nvars1"/-J0%SCAN(&nlags,&i)1"3' S&i._&j=LAG&j(%SCAN(&varsup,&i));"-",""&.I1&_nvarx1"//J0%SCAN(&nlagx,&i)1"1% X&i._&j=LAG&j(%SCAN(&varx,&i));"/".")(%LENGTH(&firstdat) NE 0)"+ IF (&Date >= "&firstdat"d);""((%LENGTH(&lastdat) NE 0)"* IF (&Date <= "&lastdat"d);""  RUN; PROC MEANS DATA=_DifDate_ NOPRINT; VAR DifDate; OUTPUT OUT=_DifDate_ MEAN=; RUN; DATA _NULL_; SET _DifDate_; Period=12*(25<=DifDate<=35)+6*(50<=DifDate<=70)+4*(80<=DifDate<=100)+3*(115<=DifDate<=135) +2*(175<=DifDate<=195)+(345"VJ<=DifDate<=375); CALL SYMPUT('period',TRIM(LEFT(PUT(period,5.)))); RUN;"VACTY" " (&nlagy GT 0)"%2I1&nlagy1"VACTY"  &vacty Y_&i"2""VSUP" "(&_nvars NE 0)"&3I1&_nvars1"/4J0%SCAN(&nlags,&i)1"VSUP"  &vsup S&i._&j"4"3""VACTX" "(&_nvars NE 0)"&5I1&_nvarx1"/6J0%SCAN(&nlagx,&i)1"VACTX" &vactx X&i._&j"6"5""_NETTOY"" &_nettoy _DifDate_"+$(%UPCASE(&crit) EQ RSQUARE)"START" %EVAL(&maxvar-1)"BEST" %EVAL(&nbmod/2)"("START" 1"BEST" &nbmod" PROC REG DATA=__travx__ OUTEST=__Est__(DROP=_MODEL_ _TYPE_ _DEPVAR_ Yvar) NOPRINT; MODEL Yvar = &vacty &vactx / SELECTION=&crit START=&start STOP=&maxvar BEST=&nbmod ADJRSQ AIC B BIC CP RMSE PC EDF; RUN; QUIT; PROC SORT DATA=__Est__; BY" DESCENDING _rsq_; RUN; DATA _Variables_; SET __Est__ END=fin; LENGTH Num 3 Model LagDep $ 10 Variables TrueNames Chow $ 500 Var True $ 40; ARRAY numx{*} &vacty &vactx; KEEP Num Model Variables TrueNames; Variables=' '; TrueNames=' ';"  Chow=' '; LagDep=' '; DO i=1 TO DIM(numx); IF (numx(i)^=.) THEN DO; Var=TRIM(LEFT(SCAN("&vacty &vactx",i,' '))); Index=INDEX(Var,'_')-2; IF (Var=:'Y') THEN DO; True=TRANWRD(Var,'Y',"&vary"); IF (LagDep=' ') THEN LagDep=TRIM" (LEFT(COMPRESS('LAGDEP='||Var))); END; ELSE IF (Var=:'S') THEN True=TRANWRD(Var,TRIM(LEFT(SCAN(Var,1,'_'))),TRIM(LEFT(SCAN("&varsup",INPUT(SUBSTR(Var,2,Index),3.))))); ELSE IF (Var=:'X') THEN True=TRANWRD(Var,TRIM(LEFT(SCAN(Var,1,'_'))),TRIM("LEFT(SCAN("&varx",INPUT(SUBSTR(Var,2,Index),3.))))); Variables=TRIM(LEFT(COMPBL(TRIM(LEFT(Variables))||' '||Var))); TrueNames=UPCASE(TRIM(LEFT(COMPBL(TRIM(LEFT(TrueNames))||' '||True)))); END; END; nbobs=_P_+_EDF_; nbyear=INT(nbobs/" &period); DO i=2 TO (nbyear-2); Chow=TRIM(LEFT(COMPBL(TRIM(LEFT(Chow))||' '||TRIM(LEFT(PUT(i*&period,5.)))))); END; Num=_N_; Model=COMPRESS('Mod'||TRIM(LEFT(PUT(_qbs-1,1),nfrq,1)#REPEAT(freq,1,"nobs); xsin=SIN(dd)*xx; xcos=COS(dd)*xx; fft=(xcos#xcos+xsin#xsin)/nobs; RUN moymob(fft,mfft,ww); fft=mfft; cc=LOC(fft > 0);" (&log EQ YES)"PD IF (NCOL(cc) ^= 0) THEN Periodogram[cc,i]=10*LOG10(fft[cc,]);""F: IF (NCOL(cc) ^= 0) THEN Periodogram[cc,i]=fft[cc,];"  END; FINISH Periodogram; USE seas(WHERE=(&varspec ^=.)); READ all VAR{&varspec} INTO x; READ all VAR{&date} INTO date; CLOSE seas; nvar=NCOL(x); nobs=NROW(x); period=&per; pi=2*ARCOS(0); frq=T(DO(0,0.5,1/"300)); IF (period=12) THEN DO; specfreq={0.348125 0.431458}; END; IF (period=4) THEN DO; specfreq={0.044375 0.088750 0.294375 0.338750 0.383125}; END; nfrq=NROW(frq); FreqN=T(CONCAT(J(1,nfrq,'Freq'),LEFT(CHAR(1:nfrq,5))));"  nbtd=NCOL(specfreq); nametd=T(CONCAT(J(1,nbtd,'TD'),LEFT(CHAR(1:nbtd,5)))); DO i=1 TO nbtd; min=ABS(frq-specfreq[i])[>:<]; frq[min]=specfreq[i]; frq[min+1]=frq[min]+frq[2]; frq[min-1]=frq[min]-frq[2]; FreqN[min]=CONCAT('TD',"LEFT(CHAR(i,5))); END; frq0=LOC((frq^=0) & (MOD(ROUND(360*frq,10**-5),360/period)=0)); nbseas=NCOL(frq0); nameseas=T(CONCAT(J(1,nbseas,'Seas'),LEFT(CHAR(1:nbseas,5)))); FreqN[frq0]=nameseas; RUN Periodogram(x,newvar1,frq,period);" Ident={'Freq'} || {'Freq2'} || {"s_01"}; Frq2=360*Frq; Periodogram=Frq2 || Frq || newvar1; CREATE __spect1__ FROM Periodogram[ROWNAME=FreqN COLNAME=Ident]; APPEND FROM Periodogram[ROWNAME=FreqN]; CLOSE __spect1__; QUIT; DATA"  __spect2__; LENGTH listf $ 2000; SET __spect1__ END=fin; DROP a listf; LABEL Freq='Frequency 0 to 180'; s_02=s_01; RETAIN listf ' '; IF ((FreqN=:'T') OR (FreqN=:'S')) THEN listf=TRIM(LEFT(COMPBL(TRIM(LEFT(listf))||', '||TRIM(LEFT(PUT"(Freq,6.2)))))); IF fin THEN DO; a=INDEX(listf,','); listf=TRIM(LEFT(SUBSTR(listf,a+1))); CALL SYMPUT('listf',TRIM(LEFT(listf))); END; RUN;" (&log EQ NO)"  PROC UNIVARIATE DATA=__spect1__ NOPRINT; VAR s_01; OUTPUT OUT=p90 P90=P90; RUN; DATA _NULL_; SET p90; pp=INT(LOG10(p90)); p90=ROUND(p90,10**(pp-2)); CALL SYMPUT('p90',TRIM(LEFT(PUT(p90,20.5)))); RUN; DATA __spect2__"^R; SET __spect2__; degre=90*freq/ARCOS(0); s_02=MIN(s_01,&p90); RUN;"" GOPTIONS CBACK=white BORDER NODISPLAY NOPROMPT DEVMAP=winansi KEYMAP=winansi DEVICE=win FTITLE=swiss FTEXT=swissb GUNIT=pct HTITLE=5 HTEXT=2.5; DATA _null_; IF (CEXIST("&&_var&i")) THEN CALL SYMPUT('_catalg','1');"9- ELSE CALL SYMPUT('_catalg','0'); RUN;" (&_catalg)"6* PROC CATALOG C=&&_var&i KILL; QUIT;"" SYMBOL1 I=join COLOR=black WIDTH=1 VALUE=none ; SYMBOL2 I=join COLOR=red WIDTH=1 VALUE=none ; PROC GPLOT DATA=seas(WHERE=(&&_var&i ^=.)) GOUT=&&_var&i UNIFORM; PLOT &&_var&i*&date = 1 / NAME="brute" VAXIS=axis1; AXIS1 LABEL=(R=0 a=90);"UI FORMAT &date &formd; TITLE "Srie brute &&_var&i"; RUN; QUIT;" &SYSVER >= 7" DATA _null_; CALL SYMPUT('smooth2',LEFT(COMPRESS('('||PUT(100*&smooth,3.)||'%)'))); RUN; PROC GPLOT DATA=loess GOUT=&&_var&i UNIFORM; PLOT (&&_var&i loess)*&date / NAME="loess" VAXIS=axis1 OVERLAY; FORMAT &date &formd; AXIS1"l` LABEL=(a=90); TITLE "Srie brute &&_var&i et lissage par LOESS &smooth2"; RUN; QUIT;""@4 PROC GPLOT DATA=__spect2__ GOUT=&&_var&i UNIFORM;" (&per EQ 12)" PLOT s_02*freq / NAME="spectre" OVERr; RUN; ODS SELECT ALL; DATA loess; SET loess(WHERE=(SmoothingParameter=&smooth)); KEEP &date depvar pred; depvar=depvar*(10**&power); pred=pred*(10**&power); RENAME depvar=&&_var&i pred=loess; RUN;""  PROC ARIMA DATA=seas(KEEP=&&_var&i); IDENTIFY VAR=&&_var&i NLAG=%EVAL(3*&per) OUTCOV=_cov_ NOPRINT; IDENTIFY VAR=&&_var&i(1) NLAG=%EVAL(3*&per) OUTCOV=_cov1_ NOPRINT; IDENTIFY VAR=&&_var&i(1,&per) NLAG=%EVAL(3*&per) OUTCOV=_cov2_ NOPRINT;"  IDENTIFY VAR=&&_var&i(&per) NLAG=%EVAL(3*&per) OUTCOV=_cov3_ NOPRINT; RUN; QUIT; DATA _dcov_; SET _cov_(KEEP=n corr lag RENAME=(n=n0 corr=corr0)); SET _cov1_(KEEP=n corr lag RENAME=(n=n1 corr=corr1)); SET _cov2_(KEEP=n corr lag RENAME=" (n=n2 corr=corr2)); SET _cov3_(KEEP=n corr lag RENAME=(n=n3 corr=corr3)); KEEP lag corr0-corr3 up0-up3 low0-low3; RETAIN nobs0-nobs3; ARRAY num(4) n0-n3; ARRAY numobs(4) nobs0-nobs3; ARRAY auto(4) corr0-corr3; ARRAY tot(4) tot0-tot3;"  ARRAY up(4) up0-up3; ARRAY low(4) low0-low3; IF _N_=1 THEN DO i=1 TO 4; numobs(i)=num(i); up(i)=0; low(i)=0; END; ELSE DO i=1 TO 4; tot(i)+auto(i)**2; up(i)=1.96*SQRT((1+2*tot(i))/numobs(i)); low(i)=-up(i); END;" RUN;"!(&partinv EQ YES)" DATA _pcov_; SET _cov_(KEEP=n partcorr lag RENAME=(n=n0 partcorr=pcorr0)); SET _cov1_(KEEP=n partcorr lag RENAME=(n=n1 partcorr=pcorr1)); SET _cov2_(KEEP=n partcorr lag RENAME=(n=n2 partcorr=pcorr2)); SET _cov3_(KEEP=n partcorr lag"  RENAME=(n=n3 partcorr=pcorr3)); KEEP lag pcorr0-pcorr3 up0-up3 low0-low3; RETAIN nobs0-nobs3; ARRAY num(4) n0-n3; ARRAY numobs(4) nobs0-nobs3; ARRAY up(4) up0-up3; ARRAY low(4) low0-low3; IF _N_=1 THEN DO i=1 TO 4; numobs" (i)=num(i); up(i)=0; low(i)=0; END; ELSE DO i=1 TO 4; up(i)=1.96/SQRT(numobs(i)); low(i)=-up(i); END; RUN; DATA _icov_; SET _cov_(KEEP=n invcorr lag RENAME=(n=n0 invcorr=icorr0)); SET _cov1_(KEEP=n invcorr lag"  RENAME=(n=n1 invcorr=icorr1)); SET _cov2_(KEEP=n invcorr lag RENAME=(n=n2 invcorr=icorr2)); SET _cov3_(KEEP=n invcorr lag RENAME=(n=n3 invcorr=icorr3)); KEEP lag icorr0-icorr3 up0-up3 low0-low3; RETAIN nobs0-nobs3; ARRAY num(4) n0-n3;"  ARRAY numobs(4) nobs0-nobs3; ARRAY up(4) up0-up3; ARRAY low(4) low0-low3; IF _N_=1 THEN DO i=1 TO 4; numobs(i)=num(i); up(i)=0; low(i)=0; END; ELSE DO i=1 TO 4; up(i)=1.96/SQRT(numobs(i)); low(i)=-up(i);" END; RUN;"" (&dif EQ YES)"VARSPEC" DifVar""VARSPEC" &&_var&i"  PROC IML; START moymob(xserie,movav,coef); movav=J(NROW(xserie),1,0); mmob1=xserie[LOC(xserie ^= .)]; nobs=NROW(mmob1); mmob2=J(nobs,1,.); ordre=NROW(coef); ncols=NCOL(coef); nb=INT(ordre / 2); IF (ordre <= nobs)" THEN DO; mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef[,ncols]),T(mmob1))[ordre:nobs]); END; ELSE mmob2=J(nobs,1,mmob1[:]); mmob2[1:nb]=T(T(mmob1[1:ordre])*coef[,1:nb]); mmob2[nobs:nobs-nb+1]=T(T(mmob1[nobs:nobs-ordre+1])*coef[,1:nb]);"  movav[LOC(xserie ^= .)]=mmob2; FINISH moymob; START Periodogram(xserie,Periodogram,freq,per); pi=2*ARCOS(0); nvar=NCOL(xserie); nfrq=NROW(freq); Periodogram=J(nfrq,nvar,0); nq=INT(2*(nfrq**(1/5))/3); ww=T(DO(-nq" ,nq,1))/(2*nq+1); ww2=(1+cos(pi*ww))/2; ww=ww2/ww2[+]; DO i=1 TO nvar; cc=LOC(xserie[,i]^=.); IF (NCOL(cc)^=0) THEN DO; xx=xserie[cc,i]; nobs=NROW(xx); END; dd=2*pi*REPEAT(DO(0,nos"VAR" "%I1&_nvar1"VAR"& %CMPRES(&var &&_var&i)"" (&power NE 1)"  PROC IML; USE __trav__; READ all VAR {&var} INTO donnees; CLOSE __trav__; power=&power; epsilon=0.001; nvar=NCOL(donnees); nobs=NROW(donnees); nbpow=NCOL(power); mindon=donnees[><,]; neg=J(1,nvar,'0'); cc=LOC(mindon"  <=0); IF (NCOL(cc)^=0) THEN DO; donnees[,cc]=donnees[,cc]-REPEAT(mindon[cc],nobs,1)+epsilon; neg[cc]='1'; END; transf=J(1,nvar,.); min=J(nbpow,nvar,.); max=J(nbpow,nvar,.); DO i=1 TO nbpow; IF (power[i]^=0) THEN tr=(donnees"  ## power[i])#SIGN(power[i]); ELSE tr=LOG(donnees); transf=transf // tr; min[i,]=tr[><,]; max[i,]=tr[<>,]; END; transf=transf[2:NROW(transf),]; CREATE _transf FROM transf[COLNAME={&var}]; APPEND FROM transf;"\P CLOSE _transf; QUIT; DATA __trav__; SET __trav__; SET _transf; RUN;"" (&type EQ 0)" DATA _tabtrav_; SET __trav__(KEEP=&var &id); vargroup=1; RUN; PROC BOXPLOT DATA=_tabtrav_; PLOT (&var)* vargroup / CAXIS = black CTEXT = black CBOXES = black HAXIS=axis1 ¬ches BOXSTYLE=&boxsty"=1 BOXWIDTHSCALE=0.5 IDCOLOR = black IDSYMBOL=dot ;"<,((%INDEX(%UPCASE(&boxsty),ID)) AND (&id NE))" ID &id;"(&formatid NE)"' FORMAT &id &formatid;"""aU SYMBOL1 C=black H=0.5; AXIS1 LABEL=none MAJOR=none VALUE=none; RUN; QUIT;"+" (&type EQ 1)"  PROC SORT DATA=__trav__(KEEP=&var &id &group) OUT=_tabtrav_; BY &group; RUN; PROC BOXPLOT DATA=_tabtrav_; PLOT (&var)* &group / CAXIS = black CTEXT = black CBOXES = black VAXIS=axis1 HAXIS=axis1 ¬ches BOXSTYLE"E9=&boxsty BOXWIDTHSCALE=0.5 IDCOLOR = black IDSYMBOL=dot ;"<,((%INDEX(%UPCASE(&boxsty),ID)) AND (&id NE))" ID &id;"(&formatid NE)"' FORMAT &id &formatid;"""K? SYMBOL1 C=black H=0.5; AXIS1 LABEL=none; RUN; QUIT;"+" (&type EQ 2)"=1 DATA _tabtrav_; LENGTH group $ 256; SET"%'I1&_nvar1"L@ __trav__(KEEP=&&_var&i &id RENAME=(&&_var&i=_var_) IN=in&i)"'" ;"%(I1&_nvar1" IF (in&i) THEN"@0((%LENGTH(&label) NE 0) AND ("&&_lab&i" NE " "))"* group=LEFT("&&_lab&i");""* group=LEFT("&&_var&i");"("  RUN; PROC BOXPLOT DATA=_tabtrav_; PLOT _var_* group / CAXIS = black CTEXT = black CBOXES = black HAXIS=axis1 VAXIS=axis1 ¬ches BOXSTYLE=&boxsty BOXWIDTHSCALE=0.5 IDCOLOR = black IDSYMBOL=dot ; SYMBOL1 C=black H="0.5;"<,((%INDEX(%UPCASE(&boxsty),ID)) AND (&id NE))" ID &id;"(&formatid NE)"' FORMAT &id &formatid;"""1% AXIS1 LABEL=none; RUN; QUIT;"+" (&type EQ 3)"  PROC IML; USE __trav__; READ all VAR {&var} INTO donnees; CLOSE __trav__; nvar=NCOL(donnees); nobs=NROW(donnees); zero=J(1,nvar,'0'); DO i=1 TO nvar; cc=LOC(donnees[,i]^=.); IF (NCOL(cc)^=0) THEN DO; mindon=donnees["><,i]; ut ;"">.(%LENGTH(%QSCAN(%BQUOTE(&order ),2, )) NE 0)"YIERROR: You must precise just one value for the order (&order ) parameter"FINMACRO" ;""+(%DATATYP(&order ) EQ CHAR)"E5ERROR: The order (&order ) parameter must be numeric"FINMACRO" ;""(&order LE 0 )"8(ERROR: You must have order (&order) > 0"FINMACRO" ;""'(%LENGTH(&print ) EQ 0)"PRINT" yes"">.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"YIERROR: You must precise just one value for the print (&print ) parameter"FINMACRO" ;""*(%DATATYP(&print ) EQ NUM)"G7ERROR: The print (&print ) parameter must be character"FINMACRO" ;""4$((&print NE yes) AND (&print NE no))"UEERROR: The print (&print ) parameter must be choosen among (yes no )"FINMACRO" ;""&(%LENGTH(&word ) EQ 0)"WORD" no""=-(%LENGTH(%QSCAN(%BQUOTE(&word ),2, )) NE 0)"WGERROR: You must precise just one value for the word (&word ) parameter"FINMACRO" ;"")(%DATATYP(&word ) EQ NUM)"E5ERROR: The word (&word ) parameter must be character"FINMACRO" ;""2"((&word NE yes) AND (&word NE no))"SCERROR: The word (&word ) parameter must be choosen among (yes no )"FINMACRO" ;""FORMSER"$ %SCAN(&format,2,' ')"FORMBKF"$ %SCAN(&format,1,' ')"((%LENGTH(&formbkf) EQ 0)"FORMBKF" 7.4"FORMSER" 10.2""((%LENGTH(&formser) EQ 0)"FORMSER" &formbkf""'(%LENGTH(&graph ) EQ 0)"GRAPH" yes"">.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"YIERROR: You must precise just one value for the graph (&graph ) parameter"FINMACRO" ;""*(%DATATYP(&graph ) EQ NUM)"G7ERROR: The graph (&graph ) parameter must be character"FINMACRO" ;""4$((&graph NE yes) AND (&graph NE no))"UEERROR: The graph (&graph ) parameter must be choosen among (yes no )"FINMACRO" ;""ERREUR" 0" DATA _NULL_; IF (((&low*&high) > 0) AND (&low > &high)) THEN CALL SYMPUT('erreur','1'); IF ((&high + &low ) = 0) THEN CALL SYMPUT('erreur','2'); IF (MOD(&order ,2) = 0) THEN CALL SYMPUT('erreur','3'); RUN;"(&erreur EQ 3)"?/ERROR: the parameter order (&order) must be odd"FINMACRO" ;"" (&erreur EQ 1)">.ERROR: You must have low (&low) < high (&high)"FINMACRO"vu ;" "(&erreur EQ 1)"H8ERROR: One of the LOW or HIGH parameter must be positive"FINMACRO" ;""F: DATA &out; SET &data; KEEP &date &var; RUN;"_NETTOY_" "pd PROC FORMAT; VALUE njm 25-35=12 50-70=6 80-100=4 115-135=3 175-195=2; RUN;"_MISS_" 0" DATA &out; SET &data END=fin; KEEP &date &var; RETAIN dtmin dtmax; IF (&var ^=.) THEN DO; ndon+1; dtmax=&date; IF (ndon=1) THEN dtmin=&date; END; IF ((&var ^= .) AND (LAG(&var) =.) AND (ndon > 1)) THEN DO; PUT" "Error: Missing value in variable &var"; CALL SYMPUT('_miss_','1'); END; IF fin THEN DO; period=PUT((dtmax-dtmin)/ndon,njm.); CALL SYMPUT('period',period); CALL SYMPUT('nblow',PUT(&low*period,3.)); CALL SYMPUT('nbhigh',PUT(&high*"6*period,3.)); END; IF (&var ^=.); RUN;"  (&period EQ )"wgERROR: Problem with the automatic determination of the series periodicity. Check your SAS date variable"FINMACRO" ;" "#(&_miss_ EQ 1)"FINMACRO"#" PROC IML; START moymob(xserie,movav,coef); nobs=NROW(xserie); movav=J(nobs,1,.); ordre=NROW(coef); ncols=NCOL(coef); nb=INT(ordre / 2); numobs=nb-ncols+2; movav[nb+1:nobs-nb]=T("PRODUCT(T(coef[,ncols]),T(xserie))[ordre:nobs]); IF (ncols > 1) THEN DO; movav[numobs:nb]=T(T(xserie[1:ordre])*coef[,1:ncols-1]); movav[nobs-numobs+1:nobs-nb+1]=T(T(xserie[nobs:nobs-ordre+1])*coef[,1:ncols-1]); END; FINISH moymob;" START lowpass(low,order,method,filt,filtp,names,prefix); pi=2*ARCOS(0); ord=INT(order/2); h=T(-ord:ord); nbfilt=(method=0 | method=2)+(ord)*(method=1 | method=3); filt=J(order,nbfilt,0);"  filtp=J(order,nbfilt,0); namlow=J(nbfilt,1,' '); namlow[nbfilt]=COMPRESS(CONCAT(TRIM(prefix),{'_'},CHAR(ord,3),{'_'},CHAR(ord,3))); omegal=2*pi/low; filt[ord+1,nbfilt]=omegal/pi; cc=LOC(h^=0); filt[cc,nbfilt" ]=SIN(omegal#h[cc])/(pi#h[cc]); IF (method=1) THEN DO i=1 TO ord-1; filt[1:2*i+1,i]=filt[ord+1-i:ord+1+i,nbfilt]; filt[1:2*i+1,i]=filt[1:2*i+1,i]+(1 - filt[+,i])/(2*i+1); namlow[i]=COMPRESS(CONCAT(TRIM(prefix),{'_'},CHAR(i,3),{'_'}," CHAR(i,3))); END; filt[,nbfilt]=filt[,nbfilt]+(1 - filt[+,nbfilt])/order; filtp[,nbfilt]=filt[,nbfilt]; IF (method=1) THEN DO i=1 TO ord-1; filtp[ord+1-i:ord+1+i,i]=filt[1:2*i+1,i]; END; filtp=h || filtp; names='t' //" namlow; FINISH lowpass; USE &out; READ all VAR{&var} INTO donnees; READ all VAR{&date} INTO date; CLOSE &out; ord=INT(&order/2); result=date || donnees; namevar="&date" || "&var"; IF (&nblow^=0) THEN DO; RUN lowpass("&nblow,&order,&endrule,flow,flowp,namel,'L'); CREATE low FROM flowp[COLNAME=namel]; APPEND FROM flowp; CLOSE low; namelow=ROWCAT(T(ROWCAT(namel[2:NROW(namel)] || J(NROW(namel)-1,1,' ')))); CALL SYMPUT('namel',namelow); RUN moymob("donnees,movavl,flow); result=result || movavl; namevar=namevar || 'Low'; END; IF (&nbhigh^=0) THEN DO; RUN lowpass(&nbhigh,&order,&endrule,fhigh,fhighp,nameh,'H'); CREATE high FROM fhighp[COLNAME=nameh]; APPEND FROM fhighp; CLOSE"  high; namehigh=ROWCAT(T(ROWCAT(nameh[2:NROW(nameh)] || J(NROW(nameh)-1,1,' ')))); CALL SYMPUT('nameh',namehigh); RUN moymob(donnees,movavh,fhigh); result=result || movavh; nvamevar=namevar || 'High'; END; IF (&nbhigh*&nblow^=0) THEN DO;"  filtbkp=flowp-fhighp; filtbkp[,1]=T(-ord:ord);; namebk=TRANWRD(namel,'L','BK'); CREATE bking FROM filtbkp[COLNAME=namebk]; APPEND FROM filtbkp; CLOSE bking; namebk=ROWCAT(T(ROWCAT(namebk[2:NROW(namebk)] || J(NROW(namebk)-1,1,' '))))"; CALL SYMPUT('namebk',COMPBL(namebk)); result=result || (movavl-movavh); namevar=namevar || 'BKing'; END; CREATE &out FROM result[COLNAME=namevar]; APPEND FROM result; CLOSE &out; CALL SYMPUT('namevar',namevar); QUIT;"((%UPCASE(&print) EQ YES)") PROC FORMAT; VALUE fdat"4(&period = 12)"th 1='JAN' 2='FEB' 3='MAR' 4='APR' 5='MAY' 6='JUN' 7='JUL' 8='AUG' 9='SEP' 10='OCT' 11='NOV' 12='DEC';"@"7 (&period = 6)"YM 1='JAN_FEB' 2='MAR_APR' 3='MAY_JUN' 4='JUL_AUG' 5='SEP_OCT' 6='NOV_DEC';"@": (&period = 4)"-! 1='Q1' 2='Q2' 3='Q3' 4='Q4';"@"= (&period = 3)"5) 1='JAN_APR' 2='MAY_AUG' 3='SEP_DEC';"@"@ (&period = 2)"-! 1='SEMESTER1' 2='SEMESTER2';"@" RUN; DATA _trav_; SET &out; per=PUT(CEIL(MONTH(&date)*&period/12),fdat.); year=YEAR(&date); RUN; PROC TRANSPOSE DATA=_trav_ OUT=_aa1_(DROP=_NAME_); ID per; BY year; VAR &var; RUN;"_NETTOY_"& &_nettoy_ _trav_ _aa1_".H((&low NE 0) AND (&high NE 0))"sg PROC TRANSPOSE DATA=_trav_ OUT=_aabk_(DROP=_NAME_); ID per; BY year; VAR bking; RUN;"_NETTOY_" &_nettoy_ _aabk_"R"M (&low NE 0)"pd PROC TRANSPOSE DATA=_trav_ OUT=_aal_(DROP=_NAME_); ID per; BY year; VAR low; RUN;"_NETTOY_" &_nettoy_ _aal_"R"R (&high NE 0)"qe PROC TRANSPOSE DATA=_trav_ OUT=_aah_(DROP=_NAME_); ID per; BY year; VAR high; RUN;"_NETTOY_" &_nettoy_ _aah_"R"'(%UPCASE(&word) EQ YES)"W(&period = 12)"MONTHS"? /JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC"g"[ (&period = 6)"MONTHS"? /JAN_FEB MAR_APR MAY_JUN JUL_AUG SEP_OCT NOV_DEC"g"_ (&period = 4)"MONTHS" Q1 Q2 Q3 Q4"g"c (&period = 3)"MONTHS"' JAN_APR MAY_AUG SEP_DEC"g"g (&period = 2)"MONTHS"# SEMESTER1 SEMESTER2"g".k((&low NE 0) AND (&high NE 0))" TITLE "Baxter-King Filters Coefficients - Low = %CMPRES(&nblow) (%CMPRES(&low) Years), High = %CMPRES(&nbhigh) (%CMPRES(&high) Years)"; DATA _NULL_; FILE PRINT; SET bking; IF (_N_=1) THEN DO; nom='t;' || COMPRESS(TRANWRD("i]"&namebk",' ',';')); PUT nom; END; PUT t 3. (&namebk)(';' &formbkf); RUN;"s"o (&low NE 0)"  TITLE "Low-Pass Filter Coefficients - Low = %CMPRES(&nblow) (%CMPRES(&low) Years)"; DATA _NULL_; FILE PRINT; SET low; IF (_N_=1) THEN DO; nom='t;' || COMPRESS(TRANWRD("&namel",' ',';')); PUT nom; END; PUT t 3."-! (&namel)(';' &formbkf); RUN;"s"s (&high NE 0)wK"O (&s EQ 0)"S" 1"O"#S(%LENGTH(&ds) EQ 0)"DS" 0"S"%W(%LENGTH(&moy ) EQ 0)"MOY" M_"a"<\,(%LENGTH(%QSCAN(%BQUOTE(&moy ),2, )) NE 0)"UEERROR: You must precise just one value for the moy (&moy ) parameter"FINMACRO" ;"\"(a(%DATATYP(&moy ) EQ NUM)"C3ERROR: The moy (&moy ) parameter must be character"FINMACRO" ;"a"(e(%LENGTH(&tabmoy ) EQ 0)"TABMOY" _tabmoy_"p"?j/(%LENGTH(%QSCAN(%BQUOTE(&tabmoy ),2, )) NE 0)"[KERROR: You must precise just one value for the tabmoy (&tabmoy ) parameter"FINMACRO" ;"j"3' %sasnom(_IN_=&tabmoy ,TYPE=DATASET);"p (&_ret_ NE 0)"XHERROR: The tabmoy (&tabmoy ) parameter must be a valid SAS dataset name"FINMACRO" ;"p"&t(%LENGTH(&crit ) EQ 0)"CRIT" 0""=y-(%LENGTH(%QSCAN(%BQUOTE(&crit ),2, )) NE 0)"WGERROR: You must precise just one value for the crit (&crit ) parameter"FINMACRO" ;"y"*~(%DATATYP(&crit ) EQ CHAR)"C3ERROR: The crit (&crit ) parameter must be numeric"FINMACRO" ;""QA((&crit NE 0) AND (&crit NE 1) AND (&crit NE 2) AND (&crit NE 3))"TDERROR: The crit (&crit ) parameter must be choosen among (0 1 2 3 )"FINMACRO" ;""'(%LENGTH(&alpha ) EQ 0)"ALPHA" 0"">.(%LENGTH(%QSCAN(%BQUOTE(&alpha ),2, )) NE 0)"YIERROR: You must precise just one value for the alpha (&alpha ) parameter"FINMACRO" ;""+(%DATATYP(&alpha ) EQ CHAR)"E5ERROR: The alpha (&alpha ) parameter must be numeric"FINMACRO" ;""(&alpha LT 0 )"1!ERROR: You must have &alpha >= 0"FINMACRO" ;""((%LENGTH(&endrule) EQ 0)"ENDRULE" 2""@0(%LENGTH(%QSCAN(%BQUOTE(&endrule ),2, )) NE 0)"]MERROR: You must precise just one value for the endrule (&endrule ) parameter"FINMACRO" ;""-(%DATATYP(&endrule ) EQ CHAR)"I9ERROR: The endrule (&endrule ) parameter must be numeric"FINMACRO" ;""qa((&endrule NE 0) AND (&endrule NE 1) AND (&endrule NE 2) AND (&endrule NE 3) AND (&endrule NE 4))"[KERROR: The endrule (&endrule ) parameter must be choosen among (0 1 2 3 4)"FINMACRO" ;""&(%LENGTH(&gain ) EQ 0)"GAIN" NO""GAIN" %UPCASE(&gain)"=-(%LENGTH(%QSCAN(%BQUOTE(&gain ),2, )) NE 0)0x=INDEX(formats,'$'); IF (((type=1) AND (b^=0)) OR ((type=2) AND (b=0))) THEN error4 +1; END; IF fin THEN DO; CALL SYMPUT('error1',TRIM(LEFT(PUT(error1,5.))));"  CALL SYMPUT('error2',TRIM(LEFT(PUT(error2,5.)))); CALL SYMPUT('error3',TRIM(LEFT(PUT(error3,5.)))); CALL SYMPUT('error4',TRIM(LEFT(PUT(error4,5.)))); CALL SYMPUT('trueform',TRIM(LEFT(listform))); CALL SYMPUT('newform',TRIM(LEFT(newform)));"th CALL SYMPUT('newvar',TRIM(LEFT(newvar))); CALL SYMPUT('groups',TRIM(LEFT(listgrp))); END; RUN;"J:groups= &groups vrank= &vrank grank=&grank nbrank= &nbrank"UEformats= &formats trueform= &trueform newform=&newform newvar=&newvar">.((&error1 + &error2 + &error3 + &error4) NE 0)"(&error1 NE 0)"WGERROR: the GROUPS parameter should have only numeric and integer values""(&error2 NE 0)"TDERROR: the GROUPS parameter should have only positive integer values""(&error3 NE 0)"F6ERROR: 1 is not a valid value for the GROUPS parameter""(&error4 NE 0)"TDERROR: Non valid format ? Format type does not match Variable type ?""FINMACRO" ;""oc DATA _trav_; SET &data; KEEP &respvar &vars; IF (CMISS(OF &vars &respvar)=0); RUN;"(&nbrank GE 1)"&I1&nbrank1"k_ PROC RANK DATA=_trav_ GROUP=&&grank&i OUT=_trav_; VAR &&vrank&i; RANKS r&i; RUN;"GRANK&I"" %EVAL(&&grank&i-1)""<0 PROC SUMMARY DATA=_trav_ NOPRINT; CLASS"&I1&nbrank1" r&i""; VAR &respvar"&I1&nbrank1" &&vrank&i""; OUTPUT OUT=_table_(DROP=min) &stat=&respvar MIN=min min1-min&nbrank MAX=max max1-max&nbrank; RUN; PROC MEANS DATA=_table_ NOPRINT; VAR max max1-max&nbrank; OUTPUT OUT=maxv MAX=; RUN; DATA _aa_; SET _trav_; ARRAY vvar &respvar"&I1&nbrank1" &&vrank&i""; ARRAY l $ l0-l&nbrank; ARRAY ll ll0-ll&nbrank; ARRAY dd dd0-dd&nbrank; ARRAY ii ii0-ii&nbrank; DO OVER vvar; l=LEFT(PUT(vvar,BEST30.)); ll=LENGTH(TRIM(LEFT(PUT(vvar,BEST30.)))); ii=INDEX(l,'.'); IF ii THEN dd=ll-ii;"  ELSE dd=0; END; RUN; PROC MEANS DATA=_aa_ NOPRINT; VAR ll0-ll&nbrank dd0-dd&nbrank; OUTPUT OUT=maxv MAX=; RUN; DATA _aa_; SET maxv; CALL SYMPUT('nform0',COMPRESS(TRIM(LEFT(PUT(ll0+3,30.))) || '.' || TRIM(LEFT(PUT(dd0+2,"H<30.))))); CALL SYMPUT('maxd',TRIM(LEFT(PUT(dd0+2,30.))));"&I1&nbrank1" CALL SYMPUT("nform&i",COMPRESS(TRIM(LEFT(PUT(ll&i,30.))) || '.' || TRIM(LEFT(PUT(dd&i,30.))))); CALL SYMPUT("max&i",TRIM(LEFT(PUT(ll&i+dd&i+12,30.))));""1% RUN; DATA _null_; SET _table_"(&nbrank GT 1)"/# (WHERE=(NMISS(r1-r&nbrank)=1))"" ;"&I1&nbrank1"  IF (r&i^=.) THEN DO; CALL SYMPUT("rmin&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(min&i,&&nform&i)))); CALL SYMPUT("rmax&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(max&i,&&nform&i)))); CALL SYMPUT("rval&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(r&i"XL,6.)))); CALL SYMPUT("grank&i",LEFT(PUT(n&i,2.))); n&i+1; END;""" RUN; PROC FORMAT;"&I1&nbrank1" VALyN_,5.)))); CALL SYMPUT('_Mod'||TRIM(LEFT(PUT(_N_,5.))),TRIM(LEFT(Variables)));"  CALL SYMPUT('_ObsMod'||TRIM(LEFT(PUT(_N_,5.))),TRIM(LEFT(PUT(nbobs,5.)))); CALL SYMPUT('_Chow'||TRIM(LEFT(PUT(_N_,5.))),TRIM(LEFT(Chow))); CALL SYMPUT('_LagDep'||TRIM(LEFT(PUT(_N_,5.))),TRIM(LEFT(LagDep))); IF fin THEN CALL SYMPUT('_nbmod',TRIM("UILEFT(PUT(_N_,5.)))); RUN; PROC SORT DATA=_Variables_; BY Model; RUN;"_NETTOY", &_nettoy __Est__ _Variables_" ODS SELECT NONE; ODS OUTPUT FitSummary=FitSummary(DROP=cValue1 cValue2) ResetTest=ResetTest DWTestProb=DWTestProb ChowTest=Chow ARCHTest=Arch Godfrey=Godfrey PhilOul=PhilOul; PROC AUTOREG DATA=__travx__ OUTEST=__EstAR__;"&89I1&_nbmod1" Mod&i : MODEL Yvar = &&_Mod&i / RESET NLAG=3 BACKSTEP DW=3 DWPROB NORMAL &&_LagDep&i CHOW=(&&_Chow&i) PCHOW=(&&_Chow&i) ARCHTEST GODFREY STATIONARITY=(PHILLIPS); OUTPUT OUT=Model&i(KEEP=Date Yvar Res&i RecPEV&i" RecRES&i Yhat&i Cusum&i CusumLB&i CusumUB&i CusumSq&i CusumSqLB&i CusumSqUB&i) P=Yhat&i R=Res&i RecPEV=RecPEV&i RecRES=RecRES&i CUSUM=Cusum&i CUSUMLB=CusumLB&i CUSUMUB=CusumUB&i CUSUMSQ=CusumSq&i CUSUMSQLB=CusumSqLB&i CUSUMSQUB=CusumSqUB&i" ALPHACSM=0.05;"9"=1 RUN; ODS SELECT ALL; DATA __Cusum__; MERGE"&<:I1&_nbmod1" Model&i":"; BY Date; ARRAY model Cusum1-Cusum&_nbmod; ARRAY cusum Cusum1-Cusum&_nbmod; ARRAY cusumlb CusumLB1-CusumLB&_nbmod; ARRAY cusumub CusumUB1-CusumUB&_nbmod; ARRAY cusumSq CusumSq1-CusumSq&_nbmod; ARRAY cusumSqlb CusumSqLB1-CusumSqLB&_nbmod;" ARRAY cusumSqub CusumSqUB1-CusumSqUB&_nbmod; ARRAY Hat Yhat1-Yhat&_nbmod; ARRAY Coher Coherence1-Coherence&_nbmod; DO OVER Cusum; IF (Cusum^=.) THEN DO; Cusum=1-(Cusumlb <= Cusum <= Cusumub); CusumSq=1-(CusumSqlb <= CusumSq <=" CusumSqub); END; END; DO OVER hat; Coher=(DIF(Hat)*DIF(Yvar)>=0); END; DROP CusumLB1-CusumLB&_nbmod CusumUB1-CusumUB&_nbmod CusumSqLB1-CusumSqLB&_nbmod CusumSqUB1-CusumSqUB&_nbmod; RUN; PROC MEANS DATA=__Cusum__ NOPRINT; VAR Cusum1-"Cusum&_nbmod CusumSq1-CusumSq&_nbmod Coherence1-Coherence&_nbmod; OUTPUT OUT=__Mean__(DROP=_TYPE_ _FREQ_) MEAN=; RUN; DATA __Mean__; LENGTH _Name_ $ 32; SET __Mean__(KEEP=Cusum1-Cusum&_nbmod RENAME=("&C;I1&_nbmod1" Cusum&i=Mod&i";"J>) IN=in1) __Mean__(KEEP=CusumSq1-CusumSq&_nbmod RENAME=("&G<I1&_nbmod1"CusumSq&i=Mod&i"<"NB) IN=in2) __Mean__(KEEP=Coherence1-Coherence&_nbmod RENAME=("&K=I1&_nbmod1"Coherence&i=Mod&i"=") IN=in3); IF in1 THEN _Name_='Cusum'; IF in2 THEN _Name_='CusumSq'; IF in3 THEN _Name_='Coherence'; RUN; PROC TRANSPOSE DATA=__Mean__ OUT=__Mean__(RENAME=(_Name_=Model)); VAR Mod1-Mod&_nbmod; RUN; PROC SORT DATA=__Mean__; BY Model; RUN;"9- PROC DATASETS LIBRARY=work NOLIST; DELETE"&P>I1&_nbmod1" Model&i">" ; QUIT; DATA FitSummary; SET FitSummary(KEEP=Model Label1 nValue1) FitSummary(KEEP=Model Label2 nValue2 RENAME=(Label2=Label1 nValue2=nValue1)); RUN; PROC SORT DATA=FitSummary; BY Model Label1; RUN; DATA FitSummary; SET FitSummary; BY"  Model Label1; IF LAST.Label1; IF (Label1='Regress R-Square') THEN Label1='RegressR2'; ELSE IF (Label1='Total R-Square') THEN Label1='TotalR2'; ELSE IF (Label1='Root MSE') THEN Label1='RMSE'; ELSE IF (Label1='Normal Test') THEN Label1='JB_Ntest'" ; ELSE IF (Label1='Pr > ChiSq') THEN Label1='Pval_JB';z IF (a=1) THEN error3 +1; END; IF (TRIM(LEFT(formats)) ^='0') THEN DO; b=INDEX(formats,'$'); IF (((type=1) AND (b^=0)) OR ((type=2) AND (b=0))) THEN error4 +1; END; IF fin THEN DO; CALL SYMPUT('error1',TRIM(LEFT(PUT(error1,5.))));"  CALL SYMPUT('error2',TRIM(LEFT(PUT(error2,5.)))); CALL SYMPUT('error3',TRIM(LEFT(PUT(error3,5.)))); CALL SYMPUT('error4',TRIM(LEFT(PUT(error4,5.)))); CALL SYMPUT('trueform',TRIM(LEFT(listform))); CALL SYMPUT('newform',TRIM(LEFT(newform)));"th CALL SYMPUT('newvar',TRIM(LEFT(newvar))); CALL SYMPUT('groups',TRIM(LEFT(listgrp))); END; RUN;"J:groups= &groups vrank= &vrank grank=&grank nbrank= &nbrank"UEformats= &formats trueform= &trueform newform=&newform newvar=&newvar">.((&error1 + &error2 + &error3 + &error4) NE 0)"(&error1 NE 0)"WGERROR: the GROUPS parameter should have only numeric and integer values""(&error2 NE 0)"TDERROR: the GROUPS parameter should have only positive integer values""(&error3 NE 0)"F6ERROR: 1 is not a valid value for the GROUPS parameter""(&error4 NE 0)"TDERROR: Non valid format ? Format type does not match Variable type ?""FINMACRO" ;""^R DATA _trav_; SET &data; KEEP &respvar &vars; IF N(OF &vars); RUN;"(&nbrank GE 1)"&I1&nbrank1"k_ PROC RANK DATA=_trav_ GROUP=&&grank&i OUT=_trav_; VAR &&vrank&i; RANKS r&i; RUN;"GRANK&I"" %EVAL(&&grank&i-1)""<0 PROC SUMMARY DATA=_trav_ NOPRINT; CLASS"&I1&nbrank1" r&i""; VAR &respvar"&I1&nbrank1" &&vrank&i""; OUTPUT OUT=_table_(DROP=min) &stat=&respvar MIN=min min1-min&nbrank MAX=max max1-max&nbrank; RUN; PROC MEANS DATA=_table_ NOPRINT; VAR max max1-max&nbrank; OUTPUT OUT=maxv MAX=; RUN; DATA _aa_; SET _trav_; ARRAY vvar &respvar"&I1&nbrank1" &&vrank&i""; ARRAY l $ l0-l&nbrank; ARRAY ll ll0-ll&nbrank; ARRAY dd dd0-dd&nbrank; ARRAY ii ii0-ii&nbrank; DO OVER vvar; l=LEFT(PUT(vvar,BEST30.)); ll=LENGTH(TRIM(LEFT(PUT(vvar,BEST30.)))); ii=INDEX(l,'.'); IF ii THEN dd=ll-ii;"  ELSE dd=0; END; RUN; PROC MEANS DATA=_aa_ NOPRINT; VAR ll0-ll&nbrank dd0-dd&nbrank; OUTPUT OUT=maxv MAX=; RUN; DATA _aa_; SET maxv; CALL SYMPUT('nform0',COMPRESS(TRIM(LEFT(PUT(ll0+3,30.))) || '.' || TRIM(LEFT(PUT(dd0+2,"H<30.))))); CALL SYMPUT('maxd',TRIM(LEFT(PUT(dd0+2,30.))));"&I1&nbrank1" CALL SYMPUT("nform&i",COMPRESS(TRIM(LEFT(PUT(ll&i,30.))) || '.' || TRIM(LEFT(PUT(dd&i,30.))))); CALL SYMPUT("max&i",TRIM(LEFT(PUT(ll&i+dd&i+12,30.))));""1% RUN; DATA _null_; SET _table_"(&nbrank GT 1)"/# (WHERE=(NMISS(r1-r&nbrank)=1))"" ;"&I1&nbrank1" IF (r&i^=.) THEN DO; CALL SYMPUT("rmin&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(min&i,&&nform&i)))); CALL SYMPUT("rmax&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(max&i,&&nform&i)))); n&i+1; END;""" RUN; PROC FORMAT;"&I1&nbrank1" VALUE fr&i._"( J0&&grank&i1"7~{&vdrop) NE 0)" (DROP=&vdrop)"q" ;"x" SET &varao"&w(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"w" ;" RUN;"VARAO" __varao__" DATA __varls__;" (&varls EQ)" SET &varraw"&(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"" ;"" SET &varls"&(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"" ;" RUN;"VARLS" __varls__" DATA __varout__;" (&varout EQ)" SET &varraw"&(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"" ;"" SET &varout"&(%LENGTH(&vdrop) NE 0)" (DROP=&vdrop)"" ;" RUN;"VAROUT" __varout__" __NETTOY__" r__varlin__ __varraw__ __vartd__ __varsa__ __varsf__ __varirr__ __vartcy__ __varout__ __vartc__ __varls__ __varao__"DATALIST"  &__nettoy__"oc DATA _NULL_; ARRAY varx &datalist; CALL SYMPUT('nblist',TRIM(LEFT(PUT(DIM(varx),5.)))); RUN;"& I1&nblist1"NAME"# %SCAN(&datalist,&i)" PROC CONTENTS DATA=&name(KEEP=_numeric_) NOPRINT OUT=_nomvar&i._(KEEP=name); RUN; DATA _nomvar&i._; SET _nomvar&i._; name=UPCASE(name); RUN; PROC SORT DATA= _nomvar&i._; BY name; RUN;" __NETTOY__"' &__nettoy__ _nomvar&i._" "L@ DATA _NULL_; LENGTH list $ 30000; RETAIN list ' '; MERGE"&!I1&nblist1"! _nomvar&i._(IN=in&i)"!"  END=fin; BY name; IF (in1*in2*in3*in4*in5*in6*in7); IF (UPCASE(name)^=UPCASE("&date")) THEN list=TRIM(LEFT(COMPBL(TRIM(LEFT(list)) || ' ' || TRIM(LEFT(name))))); IF fin THEN CALL SYMPUT('varlist',LEFT(TRIM(list))); RUN; PROC SUMMARY DATA=" &varsf; VAR &varlist; OUTPUT OUT=_models_(KEEP=&varlist) MIN=; RUN; PROC TRANSPOSE DATA=_models_ OUT=_models2_(RENAME=(Col1=Min)); RUN; DATA _NULL_; LENGTH list $ 30000; RETAIN list ' '; SET _models2_ END=fin; IF (Min^=.) THEN list=TRIM"{(LEFT(COMPBL(TRIM(LEFT(list)) || ' ' || TRIM(LEFT(_name_))))); IF fin THEN CALL SYMPUT('varlist',LEFT(TRIM(list))); RUN;" __NETTOY__". &__nettoy__ _models_ _models2_"' DATA _dates_; MERGE"&"I1&nblist1") %SCAN(&datalist,&i)(IN=in&i)"""  END=fin; BY &date; KEEP &date; RETAIN FirstDate LastDate 0; IF (SUM(OF in1-in&nblist)=&nblist) THEN DO; n+1; IF (n=1) THEN FirstDate=&date; LastDate=&date; OUTPUT; END; IF fin THEN DO; period=(LastDate-FirstDate)/(n-1); IF (" (25<=period) AND (period<=35)) THEN period=12; ELSE IF ((80<=period) AND (period<=100)) THEN period=4; ELSE period=0; CALL SYMPUT('period',TRIM(LEFT(PUT(period,2.)))); CALL SYMPUT('FirstY',TRIM(LEFT(PUT(YEAR(FirstDate),6.)))); CALL SYMPUT("E9'LastY',TRIM(LEFT(PUT(YEAR(LastDate),6.)))); END; RUN;"(&period EQ 0)"C3ERROR: Only monthly or quarterly series are allowed"FINMACRO" ;"" __NETTOY__"# &__nettoy__ _dat|"tLECTRAMO G9.2  }:>"0DIR"0TABOUT"0TABSER"0FSTAT"0PRINT" DATA _NULL_; INFILE "&dir.\tcalend.m" LENGTH=l LRECL=30000; LENGTH xx yy $ 5000; INPUT xx $VARYING5000. l @; yy=SCAN(REVERSE(xx),1,'"'); IF (yy=' ') THEN DO; xx=TRIM(xx) || ' . . . . . . . . . . . . . . . .'; END;"  ELSE DO; xx=TRANWRD(xx,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' '); xx=TRANWRD(xx,',',' '); xx=TRANWRD(xx,'****',' . '); END; xx=TRANWRD(xx,'"',' '); xx=COMPBL(LEFT(xx)"); FILE "&dir.\temptt.txt" RECFM=V LRECL=30000; PUT xx $; RUN; DATA tcalend; INFILE "&dir.\temptt.txt" FIRSTOBS=2 RECFM=V LRECL=30000; LENGTH nser 4 series $ 32 star $ 8 TDeffect LYeffect Eeffect $ 3 NbTD 3 Monday Monday_t"  Tuesday Tuesday_t Wednesday Wednesday_t Thursday Thursday_t Friday Friday_t Saturday Saturday_t Sunday LeapYear LeapYear_t Easter Easter_t 8; DROP star aa; ARRAY td Monday_t Tuesday_t Wednesday_t Thursday_t Friday_t Saturday_t; INPUT" star $ series $ @; series=LEFT(TRIM(TRANWRD(series,'"',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.); IF (aa^=1) THEN RETURN; ELSE INPUT Monday Monday_t Tuesday" Tuesday_t Wednesday Wednesday_t Thursday Thursday_t Friday Friday_t Saturday Saturday_t LeapYear LeapYear_t Easter Easter_t; Sunday=-SUM(OF Monday Tuesday Wednesday Thursday Friday Saturday); TDeffect='No '; Eeffect='No ';" LYeffect='No '; NbTD=N(OF Monday Tuesday Wednesday Thursday Friday Saturday); DO OVER td; IF ((ABS(td) > 2) AND (TDeffect='No ')) THEN TDeffect='Yes'; END; IF (ABS(LeapYear_t) > 2) THEN LYeffect='Yes'; IF (ABS(Easter_t) > 2) THEN" Eeffect='Yes'; RUN; DATA _NULL_; INFILE "&dir.\tdeterm.m" LENGTH=l LRECL=30000; LENGTH xx yy $ 5000; INPUT xx $VARYING5000. l @; yy=SCAN(REVERSE(xx),1,'"'); IF (yy=' ') THEN DO; xx=TRIM(xx) ||"  ' . . . . . . . . . . . . . . . .'; END; ELSE DO; xx=TRANWRD(xx,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' '); xx=TRANWRD(xx,',',' '); END; xx=TRANWRD(xx,'"',' '); xx=COMPBL(" LEFT(xx)); FILE "&dir.\temptt.txt" RECFM=V LRECL=30000; PUT xx $; RUN; DATA tdeterm; INFILE "&dir.\temptt.txt" FIRSTOBS=2 RECFM=V LRECL=30000 END=fin; RETAIN yesreg yesout 0; LENGTH nser 4 series $ 32 star $ 8 TD EEaster Outliers AO TC"  LS REG MO 4; DROP star aa yesreg yesout; ARRAY varx TD EEaster Outliers AO TC LS REG MO; INPUT star $ series $ @; series=LEFT(TRIM(TRANWRD(series,'"',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(" TRIM(SUBSTR(star,aa))),4.); IF (aa^=1) THEN DO; DO OVER varx;varx=0;END; END; ELSE DO; INPUT TD EEaster Outliers AO TC LS REG MO; END; CALL SYMPUT('ao'||LEFT(PUT(nser,5.)),LEFT(PUT(MAX(ao,0),5.))); CALL SYMPUT('tc'||LEFT(PUT(nser" ,5.)),LEFT(PUT(MAX(tc,0),5.))); CALL SYMPUT('ls'||LEFT(PUT(nser,5.)),LEFT(PUT(MAX(ls,0),5.))); CALL SYMPUT('reg'||LEFT(PUT(nser,5.)),LEFT(PUT(MAX(reg,0),5.))); yesreg=MAX(yesreg,MAX(reg,0)); yesout=MAX(yesout,MAX(outliers,0)); IF fin THEN" DO; CALL SYMPUT('yesreg',LEFT(PUT((yesreg > 0),2.))); CALL SYMPUT('yesout',LEFT(PUT((yesout > 0),2.))); END; RUN; DATA _NULL_; INFILE "&dir.\tfit.m" LENGTH=l LREC}"tLOOKTESTF9.2  x>"0DATA"0OUTMOD"0OUTFOR"0VARY"0VARX"0DATE"0VARSUP"0MAXVAR"0FIRSTDAT"0LASTDAT"0NLAGX"0NLAGY"0NLAGS"0CRIT"0NBMOD"0ALPHA"0METHOD"0NLAGM"0CONTROL"0DEBUG", FINCONTROL",FINMACRO" (&debug NE)"OC OPTIONS MPRINT NOTES NOXWAIT NOCENTER NOMACROGEN PS=1000 LS=250;""]Q OPTIONS NOMPRINT NONOTES NOSOURCE2 NOCENTER NOXWAIT NOMACROGEN PS=1000 LS=250;" (&control NE)" FINCONTROL""  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index" GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&&(%LENGTH(&data ) EQ 0)"DATA" _last_"2"=+-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"+"8, DATA _NULL_; SET &data (OBS=1); RUN;"2(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"2"(6(%LENGTH(&outmod ) EQ 0)"OUTMOD" _outmod_"A"?;/(%LENGTH(%QSCAN(%BQUOTE(&outmod ),2, )) NE 0)"ZJERROR: You must precise just one value for the outmod (&outmod ) parameter"FINMACRO" ;";"3' %sasnom(_IN_=&outmod ,TYPE=DATASET);"A (&_ret_ NE 0)"WGERROR: The outmod (&outmod ) parameter must be a valid SAS dataset name"FINMACRO" ;"A"(E(%LENGTH(&outfor ) EQ 0)"OUTFOR" _outfor_"P"?J/(%LENGTH(%QSCAN(%BQUOTE(&outfor ),2, )) NE 0)~es_" $I161"NAME"# %SCAN(&datalist,&i)"YM DATA &name; MERGE &name _dates_(IN=in1); BY &date; IF in1; RUN;"$" DATA TDregressors; LENGTH Date year month qtr NbDays Day1-Day7 TD Monday Tuesday Wednesday Thursday Friday Saturday WeekDays LeapYear 8 ; KEEP Date year month qtr Monday Tuesday Wednesday Thursday Friday Saturday WeekDays LeapYear;"  ARRAY days(7) Day1-Day7; ARRAY reg(6) Monday Tuesday Wednesday Thursday Friday Saturday; LABEL TD='Trading Week Days' LeapYear='Leap Year' ; Firstyear=&firsty; Lastyear=&firsty + 2799; Date=MDY(12,1,Firstyear-1); DO k=1"  TO (Lastyear-Firstyear+1)*12; Date=INTNX('month',date,1); Year=YEAR(date); Month=MONTH(date); Qtr=QTR(date); Nbdays=INTNX('month',date,1)-date; DO i=1 TO DIM(days); days(i)=0; END; DO i=1 TO NbDays; jj=WEEKDAY(date+i-1);" days(jj)=days(jj)+1; END; LeapYear=0; IF (month=2) THEN DO; LeapYear=-0.25; IF (MOD(year,4)=0 & MOD(year,100) NE 0) OR MOD(year,400)=0 THEN LeapYear=0.75; END; TD=SUM(OF day2-day6);" DO i=1 TO 6; reg(i)=days(i+1)-days(1); END; WeekDays=TD - 5*(Day1+Day7)/2; OUTPUT; END; RUN; PROC SORT DATA=TDregressors OUT=sorted; BY Month; RUN; PROC MEANS DATA=sorted NOPRINT;"  VAR Monday Tuesday Wednesday Thursday Friday Saturday WeekDays; CLASS Month; OUTPUT OUT=means MEAN=mean1-mean7; RUN; DATA sorted; MERGE sorted means(FIRSTOBS=2 DROP=_type_ _freq_); BY Month; DROP i mean1-mean7; ARRAY all(*) Monday Tuesday" Wednesday Thursday Friday Saturday WeekDays; ARRAY meanx(*) mean1-mean7; DO i=1 TO DIM(all); all(i)=all(i)-meanx(i); END; RUN; PROC SORT DATA=sorted OUT=TDregressors; BY &date; RUN;"(&period EQ 4)" PROC SUMMARY DATA=TDregressors(DROP=&date) NWAY; VAR Monday Tuesday Wednesday Thursday Friday Saturday WeekDays LeapYear; BY Year Qtr; OUTPUT OUT=TDregressors(DROP=_type_ _freq_) SUM=; RUN; DATA TDregressors; LENGTH &date 8; SET"C7 TDregressors; &date=MDY(3*(qtr-1)+1,1,Year); RUN;"" DATA TDregressors; MERGE TDregressors(KEEP=&date Monday Tuesday Wednesday Thursday Friday Saturday WeekDays LeapYear) _dates_(IN=in1); BY &date; IF in1; RUN;" __NETTOY__"5 %&__nettoy__ sorted means TDregressors"l` PROC IML; START creertab(entree,sortie) GLOBAL(cycle,perdeb,period);" (perdeb >= 1)"oc avant=J(perdeb,1,.); avant=avant//entree; sortie=SHAPE(avant,NROW(cycle),period,.);""<0 sortie=SHAPE(entree,NROW(cycle),period,.);"  FINISH creertab; START moymob(xserie,movav,coef,ends); movav=J(NROW(xserie),1,0); mmob1=xserie[LOC(xserie ^= .)]; nobs=NROW(mmob1); mmob2=J(nobs,1,.); ordre=NROW(coef"); ncols=NCOL(coef); nb=INT(ordre / 2); IF (ordre <= nobs) THEN DO; mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef[,ncols]),T(mmob1))[ordre:nobs]); END; ELSE mmob2=J(nobs,1,mmob1[:]); IF ((ends=1) | (ordre > nobs))"  THEN DO; mmob2[1:nb]=J(nb,1,mmob2[1+nb]); mmob2[nobs-nb+1:nobs]=J(nb,1,mmob2[nobs-nb]); END; ELSE IF (ends=2) THEN DO; mmob3=mmob1; IF (ordre > nobs) THEN mmob3=mmob1 // J(ordre-nobs,1,0); mmob2[1:nb]=T(T(mmob3[1:" ordre])*coef[,1:nb]); IF (ordre > nobs) THEN mmob3= J(ordre-nobs,1,0) //mmob1; nobs3=NROW(mmob3); mmob2[nobs:nobs-nb+1]=T(T(mmob3[nobs3:nLENGTH(&s ) EQ 0)"S" 1"L"P (&s EQ 0)"S" 1"P"#T(%LENGTH(&ds) EQ 0)"DS" 0"T"%X(%LENGTH(&moy ) EQ 0)"MOY" M_"b"<],(%LENGTH(%QSCAN(%BQUOTE(&moy ),2, )) NE 0)"UEERROR: You must precise just one value for the moy (&moy ) parameter"FINMACRO" ;"]"(b(%DATATYP(&moy ) EQ NUM)"C3ERROR: The moy (&moy ) parameter must be character"FINMACRO" ;"b"(f(%LENGTH(&tabmoy ) EQ 0)"TABMOY" _tabmoy_"q"?k/(%LENGTH(%QSCAN(%BQUOTE(&tabmoy ),2, )) NE 0)"[KERROR: You must precise just one value for the tabmoy (&tabmoy ) parameter"FINMACRO" ;"k"3' %sasnom(_IN_=&tabmoy ,TYPE=DATASET);"q (&_ret_ NE 0)"XHERROR: The tabmoy (&tabmoy ) parameter must be a valid SAS dataset name"FINMACRO" ;"q"&u(%LENGTH(&crit ) EQ 0)"CRIT" 0""=z-(%LENGTH(%QSCAN(%BQUOTE(&crit ),2, )) NE 0)"WGERROR: You must precise just one value for the crit (&crit ) parameter"FINMACRO" ;"z"*(%DATATYP(&crit ) EQ CHAR)"C3ERROR: The crit (&crit ) parameter must be numeric"FINMACRO" ;""QA((&crit NE 0) AND (&crit NE 1) AND (&crit NE 2) AND (&crit NE 3))"TDERROR: The crit (&crit ) parameter must be choosen among (0 1 2 3 )"FINMACRO" ;""'(%LENGTH(&alpha ) EQ 0)"ALPHA" 0"">.(%LENGTH(%QSCAN(%BQUOTE(&alpha ),2, )) NE 0)"YIERROR: You must precise just one value for the alpha (&alpha ) parameter"FINMACRO" ;""+(%DATATYP(&alpha ) EQ CHAR)"E5ERROR: The alpha (&alpha ) parameter must be numeric"FINMACRO" ;""(&alpha LT 0 )"1!ERROR: You must have &alpha >= 0"FINMACRO" ;""&(%LENGTH(&beta ) EQ 0)"BETA" 0""=-(%LENGTH(%QSCAN(%BQUOTE(&beta ),2, )) NE 0)"WGERROR: You must precise just one value for the beta (&beta ) parameter"FINMACRO" ;""*(%DATATYP(&beta ) EQ CHAR)"C3ERROR: The beta (&beta ) parameter must be numeric"FINMACRO" ;"" (&beta LT 0 )"0 ERROR: You must have &beta >= 0"FINMACRO" ;""((%LENGTH(&endrule) EQ 0)"ENDRULE" 2""@0(%LENGTH(%QSCAN(%BQUOTE(&endrule ),2, )) NE 0)"]MERROR: You must precise just one value for the endrule (&endrule ) parameter"FINMACROl"  TITLE "Low-Pass Filter Coefficients - High = %CMPRES(&nbhigh) (%CMPRES(&high) Years)"; DATA _NULL_; FILE PRINT; SET low; IF (_N_=1) THEN DO; nom='t;' || COMPRESS(TRANWRD("&nameh",' ',';')); PUT nom; END; PUT t"0$ 3. (&nameh)(';' &formbkf); RUN;"s" TITLE "Variable &var"; DATA _NULL_; FILE PRINT; SET _aa1_; IF (_N_=1) THEN DO; nom='Year;' ||TRANWRD("&months",' ',';'); PUT nom; END; PUT year 4. (&months)(';' &formser); RUN;".x((&low NE 0) AND (&high NE 0))"  TITLE "Cycle of variable &var - Estimation by Baxter-King filter (&low - &high years)"; DATA _NULL_; FILE PRINT; SET _aabk_; IF (_N_=1) THEN DO; nom='Year;' ||TRANWRD("&months",' ',';'); PUT nom; END; PUT year"1% 4. (&months)(';' &formser); RUN;""| (&low NE 0)" TITLE "Smoothing variable &var by a low-pass filter (&low years)"; DATA _NULL_; FILE PRINT; SET _aal_; IF (_N_=1) THEN DO; nom='Year;' || TRANWRD("&months",' ',';'); PUT nom; END; PUT year 4. (&months)(';'"  &formser); RUN;"" (&high NE 0)" TITLE "Smoothing variable &var by a low-pass filter (&high years)"; DATA _NULL_; FILE PRINT; SET _aah_; IF (_N_=1) THEN DO; nom='Year;' ||TRANWRD("&months",' ',';'); PUT nom; END; PUT year 4. (&months)(';'"  &formser); RUN;""".((&low NE 0) AND (&high NE 0))" TITLE "Baxter-King Filters Coefficients - Low = %CMPRES(&nblow) (%CMPRES(&low) Years), High = %CMPRES(&nbhigh) (%CMPRES(&high) Years)"; PROC PRINT DATA=bking; ID t; FORMAT _numeric_ &formbkf t 3.; RUN;"" (&low NE 0)" TITLE "Low-Pass Filter Coefficients - Low = %CMPRES(&nblow) (%CMPRES(&low) Years)"; PROC PRINT DATA=low; ID t; FORMAT _numeric_ &formbkf t 3.; RUN;"" (&high NE 0)" TITLE "Low-Pass Filter Coefficients - High = %CMPRES(&nbhigh) (%CMPRES(&high) Years)"; PROC PRINT DATA=high; ID t; FORMAT _numeric_ &formbkf t 3.; RUN;""}q PROC PRINT DATA=_aa1_; ID year; FORMAT _numeric_ &formser year 4.; TITLE "Variable &var"; RUN;".((&low NE 0) AND (&high NE 0))" TITLE "Cycle of variable &var - Estimation by Baxter-King filter (&low - &high years)"; PROC PRINT DATA=_aabk_; ID year; FORMAT _numeric_ &formser year 4.; RUN;"" (&low NE 0)" TITLE "Smoothing variable &var by a low-pass filter (&low years)"; PROC PRINT DATA=_aal_; ID year; FORMAT _numeric_ &formser year 4.; RUN;"" (&high NE 0)" TITLE "Smoothing variable &var by a low-pass filter (&high years)"; PROC PRINT DATA=_aah_; ID year; FORMAT _numeric_ &formser year 4.; RUN;"" TITLE;""((%UPCASE(&graph) EQ YES)"&%SYSFUNC(CEXIST(&var))"2& PROC CATALOG C=&var KILL; QUIT;""  GOPTIONS CBACK=white BORDER noDISPLAY DEVICE=win FTEXT=swissb noPROMPT; SYMBOL1 I=join COLOR=black WIDTH=1 VALUE=none ; SYMBOL2 I=join COLOR=red WIDTH=1 VALUE=none ; AXIS1 LABEL=NONE; PROC GPLOT DATA= &out GOUT=&var UNIFORM; PLOT &var*&date"i] /FRAME NAME="orig_s" VAXIS=axis1; FORMAT &date MONYY5.; TITLE "Variable &var"; RUNmbs); IF (det1 ^=0) THEN vrai1=(-nobs/2)*LOG(" det1); vrai2=0; det2=DET(T(res2)*res2/nobs); IF (det2 ^=0) THEN vrai2=(-nobs/2)*LOG(det2); test3=2*(vrai2-vrai1); Pval3 = 1 - PROBCHI(test3,lags); Test=Test1 || Pval1 || Test2 || Pval2 || Test3 || Pval3; END" ; FINISH TestC; START Hsiao(maty,matx,test); ylag=NCOL(maty); xlag=NCOL(matx); test=J(1,3,.); DO i=1 TO ylag; DO j=1 TO xlag; nmiss=(NMISS(maty[,1:i] || matx[,1:j]))[,+]; cc=" LOC(nmiss=0); nobs=NCOL(cc); IF nobs THEN DO; y=maty[cc,1]; IF (i>1) THEN x=J(nobs,1,1) || maty[cc,2:i] || matx[cc,1:j]; ELSE x=J(nobs,1,1) || matx[cc,1:j]; END; res =y-x*INV(T(x)*x)*(T(x)*y);"  sse=SSQ(res); fpe=sse*(nobs+i+j-1)/(nobs-i-j+1); test=test // ((i-1)||(j-1)||fpe); END; END; test=test[2:NROW(test),]; FINISH Hsiao; USE _trav_ ; READ all VAR {&vary} INTO y; READ all VAR {" &listvar} INTO x; CLOSE _trav_; Series={&listvar}; nlags=MAX(&nlagy,&nlagx); nobs=NROW(y); Granger=J(1,6,.); Coherence=J(1,nlags,.); Hsiao=J(1,3,.); NamesHsiao=' '; ylag=J(nobs,nlags+" 1,.); DO i=1 TO nlags+1; ylag[i:nobs,i]=y[1:nobs-i+1]; END; signgry=SIGN(ylag[,1]-ylag[,2]); ylag=ylag[,2:nlags+1]; nvar=NCOL(x); DO i=1 TO nvar; xlag=J(nobs,nlags+1,.); DO j=1 TO nlags+1; xlag[j:nobs,j]=x" [1:nobs-j+1,i]; END; signgrx=SIGN(xlag[,1:nlags]-xlag[,2:nlags+1]); xlag2= ylag || xlag; nmissx=(NMISS(y || xlag2))[,+]; cc=LOC(nmissx=0); IF NCOL(cc) THEN DO; xlag2=J(NCOL(cc),1,1) || xlag2[cc,]; ylag2=J(NCOL(cc)" ,1,1) || ylag[cc,]; END; vary=y[cc]; RUN TestC(vary,ylag2,xlag2,test,nlags,0.05); Granger=Granger // test; aa=((REPEAT(signgry[cc,],1,nlags)#Signgrx[cc,])>0)[:,]; Coherence=Coherence // aa; vary=ylag[,1:&nlagy]" ; varx=xlag[,1:&nlagx]; RUN Hsiao(vary,varx,Htest); NamesHsiao=NamesHsiao // J(NROW(Htest),1,Series[i]); Hsiao=Hsiao // Htest; END; Coherence=Coherence[2:nvar+1,<>] || (Coherence[2:nvar+1,<:>]-1); Granger=Granger[2:nvar+1,]" || Coherence; CREATE Granger FROM Granger[COLNAME={'Ftest' 'Pval_F' 'Chi2' 'Pval_C' 'Wald' 'Pval_W' 'Coherence' 'Clag'} ROWNAME=Series]; APPEND FROM Granger[ROWNAME=Series]; CLOSE Granger; Hsiao=Hsiao[2:NROW(Hsiao),]; Series=" NamesHsiao[2:NROW(NamesHsiao),]; CREATE Hsiao FROM Hsiao[COLNAME={'Ylag' 'Xlag' 'FPE'} ROWNAME=Series]; APPEND FROM Hsiao[ROWNAME=Series]; CLOSE Hsiao; QUIT; PROC SORT DATA=Hsiao; BY Series FPE; RUN; PROC SORT DATA=Granger;" BY Series; RUN; DATA &outdata; MERGE &outdata Granger Hsiao; BY Series; IF FIRST.Series; FORMAT First Last MONYY7. CCF Pval_F Pval_C Pval_W Coherence 7.4; RUN;"_NETTOY"& &_nettoy Granger Hsiao""xl DATA _NULL_; CALL SYMPUT('nbmeth',TRIM(LEFT(PUT(COUNT(TRIM(LEFT("&method")),' ')+1,5.)))); RUN;"&^I1&nbmeth1"JJ"! %SCAN(&method,&i)" (&jj EQ 0)"|p PROC VARCLUS DATA=&outnew._0 OUTTREE=&outcah._0 CENTROID NOPRINT MAXC=&nbclus; VAR &namenew0; RUN;""rf PROC CLUSTER DATA=&outnew._&jj METHOD=ward OUTTREE=&outcah._&jj NOPRINT; ID series; RUN;"((%UPCASE(&graph) EQ YES)"7'(%SYSFUNC(CEXIST(work.Method&jj)) EQ 1)"@4 PROC CATALOG C=work.Method&jj KILL; QUIn;".((&low NE 0) AND (&high NE 0))"} PLOT bking*&date /FRAME NAME="cycle" VAXIS=axis1; FORMAT &date MONYY5.; TITLE "Cycle of variable &var"; RUN;"" (&low NE 0)" PLOT low*&date /FRAME NAME="low" VAXIS=axis1; FORMAT &date MONYY5.; TITLE "Smoothing of variable &var - Low-pass filter (&low years)"; RUN;"" (&high NE 0)" PLOT high*&date /FRAME NAME="high" VAXIS=axis1; FORMAT &date MONYY5.; TITLE "Smoothing of variable &var - Low-pass filter (&high years)"; RUN;""  QUIT; GOPTIONS display; PROC GREPLAY IGOUT=&var TC=&var NOFS GOUT=&var; TDEF newtwo DES='two squares of equal size' 1/LLX=1 LLY=50 ULX=1 ULY=99 URX=99 URY=100 LRX=99 LRY=50 color=grey 2/LLX=1 LLY=1 ULX=1 ULY=50 URX=99 URY=50 LRX=99"8, LRY=1 color=grey ; TEMPLATE newtwo;".((&low NE 0) AND (&high NE 0))"* TREPLAY 1:orig_s 2:cycle;"" (&low NE 0)"( TREPLAY 1:orig_s 2:low;"" (&high NE 0)") TREPLAY 1:orig_s 2:high;"" RUN; QUIT;".((&low NE 0) AND (&high NE 0))" PROC GPLOT DATA= &out GOUT=&var UNIFORM; PLOT &var*&date /FRAME NAME="both" VAXIS=axis1; PLOT2 bking*&date /FRAME NAME="double" VAXIS=axis1; FORMAT &date MONYY5.; TITLE "Variable &var and Estimated Cycle"; RUN; QUIT;"" (&low NE 0)"  PROC GPLOT DATA= &out GOUT=&var UNIFORM; PLOT &var*&date /FRAME NAME="both" VAXIS=axis1; PLOT2 low*&date /FRAME NAME="double" VAXIS=axis1; FORMAT &date MONYY5.; TITLE "Smoothing of variable &var - Low-pass filter (&low years)"; RUN" ; QUIT;"" (&high NE 0)" PROC GPLOT DATA= &out GOUT=&var UNIFORM; PLOT &var*&date /FRAME NAME="both" VAXIS=axis1; PLOT2 high*&date /FRAME NAME="double" VAXIS=axis1; FORMAT &date MONYY5.; TITLE "Smoothing of variable &var - Low-pass filter (&high years)";" RUN; QUIT;"" TITLE; SYMBOL;""(&_nettoy_ NE)"UI PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_; RUN; QUIT;"" #0` P@p(dpX`4HTt  , @ h | < T d x  4 D X  d | L d t (dTt(@Pd`xhT  4HD,<PxLdt 4T  4t@Xp 4t 8,<PxTl|  , @ t !0!D!X!l!!"","@"l"""""$#x######$,$T$l$$$$$$%%,%T%l%%%%0&H&X&l&&&&''P''''''(()T)l)|))))**,*L*****+0+@++++,-.4...../ /4/<0D1L2X3d4p5x6789:;;;<<<<=,=L=|=====>L>`>e.(%LENGTH(%QSCAN(%BQUOTE(&maxpq ),2, )) NE 0)"YIERROR: You must precise just one value for the maxpq (&maxpq ) parameter"FINMACRO" ;"e"+j(%DATATYP(&maxpq ) EQ CHAR)"E5ERROR: The maxpq (&maxpq ) parameter must be numeric"FINMACRO" ;"o"o(&maxpq LE 0 )"0 ERROR: You must have &maxpq > 0"FINMACRO" ;"o"'s(%LENGTH(&mcoef ) EQ 0)"MCOEF" 100"">x.(%LENGTH(%QSCAN(%BQUOTE(&mcoef ),2, )) NE 0)"YIERROR: You must precise just one value for the mcoef (&mcoef ) parameter"FINMACRO" ;"x"+}(%DATATYP(&mcoef ) EQ CHAR)"E5ERROR: The mcoef (&mcoef ) parameter must be numeric"FINMACRO" ;""(&mcoef LE 0 )"/ERROR: You must have mcoef > 0"FINMACRO" ;""%(%LENGTH(&par ) NE 0)"<,(%LENGTH(%QSCAN(%BQUOTE(&par ),2, )) NE 0)"UEERROR: You must precise just one value for the par (&par ) parameter"FINMACRO" ;"")(%DATATYP(&par ) EQ CHAR)"A1ERROR: The par (&par ) parameter must be numeric"FINMACRO" ;"" (&par LT 0 )".ERROR: You must have par >= 0"FINMACRO" ;"""$(%LENGTH(&qma) NE 0)"<,(%LENGTH(%QSCAN(%BQUOTE(&qma ),2, )) NE 0)"UEERROR: You must precise just one value for the qma (&qma ) parameter"FINMACRO" ;"")(%DATATYP(&qma ) EQ CHAR)"A1ERROR: The qma (&qma ) parameter must be numeric"FINMACRO" ;"" (&qma LT 0 )".ERROR: You must have qma >= 0"FINMACRO" ;"""((%LENGTH(&method ) EQ 0)"METHOD" CLS""METHOD" %UPCASE(&method)"?/(%LENGTH(%QSCAN(%BQUOTE(&method ),2, )) NE 0i)"[KERROR: You must precise just one value for the method (&method ) parameter"FINMACRO" ;""+(%DATATYP(&method ) EQ NUM)"I9ERROR: The method (&method ) parameter must be character"FINMACRO" ;""K;((&method NE CLS) AND (&method NE ULS) AND (&method NE ML))"ZJERROR: The method (&method ) parameter must be choosen among (CLS ULS ML)"FINMACRO" ;"")(%LENGTH(&maxiter ) EQ 0)"MAXITER" 100""@0(%LENGTH(%QSCAN(%BQUOTE(&maxiter ),2, )) NE 0)"]MERROR: You must precise just one value for the maxiter (&maxiter ) parameter"FINMACRO" ;""-(%DATATYP(&maxiter ) EQ CHAR)"I9ERROR: The maxiter (&maxiter ) parameter must be numeric"FINMACRO" ;"" (&maxiter LE 0 )"1!ERROR: You must have maxiter > 0"FINMACRO" ;""'(%LENGTH(&print ) EQ 0)"PRINT" YES""PRINT" %UPCASE(&print)">.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"WGERROR: You must precise just one value for the print (&print) parameter"FINMACRO" ;""*(%DATATYP(&print ) EQ NUM)"E5ERROR: The print (&print) parameter must be character"FINMACRO" ;""4$((&print NE YES) AND (&print NE NO))"RBERROR: The print (&print) parameter must be choosen among (YES NO)"FINMACRO" ;""'(%LENGTH(&graph ) EQ 0)"GRAPH" YES""GRAPH" %UPCASE(&graph)">.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"WGERROR: You must precise just one value for the graph (&graph) parameter"FINMACRO" ;""*(%DATATYP(&graph ) EQ NUM)"E5ERROR: The graph (&graph) parameter must be character"FINMACRO" ;""4$((&graph NE YES) AND (&graph NE NO))"RBERROR: The graph (&graph) parameter must be choosen among (YES NO)"FINMACRO" ;""&(%LENGTH(&craw ) EQ 0)"CRAW" black""=-(%LENGTH(%QSCAN(%BQUOTE(&craw ),2, )) NE 0)"WGERROR: You must precise just one value for the craw (&craw ) parameter"FINMACRO" ;"")(%DATATYP(&craw ) EQ NUM)"E5ERROR: The craw (&craw ) parameter must be character"FINMACRO" ;""((%LENGTH(&ctrend ) EQ 0)"CTREND" red""? /(%LENGTH(%QSCAN(%BQUOTE(&ctrend ),2, )) NE 0)"[KERROR: You must precise just one value for the ctrend (&ctrend ) parameter"FINMACRO" ;" "+(%DATATYP(&ctrend ) EQ NUM)"I9EjRROR: The ctrend (&ctrend ) parameter must be character"FINMACRO" ;""((%LENGTH(&ccycle ) EQ 0)"CCYCLE" blue" "?/(%LENGTH(%QSCAN(%BQUOTE(&ccycle ),2, )) NE 0)"[KERROR: You must precise just one value for the ccycle (&ccycle ) parameter"FINMACRO" ;""+ (%DATATYP(&ccycle ) EQ NUM)"I9ERROR: The ccycle (&ccycle ) parameter must be character"FINMACRO" ;" "ERREUR" 0" DATA _NULL_; IF (INT(&mcoef ) ^= &mcoef ) THEN CALL SYMPUT('erreur','1'); IF (INT(&maxpq ) ^= &maxpq ) THEN CALL SYMPUT('erreur','1'); IF (INT(&maxiter ) ^= &maxiter ) THEN CALL SYMPUT('erreur','1');"& (&par NE)"H< IF (INT(&par ) ^= &par ) THEN CALL SYMPUT('erreur','1');"&") (&qma NE)"H< IF (INT(&qma ) ^= &qma ) THEN CALL SYMPUT('erreur','1');")" RUN;".(&erreur EQ 1)"FINMACRO"P@ERROR: the parameters mcoef, par, qma and maxpq must be integer."."(2(%UPCASE(&print) NE YES)"PRINT" noprint"4"PRINT" "nb PROC FORMAT; VALUE njm 25-35=12 50-70=6 80-100=4 115-135=3 175-195=2; RUN;"_MISS_" 0"  DATA _trav_; SET &data END=fin; KEEP &date &var; RETAIN dtmin dtmax; IF (&var ^=.) THEN DO; ndon+1; dtmax=&date; IF (ndon=1) THEN dtmin=&date; END; IF ((&var ^= .) AND (LAG(&var) =.) AND (ndon > 1)) THEN CALL SYMPUT('_miss_','1');"y IF fin THEN DO; period=PUT((dtmax-dtmin)/ndon,njm.); CALL SYMPUT('period',period); END; IF (&var ^=.); RUN;"> (&period EQ )"wgERROR: Problem with the automatic determination of the series periodicity. Check your SAS date variable"FINMACRO" ;">"C(&_miss_ EQ 1)"4$ERROR: Missing values in series &var"FINMACRO" ;"C")R((&par NE) AND (&qma NE))"E9 DATA _bic_; Model=1; ar=∥ ma=&qma; RUN;"_NMOD" 1"_MAXAR" &par"_MAXMA" &qma"_AR1" &par"_MA1" &qma"  PROC ARIMA DATA=_trav_; ODS SELECT NONE; ODS OUTPUT ChiSqAuto=ChiSq ParameterEstimates=ParEst; IDENTIFY VAR=&var(1); ESTIMATE P=&par Q=&qma METHOD=&method MAXITER=&maxiter; FORECAST ID=&date OUT=_arima_(KEEP=&date &var residual RENAME=("?3residual=Resid1)) LEAD=0; QUIT; ODS SELECT ALL;"o" PROC ARIMA DATA=_trav_; ODS SELECT NONE; ODS OUTPUT TentativeOrders=_bic_ ; IDENTIFY VAR=&var(1) P=&maxpq Q=&maxpq ESACF SCAN; RUN; QUIT; ODS SELECT ALL;"_AR" 0"_MA" 0"  DATA _bic_; SET _bic_(KEEP=scan_AR scan_MA RENAME=(scan_AR=ar scan_MA=ma)) _bic_(KEEP=esacf_AR esacf_MA RENAME=(esacf_AR=ar esacf_MA=ma)); KEEP ar ma sum; IF ar > 0; sum=ar+ma; RUN; PROC SORT DATA=_bic_ OUT=_bic_ NODUP; BY sum" ma ar; RUN;"_NMOD" 0"  DATA _bic_; LENGTH Model 8; RETAIkN maxar maxma 0; SET _bic_; KEEP Model ar ma; model+1; maxar=MAX(ar,maxar); maxma=MAX(ma,maxma); CALL SYMPUT('_ar'||LEFT(PUT(model,3.)),LEFT(PUT(ar,2.))); CALL SYMPUT('_ma'||LEFT(PUT(model,3.)"),LEFT(PUT(ma,2.))); CALL SYMPUT('_nmod',LEFT(PUT(model,3.))); CALL SYMPUT('_maxar',LEFT(PUT(maxar,3.))); CALL SYMPUT('_maxma',LEFT(PUT(maxma,3.))); RUN;"b (&_nmod EQ 0)"UEERROR: No automatic model has been proposed by ESACF and SCAN options"FINMACRO" ;"b" PROC ARIMA DATA=_trav_; ODS SELECT NONE; ODS OUTPUT ChiSqAuto=ChiSq ParameterEstimates=ParEst; IDENTIFY VAR=&var(1);"%fBI1&_nmod1" ESTIMATE P=&&_ar&i Q=&&_ma&i METHOD=&method MAXITER=&maxiter; FORECAST ID=&date OUT=for&i(KEEP=&date &var residual) LEAD=0;"B"G; RUN; QUIT; ODS SELECT ALL; DATA _arima_; MERGE"%jCK1&_nmod1"1% for&k(RENAME=(residual=Resid&k))"C"' ; BY &date; LABEL"%nDK1&_nmod1", resid&k=' ' forecast&k=' '"D" ; RUN;" DATA ParEst; SET ParEst; RETAIN model 0; IF Parameter=:'MU' THEN model=model+1; Parameter=SUBSTR(Parameter,1,2)||LEFT(PUT(Lag,3.)); RUN; PROC TRANSPOSE DATA=ParEst(KEEP=Estimate Parameter Model) OUT=ParEst; BY model; ID Parameter;"  RUN; DATA ChiSq; LENGTH Lag $ 8; SET ChiSq; KEEP Lag ProbChiSq Model ToLags; RETAIN Model -1 n; IF (ToLags=6) THEN DO; model=model+1; n=0; END; LAG='PLjung'; IF model > 0; IF df; IF (((&period=12) AND (ToLags=12)) OR ((&period"^=12) AND (ToLags=6)) OR ((n=0) AND (ToLags > &period))) THEN DO; OUTPUT; n=1; END; RUN; PROC TRANSPOSE DATA=ChiSq OUT=ChiSq; BY model; ID Lag; COPY ToLags; RUN; DATA ChiSq; SET ChiSq; LjungBox= (PLjung > 0.05); RUN;"_SELMOD" 0" DATA _bic_; RETAIN n 0; LENGTH Model 8 Arima $ 10; MERGE _bic_ ParEst ChiSq; DROP _NAME_ _LABEL_ n; BY Model; LABEL ar=' ' ma=' '; Arima=COMPRESS('('||PUT(ar,3.)||',1,'||PUT(ma,3.)||')'); IF (LjungBox) THEN DO; IF (n=0) THEN CALL"YM SYMPUT('_selmod',LEFT(PUT(Model,2.))); n=n+1; selmod='*'; END; RUN;"{ (&print EQ)"  DATA _bic1_; LENGTH Arima $ 10 Selmod $1 LjungBox PLjung ToLags MU AR1-AR&_maxar MA1-MA&_maxma 8; SET _bic_(RENAME=(MU0=MU)); ARRAY num{*} _NUMERIC_; DROP i model ar ma; DO i= 1 TO DIM(num); num(i)=ROUND(num(i),0.001); END; RUN;"  PROC TRANSPOSE DATA=_bic1_ OUT=_bic1_(DROP=_LABEL_) PREFIX=Model; VAR _all_; RUN; DATA _bic1_; SET _bic1_; DROP i; ARRAY model{*} $ model1-model&_nmod; DO i= 1 TO DIM(model); model(i)=RIGHT(model(i)); END; LABEL _name_=' ';" RENAME _name_=Description; RUN; PROC PRINT DATA=_bic1_; ID Description; TITLE "Possible ARIMA models"; RUN; TITLE;"{"(&_selmod EQ 0)";+ERROR: No automatic model has been selected"FINMACRO" ;"";/ PROC IML; USE _bic_; READ all VAR{"&GI1&_maxar1" ar&i"G"'} INTO ar; READ all VAR{"&HI1&_maxma1" ma&i"H"} INTO ma; READ all VAR{selmod} INTO selmod; CLOSE _bic_; USE _arima_; READ all VAR{&var} INTO y; READ all VAR{&date} INTO date; READ all VAR{"%II1&_nmod1" Resid&i"I" } INTO r; CLOSE _arima_; modeldL=30000; LENGTH xx yy $ 5000; INPUT xx $VARYING5000. l @; yy="SCAN(REVERSE(xx),1,'"'); IF (yy=' ') THEN DO; xx=TRIM(xx) || ' . . . . . . . . . . . . . . . . . .'; END; ELSE DO; xx=TRANWRD(xx,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' ');"  xx=TRANWRD(xx,',',' '); xx=TRANWRD(xx,'*****',' . '); xx=TRANWRD(xx,'***',' . '); END; xx=TRANWRD(xx,'"',' '); xx=COMPBL(LEFT(xx)); FILE "&dir.\temptt.txt" RECFM=V LRECL=30000; PUT xx $; RUN; DATA tfit; INFILE" "&dir.\temptt.txt" FIRSTOBS=2 LENGTH=l LRECL=30000 END=fin; LENGTH nser 4 series $ 32 star $ 8 Nobs Lam Mean P D Q BP BD BQ 4 Model_T $ 15 SE_res BIC Qval Ntest Skewness Kurtosis RUNS QS Q2 8; LABEL QS =" 'Pierce seasonality test on residuals' ProbQS = 'P-value (Pierce seasonality test on residuals)' Skewness = 'T-test (H0: Skewness=0)' Kurtosis = 'T-test (H0: Kurtosis=3)' SE_res = 'Standard error of residuals' BIC =" 'Bayesian Information Criterion' Runs = 'T-test for Randomness in signs of residuals' Lam = 'Transformation (0 = Logs, 1 = Levels)' Mean = 'Model with mean (0 = no mean)' ; DROP star aa Qval Q2 Ntest; INPUT star $" series $ @; series=LEFT(TRIM(TRANWRD(series,'"',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.); IF fin THEN CALL SYMPUT('_nser',LEFT(PUT(nser,5.))); IF (aa^=1) THEN"  RETURN; ELSE DO; INPUT Nobs Lam Mean P D Q BP BD BQ SE_res BIC Qval Ntest Skewness Kurtosis QS Q2 RUNS; ProbQS=1-PROBCHI(QS,2); END; IF (Lam ^=.) THEN Model_T=COMPRESS('('||PUT(p,2.)||','||PUT(d,2.)||','||PUT(q,2.)||')('||PUT(bp," 2.)||','||PUT(bd,2.)||','||PUT(bq,2.)||')'); RUN; DATA _NULL_; SET &fstat(KEEP=period); CALL SYMPUT('per'||LEFT(PUT(_N_,5.)),LEFT(PUT(period,5.))); RUN; DATA _NULL_; INFILE "&dir.\toutlier.m" LENGTH=l LRECL=30000; LENGTH xx yy $ 5000;"  INPUT xx $VARYING5000. l @; yy=SCAN(REVERSE(xx),1,'"'); IF (yy=' ') THEN DO; xx=TRIM(xx) || ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .'; END; ELSE DO; xx=TRANWRD(xx" ,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' '); xx=TRANWRD(xx,',',' '); xx=TRANWRD(xx,';',' '); xx=TRANWRD(xx,'******',' . '); END; xx=TRANWRD(xx,'"',' '); xx=COMPBL(LEFT(xx));" FILE "&dir.\temptt.txt" RECFM=V LRECL=30000; PUT xx $VARYING5000. l; RUN; DATA toutlier; INFILE "&dir.\temptt.txt" RECFM=V LRECL=30000; LENGTH nser 4 star $ 8 series $ 32; DROP star aa""(&yesout NE 0)" a per;""" ;"%UI1&_nser1"' INPUT star $ series $"* (&&ao&i NE 0)"%)J1&&ao&i1"# a $ DAO&j $ AO&j""*"/ (&&ls&i NE 0)"%.J1&&ls&i1"# a $ DLS&j $ LS&j""/"4 (&&tc&i NE 0)"%3J1&&tc&i1"# a $ DTC&j $ TC&j""4"; series=LEFT(TRIM(TRANWRD(series,'"',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.);": (&&ao&i NE 0)"%9J1&&ao&i1" per=INPUT(SUBSTR(DAO&j,1,2),2.); per=INT((per-1)*12/&&per&i)+1; DAO&j=PUT(MDY(per,1,INPUT(SUBSTR(DAO&j,3,2),2.)),MONYY5.);"eT;"" AXIS1 LABEL=NONE; PROC TREE DATA=&outcah._&jj(WHERE=(_ncl_ <= &gmax)) HORIZONTAL VAXIS=axis1 NCLUSTERS=&nbclus GOUT=Method&jj; RUN; AXIS;TITLE;"" PROC TREE DATA=&outcah._&jj NOPRINT NCLUSTERS=&nbclus OUT=_outtree_&jj(RENAME=(_name_=series)); RUN; PROC SORT DATA=_outtree_&jj(KEEP=Series Cluster); BY series; RUN; DATA &outdata; LENGTH Series $ 32; MERGE &outdata"  _outtree_&jj(RENAME=(Cluster=Cluster&jj)); BY series; LABEL Series=' ' Cluster&jj=' '; RUN; PROC SORT DATA=_outtree_&jj; BY Cluster; RUN; PROC TRANSPOSE DATA=_outtree_&jj OUT=_t1_; VAR series; BY Cluster; RUN; PROC"y TRANSPOSE DATA=_t1_(DROP=_name_ _label_ Cluster) OUT=&clusters._&jj(DROP=_name_) PREFIX=CL; VAR _CHARACTER_; RUN;"((%UPCASE(&print) EQ YES)"nb PROC PRINT DATA=&clusters._&jj; TITLE 'Composition of the Clusters'; RUN; TITLE;""_NETTOY"2 "&_nettoy _outtree_&jj &outcah._&jj"4$(%SYSFUNC(EXIST(work.Medoids)) EQ 1)"RF PROC DATASETS LIBRARY=work NOLIST; DELETE Medoids; QUIT;""  DATA _NULL_; SET _outtree_&jj END=fin; LENGTH liste $ 30000; RETAIN liste; BY Cluster; IF FIRST.Cluster THEN DO; liste=' '; n+1; NbCl=0; END; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series)))" )); NbCl+1; IF LAST.Cluster THEN DO; CALL SYMPUT('ListCl'||TRIM(LEFT(PUT(Cluster,5.))),TRIM(LEFT(liste))); CALL SYMPUT('NbCl'||TRIM(LEFT(PUT(Cluster,5.))),TRIM(LEFT(PUT(NbCl,5.)))); END; IF fin THEN CALL SYMPUT('NumCl',TRIM(LEFT("!PUT(n,5.)))); RUN;" (&jj NE 0)"j^ PROC TRANSPOSE DATA=&outnew._&jj OUT=Factor; VAR _numeric_; ID Series; RUN;""=1 DATA Factor; SET &outnew._&jj; RUN;"F: DATA &outmed._&jj; SET _trav_(KEEP=&date); RUN;"%(%LENGTH(&vary) NE 0)" DATA &outmed.C_&jj &outmed.H_&jj; SET _trav_(KEEP=&date); RUN; PROC SORT DATA=&outdata; BY Cluster&jj; RUN; PROC RANK DATA=&outdata OUT=&outdata TIES=LOW; VAR FPE; BY Cluster&jj; RANKS MedoidsH&jj; RUN;" PROC RANK DATA=&outdata OUT=&outdata TIES=LOW DESCENDING; VAR Coherence; BY Cluster&jj; RANKS MedoidsC&jj; RUN; PROC SORT DATA=&outdata; BY Series; RUN;""&hIK1&NumCl1" (&&NbCl&ik GT 1)" PROC FACTOR DATA=Factor(KEEP=&&ListCl&ik) NOPRINT NFACTORS=1 OUTSTAT=Fstat(WHERE=(_TYPE_=:'PATTERN')); VAR &&ListCl&ik; RUN; PROC TRANSPOSE DATA=Fstat OUT=Fstat(KEEP=_Name_ Factor1 RENAME=(_Name_=Series)); VAR _NUMERIC_;" RUN; PROC RANK DATA=Fstat OUT=Fstat TIES=LOW DESCENDING; VAR Factor1; RANKS Medoids&jj; RUN; PROC APPEND BASE=Medoids DATA=Fstat; RUN; DATA _NULL_; SET Fstat END=fin; LENGTH liste $ 30000;"  RETAIN liste ' '; IF (Medoids&jj <= &medoids) THEN liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series))))); IF fin THEN CALL SYMPUT('ListCl',TRIM(LEFT(liste))); RUN; DATA _NULL_; IF (&&NbCl&ik <= &summary)"  THEN nbfact=&&NbCl&ik -1; ELSE nbfact=&summary; CALL SYMPUT('nbfact',TRIM(LEFT(PUT(nbfact,5.)))); RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT NFACTORS=&nbfact OUT=FactorX(KEEP=&date Factor1-"OCFactor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"(&sysf+ &j = "de &&rmin&i._&j &&rmax&i._&j""" ;"" RUN;"" PROC MEANS DATA=_trav_ NOPRINT MISSING COMPLETETYPES NWAY; CLASS &newvar ; VAR &respvar; OUTPUT OUT=_&stat._(DROP=_type_ _freq_) &stat=&respvar;" (&newform NE)"  FORMAT &newform;""3' RUN; DATA _&stat._ ; SET _&stat._;"(&nbrank GE 1)" RENAME"&"I1&nbrank1" r&i=&&vrank&i""" ;""0$ LABEL &respvar="&respvar (&stat)""(&nbrank GE 1)"&#I1&nbrank1" r&i=' '"#""u; RUN; DATA _&stat._ ; SET _&stat._; LENGTH _Label_ Rows $ 50; _Label_=%SCAN(&vars,1); Rows=%SCAN(&vars,2);"(&nbrank GE 1)"&$I1&nbrank1" IF (TRIM(LEFT("&&vrank&i"))=SCAN(UPCASE("&vars"),1)) THEN _Label_=TRIM(LEFT(PUT(&&vrank&i,fr&i._.))); IF (TRIM(LEFT("&&vrank&i"))=SCAN(UPCASE("&vars"),2)) THEN Rows=TRIM(LEFT(PUT(&&vrank&i,fr&i._.)));"$"" RUN;"NAME" %SCAN(&vars,1)" PROC SORT DATA= _&stat._; BY &name; RUN; DATA _&stat._; LENGTH Columns $ 32; SET _&stat._ END=fin; BY &name; RETAIN n 0; DROP n; IF FIRST.&name THEN DO; n=n+1; CALL SYMPUT("_label_"||TRIM(LEFT(PUT(n,5.))),TRIM(LEFT(_Label_)));" END; Columns = TRIM(LEFT(COMPRESS("&name"||'_'||PUT(n,5.)))); IF fin THEN CALL SYMPUT('nbcols',TRIM(LEFT(PUT(n,5.)))); RUN;"NAME" %SCAN(&vars,2)" PROC SORT DATA= _&stat._; BY &name; RUN; PROC TRANSPOSE DATA=_&stat._ OUT=MyTable(DROP=_Name_ _Label_); BY Rows NOTSORTED; ID Columns; VAR &respvar; IDLABEL _Label_; RUN;"NAME" %SCAN(&vars,1)" %mpolish(DATA=MyTable,COLS=&name._1-&name._&nbcols,LIGNES=Rows,DIAGN=oui,PRINT=non,ITER=,FORMAT=,POWER=,CRES=,CREG=,DEBUG=&debug);" (&debug NE)"C7 OPTIONS MPRINT NOTES NOXWAIT NOCENTER LS=250 PS=500;""QE OPTIONS NOMPRINT NONOTES NOSOURCE2 NOCENTER NOXWAIT LS=250 PS=500;"s PROC PRINT DATA=MyTable NOOBS LABEL; TITLE "Raw Table (&vars)"; RUN; DATA _mpolish_; SET _mpolish_; LABEL"&'I1&nbcols1") &name._&i ="&&_label_&i""'"{o; PROC PRINT DATA=_mpolish_ NOOBS LABEL; TITLE "Result of the Median Polish Analysis (&vars)"; RUN; TITLE;"#0` P  thp,DX,d(8LtD \ l $ < L ` ( h   @ X l H`pX<Pdx(8Lxx(8Pd|\| h` D d D!X!x!!!!H"\"t""""#@#####,$T$d$l$$$$$%&&$&('4(|((P)X)))))*(*++4+\+|+++++,,(,,,-$-X-x------.0.P.x....,/L/t/P0X0l00001L2`22H3\3|3 4(4l444T5|555,6gobs3-ordre+1])*coef[,1:nb]); IF (nobs < ordre-1) THEN DO; IF ((nobs = 5) & (nb > 3)) THEN mmob2=J" (nobs,1,mmob1[:]); ELSE mmob2[nobs-nb+1:nb]=mmob1[:]; END; END; movav[LOC(xserie ^= .)]=mmob2; FINISH moymob; START henders(ordre,hender); R=(2/ARCOS(0)) / (4*(ordre=5)+4.5*(" ordre=7)+(ordre=9) +3.5*(ordre=11)+3.5*(ordre=13)+4.5*(ordre=23))**2; m=(ordre+1)/2 ; hender=J(ordre,m,0); hend=J(ordre,m,0); y=(ordre+3)/2; y1=(y-1)**2; y2=y*y; y3=(y+1)**2; y4=3*y2-16; y5=4*y2; denomi=8*y*(y2-1" )*(y5-1)*(y5-9)*(y5-25)/315; DO i=1 to m; x=(i-1)**2; hender[i+m-1,m]=(y1-x)*(y2-x)*(y3-x)*(y4-11*x)/denomi; hender[m-i+1,m]=hender[i+m-1,m]; END; DO nterm=m to ordre-1; u1=hender[nterm+1:ordre,m][+]/nterm; u2=((nterm+1:"ordre)-(nterm+1)/2)*hender[nterm+1:ordre,m]; a1=(nterm+1)/2; a2=1+((nterm*(nterm-1)*(nterm+1))/12)*R; DO i=1 to nterm; c1=(i-a1)*R; hender[nterm-i+1,nterm-m+1]=hender[i,m]+u1+(u2*(c1/a2)); END; END; FINISH henders;"  START extrem(xserie,xbar,nbyear,weight) GLOBAL(period); weight=J(NROW(xserie),1,.); cc=LOC(xserie ^=.); xser2=xserie[cc]; nobs=NROW(xser2); nbp=INT(5*period / 2); sig=J(nobs,1,0); IF (xser2[><] <"  0) THEN xbar=0; ELSE xbar=1; weightx=J(nobs,1,1); lambda1=1.5; lambda2=2.5; DO i=nbp+1 TO nobs-nbp; mm=QUARTILE(xser2[i-nbp:i+nbp]); sig[i]=(mm[4]-mm[2])/1.349; END; DO i=1 TO nbp; sig[i]=sig[nbp+1]; sig[nobs"-i+1]=sig[nobs-nbp]; END; xser2=(xser2-xbar)/sig; c=LOC(xser2 > lambda2); IF NCOL(c) ^=0 THEN weightx[c]=0; c=LOC((lambda1 < xser2) & (xser2 <= lambda2)); IF NCOL(c) ^=0 THEN weightx[c]=(lambda2 - xser2[c]) / (lambda2 - lambda1);"  weight[cc]=weightx; FINISH extrem; START avrun(xserie,mean,model); xser=xserie[LOC(xserie ^=.)]; ndon=NROW(xser); nvar=NCOL(xser); mat=J(ndon,nvar,.); DO i=1 TO nvar; IF model=0 THEN mat[2:ndon,i]=xser[2:ndon]" - xser[1:ndon-1]; ELSE mat[2:ndon,i]=xser[2:ndon] / xser[1:ndon-1] -1; END; mat=mat[2:ndon]; seq=1; matseq=.; DO i=2 TO NROW(mat); IF ((mat[i]=0) | (mat[i]*mat[i-1] >0)) THEN seq=seq+1; ELSE DO; matseq=matseq || seq;" seq=1; END; END; matseq=matseq || seq; mean=matseq[:]; FINISH avrun; START anaregr1(xserie,res) GLOBAL(period); RUN creertab(xserie,xser); bar=xser[:]; total=((xser-bar)##2)[+]; c=LOC(xserie ^= .);"  factbar=xser[:,]; ncas=(xser ^= .)[+,]; fact=((factbar-bar)##2)*T(ncas); titre= "TEST DE LA PRSENCE D'UNE SAISONNALIT STABLE"; name={'ENTRE LES MOIS','RSIDU','TOTAL'}; residu=(total-fact); ssq= fact // residu // total; dfe=NROW"(xserie[c])-period; dgr= (period-1) // dfe // (dfe+period-1); msq= (fact / (period-1)) // (residu / dfe); IF (residu ^= 0) THEN DO; fisher=(fact / (period-1)) / (residu / dfe) ; prob=1-PROBF(fisher,period-1,dfe); END; ELSE DO;"  fisher=.; prob=.; END; res=fisher || ROUND(prob,0.0001); FINISH anaregr1; START anaregr2(xserie,res,model) GLOBAL(period); RUN creertab(xserie,xser); nomiss=(xser ^=.)[,+]; ycomp=LOC(nomiss[,+]=period)" ; IF (model=0) THEN xser=ABS(xser[ycomp[1]:ycomp[NCOL(ycomp)],]); ELSE xser=ABS(xser[ycomp[1]:ycomp[NCOL(ycomp)],]- 100); year=NROW(xser); titre= "TEST DE LA PRSENCE D'UNE SAISONNALIT VOLUTIVE"; name={'ENTRE LES ANNES','RSIDU'," 'TOTAL'}; bar=xser[:]; total=((xser-bar)##2)[+]; colbar=xser[:,]; rowbar=xser[,:]; roweff=((rowbar-bar)##2)[+]*period; coleff=((colba`":"? (&&ls&i NE 0)"%>J1&&ls&i1" per=INPUT(SUBSTR(DLS&j,1,2),2.); per=INT((per-1)*12/&&per&i)+1; DLS&j=PUT(MDY(per,1,INPUT(SUBSTR(DLS&j,3,2),2.)),MONYY5.);""?"D (&&tc&i NE 0)"%CJ1&&tc&i1" per=INPUT(SUBSTR(DTC&j,1,2),2.); per=INT((per-1)*12/&&per&i)+1; DTC&j=PUT(MDY(per,1,INPUT(SUBSTR(DTC&j,3,2),2.)),MONYY5.);""D" OUTPUT;"J (&&ao&i NE 0)"%I J1&&ao&i1") DAO&j=' '; AO&j=.;" "J"O (&&ls&i NE 0)"%N J1&&ls&i1") DLS&j=' '; LS&j=.;" "O"T (&&tc&i NE 0)"%S J1&&tc&i1") DTC&j=' '; TC&j=.;" "T"" RUN; DATA _NULL_; INFILE "&dir.\tregvar.m" LENGTH=l LRECL=30000 END=fin; LENGTH xx yy $ 5000; INPUT xx $VARYING5000. l @; yy=SCAN(REVERSE(xx),1,'"'); IF (yy=' ') THEN DO; xx=TRIM(xx) ||" ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .'; END; ELSE DO; xx=TRANWRD(xx,'-)','.)'); xx=TRANWRD(xx,'- ','. '); xx=TRANWRD(xx,'(',' '); xx=TRANWRD(xx,')',' ');"  xx=TRANWRD(xx,'*********',' . '); xx=TRANWRD(xx,'******',' . '); END; xx=TRANWRD(xx,'"',' '); xx=TRANWRD(xx,';',' '); xx=TRANWRD(xx,',',' '); xx=COMPBL(LEFT(xx)); FILE "&dir.\temptt.txt" RECFM=V LRECL=30000; PUT xx" $VARYING5000. l; RUN; DATA tregvar; INFILE "&dir.\temptt.txt"; DROP name star aa; LENGTH nser 4 star $ 8 series name $ 32;"%b I1&_nser1"' INPUT star $ series $"`(&®&i NE 0)"&_J1&®&i1"* name $ Reg&j Reg&j._t""`"; series=LEFT(TRIM(TRANWRD(series,'"',' '))); star=LEFT(REVERSE(star)); aa=INDEXC(star,'0123456789'); nser=INPUT(REVERSE(TRIM(SUBSTR(star,aa))),4.); OUTPUT;" " RUN; DATA &tabser; INFILE "&dir.\table-t.out" LENGTH=l LRECL=30000 END=fin; RETAIN series; LENGTH m $ 7 series $ 32 per 3 year 4; DROP m; INPUT m $VARYING7. l @; IF INDEX(m,'-') THEN DO; per=INPUT(SCAN(m,1,'-'),2.);"dX IF (per > 0) THEN DO; INPUT Xorig Xint Xlin Residuals Mean TD EE AO TC LS"i (®1 GE 1)"$hJ1®11" Reg&j""i"  ; per=INPUT(SCAN(m,1,'-'),2.); year=INPUT(SCAN(m,2,'-'),4.); END; ELSE DO; per=.; END; OUTPUT; END; ELSE IF ((m=' ') OR (LEFT(m)=:'DATE')) THEN DELETE; ELSE DO; INPUT @1 series $; series=SCAN(series,1,"'('); series=TRANWRD(series,'"',' '); series=COMPBL(LEFT(series)); END; RUN; X "del &dir.\table-t.out"; X "del &dir.\sumodels.out"; X "copy &dir.\*.out &dir.\series.txt"; DATA _listing_; LENGTH series $ 32 nser 3 Phi1"  Phi1_t Phi2 Phi2_t Phi3 Phi3_t BPhi1 Bphi1_t BPhi2 Bphi2_t Th1 Th1_t Th2 Th2_t Th3 Th3_t BTh1 BTh1_t BTh2 BTh2_t DW Qval PQval Q2val PQ2val Norm Pnorm 8; RETAIN series ' ' numtitle 0 nser Phi1 Phi1_t Phi2 Phi2_t Phi3 Phi3_t BPhi1" Bphi1_t BPhi2 Bphi2_t Th1 Th1_t Th2 Th2_t Th3 Th3_t BTh1 BTh1_t BTh2 BTh2_t 0 DW Qval PQval Q2val PQ2val Norm Pnorm; KEEP series nser Phi1 Phi1_t Phi2 Phi2_t Phi3 Phi3_t BPhi1 Bphi1_t a:BPhi2 Bphi2_t Th1 Th1_t Th2 Th2_t Th3 Th3_t" BTh1 BTh1_t BTh2 BTh2_t DW Qval PQval Q2val PQ2val Norm Pnorm; INFILE "&dir.\series.txt" LENGTH=l END=fin; LABEL DW = 'Durbin-Watson Statistic' Norm = 'Bowman-Shenton normality test' PNorm =" 'P-value (B-S normality Test)' Qval = 'Ljung-Box test on residuals' PQval = 'P-value (Ljung-Box test on residuals)' Q2val = 'Ljung-Box test on squared residuals' PQ2val = 'P-value (Ljung-Box test on squared residuals)' ;" ARRAY numx{*} Phi1 Phi1_t Phi2 Phi2_t Phi3 Phi3_t BPhi1 Bphi1_t BPhi2 Bphi2_t Th1 Th1_t Th2 Th2_t Th3 Th3_t BTh1 BTh1_t BTh2 BTh2_t; ARRAY numy{*} DW Qval PQval Q2val PQ2val Norm Pnorm; ARRAY phi{3} Phi1-Phi3; ARRAY tphi{3} Phi1_t Phi2_t" Phi3_t; ARRAY bphi{2} Bphi1-Bphi2; ARRAY tbphi{2} Bphi1_t Bphi2_t; ARRAY th{3} th1-th3; ARRAY tth{3} Th1_t Th2_t Th3_t; ARRAY bth{2} Bth1-Bth2; ARRAY tbth{2} Bth1_t Bth2_t; INPUT xx $VARYING200. l @;"(t(%UPCASE(&print) EQ YES)"cW FILE PRINT; IF ((xx=' ') AND (LAG(xx)=' ')) THEN DELETE; PUT xx $CHAR150.;"t" IF (xx=:' SERIES TITLE=') THEN DO; numtitle=numtitle+1; IF (nseries AND (numtitle=1)) THEN OUTPUT; DO i=1 TO DIM(numx); numx(i)=0; END; DO i=1 TO DIM(numy); numy(i)=.; END; nseries+1; series=SCAN(xx,2,'=');"  aa=SUBSTR(LEFT(SUBSTR(series,2)),1,1); IF (aa IN('1','2','3','4','5','6','7','8','9','0')) THEN nser=INPUT(SUBSTR(series,2),5.); IF (numtitle=2) THEN numtitle=0; END; ELSE IF xx =:' NORMALITY TEST=' THEN DO; chi=INPUT(SCAN(xx,3,'()'"),3.); INPUT @17 norm; pnorm=1-PROBCHI(norm,chi); END; ELSE IF xx =:' DURBIN-WATSON=' THEN DW=INPUT(SCAN(xx,2,'='),10.); ELSE IF xx =:' LJUNG-BOX Q VALUE OF ORDER' THEN DO; chi=INPUT(SCAN(xx,2,'()'),3.); a=INDEX(xx,' IS')+3;"  IF (PQval=.) THEN DO; INPUT @a Qval; PQval=1-PROBCHI(Qval,chi); END; ELSE DO; INPUT @a Q2val; PQ2val=1-PROBCHI(Q2val,chi); END; END; ELSE IF xx =:' PARAMETER ESTIMATE STD ERROR T RATIO LAG'" THEN DO; INPUT;INPUT; DO WHILE (xx ^= ' '); INPUT xx $VARYING200. l @; IF (xx^= ' ') THEN DO; IF (l>27) THEN INPUT @1 type $ num est std tratio lag; ELSE INPUT @1 type $ num est; END; IF (type ='AR1')"  THEN DO; phi(num)=est; IF (l>27) THEN tphi(num)=tratio; END; ELSE IF (type ='AR2') THEN DO; bphi(num)=est; IF (l>27) THEN tbphi(num)=tratio; END; ELSE IF (type ='MA1') THEN DO; th(num)=est; IF (l>27" ) THEN tth(num)=tratio; END; ELSE IF (type ='MA2') THEN DO; bth(num)=est; IF (l>27) THEN tbth(num)=tratio; END; END; END; IF fin THEN OUTPUT; RUN; PROC SORT DATA=_listing_; BY nser; RUN; DATA &tabout;" MERGE tfit tdeterm tcalend toutlier tregvar _listing_; BY nser; TramoFail=(ABS(Skewness)>2)+(ABS(Kurtosis)>2)+(ABS(Runs)>2)+(ProbQS <= 0.05)+(PQval <= 0.05)+(PQ2val <= 0.05)+(Pnorm <= 0.05); RUN;"#}0`   $ 0 < HPXdPT\dp|p<d,LtdDL`@H\|< D X p ! !H!t!|!!!!" " "(" # $%%%%&D&p&x&&H'P'T(((() )4)@*H+T,\-X.\/d0P1x11124 56 7,889:b"tRUNX12V2UE9.1  @>"0DATA"0TSERIES"0PERIOD"0DATE"0ADD"0VARREG"0REGEFF"0OUTLREG"0MODE"0EASTER"1IDUR8"0TRAD"0MODEL"0MAXLEAD"0NDEC"0DPARAMS"0PARAMS"0WEIGHTS"0COMPTYPE"7NAMEAGRAgregat"0HISTORY"0SLIDING"0SEASMA"0TCMA"0OUT"0OUTTYPE"0EXCEL"0LISTING"0GRAPH"1GMAX5"0DX12AR"0DEBUG",FINMACRO"% (&debug NE)"7+ OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN;"&"E9 OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN;"  DATA ___tt___; start=DATETIME(); RUN; %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %"LET index=%INDEX(&table,.); %IF (&index GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%" VERIFY(&lib,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY("{&table,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&.(%LENGTH(&data ) EQ 0)"DATA" _last_":"=3-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"3"8, DATA _NULL_; SET &data (OBS=1); RUN;":(&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;":"%>(%LENGTH(&out ) EQ 0)"OUT" _result_"I"<C,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO"c ear <= &end; BY year &crit; OUTPUT OUT=stat1(DROP= _type_ _freq_) SUM=; RUN; PROC MEANS DATA=stat1 MEAN NOPRINT; CLASS &crit; OUTPUT OUT=stat2(DROP=year _type_ _freq_) MEAN=; RUN;" PROC TRANSPOSE DATA=stat2(FIRSTOBS=2) OUT=&out._1 PREFIX=&stat; RUN; PROC PRINT DATA=&out._1; FORMAT &stat.1-&stat.&nb 5.2; RUN;"CLEAN"" &clean stat1 stat2"%(%LENGTH(&word) NE 0)" DATA _null_; FILE PRINT; SET &out._1; ARRAY stat(&nb) &stat.1-&stat.&nb; DO i=1 TO &nb; stat(i)=ROUND(stat(i),0.01); END; IF (_label_ = ' ') THEN DO;" (&stat EQ M)"MA DO i=1,3 TO 12; stat(i)=INT(stat(i)); END;""J> DO i=2 TO 4; stat(i)=INT(stat(i)); END;"ma END; IF _n_=1 THEN PUT "&varlist"; PUT _label_ (&stat.1-&stat.&nb)(';'); RUN;""dX PROC TRANSPOSE DATA=stat1 OUT=&out._2 PREFIX=&stat; VAR TD; BY year; RUN;"%(%LENGTH(&word) NE 0)" DATA _null_; FILE PRINT; SET &out._2; IF _n_=1 THEN PUT "&varlist"; PUT year (&stat.1-&stat.&nb)(';' 5.0); RUN;"""&(%LENGTH(&debug) EQ 0)"WK PROC DATASETS LIBRARY=work NOLIST; DELETE &clean; RUN; QUIT;""#0` P$8thp,H\(Xx0l@ X h |   ( P  X p  ( < \ $ < T h ,@l,@T(T`x8<Tdx 4Hh$04<HP\htt !"#$%%%&'()))*(*<*P*d*x****+,l----..//h///P0x01$181`111| maxdon=donnees[<>,i]; range=maxdon-mindon; IF (range=0) THEN zero[i]='1'; ELSE donnees[cc,i]=(donnees[cc,i] - mindon)/range; CALL SYMPUT(COMPRESS(CONCAT('_zero',CHAR(i,3))),zero[i]); END; END; CREATE"i] _tabtrav_ FROM donnees[COLNAME={&var}]; APPEND FROM donnees; CLOSE _tabtrav_; QUIT;"(&id NE)"TH DATA _tabtrav_; SET __trav__(KEEP=&id);SET _tabtrav_; RUN;""=1 DATA _tabtrav_; LENGTH group $ 256; SET"%/I1&_nvar1"MA _tabtrav_(KEEP=&&_var&i &id RENAME=(&&_var&i=_var_) IN=in&i)"/" ;"%0I1&_nvar1" IF (in&i) THEN"@0((%LENGTH(&label) NE 0) AND ("&&_lab&i" NE " "))"* group=LEFT("&&_lab&i");""* group=LEFT("&&_var&i");"0"  RUN; PROC BOXPLOT DATA=_tabtrav_; PLOT _var_* group / CAXIS = black CTEXT = black CBOXES = black HAXIS=axis1 VAXIS=axis2 ¬ches BOXSTYLE=&boxsty BOXWIDTHSCALE=0.5 IDCOLOR = black IDSYMBOL=dot ; SYMBOL1 C=black H="0.5;"<,((%INDEX(%UPCASE(&boxsty),ID)) AND (&id NE))" ID &id;"(&formatid NE)"' FORMAT &id &formatid;"""\P AXIS1 LABEL=none; AXIS2 LABEL=none MAJOR=none VALUE=none; RUN; QUIT;"+" (&type EQ 4)"H< DATA _tabtrav_; LENGTH block $ 256 group $ 32; SET"% 6I1&_nvar1"SG __trav__(KEEP=&&_var&i &id &group RENAME=(&&_var&i=_var_) IN=in&i)"6"7+ ; group=TRIM(LEFT(PUT(&group,32.)));"%7I1&_nvar1" IF (in&i) THEN"@0((%LENGTH(&label) NE 0) AND ("&&_lab&i" NE " "))"* block=LEFT("&&_lab&i");""* block=LEFT("&&_var&i");"7" LABEL _var_=' '; RUN; PROC SORT DATA=_tabtrav_; BY group block; RUN; PROC BOXPLOT DATA=_tabtrav_; PLOT _var_* block (group) / CAXIS = black CTEXT = black CBOXES = black HAXIS=axis1 VAXIS=axis1 ¬ches"g[ BOXSTYLE=&boxsty BOXWIDTHSCALE=0.5 IDCOLOR = black IDSYMBOL=dot; SYMBOL1 C=black H=0.5;"<,((%INDEX(%UPCASE(&boxsty),ID)) AND (&id NE))" ID &id;"(&formatid NE)"' FORMAT &id &formatid;"""1% AXIS1 LABEL=none; RUN; QUIT;"+"+ (&type EQ 5)"  PROC IML; USE __trav__; READ all VAR {&var} INTO donnees; CLOSE __trav__; power={-2 -1 -0.5 0 0.5 1 2 3}; epsilon=0.001; nvar=NCOL(donnees); nobs=NROW(donnees); nbpow=NCOL(power); mindon=donnees[><,]; neg=J(1,nvar,'0')" ; cc=LOC(mindon <=0); IF (NCOL(cc)^=0) THEN DO; donnees[,cc]=donnees[,cc]-REPEAT(mindon[cc],nobs,1)+epsilon; neg[cc]='1'; END; transf=J(1,nvar,.); min=J(nbpow,nvar,.); max=J(nbpow,nvar,.); DO i=1 TO nbpow; IF (power[i]^=0)"  THEN tr=(donnees ## power[i])#SIGN(power[i]); ELSE tr=LOG(donnees); transf=transf // tr; min[i,]=tr[><,]; max[i,]=tr[<>,]; END; transf=transf[2:NROW(transf),]; mindon=donnees[><,]; maxdon=donnees[<>,]; aa=T" (REPEAT(maxdon-mindon,nbpow,1)/(max-min)); bb=T((max#REPEAT(mindon,nbpow,1)-min#REPEAT(maxdon,nbpow,1))/(max-min)); mat=J(1,nobs,1); transf=T(power @ mat) || (T(aa @ mat) #transf+ T(bb @ mat)); CREATE _transf FROM transf[COLNAME={p}"tRUNTRAMOE9.2  8j>"0DATA"0TSERIES"0PERIOD"0TDROP"0ADD"0VARREG"0REGEFF"0LAM"0EASTER"0TRAD"0RSA"0IDUR"0MODEL"0VA"4LIMAR0.98"4LIMMA0.98"0OUT"0OUTTYPE"0FORECAST"0DATE"0PRINT"0DTRAMO"0CONTROL"0DEBUG", FINCONTROLH",FINMACRO" (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;""TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"7+ DATA ___tt___; start=DATETIME(); RUN;"# (&control NE)" FINCONTROL"#"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index" GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&+(%LENGTH(&data ) EQ 0)"DATA" _last_"7"=0-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"0"8, DATA _NULL_; SET &data (OBS=1); RUN;"7(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"7"%;(%LENGTH(&out ) EQ 0)"OUT" _results_"F"<@,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"@"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"F (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO~ ower &var}]"; APPEND FROM transf; CLOSE _transf; DO i=1 TO nvar; CALL SYMPUT(COMPRESS(CONCAT('_neg',CHAR(i,3))),neg[i]); END; QUIT;"%*=I1&_nvar1"'(&&_neg&i EQ 1)"^NAttention : &&_var&i a des valeurs ngatives ou nulles. Elle a t translate."'"  PROC BOXPLOT DATA=_transf; PLOT &&_var&i * power / CAXIS = black CTEXT = black CBOXES = black VAXIS=axis1 BOXSTYLE = &boxsty ¬ches IDCOLOR = black IDSYMBOL=dot; SYMBOL1 C=black H=0.5; AXIS1 LABEL=none"UI MAJOR=none VALUE=none; TITLE "&&_var&i"; RUN; QUIT; TITLE;"="+"/# SYMBOL1; AXIS1; TITLE; FOOTNOTE;"#-0` P@p4\p4x $4HtX\t X p T  8 x l D \ l ,@@D$,H\t@Xh|,t(@\p0Dp $4HtH4L`x<Xlt0Dlt ( D D!!!!! "4"H""""#0$l$$$$$$@%T%p%%%$&,&@&h&&&&'4'<'H(X((((())P)d))*+,,l,,,,8-@-T-|---..H.P.\/l////00000001,111112H2t22223(4d4|44444 545P5\6h7t89:@:`:::;8<@<T<<"WGERROR: You must precise just one value for the gain (&gain ) parameter"FINMACRO" ;"")(%DATATYP(&gain ) EQ NUM)"E5ERROR: The gain (&gain ) parameter must be character"FINMACRO" ;""2"((&gain NE YES) AND (&gain NE NO))"RBERROR: The gain (&gain ) parameter must be choosen among (YES NO)"FINMACRO" ;""'(%LENGTH(&print ) EQ 0)"PRINT" YES""PRINT" %UPCASE(&print)">.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"YIERROR: You must precise just one value for the print (&print ) parameter"FINMACRO" ;""*(%DATATYP(&print ) EQ NUM)"G7ERROR: The print (&print ) parameter must be character"FINMACRO" ;""4$((&print NE YES) AND (&print NE NO))"TDERROR: The print (&print ) parameter must be choosen among (YES NO)"FINMACRO" ;""&(%LENGTH(&data ) EQ 0)"DATA" _last_""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"(&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;""%(%LENGTH(&out ) EQ 0)"OUT" _result_""<,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;""0$ %sasnom(_IN_=&out ,TYPE=DATASET);" (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;""$(%LENGTH(&xx ) NE 0)"YM DATA _NULL_; SET &data (KEEP=&xx OBS=1); ARRAY _xx_(*) &xx ; RUN;"(&syserr NE 0)"E5ERROR: There is a problem in the xx (&xx ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"""& (%LENGTH(&date ) NE 0)"=-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"WGERROR: You must precise just one value for the date (&date ) parameter"FINMACRO" ;""]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"(&syserr NE 0)"I9ERROR: There is a problem in the date (&date ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"" "'(%LENGTH(&graph ) NE 0)"GRAPH" %UPCASE(&graph)">.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2,x ,i]=td;" (&debug NE)" wadd=(poids[,1:nbcas])[,+]; wmult=J(NROW(xx),1,.); IF (min[i] > 0) THEN DO; wmult=(poids[,nbcas+1:2*nbcas])[,+]; END; ddate=date[dd]; PRINT ddate[FORMAT=monyy5.] xx cvs[COLNAME=nomliss] sa td poids[COLNAME=nomliss]" wadd wmult;""  IF (min[i] > 0) THEN DO; Season[dd,i]=donnees[dd,i]/sadjust[dd,i]; Irregular[dd,i]=sadjust[dd,i]/trendc[dd,i]; END; ELSE DO; Season[dd,i]=donnees[dd,i] - sadjust[dd,i]; Irregular[dd,i]=sadjust[dd,i] - trendc"[dd,i]; END; END; saseries=date || sadjust; CREATE saseries FROM saseries[COLNAME=nomvar]; APPEND FROM saseries; CLOSE saseries; outliers=date || outliers; CREATE outliers FROM outliers[COLNAME=nomvar]; APPEND FROM"  outliers; CLOSE outliers; trendc=date || trendc; CREATE TrendCycle FROM trendc[COLNAME=nomvar]; APPEND FROM trendc; CLOSE TrendCycle; Season=date || season; CREATE Season FROM season[COLNAME=nomvar]; APPEND FROM Season; CLOSE" Season; Irregular=date || Irregular; CREATE Irregular FROM Irregular[COLNAME=nomvar]; APPEND FROM Irregular; CLOSE Irregular; QUIT;"(&errord NE 0)" DATA TrendCycle; MERGE &data trend; BY &date; RUN; DATA Saseries; MERGE &data saseries; BY &date; RUN; DATA Outliers; MERGE _zeros_ outliers; BY &date; RUN; DATA Season; MERGE _01_ Season; BY &date; RUN; DATA"D8 Irregular; MERGE _01_ Irregular; BY &date; RUN;""pd DATA ___tt___; SET ___tt___; end=DATETIME(); time=end-start; PUT time= time.; RUN;" (&debug EQ)"cW PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_ ___tt___; RUN; QUIT;""#0` P (p(\  4 H  D d 8 L `  $ 8 h $ | ,l,l4h$LdtLdt$L(Tx @Th| 4L`lx !"""#$#8#X#####$x$$$%X%`&'$'|'''''()*+- ./0$112H2\2223345566789::;<0<D<P=X>d?@$@,ApAAABtBBy=LOC(selmod='*'); nbmod=NCOL(model); noms=CONCAT(J(1,nbmod,'BN_Trend'),CHAR(model,4)); noms=noms || CONCAT(J(1,nbmod,'BN_Cycle'),CHAR(model,4)); noms=COMPRESS(noms); ar=J(nbmod,1,1)||(-ar)[model,]; ma=J(nbmod,"1,1)||(-ma)[model,]; r=r[,model]; nobs=NROW(r); npsi=&mcoef; psi=J(npsi+1,nbmod,.); cusum=J(npsi,nbmod,.); DO i=1 TO nbmod; cc=LOC(ar[i,]^=.); dd=LOC(ma[i,]^=.); psi[,i]=T(RATIO(ar[i,cc],ma[i,dd],npsi+1)); psi2=psi[2:npsi+1,i];"  cusum[,i]=CUSUM(psi2[npsi:1])[npsi:1]; END; cycle=J(nobs,nbmod,.); maxobs=MIN(npsi,nobs); DO i= nobs TO 2 BY -1; min=MIN(i,maxobs); rsub=r[i:MAX(i-min+1,2),]; csub=cusum[1:NROW(rsub),]; cycle[i,]=(rsub # csub)[+,]; END; result="date || y || (REPEAT(y,1,nbmod)-cycle) || cycle; names={"&date" "&var"} || noms; CREATE &out FROM result[COLNAME=names]; APPEND FROM result; CLOSE &out; QUIT;"((%UPCASE(&graph) EQ YES)"&%SYSFUNC(CEXIST(&var))"2& PROC CATALOG C=&var KILL; QUIT;"" DATA _NULL_; SET _bic_(WHERE=(selmod='*')); CALL SYMPUT('model'||LEFT(PUT(_N_,3.)),arima); CALL SYMPUT('trend'||LEFT(PUT(_N_,3.)),'BN_Trend'||LEFT(PUT(model,3.))); CALL SYMPUT('cycle'||LEFT(PUT(_N_,3.)),'BN_Cycle'||LEFT(PUT(model,3.)));" CALL SYMPUT('nmod',LEFT(PUT(_N_,3.))); RUN; GOPTIONS CBACK=white BORDER noDISPLAY DEVICE=win FTEXT=swissb noPROMPT; SYMBOL1 I=join COLOR=&craw WIDTH=1 VALUE=none ; SYMBOL2 I=join COLOR=&ctrend WIDTH=1 VALUE=none ; SYMBOL3 I=join COLOR="fZ&ccycle WIDTH=1 VALUE=none ; AXIS1 LABEL=NONE; PROC GPLOT DATA=&out GOUT=&var UNIFORM;"$LI1&nmod1"  PLOT &var*&date &&trend&i*&date /FRAME NAME="orig_s&i" VAXIS=axis1 OVERLAY; FORMAT &date MONYY5.; TITLE "Variable &var and Trend, model &&model&i"; RUN; PLOT &&cycle&i*&date /FRAME NAME="cycle&i" VAXIS=axis1; FORMAT &date MONYY5.;"J> TITLE "Cycle of variable &var, model &&model&i"; RUN;"L"  QUIT; GOPTIONS display; PROC GREPLAY IGOUT=&var TC=&var NOFS GOUT=&var; TDEF newtwo DES='two squares of equal size' 1/LLX=1 LLY=50 ULX=1 ULY=99 URX=99 URY=100 LRX=99 LRY=50 color=grey 2/LLX=1 LLY=1 ULX=1 ULY=50 URX=99 URY=50 LRX=99"8, LRY=1 color=grey ; TEMPLATE newtwo;"$MI1&nmod1"7+ TREPLAY 1:orig_s&i 2:cycle&i; RUN;"M"?3 QUIT; PROC GPLOT DATA= &out GOUT=&var UNIFORM;"$NI1&nmod1" PLOT &var*&date &&trend&i*&date /FRAME NAME="both&i" VAXIS=axis1 OVERLAY; PLOT2 &&cycle&i*&date /FRAME NAME="double&i" VAXIS=axis1; FORMAT &date MONYY5.; TITLE "Variable &var, Estimated Trend and Cycle, model &&model&i"; RUN;"N"( QUIT; TITLE; SYMBOL;""#0` P@p0\xpp P $ 8 t  8 X  L d t  4 D X (@Pd$8pT`x(Ph|,DTh8h`x $4HdDH`p  H`t\t(8L 0\t<Tdx  0 P !!(!@!`!!!" "4"`"""""#l#######$($H$$$$%%H%z%%%%&T&l&|&&&&&&8''''''@(X(h(|((((($))))))4*L*\*p*****+t+++++(,@,P,d,|,,l----.H.\.p.... /4/L/d/x///0(0<0H111h2222223 343`3333344,4@4T4h4|4555666667 8$888D99:l::::8;`;;;@<h<<<<< =(=@=H>T?\@t@@AABC DDDD E8EHE\EEEEEF,F@FHFFG0G8GDHLIXJ K4K\KKKLMN@NLOOOPPQ@QHQQQRRRR{ CBOXES = black HAXIS=axis1 ¬ches BOXSTYLE=&boxsty"=1 BOXWIDTHSCALE=0.5 IDCOLOR = black IDSYMBOL=dot ;"<,((%INDEX(%UPCASE(&boxsty),ID)) AND (&id NE))" ID &id;"(&formatid NE)"' FORMAT &id &formatid;"""aU SYMBOL1 C=black H=0.5; AXIS1 LABEL=none MAJOR=none VALUE=none; RUN; QUIT;"" (&type EQ 1)"  PROC SORT DATA=__trav__(KEEP=&var &id &group) OUT=_tabtrav_; BY &group; RUN; PROC BOXPLOT DATA=_tabtrav_; PLOT (&var)* &group / CAXIS = black CTEXT = black CBOXES = black VAXIS=axis1 HAXIS=axis1 ¬ches BOXSTYLE"E9=&boxsty BOXWIDTHSCALE=0.5 IDCOLOR = black IDSYMBOL=dot ;"<,((%INDEX(%UPCASE(&boxsty),ID)) AND (&id NE))" ID &id;"(&formatid NE)"' FORMAT &id &formatid;"""K? SYMBOL1 C=black H=0.5; AXIS1 LABEL=none; RUN; QUIT;"" (&type EQ 2)"=1 DATA _tabtrav_; LENGTH group $ 256; SET"%%I1&_nvar1"L@ __trav__(KEEP=&&_var&i &id RENAME=(&&_var&i=_var_) IN=in&i)"%" ;"%&I1&_nvar1" IF (in&i) THEN"@0((%LENGTH(&label) NE 0) AND ("&&_lab&i" NE " "))"* group=LEFT("&&_lab&i");""* group=LEFT("&&_var&i");"&"  RUN; PROC BOXPLOT DATA=_tabtrav_; PLOT _var_* group / CAXIS = black CTEXT = black CBOXES = black HAXIS=axis1 VAXIS=axis1 ¬ches BOXSTYLE=&boxsty BOXWIDTHSCALE=0.5 IDCOLOR = black IDSYMBOL=dot ; SYMBOL1 C=black H="0.5;"<,((%INDEX(%UPCASE(&boxsty),ID)) AND (&id NE))" ID &id;"(&formatid NE)"' FORMAT &id &formatid;"""1% AXIS1 LABEL=none; RUN; QUIT;"" (&type EQ 3)"  PROC IML; USE __trav__; READ all VAR {&var} INTO donnees; CLOSE __trav__; nvar=NCOL(donnees); nobs=NROW(donnees); zero=J(1,nvar,'0'); DO i=1 TO nvar; cc=LOC(donnees[,i]^=.); IF (NCOL(cc)^=0) THEN DO; mindon=donnees["><,i]; maxdon=donnees[<>,i]; range=maxdon-mindon; IF (range=0) THEN zero[i]='1'; ELSE donnees[cc,i]=(donnees[cc,i] - mindon/range); CALL SYMPUT(COMPRESS(CONCAT('_zero',CHAR(i,3))),zero[i]); END; END; CREATE"i] _tabtrav_ FROM donnees[COLNAME={&var}]; APPEND FROM donnees; CLOSE _tabtrav_; QUIT;"(&id NE)"TH DATA _tabtrav_; SET __trav__(KEEP=&id);SET _tabtrav_; RUN;""=1 DATA _tabtrav_; LENGTH group $ 256; SET"%-I1&_nvar1"MA _tabtrav_(KEEP=&&_var&i &id RENAME=(&&_var&i=_var_) IN=in&i)"-" ;"%.I1&_nvar1" IF (in&i) THEN"@0((%LENGTH(&label) NE 0) AND ("&&_lab&i" NE " "))"* group=LEFT("&&_lab&i");""* group=LEFT("&&_var&i");"."  RUN; PROC BOXPLOT DATA=_tabtrav_; PLOT _var_* group / CAXIS = black CTEXT = black CBOXES = black HAXIS=axis1 VAXIS=axis2 ¬ches BOXSTYLE=&boxsty BOXWIDTHSCALE=0.5 IDCOLOR = black IDSYMBOL=dot ; SYMBOL1 C=black H="0.5;"<,((%INDEX(%UPCASE(&boxsty),tID)) AND (&id NE))" ID &id;"(&formatid NE)"' FORMAT &id &formatid;"""\P AXIS1 LABEL=none; AXIS2 LABEL=none MAJOR=none VALUE=none; RUN; QUIT;""  (&type EQ 4)"H< DATA _tabtrav_; LENGTH block $ 256 group $ 32; SET"%4I1&_nvar1"SG __trav__(KEEP=&&_var&i &id &group RENAME=(&&_var&i=_var_) IN=in&i)"4"7+ ; group=TRIM(LEFT(PUT(&group,32.)));"%5I1&_nvar1" IF (in&i) THEN"@0((%LENGTH(&label) NE 0) AND ("&&_lab&i" NE " "))"* block=LEFT("&&_lab&i");""* block=LEFT("&&_var&i");"5" LABEL _var_=' '; RUN; PROC SORT DATA=_tabtrav_; BY group block; RUN; PROC BOXPLOT DATA=_tabtrav_; PLOT _var_* block (group) / CAXIS = black CTEXT = black CBOXES = black HAXIS=axis1 VAXIS=axis1 ¬ches"g[ BOXSTYLE=&boxsty BOXWIDTHSCALE=0.5 IDCOLOR = black IDSYMBOL=dot; SYMBOL1 C=black H=0.5;"< ,((%INDEX(%UPCASE(&boxsty),ID)) AND (&id NE))" ID &id;" (&formatid NE)"' FORMAT &id &formatid;" " "1% AXIS1 LABEL=none; RUN; QUIT;"" (&type EQ 5)"  PROC IML; USE __trav__; READ all VAR {&var} INTO donnees; CLOSE __trav__; power={-2 -1 -0.5 0 0.5 1 2 3}; epsilon=0.001; nvar=NCOL(donnees); nobs=NROW(donnees); nbpow=NCOL(power); mindon=donnees[><,]; neg=J(1,nvar,'0')" ; cc=LOC(mindon <=0); IF (NCOL(cc)^=0) THEN DO; donnees[,cc]=donnees[,cc]-REPEAT(mindon[cc],nobs,1)+epsilon; neg[cc]='1'; END; transf=J(1,nvar,.); min=J(nbpow,nvar,.); max=J(nbpow,nvar,.); DO i=1 TO nbpow; IF (power[i]^=0)"  THEN tr=(donnees ## power[i])#SIGN(power[i]); ELSE tr=LOG(donnees); transf=transf // tr; min[i,]=tr[><,]; max[i,]=tr[<>,]; END; transf=transf[2:NROW(transf),]; mindon=donnees[><,]; maxdon=donnees[<>,]; aa=T" (REPEAT(maxdon-mindon,nbpow,1)/(max-min)); bb=T((max#REPEAT(mindon,nbpow,1)-min#REPEAT(maxdon,nbpow,1))/(max-min)); mat=J(1,nobs,1); transf=T(power @ mat) || (T(aa @ mat) #transf+ T(bb @ mat)); CREATE _transf FROM transf[COLNAME={power &var}]"; APPEND FROM transf; CLOSE _transf; DO i=1 TO nvar; CALL SYMPUT(COMPRESS(CONCAT('_neg',CHAR(i,3))),neg[i]); END; QUIT;"%;I1&_nvar1"(&&_neg&i EQ 1)"^NAttention : &&_var&i a des valeurs ngatives ou nulles. Elle a t translate.""  PROC BOXPLOT DATA=_transf; PLOT &&_var&i * power / CAXIS = black CTEXT = black CBOXES = black VAXIS=axis1 BOXSTYLE = &boxsty ¬ches IDCOLOR = black IDSYMBOL=dot; SYMBOL1 C=black H=0.5; AXIS1 LABEL=none"UI MAJOR=none VALUE=none; TITLE "&&_var&i"; RUN; QUIT; TITLE;";""/# SYMBOL1; AXIS1; TITLE; FOOTNOTE;"x#0` P@l,@Xl(<t 8H\  |PhxLdt L  0 p  h @ X h | 4 8P`tPhx@Xh|(DX 0\(u$D\x$d(tTl|,DTh  ( (DD 4H0l@ T p $!,!@!h!!!!"4"<"H#X#####$$P$d$$%&''l''''8(@(T(|((())H)P)\*l****++0++++,,,,,,,-H-t----.(/d/|///// 040P0\1h2t345@5`555687@7T77vr-bar)##2)[+]*year; residu=total-roweff-coleff; ssq= roweff // residu ; dfe=(year-1)*(period-1)"; dgr= (year-1) // dfe ; msq= (roweff / (year-1)) // (residu / dfe); IF (residu ^= 0) THEN DO; fisher=(roweff / (year-1)) / (residu / dfe) ; prob=1-PROBF(fisher,year-1,dfe); END; ELSE DO; fisher=.; prob=.; END; res="fisher || ROUND(prob,0.0001); FINISH anaregr2; START kw(xserie,res) GLOBAL(period); RUN creertab(xserie,xser); c=LOC(xser ^= .); xser[c]=RANK(xser[c]); srank2=xser[+,]##2; ncas=(xser ^= .)[+,]; nobs=ncas[+];"  chi2=(12/(nobs*(nobs+1)))*(srank2 / ncas)[+] - 3*(nobs+1); prob=1-PROBCHI(chi2,period-1); res=chi2 || ROUND(prob,0.0001); FINISH kw; START Friedman(xserie,res) GLOBAL(period); RUN creertab(xserie,xser); nomiss=("xser ^=.)[,+]; ycomp=LOC(nomiss[,+]=period); nyears=NCOL(ycomp); xser=xser[ycomp,]; DO i=1 TO nyears; xser[i,]=RANK(xser[i,]); END; srank=xser[+,]-(nyears*(period+1)/2); chi2=12*SSQ(srank)/(nyears*period*(period+1)); prob=1-" PROBCHI(chi2,period-1); res=chi2 || ROUND(prob,0.0001); FINISH Friedman; START regm(yser,xreg,minprob); cc=LOC(yser^=.); y=yser[cc,]; nobs=NROW(y); x=xreg[cc,]; x=J(nobs,1,1) || x; nvar=NCOL(x); xpxi=INV(" T(x)*x); beta=xpxi*(T(x)*y); yhat=x*beta; resid=y-yhat; sse=SSQ(resid); dfe=nobs-nvar; mse=sse/dfe; stdb=SQRT(VECDIAG(xpxi)*mse); t=J(NROW(beta),1,.); cc=LOC(stdb^=0); IF (NCOL(cc)^=0) THEN t[cc]=beta[cc]/stdb[cc]; prob=1-" PROBF(t#t,1,dfe); minprob=ROUND(MIN(prob[2:nvar]),0.0001); FINISH regm; START mstat(xser,xtrend,xirreg,xsa,xlin,xseas,xtd,xout,mstats,model) GLOBAL(period); qual=J(31,1,.); nmiss=NMISS(xser||xtrend||xsa||xlin||" xseas||xirreg||xtd||xout)[,+]; cc=LOC(nmiss^=0); IF (NCOL(cc)^=0) THEN DO; dd=LOC(nmiss=0); xser=xser[dd]; xtrend=xtrend[dd]; xsa=xsa[dd]; xlin=xlin[dd]; xseas=xseas[dd]; xirreg=xirreg[dd]; xtd=xtd[dd]; xout=xout[" dd]; END; IF (model=0) THEN xsi=xlin - xtrend; ELSE xsi=xlin / xtrend; lag=period/4; ndon=NROW(xser); *RUN extrem(xirreg,model,4,weight); *e3=CHOOSE(weight=0,model,xirreg); e3=xirreg; f2a=J(period," 5,0); DO i=1 TO period; IF (model=0) THEN DO; f2a[i,1]=ABS(xtrend[1+i:ndon] - xtrend[1:ndon-i])[:]; f2a[i,2]=ABS(xseas[1+i:ndon] - xseas[1:ndon-i])[:]; f2a[i,3]=ABS(xtd[1+i:ndon] - xtd[1:ndon-i])[:]; f2a[i,4]=ABS(e3[1+i:ndon] -"  e3[1:ndon-i])[:]; f2a[i,5]=ABS(xout[1+i:ndon] - xout[1:ndon-i])[:]; END; ELSE DO; f2a[i,1]=ABS(xtrend[1+i:ndon] / xtrend[1:ndon-i] -1)[:]; f2a[i,2]=ABS(xseas[1+i:ndon] / xseas[1:ndon-i] -1)[:]; f2a[i,3]=ABS(xtd[1+i:ndon] / xtd"[1:ndon-i] -1)[:]; f2a[i,4]=ABS(e3[1+i:ndon] / e3[1:ndon-i] -1)[:]; f2a[i,5]=ABS(xout[1+i:ndon] / xout[1:ndon-i] -1)[:]; END; END; f2b=f2a ## 2; sum=f2b[,+]; f2b=f2b/REPEAT(sum,1,5); qual[1]=10*f2b[lag,4]/(1-f2b[lag,5]);" comp=xlin||e3||xtrend||xseas||xout||xtd; IF (model=1) THEN comp=LOG(comp); varend=J(ndon,1,1)||T(1:ndon); ols=varend*INV(T(varend)*varend)*T(varend)*comp[,3]; comp[,1]=comp[,1] - ols; comp[,3]=comp[,3] - ols;" mean=J(1,NCOL(comp),0); mean[,{1 3 5}]=comp[:,{1 3 5}]; f2f=(comp[##,]/NROW(comp))-mean##2; f2f=100*f2f / f2f[,1]; qual[2]=10*f2f[2]/(100-f2f[5]); sum=(f2f[,2:6])[+]; qual[27:31]=ROUND(100#f2f[2:6]/sum,0.01); IF (" model=0) THEN xcvs=xtrend+e3; ELSE xcvs=xtrend#e3; IF (period=12) THEN RUN henders(13,hend); ELSE RUN henders(5,w"(&nblaga LE 0 )"1!ERROR: You must have &nblaga > 0"FINMACRO" ;""'(%LENGTH(&arima ) EQ 0)"ARIMA" 2"">.(%LENGTH(%QSCAN(%BQUOTE(&arima ),2, )) NE 0)"XHERROR: You must precise just one value for the arima (&arima ) parameter"FINMACRO" ;""+(%DATATYP(&arima ) EQ CHAR)"D4ERROR: The arima (&arima ) parameter must be numeric"FINMACRO" ;""C3((%UPCASE(&arima) NE 1) AND (%UPCASE(&arima) NE 2))"P@ERROR: The arima (&arima ) parameter must be choosen among (1 2)"FINMACRO" ;""((%LENGTH(&outnew ) EQ 0)"OUTNEW" _outnew_""?/(%LENGTH(%QSCAN(%BQUOTE(&outnew ),2, )) NE 0)"ZJERROR: You must precise just one value for the outnew (&outnew ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outnew ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outnew (&outnew ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outcah ) EQ 0)"OUTCAH" _outcah_""?/(%LENGTH(%QSCAN(%BQUOTE(&outcah ),2, )) NE 0)"ZJERROR: You must precise just one value for the outcah (&outcah ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outcah ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outcah (&outcah ) parameter must be a valid SAS dataset name"FINMACRO" ;"")(%LENGTH(&outdata ) EQ 0)"OUTDATA" _outdata_""@0(%LENGTH(%QSCAN(%BQUOTE(&outdata ),2, )) NE 0)"\LERROR: You must precise just one value for the outdata (&outdata ) parameter"FINMACRO" ;""4( %sasnom(_IN_=&outdata ,TYPE=DATASET);" (&_ret_ NE 0)"YIERROR: The outdata (&outdata ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outmed ) EQ 0)"OUTMED" _outmed_""?/(%LENGTH(%QSCAN(%BQUOTE(&outmed ),2, )) NE 0)"ZJERROR: You must precise just one value for the outmed (&outmed ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outmed ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outmed (&outmed ) parameter must be a valid SAS dataset name"FINMACRO" ;""*(%LENGTH(&clusters ) EQ 0)"CLUSTERS" _clusters_""A1(%LENGTH(%QSCAN(%BQUOTE(&clusters ),2, )) NE 0)"^NERROR: You must precise just one value for the clusters (&clusters ) parameter"FINMACRO" ;""5) %sasnom(_IN_=&clusters ,TYPE=DATASET);" (&_ret_ NE 0)"[KERROR: The clusters (&clusters ) parameter must be a valid SAS dataset phend); RUN moymob(xcvs,xcycle,hend,0); difcbar=J(ndon,1,.); difibar=J(ndon,1,.); IF (model=0)"  THEN DO; xirr2=xcvs-xcycle; difibar[2:ndon]=ABS(xirr2[2:ndon] - xirr2[1:ndon-1]); difcbar[2:ndon]=ABS(xcycle[2:ndon] - xcycle[1:ndon-1]); END; ELSE DO; xirr2=xcvs/xcycle; difibar[2:ndon]=ABS(xirr2[2:ndon] / xirr2[1:ndon-1] -1);"  difcbar[2:ndon]=ABS(xcycle[2:ndon] / xcycle[1:ndon-1] -1); END; ibar=difibar[:]; cbar=difcbar[:]; ratio=ibar / cbar; qual[3]=(ratio-1)/2; RUN avrun(xirreg,a,model); qual[4]=ABS((3*(ndon-1)/a) - 2*(ndon-1))/(2.577*SQRT(" 1.6*ndon-2.9)); f2e=J(1,period,.); cc=LOC(f2a[,1]^=0); IF (NCOL(cc)^=0) THEN f2e[cc]=T(f2a[cc,4] / f2a[cc,1]); mcd=1; cc=LOC(f2e >=1); zz=100*f2a; IF (NCOL(cc) ^=0) THEN mcd=MIN(cc[NCOL(cc)]+1,period); IF (mcd = 1) THEN"  DO; IF ((f2e[1]-f2e[2])^=0) THEN rmcd=1+(f2e[mcd]-1)/(f2e[1]-f2e[2]); ELSE rmcd=.; IF (rmcd < 0.5) THEN rmcd=0.5; IF (rmcd > 1) THEN rmcd=1; END; ELSE DO; IF ((f2e[mcd-1]-f2e[mcd])^=0) THEN rmcd=mcd+(f2e[mcd]-1)/(f2e["mcd-1]-f2e[mcd]); ELSE rmcd=mcd; IF ((mcd = period) & (f2e[period-1] <= f2e[period])) THEN rmcd=12*15.5/period; END; qual[5]=(12*rmcd/period - 0.5)/5; IF (model=1) THEN DO; RUN anaregr1(100#xsi,t1);"  RUN anaregr2(100#xsi,t2,1); END; ELSE DO; RUN anaregr1(xsi,t1); RUN anaregr2(xsi,t2,0); END; RUN kw(xsi,res); qual[6]=SQRT((7+3*t2[1])/(2*t1[1])); qual[13:14]=t1; qual[15:16]=t2; qual[17:18]=res; a=xsa[1+lag:ndon] -"  xsa[1:ndon-lag]; RUN anaregr1(a,t1); qual[19:20]=t1; RUN Friedman(a,res); qual[21:22]=res; RUN anaregr1(xirreg,t1); qual[23:24]=t1; RUN Friedman(xirreg,res); qual[25:26]=res; std=SQRT(((xseas - model)##2)[:]); IF (std"  ^= 0) THEN d10bis=(xseas-model)/std; ELSE d10bis=J(NROW(xseas),NCOL(xseas),.); RUN creertab(d10bis,sbis); nrow=NROW(sbis); difsbis=sbis[1:nrow-1,] - sbis[2:nrow,]; qual[7]=10*ABS(difsbis)[:]; qual[8]=10*ABS(difsbis[:,])[:]; qual" [1:10]=CHOOSE(qual[1:10]>3,3,qual[1:10]); qual[1:10]=CHOOSE(qual[1:10]<0,0,qual[1:10]); IF (ndon > 6*period) THEN DO; d10bis=d10bis[ndon-6*period+1:ndon-2*period+1]; sbis=SHAPE(d10bis,4,period); difsbis=sbis[1:3,] - sbis[2:4,]; qual[" 9]=10*ABS(difsbis)[:]; qual[10]=10*ABS(difsbis[:,])[:]; wqual={10 11 10 8 11 18 7 7 4 4}; END; ELSE DO; wqual={17 17 10 5 11 30 7 7 0 0}; END; mstats=qual; mstats[11]=(T(wqual)#qual[1:10]/wqual[+])[+]; cc=LOC(mstats[1:10] > 1" ); mstats[12]=NCOL(cc); FINISH mstat; USE __varraw__; READ all VAR{&varlist} INTO raw; READ all VAR{&date} INTO date; CLOSE __varraw__; USE __varsa__; READ all VAR{&varlist} INTO sa; CLOSE __varsa__; USE __vartcy__; READ all"  VAR{&varlist} INTO trend; CLOSE __vartcy__; USE __varlin__; READ all VAR{&varlist} INTO linear; CLOSE __varlin__; USE __varsf__; READ all VAR{&varlist} INTO season; CLOSE __varsf__; USE __varirr__; READ all VAR{&varlist} INTO irreg;" CLOSE __varirr__; USE __vartd__; READ all VAR{&varlist} INTO tdays; CLOSE __vartd__; USE __varout__; READ all VAR{&varlist} INTO outliers; CLOSE __varout__; USE __varao__; READ all VAR{&varlist} INTO ao; CLOSE __varao__; USE"  __varls__; READ all VAR{&varlist} INTO ls; CLOSE __varls__; USE __vartc__; READ all VAR{&varlist} INTO tc; CLOSE __vartc__; USE TDregressors; READ all VAR{Monday Tuesday Wednesday Thursday Friday Saturday WeekDays LeapYear} INTO tdregr;" CLOSE TDregressors; namecols={&varlist}; nobs=NROW(date); period=date[2]-date[1]; IF ((25<=period) & (period<=35)) THEN peqname"FINMACRO" ;""( (%LENGTH(&nbclus ) EQ 0)"NBCLUS" 5""?/(%LENGTH(%QSCAN(%BQUOTE(&nbclus ),2, )) NE 0)"ZJERROR: You must precise just one value for the nbclus (&nbclus ) parameter"FINMACRO" ;"",(%DATATYP(&nbclus ) EQ CHAR)"F6ERROR: The nbclus (&nbclus ) parameter must be numeric"FINMACRO" ;""(&nbclus LE 0 )"1!ERROR: You must have &nbclus > 0"FINMACRO" ;"")(%LENGTH(&summary ) EQ 0)"SUMMARY" 0","@"0(%LENGTH(%QSCAN(%BQUOTE(&summary ),2, )) NE 0)"\LERROR: You must precise just one value for the summary (&summary ) parameter"FINMACRO" ;"""-'(%DATATYP(&summary ) EQ CHAR)"H8ERROR: The summary (&summary ) parameter must be numeric"FINMACRO" ;"," ,(&summary LT 0 )"3#ERROR: You must have &summary >= 0"FINMACRO" ;","'0(%LENGTH(&graph ) EQ 0)"GRAPH" NO"?">5.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"XHERROR: You must precise just one value for the graph (&graph ) parameter"FINMACRO" ;"5"*:(%DATATYP(&graph ) EQ NUM)"F6ERROR: The graph (&graph ) parameter must be character"FINMACRO" ;"?"F?6((%UPCASE(&graph) NE YES) AND (%UPCASE(&graph) NE NO))"TDERROR: The graph (&graph ) parameter must be choosen among (YES NO )"FINMACRO" ;"?")C(%LENGTH(&medoids ) EQ 0)"MEDOIDS" 1"R"@H0(%LENGTH(%QSCAN(%BQUOTE(&medoids ),2, )) NE 0)"\LERROR: You must precise just one value for the medoids (&medoids ) parameter"FINMACRO" ;"H"-M(%DATATYP(&medoids ) EQ CHAR)"H8ERROR: The medoids (&medoids ) parameter must be numeric"FINMACRO" ;"R" R(&medoids LE 0 )"2"ERROR: You must have &medoids > 0"FINMACRO" ;"R"&V(%LENGTH(&gmax ) EQ 0)"GMAX" 50"e"=[-(%LENGTH(%QSCAN(%BQUOTE(&gmax ),2, )) NE 0)"VFERROR: You must precise just one value for the gmax (&gmax ) parameter"FINMACRO" ;"["*`(%DATATYP(&gmax ) EQ CHAR)"B2ERROR: The gmax (&gmax ) parameter must be numeric"FINMACRO" ;"e"e (&gmax LE 0 )"/ERROR: You must have &gmax > 0"FINMACRO" ;"e"'i(%LENGTH(&print ) EQ 0)"PRINT" NO"x">n.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"XHERROR: You must precise just oner%LENGTH(&detail ) EQ 0)"DETAIL" 5"l"?b/(%LENGTH(%QSCAN(%BQUOTE(&detail ),2, )) NE 0)"_OERROR: Vous devez prciser une seule valeur pour le paramtre detail (&detail )"FINMACRO" ;"b",g(%DATATYP(&detail ) EQ CHAR)"SCERROR: La valeur du paramtre detail (&detail ) doit tre numrique"FINMACRO" ;"l"YlI((&detail NE 0) AND (&detail NE 3) AND (&detail NE 5) AND (&detail NE 7))"bRERROR: La valeur du paramtre detail (&detail ) doit tre choisie parmi (0 3 5 7 )"FINMACRO" ;"l"&p(%LENGTH(&mean ) EQ 0)"MEAN" non""=u-(%LENGTH(%QSCAN(%BQUOTE(&mean ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre mean (&mean )"FINMACRO" ;"u")z(%DATATYP(&mean ) EQ NUM)"O?ERROR: La valeur du paramtre mean (&mean ) doit tre caractre"FINMACRO" ;""E5((%UPCASE(&mean) NE OUI) AND (%UPCASE(&mean) NE NON))"^NERROR: La valeur du paramtre mean (&mean ) doit tre choisie parmi (oui non )"FINMACRO" ;""'(%LENGTH(&tronq ) EQ 0)"TRONQ" non"">.(%LENGTH(%QSCAN(%BQUOTE(&tronq ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre tronq (&tronq )"FINMACRO" ;""*(%DATATYP(&tronq ) EQ NUM)"QAERROR: La valeur du paramtre tronq (&tronq ) doit tre caractre"FINMACRO" ;""G7((%UPCASE(&tronq) NE OUI) AND (%UPCASE(&tronq) NE NON))"`PERROR: La valeur du paramtre tronq (&tronq ) doit tre choisie parmi (oui non )"FINMACRO" ;""ERREUR" 0"[O DATA _NULL_; IF (INT(&dec ) ^= &dec ) THEN CALL SYMPUT('erreur','1'); RUN;"(&erreur EQ 1)"M=ERROR: Vrifiez le type entier souhait des paramtres (dec )"FINMACRO" ;""  PROC CONTENTS DATA=&data(KEEP=&var) OUT=nomvar NOPRINT; RUN; DATA _NULL_; SET nomvar END=fin; nvar+1; CALL SYMPUT('_var'||LEFT(PUT(nvar,3.)),name); IF fin THEN CALL SYMPUT('_nvar',LEFT(PUT(nvar,3.))); RUN; PROC IML; lettres="UIT({M F E D C B A Z Y X W V U T S R Q P O}); USE &data; READ all VAR{"%I1&_nvar1" &&_var&i"";/ } INTO donnees; CLOSE &data; nomvar={"% I1&_nvar1" &&_var&i" ";/ }; nvar=NCOL(donnees); nobs=NROW(donnees);"#(%LENGTH(&id) NE 0)" USE &data; READ all VAR{&id} INTO ident; CLOSE &data; IF (TYPE(ident)='R') THEN ident=LEFT(TRIM(CHAR(ident,8))); ELSE DO; ident=LEFT(TRIM(ident)); IF (MAX(LENGTH(ident)) >= 8) THEN ident=SUBSTR(ident,1,8); END;""7+ ident=LEFT(CHAR(T(1:NROW(donnees)),6));" prof=donnees; RESET NONAME; DO i=1 TO nvar; nom=nomvar[i]; don=donnees[,i]; cc=LOC(don ^=.); ncas=NCOL(cc); RESET NONAME; PRINT "RsumssK Numriques de la variable" nom; PRINT nobs "observations" , ncas" "observations non manquantes"; RESET NAME; IF (ncas^=0) THEN DO; dd=don[cc]; dd2=dd; id=ident[cc]; id2=id; rang=RANK(dd); pp=(rang || ncas-rang+1)[,><]; pp2=pp; dd[rang]=dd2; id[rang]=id2; pp[rang]=pp2;"  log=INT(LOG2(ncas)); resume=J(log,3,.); names=J(log,2,' '); nn=J(log,1,ncas); DO j=2 TO log; nn[j,]=INT((nn[j-1,]+1)/2); END; nn=nn[2:log]//{1}; lett2=lettres[1:log-1] // {O}; letters=COMPRESS(CONCAT(lett2," '(',CHAR(nn),')')); DO j=1 TO log; resume[j,{1 3}]=T(dd[LOC(pp=nn[j])]); names[j,1:2]=T(id[LOC(pp=nn[j])]); END; resume[1,2]=(resume[1,1]+resume[1,3])/2; trimean=resume[2,1]/4+resume[1,2]/2+resume[2,3]/4; log2=INT(LOG10(MAX(" ABS(resume[log,{1 3}])))); nchar=log2+&dec+3; spread=resume[,3]-resume[,1]; mispread=(resume[,3]+resume[,1])/2; spread=CHAR(spread,nchar,&dec); spread[1]=' '; mispread=CHAR(mispread,nchar,&dec); mispread[1]=' '; resume=CHAR"(resume,nchar,&dec); resume[1,{1 3}]=' '; ndetail=(1:log); IF ((&detail=3) & (log > 1)) THEN ndetail={1} || log; IF ((&detail=5) & (log > 2)) THEN ndetail={1 2} || log; IF ((&detail=7) & (log > 3)) THEN ndetail={1 2 3} || log;"  letters=letters[ndetail,]; names=names[ndetail,]; resume=resume[ndetail,]; spread=spread[ndetail,]; mispread=mispread[ndetail,]; trimean=CHAR(trimean,nchar,&dec); PRINT letters[LABEL=" "] names[LABEL="Ident"] resume[" LABEL=" "]")(%UPCASE(&spread) EQ OUI)"I= spread[LABEL='Spread'] mispread[LABEL='Midspread']""  trimean ;"'(%UPCASE(&mean) EQ OUI)" mean=dd[:]; variance=SSQ(dd - mean)/(ncas-1); log2=INT(LOG10(MAX(ABS(mean || variance)))); nchar=log2+&dec+3; mean=CHAR(mean,nchar,&dec); variance=CHAR(variance,nchar,&dec); PRINT mean variance;""((%UPCASE(&tronq) EQ OUI)" ordre=INT(ncas#DO(5,45,5)/100); tronq=J(2,9,.); DO ii=1 TO 9; non=ordre[ii]; valeurs=dd[non+1:ncas-non]; tronq[1,ii]=valeurs[:]; tronq[2,ii]=(J(non,1,dd[non+1])//valeurs//J(non,1,dd[ncas-non]))[:]; END;" log2=INT(LOG10(MAX(ABS(tronq)))); nchar=log2+&dec+3; tronq=CHAR(tronq,nchar,&dec); nomcols=CHAR(DO(5,45,5),nchar-&dec); nomligs={'Tronques' 'winsorises'}; PRINT tronq[COLNAME=nomcols ROWNAME=nomligs];""/# END; PRINT /; END; QUIT;"#0` P$8tx L$8`x<x  4\p0 H X l  $ @ t   X t ` x D `x\t<Phx4L\px4L\p0@TlLdt,4p0hdlx !"""0#D#d##$$$%&&&L"tSTEMhD9.2  x>@>"0DATA"0VAR"0ID"0IDEXTR"0FORM"0BORNE"0COLS"0MAXLIG"0MINLIG"0NGROUP"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"!"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"!(&syserr NE 0)"?/ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;"!"%%(%LENGTH(&var ) EQ 0)"VAR" _numeric_","[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;",(&syserr NE 0)"=-ERROR: Problme dans le paramtre var (&var )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;","$5(%LENGTH(&id ) NE 0)"[O DATA _NULL_; SET &data (KEEP=&id OBS=1); ARRAY _xx_(*) $ &id ; RUN;"4(&syserr NE 0)";+ERROR: Problme dans le paramtre id (&id )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"4"5"(>(%LENGTH(&idextr ) NE 0)"cW DATA _NULL_; SET &data (KEEP=&idextr OBS=1); ARRAY _xx_(*) $ &idextr ; RUN;"=(&syserr NE 0)"C3ERROR: Problme dans le paramtre idextr (&idextr )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"=">"&B(%LENGTH(&form ) EQ 0)"FORM" 4"Q"=G-(%LENGTH(%QSCAN(%BQUOTE(&form ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre form (&form )"FINMACRO" ;"G"*L(%DATATYP(&form ) EQ CHAR)"O?ERROR: La valeur du paramtre form (&form ) doit tre numrique"FINMACRO" ;"Q"Q (&form LE 0 )"2"ERROR: Vous devez avoir &form > 0"FINMACRO" ;"Q"'U(%LENGTH(&borne ) EQ 0)"BORNE" 2"d">Z.(%LENGTH(%QSCAN(%BQUOTE(&borne ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre borM"NAME"# %SCAN(&datalist,&i)"YM DATA &name; MERGE &name _dates_(IN=in1); BY &date; IF in1; RUN;"$" DATA TDregressors; LENGTH Date year month qtr NbDays Day1-Day7 TD Monday Tuesday Wednesday Thursday Friday Saturday WeekDays LeapYear 8 ; KEEP Date year month qtr Monday Tuesday Wednesday Thursday Friday Saturday WeekDays LeapYear;"  ARRAY days(7) Day1-Day7; ARRAY reg(6) Monday Tuesday Wednesday Thursday Friday Saturday; LABEL TD='Trading Week Days' LeapYear='Leap Year' ; Firstyear=&firsty; Lastyear=&firsty + 2799; Date=MDY(12,1,Firstyear-1); DO k=1"  TO (Lastyear-Firstyear+1)*12; Date=INTNX('month',date,1); Year=YEAR(date); Month=MONTH(date); Qtr=QTR(date); Nbdays=INTNX('month',date,1)-date; DO i=1 TO DIM(days); days(i)=0; END; DO i=1 TO NbDays; jj=WEEKDAY(date+i-1);" days(jj)=days(jj)+1; END; LeapYear=0; IF (month=2) THEN DO; LeapYear=-0.25; IF (MOD(year,4)=0 & MOD(year,100) NE 0) OR MOD(year,400)=0 THEN LeapYear=0.75; END; TD=SUM(OF day2-day6);" DO i=1 TO 6; reg(i)=days(i+1)-days(1); END; WeekDays=TD - 5*(Day1+Day7)/2; OUTPUT; END; RUN; PROC SORT DATA=TDregressors OUT=sorted; BY Month; RUN; PROC MEANS DATA=sorted NOPRINT;"  VAR Monday Tuesday Wednesday Thursday Friday Saturday WeekDays; CLASS Month; OUTPUT OUT=means MEAN=mean1-mean7; RUN; DATA sorted; MERGE sorted means(FIRSTOBS=2 DROP=_type_ _freq_); BY Month; DROP i mean1-mean7; ARRAY all(*) Monday Tuesday" Wednesday Thursday Friday Saturday WeekDays; ARRAY meanx(*) mean1-mean7; DO i=1 TO DIM(all); all(i)=all(i)-meanx(i); END; RUN; PROC SORT DATA=sorted OUT=TDregressors; BY &date; RUN;"(&period EQ 4)" PROC SUMMARY DATA=TDregressors(DROP=&date) NWAY; VAR Monday Tuesday Wednesday Thursday Friday Saturday WeekDays LeapYear; BY Year Qtr; OUTPUT OUT=TDregressors(DROP=_type_ _freq_) SUM=; RUN; DATA TDregressors; LENGTH &date 8; SET"C7 TDregressors; &date=MDY(3*(qtr-1)+1,1,Year); RUN;"" DATA TDregressors; MERGE TDregressors(KEEP=&date Monday Tuesday Wednesday Thursday Friday Saturday WeekDays LeapYear) _dates_(IN=in1); BY &date; IF in1; RUN;" __NETTOY__"5 %&__nettoy__ sorted means TDregressors"l` PROC IML; START creertab(entree,sortie) GLOBAL(cycle,perdeb,period);" (perdeb >= 1)"oc avant=J(perdeb,1,.); avant=avant//entree; sortie=SHAPE(avant,NROW(cycle),period,.);""<0 sortie=SHAPE(entree,NROW(cycle),period,.);"  FINISH creertab; START moymob(xserie,movav,coef,ends); movav=J(NROW(xserie),1,0); mmob1=xserie[LOC(xserie ^= .)]; nobs=NROW(mmob1); mmob2=J(nobs,1,.); ordre=NROW(coef"); ncols=NCOL(coef); nb=INT(ordre / 2); IF (ordre <= nobs) THEN DO; mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef[,ncols]),T(mmob1))[ordre:nobs]); END; ELSE mmob2=J(nobs,1,mmob1[:]); IF ((ends=1) | (ordre > nobs))"  THEN DO; mmob2[1:nb]=J(nb,1,mmob2[1+nb]); mmob2[nobs-nb+1:nobs]=J(nb,1,mmob2[nobs-nb]); END; ELSE IF (ends=2) THEN DO; mmob3=mmob1; IF (ordre > nobs) THEN mmob3=mmob1 // J(ordre-nobs,1,0); mmob2[1:nb]=T(T(mmob3[1:" ordre])*coef[,1:nb]); IF (ordre > nobs) THEN mmob3= J(ordre-nobs,1,0) //mmob1; nobs3=NROW(mmob3); mmob2[nobs:nobs-nb+1]=T(T(mmob3[nobs3:nobs3-ordre+1])*coef[,1:nb]); IF (nobs < oN"tMEDMOBhD9.2  T=T>"0DATA"0OUT"0VAR"0DATE"0LISSEUR"0TWICE"0INTER"0PRINT"0GRAPH"0CBRUT"0CLIS"0DEBUG",FINMACROS" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"&"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"&(&syserr NE 0)"?/ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;"&"%*(%LENGTH(&out ) EQ 0)"OUT" _result_"5"</,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"YIERROR: Vous devez prciser une seule valeur pour le paramtre out (&out )"FINMACRO" ;"/"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"5 (&_ret_ NE 0)"^NERROR: La valeur du paramtre out (&out ) doit tre un nom de table SAS valide"FINMACRO" ;"5"%C(%LENGTH(&var ) NE 0)"<;,(%LENGTH(%QSCAN(%BQUOTE(&var ),2, )) NE 0)"YIERROR: Vous devez prciser une seule valeur pour le paramtre var (&var )"FINMACRO" ;";"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"B(&syserr NE 0)"=-ERROR: Problme dans le paramtre var (&var )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"B"C"&G(%LENGTH(&date ) EQ 0)"DATE" date"S"=L-(%LENGTH(%QSCAN(%BQUOOTE(&date ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre date (&date )"FINMACRO" ;"L"]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"S(&syserr NE 0)"?/ERROR: Problme dans le paramtre date (&date )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"S")Z(%LENGTH(&lisseur ) NE 0)"@Y0(%LENGTH(%QSCAN(%BQUOTE(&lisseur ),2, )) NE 0)"aQERROR: Vous devez prciser une seule valeur pour le paramtre lisseur (&lisseur )"FINMACRO" ;"Y"Z"'^(%LENGTH(&twice ) EQ 0)"TWICE" non"m">c.(%LENGTH(%QSCAN(%BQUOTE(&twice ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre twice (&twice )"FINMACRO" ;"c"*h(%DATATYP(&twice ) EQ NUM)"QAERROR: La valeur du paramtre twice (&twice ) doit tre caractre"FINMACRO" ;"m"5m%((&twice NE oui) AND (&twice NE non))"`PERROR: La valeur du paramtre twice (&twice ) doit tre choisie parmi (oui non )"FINMACRO" ;"m"'q(%LENGTH(&inter ) EQ 0)"INTER" non"">v.(%LENGTH(%QSCAN(%BQUOTE(&inter ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre inter (&inter )"FINMACRO" ;"v"*{(%DATATYP(&inter ) EQ NUM)"QAERROR: La valeur du paramtre inter (&inter ) doit tre caractre"FINMACRO" ;""5%((&inter NE oui) AND (&inter NE non))"`PERROR: La valeur du paramtre inter (&inter ) doit tre choisie parmi (oui non )"FINMACRO" ;""'(%LENGTH(&print ) EQ 0)"PRINT" non"">.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre print (&print )"FINMACRO" ;""*(%DATATYP(&print ) EQ NUM)"QAERROR: La valeur du paramtre print (&print ) doit tre caractre"FINMACRO" ;""5%((&print NE oui) AND (&print NE non))"`PERROR: La valeur du paramtre print (&print ) doit tre choisie parmi (oui non )"FINMACRO" ;""'(%LENGTH(&graph ) EQ 0)"GRAPH" non"">.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre graph (&graph )"FINMACRO" ;""*(%DATATYP(&graph ) EQ NUM)"QAERROR: La valeur du paramtre graph (&graph ) doit tre caractre"FINMACRO" ;""5%((&graph NE oui) AND (&graph NE non))"`PERROR: La valeur du paramtre graph (&graph ) doit tHre choisie parmi (oui non )"FINMACRO" ;""'(%LENGTH(&cbrut ) EQ 0)"CBRUT" black"">.(%LENGTH(%QSCAN(%BQUOTE(&cbrut ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre cbrut (&cbrut )"FINMACRO" ;""*(%DATATYP(&cbrut ) EQ NUM)"QAERROR: La valeur du paramtre cbrut (&cbrut ) doit tre caractre"FINMACRO" ;""&(%LENGTH(&clis ) EQ 0)"CLIS" red""=-(%LENGTH(%QSCAN(%BQUOTE(&clis ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre clis (&clis )"FINMACRO" ;"")(%DATATYP(&clis ) EQ NUM)"O?ERROR: La valeur du paramtre clis (&clis ) doit tre caractre"FINMACRO" ;""ERREUR" 0"LISSEUR"* %CMPRES(%UPCASE(&lisseur))"0 %VERIFY(&lisseur,23456789RSHIJK)"^NERROR: Les seuls caractres permis pour dfinir le lisseur sont 23456789RSHIJK"ERREUR" 1""SM_0" 0"ERRR" 0"LONGUEUR"! %LENGTH(&lisseur)"( (I1&longueur1"SM_&I"& %SUBSTR(&lisseur,&i,1)"J"  %EVAL(&i-1)"B2((&&sm_&i EQ R) AND (%VERIFY(&&sm_&j,02468RHIJK)))"ERRR" 1""(" (errr EQ 1)"aQERROR: R doit etre utilis aprs une mdiane mobile impaire ou aprs le Splitting"ERREUR" 1"" (&erreur=1)"FINMACRO""ERRX" 0" DATA _trav_; SET &data END=f; IF (&var ^= .) THEN ndon+1; IF ((&var ^= .) AND (LAG(&var)=.) AND (ndon > 1)) THEN CALL SYMPUT('errx','1'); IF (&var ^= .);" (&date EQ)"DATE" numero" numero=_n_;""% KEEP &var &date; RUN;" (errx = 1)"C3ERROR: Valeur manquante dans la srie lisser &var"FINMACRO" ;"" PROC IML SYMSIZE=200; START moymob(xserie,movav,coeff); _ndon=NROW(xserie); movav=xserie; nb=INT(NROW(coeff)/2); DO i=1+nb TO _ndon-nb; movav[i]=T(xserie[i-nb:i+nb])*coeff; END;" FINISH moymob; START medmob(xserie,movav,ordre,npair); _ndon=NROW(xserie); movav=xserie; nb=INT(ordre/2); nb1=ordre-nb-1; pair=npair*(nb ^= nb1); DO i=1+nb TO _ndon-nb1; movav[i-pair]="MEDIAN(xserie[i-nb:i-nb+ordre-1]); END; IF (nb >= 2) THEN DO i=2 TO nb; movav[i-pair]=MEDIAN(xserie[1:2*i-1]); END; IF (nb1 > 1) THEN DO i=_ndon-nb1+1 TO _ndon-1; movav[i-pair]=MEDIAN(xserie[2*i-_ndon:_ndon]); END; movav[1]=" MEDIAN(xserie[1] // movav[2] // 3*movav[2]-2*movav[3]); movav[_ndon]=MEDIAN(xserie[_ndon] // movav[_ndon-1] // 3*movav[_ndon-1]-2*movav[_ndon-2]); FINISH medmob; START split(xserie,movav); _ndon=NROW(xserie); movaIv=xserie;"  DO i=3 TO _ndon-3 BY 2; IF ((xserie[i]=xserie[i+1]) & (xserie[i-1] ^= xserie[i]) & (xserie[i+2] ^= xserie[i+1]) & ((xserie[i] - xserie[i-1])*(xserie[i+1]-xserie[i+2]) > 0) ) THEN DO; movav[i]=MEDIAN(xserie[i] // xserie[i-1] // 3*xserie"[i-1]-2*xserie[i-2]); movav[i+1]=MEDIAN(xserie[i+1] // xserie[i+2] // 3*xserie[i+2]-2*xserie[i+3]); END; END; FINISH split; USE _trav_; READ all VAR{&var} INTO donnees; READ all VAR{&date} INTO date; CLOSE _trav_; liss0="donnees; nom={"&var"}; resultat=donnees; hanning={1, 2, 1} /4; ianning={1, 2, 2, 2, 1} /8; janning={1, 1, 1, 2, 1, 1, 1} /8; kanning={1, 1, 2, 3, 2, 3, 2, 1, 1} /16; npair=1;"( ,I1&longueur1"J"  %EVAL(&i-1)"0 (%VERIFY(&&sm_&i,23456789) EQ 0)"j^ IF MOD(&&sm_&i,2)=0 THEN npair=ABS(npair-1); RUN medmob(liss&j,liss&i,&&sm_&i,npair);""(&&sm_&i EQ H)"3' RUN moymob(liss&j,liss&i,hanning);""(&&sm_&i EQ I)"3' RUN moymob(liss&j,liss&i,ianning);""(&&sm_&i EQ J)"3' RUN moymob(liss&j,liss&i,janning);"" (&&sm_&i EQ K)"3' RUN moymob(liss&j,liss&i,kanning);"" (&&sm_&i EQ S)"* RUN split(liss&j,liss&i);""(&&sm_&i EQ R)"NB _ndon=NROW(liss&j); lissa=J(_ndon,1,0); lissb=liss&j;"0 (%VERIFY(&&sm_&j,23456789) EQ 0)"} DO niter=1 TO 15 WHILE (ANY(lissa ^= lissb)); lissa=lissb; RUN medmob(lissa,lissb,&&sm_&j,npair); END;""(&&sm_&j EQ S)"zn DO niter=1 TO 15 WHILE (ANY(lissa ^= lissb)); lissa=lissb; RUN split(lissa,lissb); END;"" liss&i=lissa;""WK nom=nom || {"L%SUBSTR(&lisseur,1,&i)"}; resultat=resultat || liss&i;","(@(%UPCASE(&twice) EQ OUI)"I= npair=1; liss0=resultat[,1]-resultat[,NCOL(resultat)];"(; 7I1&longueur1"J"  %EVAL(&i-1)"0! (%VERIFY(&&sm_&i,23456789) EQ 0)"l` IF MOD(&&sm_&i,2)=0 THEN npair=ABS(npair-1); RUN medmob(liss&j,liss&i,&&sm_&i,npair);":"$(&&sm_&i EQ H)"4( RUN moymob(liss&j,liss&i,hanning);":"'(&&sm_&i EQ I)"4( RUN moymob(liss&j,liss&i,ianning);":"*(&&sm_&i EQ J)"4( RUN moymob(liss&j,liss&i,janning);":"-(&&sm_&i EQ K)"4( RUN moymob(liss&j,liss&i,kanning);":"0(&&sm_&i EQ S)"+ RUN split(liss&j,liss&i);":":(&&sm_&i EQ R)"QE _ndon=NROW(liss&j); lissa=J(_ndon,1,0); lissb=liss&j;"05 (%VERIFY(&&sm_&j,23456789) EQ 0)" DO niter=1 TO 15 WHILE (ANY(lissa ^= lissb)); lissa=lissb; RUN medmob(lissa,lissb,&&sm_&j,npair); END;"8"8(&&sm_&j EQ S)"~r DO niter=1 TO 15 WHILE (ANY(lissa ^= lissb)); lissa=lissb; RUN split(lissa,lissb); END;"8" liss&i=lissa;":"7"_S twicing=resultat[,NCOL(resultat)]+liss&longueur; nom=nom || {"L&J} lisseur.T"};"LISSEUR"  &lisseur.T"-! resultat=resultat || twicing;"@"(C(%UPCASE(&inter) NE OUI)"K? j=1 || NCOL(nom); resultat=resultat[,j]; nom=nom[,j];"C" resultat=date || resultat; nom= {"&date"} || nom; CREATE &out FROM resultat [COLNAME=nom]; APPEND FROM resultat ; CLOSE &out; QUIT;"(K(%UPCASE(&print) EQ OUI)"3' PROC PRINT DATA=&out; ID &date;"!I(&date NE numero)"' FORMAT &date MONYY5.;"I" RUN;"K"(S(%UPCASE(&graph) EQ OUI)"  GOPTIONS CBACK=white BORDER DISPLAY; TITLE2 H=1 "LISSAGE DE LA VARIABLE &var"; TITLE3 H=1 "(lisseur &lisseur)"; PROC GPLOT DATA=&out; SYMBOL1 COLOR=&cbrut INTERPOL=join VALUE=none; SYMBOL2 COLOR=&clis INTERPOL=join VALUE=none;"D8 PLOT &var*&date L&lisseur*&date / frame overlay;"!Q(&date NE numero)"* FORMAT &date MONYY5.;"Q"! RUN; QUIT;"S"T#T0` P@l(X  , @ |  D d ( d X x $ < L ` t t0pD$8`x@Xh|$8p 4L`t,<P| D 4H$Px\$xLdt4Phx0D \ l !!!!!!!!"("L"t"""""(#<#P#d#l###$$,$H$`$t$$$L%h%|%%%%%&L&d&t&&'()*+,|----.p..... /@/T/t////0$0D0p0000$1111`2t2223303|33334p44444 5@5T5t55556$6D6p6666(7777l88888949P9999::::;8;`;t;;;;<=8=d=x===Ks "U(&erreur EQ 2)"RBERROR: the NGRP parameter should have only positive integer values"U"FINMACRO" ;"X"xl PROC RANK DATA=&data(KEEP=&varx) OUT=&out GROUP=%SCAN(&ngrp,1); VAR %SCAN(&varx,1); RANKS r1; RUN;"^ (&nvarx GE 2)"%]I2&nvarx1"pd PROC RANK DATA=&out OUT=&out GROUP=%SCAN(&ngrp,&i); VAR %SCAN(&varx,&i); RANKS r&i; RUN;""^"  DATA _aa_; SET &out; ARRAY vvar &varx; ARRAY l $ l1-l&nvarx; ARRAY ll ll1-ll&nvarx; ARRAY dd dd1-dd&nvarx; ARRAY ii ii1-ii&nvarx; DO OVER vvar; l=LEFT(PUT(vvar,BEST30.)); ll=LENGTH(TRIM(LEFT(PUT(vvar,BEST30.)))); ii=INDEX(l,"'.'); IF ii THEN dd=ll-ii; ELSE dd=0; END; RUN; PROC MEANS DATA=_aa_ NOPRINT; VAR ll1-ll&nvarx dd1-dd&nvarx; OUTPUT OUT=maxv MAX=; RUN; DATA _NULL_; SET maxv;"%cI1&nvarx1"oc CALL SYMPUT("nform&i",COMPRESS(TRIM(LEFT(PUT(ll&i,30.))) || '.' || TRIM(LEFT(PUT(dd&i,30.)))));"" RUN; PROC SUMMARY DATA=&out; CLASS r1-r&nvarx; VAR &varx; OUTPUT OUT=_table_(DROP=_TYPE_ _FREQ_) MIN=min1-min&nvarx MAX=max1-max&nvarx; RUN; DATA _null_; SET _table_; IF N(OF r1-r&nvarx)=1;"%gI1&nvarx1" IF (r&i^=.) THEN DO; CALL SYMPUT("rmin&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(min&i,&&nform&i)))); CALL SYMPUT("rmax&i._"||LEFT(PUT(n&i,2.)),TRIM(LEFT(PUT(max&i,&&nform&i)))); n&i+1; END;""  RUN; PROC FORMAT;"%oI1&nvarx1"# VALUE &prefix.&i._"7mJ0%EVAL(%SCAN(&ngrp,&i)-1)1"7+ &j = "de &&rmin&i._&j &&rmax&i._&j""" ;"" RUN;"_NETTOY"* &_nettoy _table_ _aa_ maxv"v (&delout NE)"_NETTOY"! &_nettoy _tabfff_"v"&y(%LENGTH(&debug) EQ 0)"UI PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy; RUN; QUIT;"y"#z0` Lh  8L  Xx,@h@`,<Px 4H`p(<l  4 D P   4 T t H\t0XLT,T08X08Ld$|Drdre-1) THEN DO; IF ((nobs = 5) & (nb > 3)) THEN mmob2=J" (nobs,1,mmob1[:]); ELSE mmob2[nobs-nb+1:nb]=mmob1[:]; END; END; movav[LOC(xserie ^= .)]=mmob2; FINISH moymob; START henders(ordre,hender); R=(2/ARCOS(0)) / (4*(ordre=5)+4.5*(" ordre=7)+(ordre=9) +3.5*(ordre=11)+3.5*(ordre=13)+4.5*(ordre=23))**2; m=(ordre+1)/2 ; hender=J(ordre,m,0); hend=J(ordre,m,0); y=(ordre+3)/2; y1=(y-1)**2; y2=y*y; y3=(y+1)**2; y4=3*y2-16; y5=4*y2; denomi=8*y*(y2-1" )*(y5-1)*(y5-9)*(y5-25)/315; DO i=1 to m; x=(i-1)**2; hender[i+m-1,m]=(y1-x)*(y2-x)*(y3-x)*(y4-11*x)/denomi; hender[m-i+1,m]=hender[i+m-1,m]; END; DO nterm=m to ordre-1; u1=hender[nterm+1:ordre,m][+]/nterm; u2=((nterm+1:"ordre)-(nterm+1)/2)*hender[nterm+1:ordre,m]; a1=(nterm+1)/2; a2=1+((nterm*(nterm-1)*(nterm+1))/12)*R; DO i=1 to nterm; c1=(i-a1)*R; hender[nterm-i+1,nterm-m+1]=hender[i,m]+u1+(u2*(c1/a2)); END; END; FINISH henders;"  START extrem(xserie,xbar,nbyear,weight) GLOBAL(period); weight=J(NROW(xserie),1,.); cc=LOC(xserie ^=.); xser2=xserie[cc]; nobs=NROW(xser2); nbp=INT(5*period / 2); sig=J(nobs,1,0); IF (xser2[><] <"  0) THEN xbar=0; ELSE xbar=1; weightx=J(nobs,1,1); lambda1=1.5; lambda2=2.5; DO i=nbp+1 TO nobs-nbp; mm=QUARTILE(xser2[i-nbp:i+nbp]); sig[i]=(mm[4]-mm[2])/1.349; END; DO i=1 TO nbp; sig[i]=sig[nbp+1]; sig[nobs"-i+1]=sig[nobs-nbp]; END; xser2=(xser2-xbar)/sig; c=LOC(xser2 > lambda2); IF NCOL(c) ^=0 THEN weightx[c]=0; c=LOC((lambda1 < xser2) & (xser2 <= lambda2)); IF NCOL(c) ^=0 THEN weightx[c]=(lambda2 - xser2[c]) / (lambda2 - lambda1);"  weight[cc]=weightx; FINISH extrem; START avrun(xserie,mean,model); xser=xserie[LOC(xserie ^=.)]; ndon=NROW(xser); nvar=NCOL(xser); mat=J(ndon,nvar,.); DO i=1 TO nvar; IF model=0 THEN mat[2:ndon,i]=xser[2:ndon]" - xser[1:ndon-1]; ELSE mat[2:ndon,i]=xser[2:ndon] / xser[1:ndon-1] -1; END; mat=mat[2:ndon]; seq=1; matseq=.; DO i=2 TO NROW(mat); IF ((mat[i]=0) | (mat[i]*mat[i-1] >0)) THEN seq=seq+1; ELSE DO; matseq=matseq || seq;" seq=1; END; END; matseq=matseq || seq; mean=matseq[:]; FINISH avrun; START anaregr1(xserie,res) GLOBAL(period); RUN creertab(xserie,xser); bar=xser[:]; total=((xser-bar)##2)[+]; c=LOC(xserie ^= .);"  factbar=xser[:,]; ncas=(xser ^= .)[+,]; fact=((factbar-bar)##2)*T(ncas); titre= "TEST DE LA PRSENCE D'UNE SAISONNALIT STABLE"; name={'ENTRE LES MOIS','RSIDU','TOTAL'}; residu=(total-fact); ssq= fact // residu // total; dfe=NROW"(xserie[c])-period; dgr= (period-1) // dfe // (dfe+period-1); msq= (fact / (period-1)) // (residu / dfe); IF (residu ^= 0) THEN DO; fisher=(fact / (period-1)) / (residu / dfe) ; prob=1-PROBF(fisher,period-1,dfe); END; ELSE DO;"  fisher=.; prob=.; END; res=fisher || ROUND(prob,0.0001); FINISH anaregr1; START anaregr2(xserie,res,model) GLOBAL(period); RUN creertab(xserie,xser); nomiss=(xser ^=.)[,+]; ycomp=LOC(nomiss[,+]=period)" ; IF (model=0) THEN xser=ABS(xser[ycomp[1]:ycomp[NCOL(ycomp)],]); ELSE xser=ABS(xser[ycomp[1]:ycomp[NCOL(ycomp)],]- 100); year=NROW(xser); titre= "TEST DE LA PRSENCE D'UNE SAISONNALIT VOLUTIVE"; name={'ENTRE LES ANNES','RSIDU'," 'TOTAL'}; bar=xser[:]; total=((xser-bar)##2)[+]; colbar=xser[:,]; rowbar=xser[,:]; roweff=((rowbar-bar)##2)[+]*period; coleff=((colbar-bar)##2)[+]*year; residu=total-roweff-coE"t QQPLOTMAThD9.2  b\>"0DATA"0VARX"0VARY"0PAS"0POWER"0DEBUG",FINMACROa" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;" ":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"&(%LENGTH(&data ) EQ 0)"DATA" _last_""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;""& (%LENGTH(&varx ) EQ 0)"VARX" _numeric_"'"]Q DATA _NULL_; SET &data (KEEP=&varx OBS=1); ARRAY _xx_(*) &varx ; RUN;"'(&syserr NE 0)"H8ERROR: There is a problem in the varx (&varx ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"'"&+(%LENGTH(&vary ) EQ 0)"VARY" &varx"2"]Q DATA _NULL_; SET &data (KEEP=&vary OBS=1); ARRAY _xx_(*) &vary ; RUN;"2(&syserr NE 0)"H8ERROR: There is a problem in the vary (&vary ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"2"%6(%LENGTH(&pas ) EQ 0)"PAS" 5"E"<;,(%LENGTH(%QSCAN(%BQUOTE(&pas ),2, )) NE 0)"TDERROR: You must precise just one value for the pas (&pas ) parameter"FINMACRO" ;";")@(%DATATYP(&pas ) EQ CHAR)"@0ERROR: The pas (&pas ) parameter must be numeric"FINMACRO" ;"E"E (&pas LE 0 )".ERROR: You must have &pas > 0"FINMACRO" ;"E"ERREUR" 0"[O DATA _NULL_; IF (INT(&pas ) ^= &pas ) THEN CALL SYMPUT('erreur','1'); RUN;"M(&erreur EQ 1)"XHERROR: one of the parameters (pas ) is not of the requested integer type"FINMACRO" ;"M" PROC CONTENTS DATA=&data(KEEP=&varx) OUT=nomvar NOPRINT; RUN; DATA _NULL_; SET nomvar END=fin; LENGTH listvar $ 30000; RETAIN listvar ' '; listvar=COMPBL(TRIM(LEFT(listvar)) || ' ' || TRIM(LEFT(name))); IF fin THEN CALL"  SYMPUT('listvx',TRIM(LEFT(listvar))); RUN; PROC CONTENTS DATA=&data(KEEP=&vary) OUT=nomvar NOPRINT; RUN; DATA _NULL_; SET nomvar END=fin; LENGTH listvar $ 30000; RETAIN listvar ' '; listvar=COMPBL(TRIM(LEFT(listvar)) || ' ' || TRIM(" LEFT(name))); IF fin THEN CALL SYMPUT('listvy',TF"tCLUSTERXG9.2  Xd>"0DATA"0VAR"0VAREXP"0IDOBS"0FREQ"0STANDARD"0DCHI2"0OUTNEW"0OUTCAH"0CLUSTERS"0MAXOBS"0NFAST"0NBCLUS"0CLUSNAME"0MEDOIDS"0GMAX"0PRINT"0FORMAT"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOXWAIT NOSOURCE2;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&!(%LENGTH(&data ) EQ 0)"DATA" _last_"-"=&-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"&"8, DATA _NULL_; SET &data (OBS=1); RUN;"-(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"-"%1(%LENGTH(&var ) EQ 0)"VAR" _numeric_"8"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"8(&syserr NE 0)"F6ERROR: There is a problem in the var (&var ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"8"(A(%LENGTH(&varexp ) NE 0)"F: DATA _NULL_; SET &data (KEEP=&varexp OBS=1); RUN;"@(&syserr NE 0)"L<ERROR: There is a problem in the varexp (&varexp ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"@"A"VAREXP"  &varexp &var"&Q(%LENGTH(&freq ) NE 0)"=I-G"tRUNTSnG9.2  x >"0DATA"0TSERIES"0PERIOD"0TDROP"0ADD"0VARREG"0REGEFF"0LAM"0EASTER"0TRAD"0IDUR"0RSA"0MODEL"0VA"4LIMAR0.98"4LIMMA0.98"0OUT"0OUTTYPE"0FORECAST"0DATE"0PRINT"0X12DIAG"0GRAPH"0EXCEL"0GMAX"0DTRAMO"0DSEATS"0CONTROL"0DEBUG", FINCONTROL",FINMACROw"# (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"$":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"7+ DATA ___tt___; start=DATETIME(); RUN;"( (&control NE)" FINCONTROL"("  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index" GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&0(%LENGTH(&data ) EQ 0)"DATA" _last_"<"=5-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"5"8, DATA _NULL_; SET &data (OBS=1); RUN;"<(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"<"%@(%LENGTH(&out ) EQ 0)"OUT" _results_"K"<E,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"TDERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"E@"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"K (&_ret_ NE 0)"QAERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"K"%O(%LENGTH(&add ) EQ 0)"ADD" 0"Y"<T,(%LENGTH(%QSCAN(%BQUOTE(&add ),2, )) NE 0)"TDERROR: You must precise just one value for the add (&add ) parameter"FINMACRO" ;"T")Y(%DATATYP(&add ) EQ CHAR)"@0ERROR: The add (&add ) parameter must be numeric"FINMACRO" ;"Y")](%LENGTH(&outtype ) EQ 0)"OUTTYPE" 1"l"@b0(%LENGTH(%QSCAN(%BQUOTE(&outtype ),2, )) NE 0)"\LERROR: You must precise just one value for the outtype (&outtype ) parameter"FINMACRO" ;"b"-g(%DATATYP(&outtype ) EQ CHAR)"H8ERROR: The outtype (&outtype ) parameter must be numeric"FINMACRO" ;"l"5l%((&outtype NE 1) AND (&outtype NE 2))"UEERROR: The outtype (&outtype ) parameter must be choosen among (1 2 )"FINMACRO" ;"l")p(%LENGTH(&tseries ) EQ 0)"TSERIES" _numeric_"w"cW DATA _NULL_; SET &data (KEEP=&tseries OBS=1); ARRAY _xx_(*) &tseries ; RUN;"w(&syserr NE 0)"N>ERROR: There is a problem in the tseries (&tseries ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"w")(%LENGTH(&tseries ) NE 0)"E9 DATA _NULL_; SET &data (KEEP=&tdrop OBS=1); RUN;"(&syserr NE 0)"J:ERROR: There is a problem in the tdrop (&tdrop ) parameter"UEERROR: Non valid SAS dataset? Non valid SAS name? Non valid SAS list?"FINMACRO" ;"""&(%LENGTH(&date ) EQ 0)":*ERROR: The date parameter must be precised"FINMACRO" ;""=-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"VFERROR: You must precise just one value for the date (&date ) parameter"FINMACRO" ;""]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"(&syserr NE 0)"I9ERROR: There is a problem in the date (&date ) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;""((%LENGTH(&varreg ) NE 0)"aU DATA _NULL_; SET &data (KEEP=&varreg OBS=1); ARRAY _xx_(*) &varreg ; RUN;"(&syserr NE 0)"L<ERROR: There is a problem in the varreg (&varreg ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"""((%LENGTH(®eff ) EQ 0)"REGEFF" 0""?/(%LENGTH(%QSCAN(%BQUOTE(®eff ),2, )) NE 0)"ZAJERROR: You must precise just one value for the regeff (®eff ) parameter"FINMACRO" ;"",(%DATATYP(®eff ) EQ CHAR)"F6ERROR: The regeff (®eff ) parameter must be numeric"FINMACRO" ;""((®eff NE 0) AND (®eff NE 1) AND (®eff NE 2) AND (®eff NE 3) AND (®eff NE 4) AND (®eff NE 5) AND (®eff NE 6))"]MERROR: The regeff (®eff ) parameter must be choosen among (0 1 2 3 4 5 6 )"FINMACRO" ;""%(%LENGTH(&rsa ) EQ 0)"RSA" 0""<,(%LENGTH(%QSCAN(%BQUOTE(&rsa ),2, )) NE 0)"TDERROR: You must precise just one value for the rsa (&rsa ) parameter"FINMACRO" ;"")(%DATATYP(&rsa ) EQ CHAR)"@0ERROR: The rsa (&rsa ) parameter must be numeric"FINMACRO" ;""((&rsa NE 0) AND (&rsa NE 1) AND (&rsa NE 2) AND (&rsa NE 3) AND (&rsa NE 4) AND (&rsa NE 5) AND (&rsa NE 6) AND (&rsa NE 9))"XHERROR: The rsa (&rsa ) parameter must be choosen among (0 1 2 3 4 5 6 9)"FINMACRO" ;""%(%LENGTH(&lam ) EQ 0)"LAM" 0""<,(%LENGTH(%QSCAN(%BQUOTE(&lam ),2, )) NE 0)"TDERROR: You must precise just one value for the lam (&lam ) parameter"FINMACRO" ;"")(%DATATYP(&lam ) EQ CHAR)"@0ERROR: The lam (&lam ) parameter must be numeric"FINMACRO" ;"">.((&lam NE 0) AND (&lam NE 1) AND (&lam NE -1))"P@ERROR: The lam (&lam ) parameter must be choosen among (0 1 -1 )"FINMACRO" ;""((%LENGTH(&easter ) EQ 0)"EASTER" 0""?/(%LENGTH(%QSCAN(%BQUOTE(&easter ),2, )) NE 0)"ZJERROR: You must precise just one value for the easter (&easter ) parameter"FINMACRO" ;"",(%DATATYP(&easter ) EQ CHAR)"F6ERROR: The easter (&easter ) parameter must be numeric"FINMACRO" ;""G7((&easter NE 0) AND (&easter NE 1) AND (&easter NE -1))"VFERROR: The easter (&easter ) parameter must be choosen among (0 1 -1 )"FINMACRO" ;""&(%LENGTH(&idur ) EQ 0)"IDUR" 6""=-(%LENGTH(%QSCAN(%BQUOTE(&idur ),2, )) NE 0)"VFERROR: You must precise just one value for the idur (&idur ) parameter"FINMACRO" ;""*(%DATATYP(&idur ) EQ CHAR)"B2ERROR: The idur (&idur ) parameter must be numeric"FINMACRO" ;"" (&idur LE 0 )"/ERROR: You must have &idur > 0"FINMACRO" ;""$ (%LENGTH(&va ) NE 0)";+(%LENGTH(%QSCAN(%BQUOTE(&va ),2, )) NE 0)"RBERROR: You must precise just one value for the va (&va ) parametB )) NE 0)"YIERROR: You must precise just one value for the graph (&graph ) parameter"FINMACRO" ;""*(%DATATYP(&graph ) EQ NUM)"G7ERROR: The graph (&graph ) parameter must be character"FINMACRO" ;""4$((&graph NE YES) AND (&graph NE NO))"TDERROR: The graph (&graph ) parameter must be choosen among (YES NO)"FINMACRO" ;"""& (%LENGTH(&craw ) EQ 0)"CRAW" black"*"=%-(%LENGTH(%QSCAN(%BQUOTE(&craw ),2, )) NE 0)"WGERROR: You must precise just one value for the craw (&craw ) parameter"FINMACRO" ;"%")*(%DATATYP(&craw ) EQ NUM)"E5ERROR: The craw (&craw ) parameter must be character"FINMACRO" ;"*"&.(%LENGTH(&clis ) EQ 0)"CLIS" red"8"=3-(%LENGTH(%QSCAN(%BQUOTE(&clis ),2, )) NE 0)"WGERROR: You must precise just one value for the clis (&clis ) parameter"FINMACRO" ;"3")8(%DATATYP(&clis ) EQ NUM)"E5ERROR: The clis (&clis ) parameter must be character"FINMACRO" ;"8"A<1((%LENGTH(&graph ) EQ 0) AND (%LENGTH(&xx) NE 0))"GRAPH" YES"<"9A)((&endrule EQ 4) AND (%LENGTH(&xx) EQ 0))"WGERROR: ENDRULE=4 can only be used when there is a series to be smoothed"FINMACRO" ;"A"ERREUR" 0"  PROC IML; s={&s}; ds={&ds}; order={&order}; IF ((TYPE(s) = 'N') & (NCOL(LOC(INT(s) ^= s))^=0)) THEN CALL SYMPUT('erreur','1'); IF ((TYPE(s) = 'N') & (NCOL(LOC( s < 0))^=0)) THEN CALL SYMPUT('erreur','2'); IF ((TYPE(ds) = 'N') & (NCOL(LOC(INT"(ds) ^= ds))^=0)) THEN CALL SYMPUT('erreur','3'); IF ((TYPE(ds) = 'N') & (NCOL(LOC( ds < 0))^=0)) THEN CALL SYMPUT('erreur','4'); IF(MOD(order,2)=0) THEN CALL SYMPUT('erreur','5'); QUIT;"J (&syserr)"@0ERROR: the S and DS parameters should be numeric"FINMACRO" ;"J"](&erreur NE 0)"N(&erreur EQ 1)"F6ERROR: the S parameter should have only integer values"N"Q(&erreur EQ 2)"O?ERROR: the S parameter should have only positive integer values"Q"T(&erreur EQ 3)"G7ERROR: the DS parameter should have only integer values"T"W(&erreur EQ 4)"P@ERROR: the DS parameter should have only positive integer values"W"Z(&erreur EQ 5)"8(ERROR: the ORDER parameter should be odd"Z"FINMACRO" ;"]"ERREUR" 0"(&xx NE)"  PROC CONTENTS DATA=&data(KEEP=&xx) NOPRINT OUT=_nomvar_(KEEP=name); RUN; DATA _null_; SET _nomvar_ END=f; CALL SYMPUT('_nvar'!!LEFT(PUT(_n_,8.)),name); CALL SYMPUT('err'!!LEFT(PUT(_n_,8.)),'0'); IF f THEN CALL SYMPUT('_nser_',LEFT(PUT("_n_,8.))); RUN; DATA _trav_; SET &data(KEECer"FINMACRO" ;""((%DATATYP(&va ) EQ CHAR)">.ERROR: The va (&va ) parameter must be numeric"FINMACRO" ;" "  (&va LE 0 )"-ERROR: You must have &va > 0"FINMACRO" ;" " "*(%LENGTH(&forecast ) EQ 0)"FORECAST" 0""A1(%LENGTH(%QSCAN(%BQUOTE(&forecast ),2, )) NE 0)"^NERROR: You must precise just one value for the forecast (&forecast ) parameter"FINMACRO" ;"".(%DATATYP(&forecast ) EQ CHAR)"J:ERROR: The forecast (&forecast ) parameter must be numeric"FINMACRO" ;""!(&forecast LT 0 )"E5ERROR: You must have &forecast greater of equal to 0"FINMACRO" ;""&!(%LENGTH(&trad ) EQ 0)"TRAD" 0"0"=&-(%LENGTH(%QSCAN(%BQUOTE(&trad ),2, )) NE 0)"VFERROR: You must precise just one value for the trad (&trad ) parameter"FINMACRO" ;"&"*+(%DATATYP(&trad ) EQ CHAR)"B2ERROR: The trad (&trad ) parameter must be numeric"FINMACRO" ;"0"0((&trad NE 0) AND (&trad NE 1) AND (&trad NE 2) AND (&trad NE 6) AND (&trad NE 7) AND (&trad NE -1) AND (&trad NE -2) AND (&trad NE -6) AND (&trad NE -7))"aQERROR: The trad (&trad ) parameter must be choosen among (0 1 2 6 7 -1 -2 -6 -7 )"FINMACRO" ;"0"'4(%LENGTH(&print ) EQ 0)"PRINT" NO"E"PRINT" %UPCASE(&print)">;.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"WGERROR: You must precise just one value for the print (&print) parameter"FINMACRO" ;";"*@(%DATATYP(&print ) EQ NUM)"E5ERROR: The print (&print) parameter must be character"FINMACRO" ;"E"4E$((&print NE YES) AND (&print NE NO))"RBERROR: The print (&print) parameter must be choosen among (YES NO)"FINMACRO" ;"E")I(%LENGTH(&x12diag ) EQ 0)"X12DIAG" NO"Z"X12DIAG"! %UPCASE(&x12diag)"@P0(%LENGTH(%QSCAN(%BQUOTE(&x12diag ),2, )) NE 0)"[KERROR: You must precise just one value for the x12diag (&x12diag) parameter"FINMACRO" ;"P",U(%DATATYP(&x12diag ) EQ NUM)"I9ERROR: The x12diag (&x12diag) parameter must be character"FINMACRO" ;"Z"8Z(((&x12diag NE YES) AND (&x12diag NE NO))"VFERROR: The x12diag (&x12diag) parameter must be choosen among (YES NO)"FINMACRO" ;"Z"'^(%LENGTH(&graph ) EQ 0)"GRAPH" NO"o"GRAPH" %UPCASE(&graph)">e\(%LENGTH(%QSCAN(%BQUOTE(&freq ),2, )) NE 0)"UEERROR: You must precise just one value for the freq (&freq) parameter"FINMACRO" ;"I"]Q DATA _NULL_; SET &data (KEEP=&freq OBS=1); ARRAY _xx_(*) &freq ; RUN;"P(&syserr NE 0)"H8ERROR: There is a problem in the freq (&freq ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"P"Q"'_(%LENGTH(&idobs ) NE 0)">W.(%LENGTH(%QSCAN(%BQUOTE(&idobs ),2, )) NE 0)"WGERROR: You must precise just one value for the idobs (&idobs) parameter"FINMACRO" ;"W"_S DATA _NULL_; SET &data (KEEP=&idobs OBS=1); ARRAY _xx_(*) &idobs ; RUN;"^(&syserr NE 0)"J:ERROR: There is a problem in the idobs (&idobs ) parameter"UEERROR: Non valid SAS dataset? Non valid SAS name? Non valid SAS list?"FINMACRO" ;"^"_"*c(%LENGTH(&standard ) EQ 0)"STANDARD" NO"r"Ah1(%LENGTH(%QSCAN(%BQUOTE(&standard ),2, )) NE 0)"^NERROR: You must precise just one value for the standard (&standard ) parameter"FINMACRO" ;"h"-m(%DATATYP(&standard ) EQ NUM)"L<ERROR: The standard (&standard ) parameter must be character"FINMACRO" ;"r"Lr<((%UPCASE(&standard) NE YES) AND (%UPCASE(&standard) NE NO))"ZJERROR: The standard (&standard ) parameter must be choosen among (YES NO )"FINMACRO" ;"r"'v(%LENGTH(&dchi2 ) EQ 0)"DCHI2" NO"">{.(%LENGTH(%QSCAN(%BQUOTE(&dchi2 ),2, )) NE 0)"XHERROR: You must precise just one value for the dchi2 (&dchi2 ) parameter"FINMACRO" ;"{"*(%DATATYP(&dchi2 ) EQ NUM)"F6ERROR: The dchi2 (&dchi2 ) parameter must be character"FINMACRO" ;""F6((%UPCASE(&dchi2) NE YES) AND (%UPCASE(&dchi2) NE NO))"TDERROR: The dchi2 (&dchi2 ) parameter must be choosen among (YES NO )"FINMACRO" ;""((%LENGTH(&maxobs ) EQ 0)"MAXOBS" 2000""?/(%LENGTH(%QSCAN(%BQUOTE(&maxobs ),2, )) NE 0)"ZJERROR: You must precise just one value for the maxobs (&maxobs ) parameter"FINMACRO" ;"",(%DATATYP(&maxobs ) EQ CHAR)"F6ERROR: The maxobs (&maxobs ) parameter must be numeric"FINMACRO" ;""(&maxobs LE 0 )"1!ERROR: You must have &maxobs > 0"FINMACRO" ;""'(%LENGTH(&nfast ) EQ 0)"NFAST" 500"">.(%LENGTH(%QSCAN(%BQUOTE(&nfast ),2, )) NE 0)"XHERROR: You must precise just one value for the nfast (&nfast ) parameter"FINMACRO" ;"]"+(%DATATYP(&nfast ) EQ CHAR)"D4ERROR: The nfast (&nfast ) parameter must be numeric"FINMACRO" ;""(&nfast LE 0 )"0 ERROR: You must have &nfast > 0"FINMACRO" ;""((%LENGTH(&outnew ) EQ 0)"OUTNEW" _outnew_""?/(%LENGTH(%QSCAN(%BQUOTE(&outnew ),2, )) NE 0)"ZJERROR: You must precise just one value for the outnew (&outnew ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outnew ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outnew (&outnew ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outcah ) EQ 0)"OUTCAH" _outcah_""?/(%LENGTH(%QSCAN(%BQUOTE(&outcah ),2, )) NE 0)"ZJERROR: You must precise just one value for the outcah (&outcah ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outcah ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outcah (&outcah ) parameter must be a valid SAS dataset name"FINMACRO" ;""*(%LENGTH(&clusters ) EQ 0)"CLUSTERS" _clusters_""A1(%LENGTH(%QSCAN(%BQUOTE(&clusters ),2, )) NE 0)"^NERROR: You must precise just one value for the clusters (&clusters ) parameter"FINMACRO" ;""5) %sasnom(_IN_=&clusters ,TYPE=DATASET);" (&_ret_ NE 0)"[KERROR: The clusters (&clusters ) parameter must be a valid SAS dataset name"FINMACRO" ;""*(%LENGTH(&clusname ) EQ 0)"CLUSNAME" cluster""( %sasnom(_IN_=&clusname );" (&_ret_ NE 0)"SCERROR: The clusname (&clusname ) parameter must be a valid SAS name"FINMACRO" ;""((%LENGTH(&nbclus ) EQ 0)"NBCLUS" 5""?/(%LENGTH(%QSCAN(%BQUOTE(&nbclus ),2, )) NE 0)"ZJERROR: You must precise just one value for the nbclus (&nbclus ) parameter"FINMACRO" ;"",(%DATATYP(&nbclus ) EQ CHAR)"F6ERROR: The nbclus (&nbclus ) parameter must be numeric"FINMACRO" ;""(&nbclus LE 0 )"1!ERROR: You must have &nbclus > 0"FINMACRO" ;"")(%LENGTH(&medoids ) EQ 0)"MEDOIDS" 1""@0(%LENGTH(%QSCAN(%BQUOTE(&medoids ),2, )) NE 0)"\LERROR: You must precise just one value for the medoids (&medoids ) parameter"FINMACRO" ;""-(%DATATYP(&medoids ) EQ CHAR)"H8ERROR: The medoids (&medoids ) parameter must be numeric"FINMACRO" ;"" (&medoids LE 0 )"2"ERROR: You must have &medoids >^"tQQPLOThD9.2  SH9P>"0DATA"0VAR"0LOI"0METH"0POWER"0PARA"0REG"0IC"0CQQ"0CREG"0CLIM"0DEBUG",FINMACROR" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;""(&syserr NE 0)"?/ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;"""%'(%LENGTH(&var ) EQ 0)"7'ERROR: Le paramtre var est obligatoire"FINMACRO" ;"3"<,,(%LENGTH(%QSCAN(%BQUOTE(&var ),2, )) NE 0)"YIERROR: Vous devez prciser une seule valeur pour le paramtre var (&var )"FINMACRO" ;","[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"3(&syserr NE 0)"=-ERROR: Problme dans le paramtre var (&var )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"3"%7(%LENGTH(&loi ) EQ 0)"LOI" 1"F"<<,(%LENGTH(%QSCAN(%BQUOTE(&loi ),2, )) NE 0)"YIERROR: Vous devez prciser une seule valeur pour le paramtre loi (&loi )"FINMACRO" ;"<"(A(%DATATYP(&loi ) EQ NUM)"M=ERROR: La valeur du paramtre loi (&loi ) doit tre caractre"FINMACRO" ;"F"Fz((&loi NE 1) AND (&loi NE 2) AND (&loi NE 3) AND (&loi NE 4) AND (&loi NE 5) AND (&loi NE 6) AND (&loi NE 7))"aQERROR: La valeur du paramtre loi (&loi ) doit tre choisie parmi (1 2 3 4 5 6 7)"FINMACRO" ;"F"&J(%LENGTH(&meth ) EQ 0)"METH" 1"Y"=O-(%LENGTH(%QSCAN(%BQUOTE(&meth ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre meth (&meth )"FINMACRO" ;"O")T(%DATATYP(&meth ) EQ NUM)"O?ERROR: La valeur du paramtre meth (&meth ) doit tre caractre"FINMACRO" ;"Y"@Y0((&meth NE 1) AND (&meth NE 2) AND (&meth NE 3))"\LERROR: La valeur du paramtre meth (&meth ) doit _^RIM(LEFT(listvar))); RUN; PROC CONTENTS DATA=&data(KEEP=&varx &vary) OUT=nomvar NOPRINT; RUN; DATA _NULL_; SET nomvar END=fin; nvar+1; CALL SYMPUT('_var'||LEFT(PUT(nvar,3.)),name); IF"E9 fin THEN CALL SYMPUT('_nvar',LEFT(PUT(nvar,3.))); RUN;"%TI1&_nvar1" PROC UNIVARIATE DATA=&data NOPRINT; VAR &&_var&i; OUTPUT OUT=&&_var&i PCTLPTS=0 TO 100 BY &pas PCTLPRE=P; RUN; PROC TRANSPOSE DATA=&&_var&i OUT=&&_var&i(RENAME=(COL1=&&_var&i)); RUN;""+ DATA pctls; DROP _label_;"%XI1&_nvar1" SET &&_var&i;"" ARRAY varnum"%\I1&_nvar1" &&_var&i"" ;"&`(%LENGTH(&power) NE 0)"~ DO OVER varnum; IF (&power=0) THEN varnum=LOG(varnum); ELSE varnum=SIGN(&power)*varnum**&power; END;"`" RUN; PROC DATASETS LIB=WORK NOLIST; DELETE &listvx &listvy; RUN; QUIT; PROC INSIGHT DATA=pctls; SCATTER &listvy * &listvx; RUN;"#b0` Lh  8L  Xx,@h| ,tDXpL0DX  $ P  0 @ T l T l |  ,Tt|XXtre choisie parmi (1 2 3 )"FINMACRO" ;"Y"'](%LENGTH(&power ) EQ 0)"POWER" 1"i"'i(%LENGTH(&power ) NE 0)">c.(%LENGTH(%QSCAN(%BQUOTE(&power ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre power (&power )"FINMACRO" ;"c"+h(%DATATYP(&power ) EQ CHAR)"QAERROR: La valeur du paramtre power (&power ) doit tre numrique"FINMACRO" ;"h"i"&m(%LENGTH(¶ ) EQ 0)"PARA" 1"w"=r-(%LENGTH(%QSCAN(%BQUOTE(¶ ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre para (¶ )"FINMACRO" ;"r"*w(%DATATYP(¶ ) EQ CHAR)"O?ERROR: La valeur du paramtre para (¶ ) doit tre numrique"FINMACRO" ;"w"%{(%LENGTH(® ) EQ 0)"REG" non""<,(%LENGTH(%QSCAN(%BQUOTE(® ),2, )) NE 0)"YIERROR: Vous devez prciser une seule valeur pour le paramtre reg (® )"FINMACRO" ;""((%DATATYP(® ) EQ NUM)"M=ERROR: La valeur du paramtre reg (® ) doit tre caractre"FINMACRO" ;""C3((%UPCASE(®) NE OUI) AND (%UPCASE(®) NE NON))"\LERROR: La valeur du paramtre reg (® ) doit tre choisie parmi (oui non )"FINMACRO" ;""$(%LENGTH(&ic ) EQ 0)"IC" non"";+(%LENGTH(%QSCAN(%BQUOTE(&ic ),2, )) NE 0)"WGERROR: Vous devez prciser une seule valeur pour le paramtre ic (&ic )"FINMACRO" ;""'(%DATATYP(&ic ) EQ NUM)"K;ERROR: La valeur du paramtre ic (&ic ) doit tre caractre"FINMACRO" ;""A1((%UPCASE(&ic) NE OUI) AND (%UPCASE(&ic) NE NON))"ZJERROR: La valeur du paramtre ic (&ic ) doit tre choisie parmi (oui non )"FINMACRO" ;""%(%LENGTH(&cqq ) EQ 0)"CQQ" black""<,(%LENGTH(%QSCAN(%BQUOTE(&cqq ),2, )) NE 0)"YIERROR: Vous devez prciser une seule valeur pour le paramtre cqq (&cqq )"FINMACRO" ;""((%DATATYP(&cqq ) EQ NUM)"M=ERROR: La valeur du paramtre cqq (&cqq ) doit tre caractre"FINMACRO" ;""&(%LENGTH(&creg ) EQ 0)"CREG" red""=-(%LENGTH(%QSCAN(%BQUOTE(&creg ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre creg (&creg )"FINMACRO" ;"")(%DATATYP(&creg ) EQ NUM)"O?ERROR: La valeur du paramtre creg (&creg ) doit tre caractre"FINMACRO" ;""&Y(%LENGTH(&clim ) EQ 0)"CLIM" blue""=-(%LENGTH(%QSCAN(%BQUOTE(&clim ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre clim (&clim )"FINMACRO" ;"")(%DATATYP(&clim ) EQ NUM)"O?ERROR: La valeur du paramtre clim (&clim ) doit tre caractre"FINMACRO" ;""_NBP_" 80"  PROC SORT DATA=&data(WHERE=(&var NE .)) OUT=_code_(KEEP=&var); BY &var; RUN; DATA _null_; SET _code_(OBS=1) NOBS=nbre; IF (&power=0) THEN _tvar_=LOG(&var); ELSE IF (&power>0) THEN _tvar_=&var**&power; ELSE _tvar_=-&var**&power;"j^ CALL SYMPUT('_nobs_',LEFT(PUT(nbre,8.))); CALL SYMPUT('err',LEFT(PUT(_ERROR_,3.))); RUN;" (&err NE 0)"m]ERROR: Il y a des valeurs ngatives ou nulles. Incompatibilit avec la transformation choisie"FINMACRO" ;""ERR" "G; DATA _code_; SET _code_ END=_fin_; KEEP _tvar_ _prob_"%(%UPCASE(&ic) EQ OUI)" _p_"" ; alpha=(1/3)*(&meth EQ 1)+0.5*(&meth EQ 2)+0.3*(&meth EQ 3); beta=(1/4)*(&meth EQ 1)+0*(&meth EQ 2)+0.4*(&meth EQ 3); _p_=(_N_ - alpha)/(&_nobs_ + beta); IF (&power=0) THEN _tvar_=LOG(&var); ELSE IF (&power>0) THEN _tvar_=&var**&power;"* ELSE _tvar_=-&var**&power;" (&loi EQ 1)"$ _prob_=PROBIT(_p_);"" (&loi EQ 2)" _prob_= _p_;"" (&loi EQ 3)" IF _tvar_ < 0 THEN DO; CALL SYMPUT('err','1'); STOP; END; _prob_= GAMINV(_p_,¶)**(1/3); _tvar_=_tvar_**(1/3);"" (&loi EQ 4)" IF _tvar_ < 0 THEN DO; CALL SYMPUT('err','1'); STOP; END; _prob_= (2*GAMINV(_p_,¶/2))**(1/3); _tvar_=_tvar_**(1/3);"" (&loi EQ 5)"H< _prob_= (-LOG(1-_p_))**(1/3); _tvar_=_tvar_**(1/3);"" (&loi EQ 6)"% _prob_= -LOG(1-_p_);"" (&loi EQ 7)"| IF _tvar_ < 0 THEN DO; CALL SYMPUT('err','1'); STOP; END; _prob_= LOG(-LOG(1-_p_)); _tvar_=LOG(_tvar_);""B2((%UPCASE(&ic) EQ NON) AND (%UPCASE(®) EQ NON))"ui IF (&_nobs_ < &_nbp_) THEN OUTPUT; ELSE IF MOD(_N_ ,INT((&_nobs_)/(&_nbp_ - 10)))=0 THEN OUTPUT;"" RUN;" (&err NE)"m]ERROR: Il y a des valeurs ngatives ou nulles. Incompatibilit avec la transformation choisie"FINMACRO" ;""A1((%UPCASE(&ic) EQ OUI) OR (%UPCASE(®) EQ OUI))"  PROC RANK DATA=_code_ OUT=_code_ GROUPS=3 ; VAR _prob_; RANKS _rprob_; RUN; PROC SORT DATA=_code_; BY _rprob_; RUN; PROC UNIVARIATE DATA=_code_ NOPRINT; VAR _tvar_ _prob_; BY _rprob_ ; OUTPUT OUT=_stats_ MEDIAN= _mtv_"  _mpr_ ; RUN; PROC TRANSPOSE DATA=_stats_ OUT=_stats_(KEEP=col1); BY _rprob_; RUN; PROC TRANSPOSE DATA=_stats_ OUT=_stats_(DROP=_name_ RENAME=(col1=_mtv1_ col2=_mpr1_ col3=_mtv2_ col4=_mpr2_ col5=_mtv3_ col6" =_mpr3_)); RUN; DATA _code_; RETAIN _mtv1_ _mtv2_ _mtv3_ _mpr1_ _mpr2_ _mpr3_ _pente_ ; DROP _mtv1_ _mtv2_ _mtv3_ _mpr1_ _mpr2_ _mpr3_Z _pente_ ; SET _code_; IF _N_=1 THEN DO; SET _stats_; _pente_=(_mtv3_-_mtv1_)/(_mpr3_-"nb_mpr1_); END; _regr_=_pente_*(_prob_ - (_mpr1_+_mpr2_+_mpr3_)/3) + (_mtv1_+_mtv2_+_mtv3_)/3;"%(%UPCASE(&ic) EQ OUI)" (&loi EQ 1)"`T _sd_=_pente_*SQRT(_p_*(1-_p_)/&_nobs_)*SQRT(4*ARSIN(1))/EXP(-0.5*(_prob_**2));"" (&loi EQ 2)"<0 _sd_=_pente_*SQRT(_p_*(1-_p_)/&_nobs_); );"" (&loi EQ 3)"x _sd_=_pente_*SQRT(_p_*(1-_p_)/&_nobs_)*GAMMA(¶) /(3*(_prob_**(3*¶ -1))*EXP(-_prob_**3));"" (&loi EQ 4)" _sd_=_pente_*SQRT(_p_*(1-_p_)/&_nobs_)*GAMMA(¶/2) /(3*(2**(-¶/2))*(_prob_**(1.5*¶ -1))*EXP(-0.5*(_prob_**3)));""  (&loi EQ 5)"YM _sd_=_pente_*SQRT(_p_*(1-_p_)/&_nobs_)/(3*(_prob_**2)*EXP(-_prob_**3));"" (&loi EQ 6)"F: _sd_=_pente_*SQRT(_p_*(1-_p_)/&_nobs_)/EXP(-_prob_);"" (&loi EQ 7)"YM _sd_=_pente_*SQRT(_p_*(1-_p_)/&_nobs_)/(EXP(_prob_)*EXP(-EXP(_prob_)));"";/ _high_=_regr_+_sd_; _low_=_regr_-_sd_;""v IF (&_nobs_ < &_nbp_) THEN OUTPUT; ELSE IF MOD(_N_ ,INT((&_nobs_)/(&_nbp_ - 10)))=0 THEN OUTPUT; RUN;"" (&loi EQ 1)"LOI" Normale"1" (&loi EQ 2)"LOI" Uniforme"1"! (&loi EQ 3)"LOI" Gamma"1"% (&loi EQ 4)"LOI" du Chi2"1") (&loi EQ 5)"LOI"! Exponentielle (1)"1"- (&loi EQ 6)"LOI"! Exponentielle (2)"1"1 (&loi EQ 7)"LOI" de Gumbel"1"TITLE1" "TITLE2" " DATA _null_; IF (&power = 1) THEN CALL SYMPUT('title1',"QQPLOT DE LA VARIABLE &var - Loi &loi "); ELSE DO; CALL SYMPUT('title1',"QQPLOT DE LA VARIABLE &var (** &power) - Loi &loi"); CALL SYMPUT('title2',"courbe Quantile-Quantile");" END; RUN;"':(%LENGTH(&title1) NE 0)"$ TITLE1 H=1 "&title1";":"'=(%LENGTH(&title2) NE 0)"' TITLE2 C=&cqq "&title2";"="&B(%UPCASE(®) EQ NON)"%A(%UPCASE(&ic) EQ OUI)"6* TITLE3 C=&clim "limites de confiance";"A"F"/# TITLE3 C=&creg "droite ajuste";"%F(%UPCASE(&ic) EQ OUI)"6* TITLE4 C=&clim "limites de confiance";"F" PROC GPLOT DATA=_code_; SYMBOL1 COLOR=&cqq INTERPOL=none VALUE=circle; SYMBOL2 COLOR=&creg INTERPOL=join VALUE=none; SYMBOL3 COLOR=&clim INTERPOL=join L=5 VALUE=none; SYMBOL4 COLOR=&clim INTERPOL=join L=5 VALUE=none; PLOT _tvar_*_prob_"&J(%UPCASE(®) EQ OUI)" _regr_*_prob_"J"%M(%UPCASE(&ic) EQ OUI)"+ _high_*_prob_ _low_*_prob_"M"cW / frame overlay; RUN; QUIT; PROC DATASETS LIBRARY=WORK NOL["IST; DELETE"AQ1((%UPCASE(&ic) EQ OUI) OR (%UPCASE(®) EQ OUI))"  _stats_ "Q", _code_; QUIT; TITLE;SYMBOL;"P#S0` P@l,@Xl 0D| 8H\4(H 0Xl, D T h   $ 4 H p H ` p  ( < | <Th|D\l(<PxPhx 0Dl@Xh| 0t 0DXl(<d00l,|\ pPd|D` 0 x !!"<"P"l""""L#`#|#$($D$$$$$$%%%%l&&&& '8'H'\''()*4+\+x+++,D,X,t,, -(----L.`.|....P/d///80L0h0|0000001 141L1`1|1111112$2@2T2x22222233,3<3D4`444445$5L5t55556,6d6x67777808D88899D9T"ZJERROR: You must precise just one value for the outfor (&outfor ) parameter"FINMACRO" ;"J"3' %sasnom(_IN_=&outfor ,TYPE=DATASET);"P (&_ret_ NE 0)"WGERROR: The outfor (&outfor ) parameter must be a valid SAS dataset name"FINMACRO" ;"P"&U(%LENGTH(&vary ) EQ 0)"<,ERROR: You must precise a dependent variable"FINMACRO" ;"a"<Z,(%LENGTH(%QSCAN(%BQUOTE(&vary),2, )) NE 0)"UEERROR: You must precise just one value for the vary (&vary) parameter"FINMACRO" ;"Z"\P DATA _NULL_; SET &data (KEEP=&vary OBS=1); ARRAY _xx_(*) &vary; RUN;"a(&syserr NE 0)"G7ERROR: There is a problem in the vary (&vary) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"a"&f(%LENGTH(&date ) EQ 0)";+ERROR: You must precise a SAS date variable"FINMACRO" ;"r"<k,(%LENGTH(%QSCAN(%BQUOTE(&date),2, )) NE 0)"WGERROR: You must precise just one variable in the date (&date) parameter"FINMACRO" ;"k"]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"r(&syserr NE 0)"H8ERROR: There is a problem in the date (&date ) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"r"({(%LENGTH(&varsup ) NE 0)"aU DATA _NULL_; SET &data (KEEP=&varsup OBS=1); ARRAY _xx_(*) &varsup ; RUN;"z(&syserr NE 0)"L<ERROR: There is a problem in the varsup (&varsup ) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"z"{"&(%LENGTH(&varx ) NE 0)"[O DATA _NULL_; SET &data (KEEP=&varx OBS=1); ARRAY _xx_(*) &varx; RUN;"(&syserr NE 0)"G7ERROR: There is a problem in the varx (&varx) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"""'(%LENGTH(&nlagx ) EQ 0)"NLAGX" 3""eY PROC IML; x={&nlagx}; CALL SYMPUT('_TypeX',UPCASE(TRIM(LEFT(TYPE(x))))); QUIT;"(&_TypeX NE N)"D4ERROR: The nlagx (&nlagx ) parameter must be numeric"FINMACRO" ;""h\ PROC IML; x={&nlagx}; minx=MIN(x); CALL SYMPUT('_MinX',CHAR(minx,10,0)); QUIT;"(&_MinX LT 0 )"0 ERROR: You must have &nlagx > 0"FINMACRO" ;""ym PROC IML; x=INT({&nlagx}); CALL SYMPUT('nlagx',TRIM(LEFT(COMPBL(ROWCAT(CHAR(x,5,0)))))); QUIT;"'(%LENGTH(&nlagy ) EQ 0)"NLAGY" 2"">.(%LENGTH(%QSCAN(%BQUOTE(&nlagy ),2, )) NE 0)"XHERROR: You must precise just one value for the nlagy (&nlagy ) parameterU"t STATIONARITYhD9.2  `#>"0DATA"0OUTTEST"0VAR"0MAXLAGS"0ALPHA"0WORD"0PRINT"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"{'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND sasnom;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;""(&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;""")&(%LENGTH(&outtest ) EQ 0)"OUTTEST" _tests_"1"@+0(%LENGTH(%QSCAN(%BQUOTE(&outtest ),2, )) NE 0)"]MERROR: You must precise just one value for the outtest (&outtest ) parameter"FINMACRO" ;"+"3' %sasnom(_IN_=&outtest,TYPE=DATASET);"1 (&_ret_ NE 0)"ZJERROR: The outtest (&outtest ) parameter must be a valid SAS dataset name"FINMACRO" ;"1"%5(%LENGTH(&var ) EQ 0)"VAR" _numeric_"5")9(%LENGTH(&maxlags ) EQ 0)"MAXLAGS" 8"C"@>0(%LENGTH(%QSCAN(%BQUOTE(&maxlags ),2, )) NE 0)"]MERROR: You must precise just one value for the maxlags (&maxlags ) parameter"FINMACRO" ;">"-C(%DATATYP(&maxlags ) EQ CHAR)"I9ERROR: The maxlags (&maxlags ) parameter must be numeric"FINMACRO" ;"C"'G(%LENGTH(&alpha ) EQ 0)"ALPHA" 5"V">L.(%LENGTH(%QSCAN(%BQUOTE(&alpha ),2, )) NE 0)"YIERROR: You must precise just one value for the alpha (&alpha ) parameter"FINMACRO" ;"VP=&xx &date) END=f; ARRAY _vv_(&_nser_) &xx; ARRAY _ndon(&_nser_) _nomb1-_nomb&_nser_; DROP i _nomb1-_nomb&_nser_;"<e,((%LENGTH(&date ) EQ 0) AND (&graph EQ YES))" _numero_=_N_;"e"  DO i=1 TO &_nser_; IF _vv_(i) ^= . THEN _ndon(i)+1; IF ((_vv_(i) ^= .) AND (LAG(_vv_(i))=.) AND (_ndon(i) > 1)) THEN CALL SYMPUT('err'!!LEFT(PUT(i,8.)),'1'); IF f THEN CALL SYMPUT('_ndon'!!LEFT(PUT(i,8.)),LEFT(PUT(_ndon(i),8.)")); END; RUN;"<k,((%LENGTH(&date ) EQ 0) AND (&graph EQ YES))"DATE" _numero_"k"LISTVAR" "&{?I1&_nser_1"LISTVAR") &listvar %TRIM(&&_nvar&i)"u (&&err&i = 1)"1!Missing value in series &&_nvar&i"ERREUR" 1"u"%z(&&_ndon&i LT &order)"<,Not enough values to smooth series &&_nvar&i"ERREUR" 1"z"?"~(&erreur EQ 1)"FINMACRO"~""ERREUR" 0" PROC IML; START gain(weight,period,result); k=weight[,1]; ww=weight[,2:NCOL(weight)]; nmov=NCOL(ww); omega=2#ARCOS(0)#T(DO(0,1,1/(20*period))); komega=omega @ T(k); sink=SIN(komega); cosk=COS(komega); nobs=180#T(DO(0,1,1/(20*"period))); result=nobs; DO i=1 TO nmov; cc=LOC(ww[,i]^=.); sin=sink[,cc]*ww[cc,i]; cos=cosk[,cc]*ww[cc,i]; gain=SQRT(sin##2+cos##2); phase=J(NROW(gain),1,.); cc=LOC(ABS(cos) > 1e-10); phase[cc]=ATAN(sin[cc]/cos[cc]); phase1=" phase; cc=LOC(omega ^=0); phase1[cc]=phase[cc] / omega[cc]; phase1=ROUND(phase1,1e-5); result=result || gain || phase1; END; FINISH gain; START constraint(p1,p2,const,s,ds,r); r=J(const,&order,1); DO i=-p1 TO p2; DO j=" 2 to &d+1; r[j,i+p1+1]=i**(j-1); END; END; DO i=-p1 TO p2; _nt_=0; DO j=1 TO NCOL(s); ll=s[j]; kk=int(i/ll)-1*(i < 0); DO k=1 to ll-1; r[_nt_+k+&d+1,i+p1+1]=-1*(mod(i,ll)=0)+1*(mod(i+p1*ll,ll)=k); END;"  _nt_=_nt_+s[j]-1; IF (ds[j]^= 0) THEN DO; DO _l=1 TO ds[j]; DO k=1 to ll-1; r[_nt_+k+&d+1,i+p1+1] = (kk ^= 0 )*((-int(i/ll)*ll)**_l)*(mod(i,ll)=0) +((kk*ll+k)**_l) *(mod(i+p1*ll,ll)=k);"  END; _nt_=_nt_++s[j]-1; END; END; END; END; FINISH constraint; START musgrave(moy,tab,R); ordre=NROW(moy); m=(ordre+1)/2 ; out=J(ordre,m,.); tab=J(ordre,m,.); out[,m]=moy; tab[,m]=moy; DO"  nterm=m to ordre-1; u1=out[nterm+1:ordre,m][+]/nterm; u2=((nterm+1:ordre)-(nterm+1)/2)*out[nterm+1:ordre,m]; a1=(nterm+1)/2; a2=1+((nterm*(nterm-1)*(nterm+1))/12)*R; DO i=1 to nterm; c1=(i-a1)*R; out[nterm-i+1,nterm-m+1]=out" [i,m]+u1+(u2*(c1/a2)); tab[i,nterm-m+1]=out[nterm-i+1,nterm-m+1]; END; END; tab=T(-INT(ordre/2):INT(ordre/2)) || tab; moy=out; FINISH musgrave; START moymob(xserie,smooth,coeff); coef=CHOOSE(coeff=.,0,coeff); smooth=J(" NROW(xserie),1,.); mmob1=xserie[LOC(xserie ^= .)]; nobs=NROW(mmob1); mmob2=J(nobs,1,.); ordre=NROW(coef); ncols=NCOL(coef); nb=INT(ordre / 2); IF (ncols > 1) THEN mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef[,nb+1]),T(mmob1))[ordre" :nobs]); ELSE mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef),T(mmob1))[ordre:nobs]); IF (ncols > 1) THEN DO; cols=1:nb; mmob3=mmob1; mmob2[1:nb]=T(T(mmob3[1:ordre])*coefW" ;"F"%J(%LENGTH(&add ) EQ 0)"ADD" 0"T"<O,(%LENGTH(%QSCAN(%BQUOTE(&add ),2, )) NE 0)"TDERROR: You must precise just one value for the add (&add ) parameter"FINMACRO" ;"O")T(%DATATYP(&add ) EQ CHAR)"@0ERROR: The add (&add ) parameter must be numeric"FINMACRO" ;"T")X(%LENGTH(&outtype ) EQ 0)"OUTTYPE" 1"g"@]0(%LENGTH(%QSCAN(%BQUOTE(&outtype ),2, )) NE 0)"\LERROR: You must precise just one value for the outtype (&outtype ) parameter"FINMACRO" ;"]"-b(%DATATYP(&outtype ) EQ CHAR)"H8ERROR: The outtype (&outtype ) parameter must be numeric"FINMACRO" ;"g"5g%((&outtype NE 1) AND (&outtype NE 2))"UEERROR: The outtype (&outtype ) parameter must be choosen among (1 2 )"FINMACRO" ;"g")k(%LENGTH(&tseries ) EQ 0)"TSERIES" _numeric_"r"cW DATA _NULL_; SET &data (KEEP=&tseries OBS=1); ARRAY _xx_(*) &tseries ; RUN;"r(&syserr NE 0)"N>ERROR: There is a problem in the tseries (&tseries ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"r"){(%LENGTH(&tseries ) NE 0)"E9 DATA _NULL_; SET &data (KEEP=&tdrop OBS=1); RUN;"z(&syserr NE 0)"J:ERROR: There is a problem in the tdrop (&tdrop ) parameter"UEERROR: Non valid SAS dataset? Non valid SAS name? Non valid SAS list?"FINMACRO" ;"z"{"&(%LENGTH(&date ) EQ 0)":*ERROR: The date parameter must be precised"FINMACRO" ;""=-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"VFERROR: You must precise just one value for the date (&date ) parameter"FINMACRO" ;""]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"(&syserr NE 0)"I9ERROR: There is a problem in the date (&date ) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;""((%LENGTH(&varreg ) NE 0)"aU DATA _NULL_; SET &data (KEEP=&varreg OBS=1); ARRAY _xx_(*) &varreg ; RUN;"(&syserr NE 0)"L<ERROR: There is a problem in the varreg (&varreg ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"""((%LENGTH(®eff ) EQ 0)"REGEFF" 0""?/(%LENGTH(%QSCAN(%BQUOTE(®eff ),2, )) NE 0)"ZJERROR: You must precise just one value for the regeff (®eff ) parameter"FINMACRO" ;"",(%DATATYP(®eff ) EQ CHAR)P[,cols]); IF (ncols=2*nb+2) THEN cols=nb+2:2*nb+2; nobs3=NROW(" mmob3); mmob2[nobs:nobs-nb+1]=T(T(mmob3[nobs3:nobs3-ordre+1])*coef[,cols]); END; smooth[LOC(xserie ^= .)]=mmob2; FINISH moymob; START diagn(table,crit); tab=table[,2:NCOL(table)]; tab=CHOOSE(tab=.,0,tab); crit=J(8,NCOL(tab),." ); iii=REPEAT(table[,1],1,NCOL(tab)); crit[1,]=tab[+,]; crit[2,]=(tab#iii)[+,]; crit[3,]=(tab#(iii##2))[+,]; crit[4,]=(tab#(iii##3))[+,]; order=NROW(tab); pol={1}; DO i=0 TO 3; p=J(order+i,order+2*i,0); DO j=1 TO order+i;" p[j,j:j+i]=pol; END; p=p[,1:order+i]; omega=(p*T(p))[1:order,1:order]; pol=PRODUCT(pol,{1 -1}); crit[i+5,]=T(VECDIAG(T(tab)*omega*tab)); END; FINISH diagn; START F_func(x) GLOBAL(p,f,beta,omega,start,end,nbint);" START G_func(s) GLOBAL(x,p,f); k=T(DO(-p,+f,1)); z=ABS(ATAN((x*SIN(s#k))/(x*COS(s#k)))); RETURN(z); FINISH; pi=2*ARCOS(0); int=T(DO(start*pi,end*pi,(end-start)*pi/&nbint)); CALL QUAD(y,"G_func",int) EPS=1.e-10; v=beta#(x*" omega*T(x))+(1-beta)*SUM(y); *PRINT int y v; RETURN(v); FINISH; s={&s}; ds={&ds}; ns=NCOL(s); nds=NCOL(ds); IF (nds > ns) THEN ds=nds[1:ns]; IF (nds < ns) THEN ds=nds || J(1,ns-nds,0); const=(MAX(s,1)-1)*T(ds+1)+1+&d; CALL"  SYMPUT('const',TRIM(LEFT(CHAR(const,3)))); IF (const > &order) THEN CALL SYMPUT('erreur','1'); ELSE DO; nb=INT(&order/2); IF (&crit =0) THEN omega=I(&order); ELSE DO; IF (&crit > 0) THEN pol={1 -1}; IF (&crit > 1) THEN pol" =PRODUCT(pol,{1 -1}); IF (&crit > 2) THEN pol=PRODUCT(pol,{1 -1}); p=J(&order+&crit,&order+2*&crit,0); DO i=1 TO &order+&crit; p[i,i:i+&crit]=pol; END; p=p[,1:&order+&crit]; omega=(p*t(p))[1:&order,1:&order]; IF (&alpha >":. 0) THEN omega=I(&order)+&alpha#omega; END;" (&debug NE)" PRINT omega;""XL a=I(const)[,1]; nb2=nb; RUN constraint(nb,nb2,const,s,ds,r);" (&debug NE)"PRINT r;""  inv=INV(omega); mat=r*inv*T(r); IF (det(mat)=0) THEN CALL SYMPUT('erreur','2'); ELSE DO; movav=inv*T(r)*INV(mat)*a; IF (&endrule= 0) THEN DO; tabmoy=T(-nb:nb) || movav; namesma={'i'} || COMPRESS(CONCAT("&moy",CHAR("nb,4),"_",CHAR(nb,4))); END; IF (&endrule= 1) THEN DO; tabmoy=J(&order+nb,nb+1,.); tabmoy[nb+1:&order+nb,nb+1]=movav; DO i=1 TO nb; RUN constraint(nb+i,nb-i,const,s,ds,r); moy=inv*T(r)*INV(r*inv*T(r))*a; movav ="  moy[&order:1,] || movav; tabmoy[nb+1-i:&order+nb-i,nb+1-i]=moy; END; tabmoy=T(-2*nb:nb) || tabmoy; namesma={'i'} || COMPRESS(CONCAT(J(1,nb+1,"&moy"),CHAR((2*nb:nb),4),J(1,nb+1,"_"),CHAR((0:nb),4))); END; IF (&endrule= 2) THEN" DO; *cst=4*(ordre=5)+4.5*(ordre=7)+(ordre=9)+3.5*(ordre=11)+3.5*(ordre=13)+4.5*(ordre=23); IF (&order <=5) THEN cst=4; ELSE IF (&order <=7) THEN cst=4.5; ELSE IF (&order <=9) THEN cst=1; ELSE IF (&order <=13) THEN cst=3.5;"  ELSE IF (&order <=23) THEN cst=4.5; ELSE cst=5; R=(2/ARCOS(0))/cst**2; RUN musgrave(movav,tabmoy,R); namesma={'i'} || COMPRESS(CONCAT(J(1,nb+1,"&moy"),CHAR(J(1,nb+1,nb),4),J(1,nb+1,"_"),CHAR((0:nb),4))); END; IF (&endrule" = 3) THEN DO; start=&start; end=&end; nbint=&nbint; beta=β tabmoy=J(&order+nb,nb+1,.); tabmoy[nb+1:&order+nb,nb+1]=movav; first=T(movav); DO i=1 TO nb; p=nb+i; f=nb-i; RUN constraint(p,f,const",s,ds,r); constraints=J(2,p+f+3,.) // (r || J(const,1,0) || a); x=first; *CALL NLPNMS(rc,moy,"F_funQc",x,,constraints); CALL NLPQN(rc,moy,"F_func",x,,constraints); moy=T(moy); movav = moy[&order:1,] || movav;" tabmoy[nb+1-i:&order+nb-i,nb+1-i]=moy; PRINT i rc tabmoy; END; tabmoy=T(-2*nb:nb) || tabmoy; namesma={'i'} || COMPRESS(CONCAT(J(1,nb+1,"&moy"),CHAR((2*nb:nb),4),J(1,nb+1,"_"),CHAR((0:nb),4))); END;"1!((&debug NE) AND (&endrule LE 3))"PRINT movav tabmoy;""(&xx NE)" USE _trav_; READ all VAR{&listvar} INTO don; READ all VAR{&date} INTO date; CLOSE _trav_; nvars=NCOL(don); names={&date &listvar} || COMPRESS(CONCAT(J(1,nvars,"&moy"),{&listvar})); liss=J(NROW(don),nvars,.);"(&endrule NE 4)"y DO i=1 TO nvars; xserie=don[,i]; RUN moymob(xserie,smooth,movav); liss[,i]=smooth; END;""(&endrule EQ 4)" namesma={'i'} || COMPRESS(CONCAT(J(1,&order,"&moy"),CHAR(J(1,&order,nb),4), J(1,&order,"_"),CHAR((0:nb)||(0:nb-1),4),J(1,nb,'_d')||' '||J(1,nb,'_f'))); DO i=1 TO nvars; xserie=don[,i]; nomiss=xserie[LOC(xserie^=.)];" nobs=NROW(nomiss); debut=nomiss[1:&order]; fin=nomiss[nobs-&order+1:nobs]; a=J(&order,1,1) || T(1:&order); b=INV(T(a)*a)*T(a)*debut; sig2=SSQ(debut-a*b)/ℴ R=(b[2]*b[2])/sig2; movavd=movav;"  RUN musgrave(movavd,tabmoyd,R); b=INV(T(a)*a)*T(a)*fin; sig2=SSQ(fin-a*b)/ℴ R=(b[2]*b[2])/sig2; movavf=movav; RUN musgrave(movavf,tabmoyf,R); movav2=movavd || movavf[,1:nb]; tabmoy2=tabmoyd ||"zn tabmoyf[,2:nb+1]; RUN moymob(xserie,smooth,movav2); liss[,i]=smooth; varx={&listvar}[i];" (&debug NE)"&PRINT varx movav2 tabmoy2;""  IF (i=1) THEN DO; var={&listvar}[i]//J(&order-1,1,' '); tabmoy=tabmoy2; END; ELSE DO; var=var // {&listvar}[i]//J(&order-1,1,' '); tabmoy=tabmoy // tabmoy2; END; END; CREATE var FROM"NB var[COLNAME={variable}]; APPEND FROM var; CLOSE var;""y result=date || don || liss; CREATE &out FROM result[COLNAME=names]; APPEND FROM result; CLOSE &out;""  CREATE &tabmoy FROM tabmoy[COLNAME=namesma]; APPEND FROM tabmoy; CLOSE &tabmoy; RUN diagn(tabmoy,criter); Criteria={'SumCoef' 'SumICoef' 'SumI2Coef' 'SumI3Coef' 'Delta0' 'Delta1' 'Delta2' 'Delta3'}; names3=namesma[2:NCOL("namesma)]; CREATE criteria FROM criter[COLNAME=names3 ROWNAME=criteria]; APPEND FROM criter[ROWNAME=criteria]; CLOSE criteria;"'(%UPCASE(&gain) EQ YES)" period=1; DO i=1 TO NCOL(s); period=period*s[i]; END; IF (period ^= 1) THEN freq=ROUND(360/period,0.1); ELSE freq=30; CALL SYMPUT('freq',CHAR(freq,5,1)); RUN gain(tabmoy,period,result);"  namesma=T(namesma[2:NCOL(namesma)]); nnames=NROW(namesma); namespg=COMPRESS(CONCAT(J(nnames,1,"G_"),namesma)) // COMPRESS(CONCAT(J(nnames,1,"P_"),namesma)); namespg={'freq'}// COLVEC(T(namespg)); CREATE Gain_Phasis FROM result["OCCOLNAME=namespg]; APPEND FROM result; CLOSE Gain_Phasis;""" END; END; QUIT;"(&erreur EQ 1)"rbERROR: the number of constraints (&const) should be smaller than the number of parameters (&order)"FINMACRO" ;""(&erreur EQ 2)"k[ERRORR: Non invertible matrix. The constraints are not independant. Check the seasonalities."FINMACRO" ;""(&endrule EQ 4)"A5 DATA _tabmoy_; SET var; SET _tabmoy_; RUN;""(&print EQ YES)"OC PROC PRINT DATA=_tabmoy_; FORMAT _numeric_ 7.4 i 4.; ID"(&endrule EQ 4)" variable"" i" ; RUN;""((%UPCASE(&graph) EQ YES)"L@ GOPTIONS CBACK=white BORDER DEVICE=win FTEXT=swiss noPROMPT;"#(%LENGTH(&xx) NE 0)"{ SYMBOL1 I=join COLOR=&craw WIDTH=1 VALUE=none ; SYMBOL2 I=join COLOR=&clis WIDTH=1 VALUE=none ; AXIS1 LABEL=NONE;"&RI1&_nser_1" PROC GPLOT DATA=&out(WHERE=(&&_nvar&i ^=.)) UNIFORM; PLOT &&_nvar&i*&date &moy.&&_nvar&i*&date /FRAME OVERLAY VAXIS=axis1;"#(&date NE _numero_)"( FORMAT &date MONYY5.;""0$ TITLE " "; RUN; QUIT;"R"! TITLE; SYMBOL;""'(%UPCASE(&gain) EQ YES)"  PROC CONTENTS DATA=_tabmoy_(DROP=i) NOPRINT OUT=nomvar(KEEP=name); RUN; DATA nomvar; SET nomvar; nb=INPUT(REVERSE(SCAN(REVERSE(name),2,'_')),6.); RUN; PROC SORT DATA=nomvar; BY nb; RUN; DATA _NULL_; SET nomvar END=fin"; IF (name ^='VARIABLE') THEN DO; n+1; CALL SYMPUT('_var'||LEFT(PUT(n,5.)),TRIM(LEFT(name))); END; IF fin THEN CALL SYMPUT('_nbvar',LEFT(PUT(n,5.))); RUN; GOPTIONS NODISPLAY GUNIT=pct HTITLE=5 HTEXT=2.5;"+%SYSFUNC(CEXIST(work.mov1))"`T PROC DATASETS LIB=work MEMTYPE=CAT NOLIST; DELETE mov1; RUN; QUIT;""." SYMBOL1 C=black I=join V=none;"&VI1&_nbvar1"  PROC GPLOT DATA=Gain_Phasis GOUT=mov&i UNIFORM; PLOT G_&&_var&i * freq / FRAME HAXIS=0 TO 180 BY &freq HREF=0 TO 180 BY &freq LHREF=33 VREF=1 LVREF=33 NAME="gain"; TITLE "Gain Function"; RUN; QUIT; PROC GPLOT DATA=Gain_Phasis" GOUT=mov&i UNIFORM; PLOT P_&&_var&i * freq / FRAME HAXIS=0 TO 180 BY &freq HREF=0 TO 180 BY &freq LHREF=33 NAME="phasis"; TITLE "Phasis Function"; RUN; QUIT; PROC GPLOT DATA=&tabmoy GOUT=mov&i UNIFORM; PLOT &&_var&i * i /"  FRAME HREF=0 LHREF=33 VREF=0 LVREF=33 NAME="coef" ; TITLE "Coefficients"; RUN; QUIT; GOPTIONS display; PROC GREPLAY IGOUT=mov&i TC=mov&i NOFS GOUT=mov&i; TDEF newthree DES='Three squares of equal size' 1/LLX=1 LLY=1" ULX=1 ULY=49 URX=49 URY=49 LRX=49 LRY=1 color=grey 2/LLX=51 LLY=1 ULX=51 ULY=49 URX=99 URY=49 LRX=99 LRY=1 color=grey 3/LLX=26 LLY=51 ULX=26 ULY=99 URX=76 URY=99 LRX=76 LRY=51 color=grey;"h\ TEMPLATE newthree; TREPLAY 1:gain 2:phasis 3:coef; RUN; QUIT; TITLE;"V"F: OPTIONS noxwait; X "del c:\temp.txt /Q"; SYMBOL;"""#0` P@p0` P|Lt, 0 H X l  0 D X H  X p $8LpLLdt4 xX\t@Xh|S$0HXl$<Pd,@pl,@Th|4L\p  T $8Ld 8H\ @ !$!8!x!!!! "D"d""" ##0#X#l####,$D$T$h$$$ %$%4%H%l%%%0&&&&&&'T'''''H(h(( )8)H)\)p))))*l*****+4+D+X++++,,0,X,l,,,,0-H-X-l----..D.X.l.../0/@/T/////0H0`0t000141D1X1p112\3x33333444|4445545|5556646l66666667 889 949@:`::::::;,;D;p;;;;;<,<h<<<<<<<<=(=<=D>L?X@dApB|CDEFGHIJKLMN4OPOhO|OOOPP$Q,R8S"0ORDER"0D"0S"0DS"0MOY"0TABMOY"0CRIT"0ALPHA"0BETA"0ENDRULE"0START"0END"0NBINT"0PRINT"0GAIN"0DATA"0OUT"0XX"0DATE"0GRAPH"0CRAW"0CLIS"0DEBUG",FINMACRO" (&debug NE)"!OPTIONS MPRINT NOTES;""  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"'%(%LENGTH(&order ) EQ 0)";+ERROR: The order parameter must be precised"FINMACRO" ;"4">*.(%LENGTH(%QSCAN(%BQUOTE(&order ),2, )) NE 0)"WGERROR: You must precise just one value for the order (&order) parameter"FINMACRO" ;"*"+/(%DATATYP(&order ) EQ CHAR)"C3ERROR: The order (&order) parameter must be numeric"FINMACRO" ;"4"4(&order LE 0 )"/ERROR: You must have &order > 0"FINMACRO" ;"4"#8(%LENGTH(&d ) EQ 0)"D" 0"G":=*(%LENGTH(%QSCAN(%BQUOTE(&d ),2, )) NE 0)"O?ERROR: You must precise just one value for the d (&d) parameter"FINMACRO" ;"="'B(%DATATYP(&d ) EQ CHAR)";+ERROR: The d (&d) parameter must be numeric"FINMACRO" ;"G"EG5((&d NE 0) AND (&d NE 1) AND (&d NE 2) AND (&d NE 3))"N>ERROR: The d (&d ) parameter must be choosen among (0 1 2 3 )"FINMACRO" ;"G"#K(%LENGTH(&s ) EQ 0)"S" 1"-K"O (&s EQ 0)"S" 1"O"#S(%LENGTH(&ds) EQ 0)"DS" 0"S"%W(%LENGTH(&moy ) EQ 0)"MOY" M_"a"<\,(%LENGTH(%QSCAN(%BQUOTE(&moy ),2, )) NE 0)"UEERROR: You must precise just one value for the moy (&moy ) parameter"FINMACRO" ;"\"(a(%DATATYP(&moy ) EQ NUM)"C3ERROR: The moy (&moy ) parameter must be character"FINMACRO" ;"a"(e(%LENGTH(&tabmoy ) EQ 0)"TABMOY" _tabmoy_"p"?j/(%LENGTH(%QSCAN(%BQUOTE(&tabmoy ),2, )) NE 0)"[KERROR: You must precise just one value for the tabmoy (&tabmoy ) parameter"FINMACRO" ;"j"3' %sasnom(_IN_=&tabmoy ,TYPE=DATASET);"p (&_ret_ NE 0)"XHERROR: The tabmoy (&tabmoy ) parameter must be a valid SAS dataset name"FINMACRO" ;"p"&t(%LENGTH(&crit ) EQ 0)"CRIT" 0""=y-(%LENGTH(%QSCAN(%BQUOTE(&crit ),2, )) NE 0)"WGERROR: You must precise just one value for the crit (&crit ) parameter"FINMACRO" ;"y"*~(%DATATYP(&crit ) EQ CHAR)"C3ERROR: The crit (&crit ) parameter must be numeric"FINMACRO" ;""QA((&crit NE 0) AND (&crit NE 1) AND (&crit NE 2) AND (&crit NE 3))"TDERROR: The crit (&crit ) parameter must be choosen among (0 1 2 3 )"FINMACRO" ;""'(%LENGTH(&alpha ) EQ 0)"ALPHA" 0"">.(%LENGTH(%QSCAN(%BQUOTE(&alpha ),2, )) NE 0)"YIERROR: You must precise just one value for the alpha (&alpha ) parameter"FINMACRO" ;""+(%DATATYP(&alpha ) EQ CHAR)"E5ERROR: The alpha (&alpha ) parameter must be numeric"FINMACRO" ;""(&alpha LT 0 )"1!ERROR: You must have &alpha >= 0"FINMACRO" ;""((%LENGTH(&endrule) EQ 0)"ENDRULE" 2""@0(%LENGTH(%QSCAN(%BQUOTE(&endrule ),2, )) NE 0)"]MERROR: You must precise just one value for the endrule (&endrule ) parameter"FINMACRO" ;""-(%DATATYP(&endrule ) EQ CHAR)"I9ERROR: The endrule (&endrule ) parameter must be numeric"FINMACRO" ;""qa((&endrule NE 0) AND (&endrule NE 1) AND (&endrule NE 2) AND (&endrule NE 3) AND (&endrule NE 4))"[KERROR: The endrule (&endrule ) parameter must be choosen among (0 1 2 3 4)"FINMACRO" ;""&(%LENGTH(&gain ) EQ 0)"GAIN" NO""GAIN" %UPCASE(&gain)"=-(%LENGTH(%QSCAN(%BQUOTE(&gain ),2, )) NE 0)."WGERROR: You must precise just one value for the gain (&gain ) parameter"FINMACRO" ;"")(%DATATYP(&gain ) EQ NUM)"E5ERROR: The gain (&gain ) parameter must be character"FINMACRO" ;""2"((&gain NE YES) AND (&gain NE NO))"RBERROR: The gain (&gain ) parameter must be choosen among (YES NO)"FINMACRO" ;""'(%LENGTH(&print ) EQ 0)"PRINT" YES""PRINT" %UPCASE(&print)">.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"YIERROR: You must precise just one value for the print (&print ) parameter"FINMACRO" ;""*(%DATATYP(&print ) EQ NUM)"G7ERROR: The print (&print ) parameter must be character"FINMACRO" ;""4$((&print NE YES) AND (&print NE NO))"TDERROR: The print (&print ) parameter must be choosen among (YES NO)"FINMACRO" ;""&(%LENGTH(&data ) EQ 0)"DATA" _last_""=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"(&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;""%(%LENGTH(&out ) EQ 0)"OUT" _result_""<,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;""0$ %sasnom(_IN_=&out ,TYPE=DATASET);" (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;""$(%LENGTH(&xx ) NE 0)"YM DATA _NULL_; SET &data (KEEP=&xx OBS=1); ARRAY _xx_(*) &xx ; RUN;"(&syserr NE 0)"E5ERROR: There is a problem in the xx (&xx ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"""& (%LENGTH(&date ) NE 0)"=-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"WGERROR: You must precise just one value for the date (&date ) parameter"FINMACRO" ;""]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"(&syserr NE 0)"I9ERROR: There is a problem in the date (&date ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"" "'(%LENGTH(&graph ) NE 0)"GRAPH" %UPCASE(&graph)">.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2,/ )) NE 0)"YIERROR: You must precise just one value for the graph (&graph ) parameter"FINMACRO" ;""*(%DATATYP(&graph ) EQ NUM)"G7ERROR: The graph (&graph ) parameter must be character"FINMACRO" ;""4$((&graph NE YES) AND (&graph NE NO))"TDERROR: The graph (&graph ) parameter must be choosen among (YES NO)"FINMACRO" ;"""& (%LENGTH(&craw ) EQ 0)"CRAW" black"*"=%-(%LENGTH(%QSCAN(%BQUOTE(&craw ),2, )) NE 0)"WGERROR: You must precise just one value for the craw (&craw ) parameter"FINMACRO" ;"%")*(%DATATYP(&craw ) EQ NUM)"E5ERROR: The craw (&craw ) parameter must be character"FINMACRO" ;"*"&.(%LENGTH(&clis ) EQ 0)"CLIS" red"8"=3-(%LENGTH(%QSCAN(%BQUOTE(&clis ),2, )) NE 0)"WGERROR: You must precise just one value for the clis (&clis ) parameter"FINMACRO" ;"3")8(%DATATYP(&clis ) EQ NUM)"E5ERROR: The clis (&clis ) parameter must be character"FINMACRO" ;"8"A<1((%LENGTH(&graph ) EQ 0) AND (%LENGTH(&xx) NE 0))"GRAPH" YES"<"9A)((&endrule EQ 4) AND (%LENGTH(&xx) EQ 0))"WGERROR: ENDRULE=4 can only be used when there is a series to be smoothed"FINMACRO" ;"A"ERREUR" 0"  PROC IML; s={&s}; ds={&ds}; order={&order}; IF ((TYPE(s) = 'N') & (NCOL(LOC(INT(s) ^= s))^=0)) THEN CALL SYMPUT('erreur','1'); IF ((TYPE(s) = 'N') & (NCOL(LOC( s < 0))^=0)) THEN CALL SYMPUT('erreur','2'); IF ((TYPE(ds) = 'N') & (NCOL(LOC(INT"(ds) ^= ds))^=0)) THEN CALL SYMPUT('erreur','3'); IF ((TYPE(ds) = 'N') & (NCOL(LOC( ds < 0))^=0)) THEN CALL SYMPUT('erreur','4'); IF(MOD(order,2)=0) THEN CALL SYMPUT('erreur','5'); QUIT;"J (&syserr)"@0ERROR: the S and DS parameters should be numeric"FINMACRO" ;"J"](&erreur NE 0)"N(&erreur EQ 1)"F6ERROR: the S parameter should have only integer values"N"Q(&erreur EQ 2)"O?ERROR: the S parameter should have only positive integer values"Q"T(&erreur EQ 3)"G7ERROR: the DS parameter should have only integer values"T"W(&erreur EQ 4)"P@ERROR: the DS parameter should have only positive integer values"W"Z(&erreur EQ 5)"8(ERROR: the ORDER parameter should be odd"Z"FINMACRO" ;"]"ERREUR" 0"(&xx NE)"  PROC CONTENTS DATA=&data(KEEP=&xx) NOPRINT OUT=_nomvar_(KEEP=name); RUN; DATA _null_; SET _nomvar_ END=f; CALL SYMPUT('_nvar'!!LEFT(PUT(_n_,8.)),name); CALL SYMPUT('err'!!LEFT(PUT(_n_,8.)),'0'); IF f THEN CALL SYMPUT('_nser_',LEFT(PUT("_n_,8.))); RUN; DATA _trav_; SET &data(KEE(P=&xx &date) END=f; ARRAY _vv_(&_nser_) &xx; ARRAY _ndon(&_nser_) _nomb1-_nomb&_nser_; DROP i _nomb1-_nomb&_nser_;"<e,((%LENGTH(&date ) EQ 0) AND (&graph EQ YES))" _numero_=_N_;"e"  DO i=1 TO &_nser_; IF _vv_(i) ^= . THEN _ndon(i)+1; IF ((_vv_(i) ^= .) AND (LAG(_vv_(i))=.) AND (_ndon(i) > 1)) THEN CALL SYMPUT('err'!!LEFT(PUT(i,8.)),'1'); IF f THEN CALL SYMPUT('_ndon'!!LEFT(PUT(i,8.)),LEFT(PUT(_ndon(i),8.)")); END; RUN;"<k,((%LENGTH(&date ) EQ 0) AND (&graph EQ YES))"DATE" _numero_"k"LISTVAR" "&{?I1&_nser_1"LISTVAR") &listvar %TRIM(&&_nvar&i)"u (&&err&i = 1)"1!Missing value in series &&_nvar&i"ERREUR" 1"u"%z(&&_ndon&i LT &order)"<,Not enough values to smooth series &&_nvar&i"ERREUR" 1"z"?"~(&erreur EQ 1)"FINMACRO"~""ERREUR" 0" PROC IML; START gain(weight,period,result); k=weight[,1]; ww=weight[,2:NCOL(weight)]; nmov=NCOL(ww); omega=2#ARCOS(0)#T(DO(0,1,1/(20*period))); komega=omega @ T(k); sink=SIN(komega); cosk=COS(komega); nobs=180#T(DO(0,1,1/(20*"period))); result=nobs; DO i=1 TO nmov; cc=LOC(ww[,i]^=.); sin=sink[,cc]*ww[cc,i]; cos=cosk[,cc]*ww[cc,i]; gain=SQRT(sin##2+cos##2); phase=J(NROW(gain),1,.); cc=LOC(ABS(cos) > 1e-10); phase[cc]=ATAN(sin[cc]/cos[cc]); phase1=" phase; cc=LOC(omega ^=0); phase1[cc]=phase[cc] / omega[cc]; phase1=ROUND(phase1,1e-5); result=result || gain || phase1; END; FINISH gain; START constraint(p1,p2,const,s,ds,r); r=J(const,&order,1); DO i=-p1 TO p2; DO j=" 2 to &d+1; r[j,i+p1+1]=i**(j-1); END; END; DO i=-p1 TO p2; _nt_=0; DO j=1 TO NCOL(s); ll=s[j]; kk=int(i/ll)-1*(i < 0); DO k=1 to ll-1; r[_nt_+k+&d+1,i+p1+1]=-1*(mod(i,ll)=0)+1*(mod(i+p1*ll,ll)=k); END;"  _nt_=_nt_+s[j]-1; IF (ds[j]^= 0) THEN DO; DO _l=1 TO ds[j]; DO k=1 to ll-1; r[_nt_+k+&d+1,i+p1+1] = (kk ^= 0 )*((-int(i/ll)*ll)**_l)*(mod(i,ll)=0) +((kk*ll+k)**_l) *(mod(i+p1*ll,ll)=k);"  END; _nt_=_nt_++s[j]-1; END; END; END; END; FINISH constraint; START musgrave(moy,tab,R); ordre=NROW(moy); m=(ordre+1)/2 ; out=J(ordre,m,.); tab=J(ordre,m,.); out[,m]=moy; tab[,m]=moy; DO"  nterm=m to ordre-1; u1=out[nterm+1:ordre,m][+]/nterm; u2=((nterm+1:ordre)-(nterm+1)/2)*out[nterm+1:ordre,m]; a1=(nterm+1)/2; a2=1+((nterm*(nterm-1)*(nterm+1))/12)*R; DO i=1 to nterm; c1=(i-a1)*R; out[nterm-i+1,nterm-m+1]=out" [i,m]+u1+(u2*(c1/a2)); tab[i,nterm-m+1]=out[nterm-i+1,nterm-m+1]; END; END; tab=T(-INT(ordre/2):INT(ordre/2)) || tab; moy=out; FINISH musgrave; START moymob(xserie,smooth,coeff); coef=CHOOSE(coeff=.,0,coeff); smooth=J(" NROW(xserie),1,.); mmob1=xserie[LOC(xserie ^= .)]; nobs=NROW(mmob1); mmob2=J(nobs,1,.); ordre=NROW(coef); ncols=NCOL(coef); nb=INT(ordre / 2); IF (ncols > 1) THEN mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef[,nb+1]),T(mmob1))[ordre" :nobs]); ELSE mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef),T(mmob1))[ordre:nobs]); IF (ncols > 1) THEN DO; cols=1:nb; mmob3=mmob1; mmob2[1:nb]=T(T(mmob3[1:ordre])*coef)[,cols]); IF (ncols=2*nb+2) THEN cols=nb+2:2*nb+2; nobs3=NROW(" mmob3); mmob2[nobs:nobs-nb+1]=T(T(mmob3[nobs3:nobs3-ordre+1])*coef[,cols]); END; smooth[LOC(xserie ^= .)]=mmob2; FINISH moymob; START diagn(table,crit); tab=table[,2:NCOL(table)]; tab=CHOOSE(tab=.,0,tab); crit=J(8,NCOL(tab),." ); iii=REPEAT(table[,1],1,NCOL(tab)); crit[1,]=tab[+,]; crit[2,]=(tab#iii)[+,]; crit[3,]=(tab#(iii##2))[+,]; crit[4,]=(tab#(iii##3))[+,]; order=NROW(tab); pol={1}; DO i=0 TO 3; p=J(order+i,order+2*i,0); DO j=1 TO order+i;" p[j,j:j+i]=pol; END; p=p[,1:order+i]; omega=(p*T(p))[1:order,1:order]; pol=PRODUCT(pol,{1 -1}); crit[i+5,]=T(VECDIAG(T(tab)*omega*tab)); END; FINISH diagn; START F_func(x) GLOBAL(p,f,beta,omega,start,end,nbint);" START G_func(s) GLOBAL(x,p,f); k=T(DO(-p,+f,1)); z=ABS(ATAN((x*SIN(s#k))/(x*COS(s#k)))); RETURN(z); FINISH; pi=2*ARCOS(0); int=T(DO(start*pi,end*pi,(end-start)*pi/&nbint)); CALL QUAD(y,"G_func",int) EPS=1.e-10; v=beta#(x*" omega*T(x))+(1-beta)*SUM(y); *PRINT int y v; RETURN(v); FINISH; s={&s}; ds={&ds}; ns=NCOL(s); nds=NCOL(ds); IF (nds > ns) THEN ds=nds[1:ns]; IF (nds < ns) THEN ds=nds || J(1,ns-nds,0); const=(MAX(s,1)-1)*T(ds+1)+1+&d; CALL"  SYMPUT('const',TRIM(LEFT(CHAR(const,3)))); IF (const > &order) THEN CALL SYMPUT('erreur','1'); ELSE DO; nb=INT(&order/2); IF (&crit =0) THEN omega=I(&order); ELSE DO; IF (&crit > 0) THEN pol={1 -1}; IF (&crit > 1) THEN pol" =PRODUCT(pol,{1 -1}); IF (&crit > 2) THEN pol=PRODUCT(pol,{1 -1}); p=J(&order+&crit,&order+2*&crit,0); DO i=1 TO &order+&crit; p[i,i:i+&crit]=pol; END; p=p[,1:&order+&crit]; omega=(p*t(p))[1:&order,1:&order]; IF (&alpha >":. 0) THEN omega=I(&order)+&alpha#omega; END;" (&debug NE)" PRINT omega;""XL a=I(const)[,1]; nb2=nb; RUN constraint(nb,nb2,const,s,ds,r);" (&debug NE)"PRINT r;""  inv=INV(omega); mat=r*inv*T(r); IF (det(mat)=0) THEN CALL SYMPUT('erreur','2'); ELSE DO; movav=inv*T(r)*INV(mat)*a; IF (&endrule= 0) THEN DO; tabmoy=T(-nb:nb) || movav; namesma={'i'} || COMPRESS(CONCAT("&moy",CHAR("nb,4),"_",CHAR(nb,4))); END; IF (&endrule= 1) THEN DO; tabmoy=J(&order+nb,nb+1,.); tabmoy[nb+1:&order+nb,nb+1]=movav; DO i=1 TO nb; RUN constraint(nb+i,nb-i,const,s,ds,r); moy=inv*T(r)*INV(r*inv*T(r))*a; movav ="  moy[&order:1,] || movav; tabmoy[nb+1-i:&order+nb-i,nb+1-i]=moy; END; tabmoy=T(-2*nb:nb) || tabmoy; namesma={'i'} || COMPRESS(CONCAT(J(1,nb+1,"&moy"),CHAR((2*nb:nb),4),J(1,nb+1,"_"),CHAR((0:nb),4))); END; IF (&endrule= 2) THEN" DO; *cst=4*(ordre=5)+4.5*(ordre=7)+(ordre=9)+3.5*(ordre=11)+3.5*(ordre=13)+4.5*(ordre=23); IF (&order <=5) THEN cst=4; ELSE IF (&order <=7) THEN cst=4.5; ELSE IF (&order <=9) THEN cst=1; ELSE IF (&order <=13) THEN cst=3.5;"  ELSE IF (&order <=23) THEN cst=4.5; ELSE cst=5; R=(2/ARCOS(0))/cst**2; RUN musgrave(movav,tabmoy,R); namesma={'i'} || COMPRESS(CONCAT(J(1,nb+1,"&moy"),CHAR(J(1,nb+1,nb),4),J(1,nb+1,"_"),CHAR((0:nb),4))); END; IF (&endrule" = 3) THEN DO; start=&start; end=&end; nbint=&nbint; beta=β tabmoy=J(&order+nb,nb+1,.); tabmoy[nb+1:&order+nb,nb+1]=movav; first=T(movav); DO i=1 TO nb; p=nb+i; f=nb-i; RUN constraint(p,f,const",s,ds,r); constraints=J(2,p+f+3,.) // (r || J(const,1,0) || a); x=first; *CALL NLPNMS(rc,moy,"F_fun*c",x,,constraints); CALL NLPQN(rc,moy,"F_func",x,,constraints); moy=T(moy); movav = moy[&order:1,] || movav;" tabmoy[nb+1-i:&order+nb-i,nb+1-i]=moy; PRINT i rc tabmoy; END; tabmoy=T(-2*nb:nb) || tabmoy; namesma={'i'} || COMPRESS(CONCAT(J(1,nb+1,"&moy"),CHAR((2*nb:nb),4),J(1,nb+1,"_"),CHAR((0:nb),4))); END;"1!((&debug NE) AND (&endrule LE 3))"PRINT movav tabmoy;""(&xx NE)" USE _trav_; READ all VAR{&listvar} INTO don; READ all VAR{&date} INTO date; CLOSE _trav_; nvars=NCOL(don); names={&date &listvar} || COMPRESS(CONCAT(J(1,nvars,"&moy"),{&listvar})); liss=J(NROW(don),nvars,.);"(&endrule NE 4)"y DO i=1 TO nvars; xserie=don[,i]; RUN moymob(xserie,smooth,movav); liss[,i]=smooth; END;""(&endrule EQ 4)" namesma={'i'} || COMPRESS(CONCAT(J(1,&order,"&moy"),CHAR(J(1,&order,nb),4), J(1,&order,"_"),CHAR((0:nb)||(0:nb-1),4),J(1,nb,'_d')||' '||J(1,nb,'_f'))); DO i=1 TO nvars; xserie=don[,i]; nomiss=xserie[LOC(xserie^=.)];" nobs=NROW(nomiss); debut=nomiss[1:&order]; fin=nomiss[nobs-&order+1:nobs]; a=J(&order,1,1) || T(1:&order); b=INV(T(a)*a)*T(a)*debut; sig2=SSQ(debut-a*b)/ℴ R=(b[2]*b[2])/sig2; movavd=movav;"  RUN musgrave(movavd,tabmoyd,R); b=INV(T(a)*a)*T(a)*fin; sig2=SSQ(fin-a*b)/ℴ R=(b[2]*b[2])/sig2; movavf=movav; RUN musgrave(movavf,tabmoyf,R); movav2=movavd || movavf[,1:nb]; tabmoy2=tabmoyd ||"zn tabmoyf[,2:nb+1]; RUN moymob(xserie,smooth,movav2); liss[,i]=smooth; varx={&listvar}[i];" (&debug NE)"&PRINT varx movav2 tabmoy2;""  IF (i=1) THEN DO; var={&listvar}[i]//J(&order-1,1,' '); tabmoy=tabmoy2; END; ELSE DO; var=var // {&listvar}[i]//J(&order-1,1,' '); tabmoy=tabmoy // tabmoy2; END; END; CREATE var FROM"NB var[COLNAME={variable}]; APPEND FROM var; CLOSE var;""y result=date || don || liss; CREATE &out FROM result[COLNAME=names]; APPEND FROM result; CLOSE &out;""  CREATE &tabmoy FROM tabmoy[COLNAME=namesma]; APPEND FROM tabmoy; CLOSE &tabmoy; RUN diagn(tabmoy,criter); Criteria={'SumCoef' 'SumICoef' 'SumI2Coef' 'SumI3Coef' 'Delta0' 'Delta1' 'Delta2' 'Delta3'}; names3=namesma[2:NCOL("namesma)]; CREATE criteria FROM criter[COLNAME=names3 ROWNAME=criteria]; APPEND FROM criter[ROWNAME=criteria]; CLOSE criteria;"'(%UPCASE(&gain) EQ YES)" period=1; DO i=1 TO NCOL(s); period=period*s[i]; END; IF (period ^= 1) THEN freq=ROUND(360/period,0.1); ELSE freq=30; CALL SYMPUT('freq',CHAR(freq,5,1)); RUN gain(tabmoy,period,result);"  namesma=T(namesma[2:NCOL(namesma)]); nnames=NROW(namesma); namespg=COMPRESS(CONCAT(J(nnames,1,"G_"),namesma)) // COMPRESS(CONCAT(J(nnames,1,"P_"),namesma)); namespg={'freq'}// COLVEC(T(namespg)); CREATE Gain_Phasis FROM result["OCCOLNAME=namespg]; APPEND FROM result; CLOSE Gain_Phasis;""" END; END; QUIT;"(&erreur EQ 1)"rbERROR: the number of constraints (&const) should be smaller than the number of parameters (&order)"FINMACRO" ;""(&erreur EQ 2)"k[ERRO+R: Non invertible matrix. The constraints are not independant. Check the seasonalities."FINMACRO" ;""(&endrule EQ 4)"A5 DATA _tabmoy_; SET var; SET _tabmoy_; RUN;""(&print EQ YES)"OC PROC PRINT DATA=_tabmoy_; FORMAT _numeric_ 7.4 i 4.; ID"(&endrule EQ 4)" variable"" i" ; RUN;""((%UPCASE(&graph) EQ YES)"L@ GOPTIONS CBACK=white BORDER DEVICE=win FTEXT=swiss noPROMPT;"#(%LENGTH(&xx) NE 0)"{ SYMBOL1 I=join COLOR=&craw WIDTH=1 VALUE=none ; SYMBOL2 I=join COLOR=&clis WIDTH=1 VALUE=none ; AXIS1 LABEL=NONE;"&RI1&_nser_1" PROC GPLOT DATA=&out(WHERE=(&&_nvar&i ^=.)) UNIFORM; PLOT &&_nvar&i*&date &moy.&&_nvar&i*&date /FRAME OVERLAY VAXIS=axis1;"#(&date NE _numero_)"( FORMAT &date MONYY5.;""0$ TITLE " "; RUN; QUIT;"R"! TITLE; SYMBOL;""'(%UPCASE(&gain) EQ YES)"  PROC CONTENTS DATA=_tabmoy_(DROP=i) NOPRINT OUT=nomvar(KEEP=name); RUN; DATA nomvar; SET nomvar; nb=INPUT(REVERSE(SCAN(REVERSE(name),2,'_')),6.); RUN; PROC SORT DATA=nomvar; BY nb; RUN; DATA _NULL_; SET nomvar END=fin"; IF (name ^='VARIABLE') THEN DO; n+1; CALL SYMPUT('_var'||LEFT(PUT(n,5.)),TRIM(LEFT(name))); END; IF fin THEN CALL SYMPUT('_nbvar',LEFT(PUT(n,5.))); RUN; GOPTIONS NODISPLAY GUNIT=pct HTITLE=5 HTEXT=2.5;"+%SYSFUNC(CEXIST(work.mov1))"`T PROC DATASETS LIB=work MEMTYPE=CAT NOLIST; DELETE mov1; RUN; QUIT;""." SYMBOL1 C=black I=join V=none;"&VI1&_nbvar1"  PROC GPLOT DATA=Gain_Phasis GOUT=mov&i UNIFORM; PLOT G_&&_var&i * freq / FRAME HAXIS=0 TO 180 BY &freq HREF=0 TO 180 BY &freq LHREF=33 VREF=1 LVREF=33 NAME="gain"; TITLE "Gain Function"; RUN; QUIT; PROC GPLOT DATA=Gain_Phasis" GOUT=mov&i UNIFORM; PLOT P_&&_var&i * freq / FRAME HAXIS=0 TO 180 BY &freq HREF=0 TO 180 BY &freq LHREF=33 NAME="phasis"; TITLE "Phasis Function"; RUN; QUIT; PROC GPLOT DATA=&tabmoy GOUT=mov&i UNIFORM; PLOT &&_var&i * i /"  FRAME HREF=0 LHREF=33 VREF=0 LVREF=33 NAME="coef" ; TITLE "Coefficients"; RUN; QUIT; GOPTIONS display; PROC GREPLAY IGOUT=mov&i TC=mov&i NOFS GOUT=mov&i; TDEF newthree DES='Three squares of equal size' 1/LLX=1 LLY=1" ULX=1 ULY=49 URX=49 URY=49 LRX=49 LRY=1 color=grey 2/LLX=51 LLY=1 ULX=51 ULY=49 URX=99 URY=49 LRX=99 LRY=1 color=grey 3/LLX=26 LLY=51 ULX=26 ULY=99 URX=76 URY=99 LRX=76 LRY=51 color=grey;"h\ TEMPLATE newthree; TREPLAY 1:gain 2:phasis 3:coef; RUN; QUIT; TITLE;"V"F: OPTIONS noxwait; X "del c:\temp.txt /Q"; SYMBOL;"""#0` P@p0` P|Lt, 0 H X l  0 D X H  X p $8LpLLdt4 xX\t@Xh|$$0HXl$<Pd,@pl,@Th|4L\p  T $8Ld 8H\ @ !$!8!x!!!! "D"d""" ##0#X#l####,$D$T$h$$$ %$%4%H%l%%%0&&&&&&'T'''''H(h(( )8)H)\)p))))*l*****+4+D+X++++,,0,X,l,,,,0-H-X-l----..D.X.l.../0/@/T/////0H0`0t000141D1X1p112\3x33333444|4445545|5556646l66666667 889 949@:`::::::;,;D;p;;;;;<,<h<<<<<<<<=(=<=D>L?X@dApB|CDEFGHIJKLMN4OPOhO|OOOPP$Q,R8S 0);" (&log EQ YES)"PD IF (NCOL(cc) ^= 0) THEN Periodogram[cc,i]=10*LOG10(fft[cc,]);""F: IF (NCOL(cc) ^= 0) THEN Periodogram[cc,i]=fft[cc,];"  END; FINISH Periodogram; USE seas(WHERE=(&varspec ^=.)); READ all VAR{&varspec} INTO x; READ all VAR{&date} INTO date; CLOSE seas; nvar=NCOL(x); nobs=NROW(x); period=&per; pi=2*ARCOS(0); frq=T(DO(0,0.5,1/"300)); IF (period=12) THEN DO; specfreq={0.348125 0.431458}; END; IF (period=4) THEN DO; specfreq={0.044375 0.088750 0.294375 0.338750 0.383125}; END; nfrq=NROW(frq); FreqN=T(CONCAT(J(1,nfrq,'Freq'),LEFT(CHAR(1:nfrq,5))));"  nbtd=NCOL(specfreq); nametd=T(CONCAT(J(1,nbtd,'TD'),LEFT(CHAR(1:nbtd,5)))); DO i=1 TO nbtd; min=ABS(frq-specfreq[i])[>:<]; frq[min]=specfreq[i]; frq[min+1]=frq[min]+frq[2]; frq[min-1]=frq[min]-frq[2]; FreqN[min]=CONCAT('TD',"LEFT(CHAR(i,5))); END; frq0=LOC((frq^=0) & (MOD(ROUND(360*frq,10**-5),360/period)=0)); nbseas=NCOL(frq0); nameseas=T(CONCAT(J(1,nbseas,'Seas'),LEFT(CHAR(1:nbseas,5)))); FreqN[frq0]=nameseas; RUN Periodogram(x,newvar1,frq,period);" Ident={'Freq'} || {'Freq2'} || {"s_01"}; Frq2=360*Frq; Periodogram=Frq2 || Frq || newvar1; CREATE __spect1__ FROM Periodogram[ROWNAME=FreqN COLNAME=Ident]; APPEND FROM Periodogram[ROWNAME=FreqN]; CLOSE __spect1__; QUIT; DATA"  __spect2__; LENGTH listf $ 2000; SET __spect1__ END=fin; DROP a listf; LABEL Freq='Frequency 0 to 180'; s_02=s_01; RETAIN listf ' '; IF ((FreqN=:'T') OR (FreqN=:'S')) THEN listf=TRIM(LEFT(COMPBL(TRIM(LEFT(listf))||', '||TRIM(LEFT(PUT"(Freq,6.2)))))); IF fin THEN DO; a=INDEX(listf,','); listf=TRIM(LEFT(SUBSTR(listf,a+1))); CALL SYMPUT('listf',TRIM(LEFT(listf))); END; RUN;" (&log EQ NO)"  PROC UNIVARIATE DATA=__spect1__ NOPRINT; VAR s_01; OUTPUT OUT=p90 P90=P90; RUN; DATA _NULL_; SET p90; pp=INT(LOG10(p90)); p90=ROUND(p90,10**(pp-2)); CALL SYMPUT('p90',TRIM(LEFT(PUT(p90,20.5)))); RUN; DATA __spect2__"^R; SET __spect2__; degre=90*freq/ARCOS(0); s_02=MIN(s_01,&p90); RUN;"" GOPTIONS CBACK=white BORDER NODISPLAY NOPROMPT DEVMAP=winansi KEYMAP=winansi DEVICE=win FTITLE=swiss FTEXT=swissb GUNIT=pct HTITLE=5 HTEXT=2.5; DATA _null_; IF (CEXIST("&&_var&i")) THEN CALL SYMPUT('_catalg','1');"9- ELSE CALL SYMPUT('_catalg','0'); RUN;" (&_catalg)"6* PROC CATALOG C=&&_var&i KILL; QUIT;"" SYMBOL1 I=join COLOR=black WIDTH=1 VALUE=none ; SYMBOL2 I=join COLOR=red WIDTH=1 VALUE=none ; PROC GPLOT DATA=seas(WHERE=(&&_var&i ^=.)) GOUT=&&_var&i UNIFORM; PLOT &&_var&i*&date = 1 / NAME="brute" VAXIS=axis1; AXIS1 LABEL=(R=0 a=90);"UI FORMAT &date &formd; TITLE "Srie brute &&_var&i"; RUN; QUIT;" &SYSVER >= 7" DATA _null_; CALL SYMPUT('smooth2',LEFT(COMPRESS('('||PUT(100*&smooth,3.)||'%)'))); RUN; PROC GPLOT DATA=loess GOUT=&&_var&i UNIFORM; PLOT (&&_var&i loess)*&date / NAME="loess" VAXIS=axis1 OVERLAY; FORMAT &date &formd; AXIS1"l` LABEL=(a=90); TITLE "Srie brute &&_var&i et lissage par LOESS &smooth2"; RUN; QUIT;""@4 PROC GPLOT DATA=__spect2__ GOUT=&&_var&i UNIFORM;" (&per EQ 12)" PLOT s_02*freq / NAME="spectre" OVER'L"+Q(%DATATYP(&alpha ) EQ CHAR)"E5ERROR: The alpha (&alpha ) parameter must be numeric"FINMACRO" ;"V"4V$((&alpha LE 0 ) OR (&alpha GE 100 ))"7'ERROR: You must have 0 < &alpha < 100"FINMACRO" ;"V"&Z(%LENGTH(&word ) EQ 0)"WORD" NO"k"WORD" %UPCASE(&word)"=a-(%LENGTH(%QSCAN(%BQUOTE(&word ),2, )) NE 0)"WGERROR: You must precise just one value for the word (&word ) parameter"FINMACRO" ;"a")f(%DATATYP(&word ) EQ NUM)"E5ERROR: The word (&word ) parameter must be character"FINMACRO" ;"k"2k"((&word NE YES) AND (&word NE NO))"RBERROR: The word (&word ) parameter must be choosen among (YES NO)"FINMACRO" ;"k"'o(%LENGTH(&print ) EQ 0)"PRINT" NO""PRINT" %UPCASE(&print)">v.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"YIERROR: You must precise just one value for the print (&print ) parameter"FINMACRO" ;"v"*{(%DATATYP(&print ) EQ NUM)"G7ERROR: The print (&print ) parameter must be character"FINMACRO" ;""4$((&print NE YES) AND (&print NE NO))"TDERROR: The print (&print ) parameter must be choosen among (YES NO)"FINMACRO" ;""(&print EQ YES)"PRINT" ALL""PRINT" NONE"  DATA _trav_; SET &data; KEEP &var; RUN; PROC CONTENTS DATA=_trav_ OUT=_nomvar_(KEEP=name) NOPRINT; RUN; DATA _null_; SET _nomvar_ END=f; CALL SYMPUT('_var'!!LEFT(PUT(_N_,3.)),name); IF f THEN CALL SYMPUT('_nvar',LEFT(PUT(_N_," 3.))); RUN;"LISTVAR" "%I1&_nvar1"LISTVAR"! &listvar &&_var&i""C7 PROC ARIMA DATA=_trav_;"%I1&_nvar1" ODS SELECT &print; ODS OUTPUT StationarityTests=_TestStats_; IDENTIFY VAR=&&_var&i STATIONARITY=(ADF=&maxlags); IDENTIFY VAR=&&_var&i STATIONARITY=(PP=&maxlags);"(&SYSVER >= 9)"B6 IDENTIFY VAR=&&_var&i STATIONARITY=(RW=&maxlags);""" RUN; QUIT; ODS SELECT ALL; PROC FORMAT; VALUE fmod 0='RW' 1-3='ADF' 4-6='PP'; RUN; DATA _TestStats_ &outtest(DROP=_name_); LENGTH variable $ 32 test $ 3; SET _TestStats_;"(&SYSVER >= 9)"J> variable=SCAN("&listvar",INT((_N_-1)/(7*(&maxlags+1)))+1);""J> variable=SCAN("&listvar",INT((_N_-1)/(6*(&maxlags+1)))+1);" test=PUT(MOD(INT((_N_-1)/(&maxlags+1))+1,7),fmod.); _name_=COMPRESS("Lag"||PUT(lags,3.)); LABEL tau='Tau'; RUN; PROC TRANSPOSE DATA=_TestStats_ OUT=tests(DROP=_name_ RENAME=(_LABEL_=Stat)); BY variable test NOTSORTED type; VAR tau ProbTau;" RUN; DATA tests level(RENAME=(Lag0-Lag&maxlags=L0-L&maxlags)); SET tests; BY variable test NOTSORTED type; IF (MOD(_N_,2)=0) THEN DO; OUT "tTABCODhD9.2  p'>"0DATA"0OUT"0VAR"0IDOBS"0TYPE"0PAS"0NCAT"0FUZZ"0PRINT"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"$"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"$(&syserr NE 0)"?/ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;"$"%((%LENGTH(&out ) EQ 0)"OUT" _tabcod_"3"<-,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"YIERROR: Vous devez prciser une seule valeur pour le paramtre out (&out )"FINMACRO" ;"-"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"3 (&_ret_ NE 0)"^NERROR: La valeur du paramtre out (&out ) doit tre un nom de table SAS valide"FINMACRO" ;"3"%7(%LENGTH(&var ) EQ 0)"VAR" _numeric_">"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;">(&syserr NE 0)"=-ERROR: Problme dans le paramtre var (&var )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;">"'G(%LENGTH(&idobs ) NE 0)"aU DATA _NULL_; SET &data (KEEP=&idobs OBS=1); ARRAY _xx_(*) $ &idobs ; RUN;"F(&syserr NE 0)"A1ERROR: Problme dans le paramtre idobs (&idobs )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"F"! PUT level; test=' '; type=' '; END; IF NOT(FIRST.variable) THEN variable=' '; OUTPUT tests;"  RUN; DATA level; SET level END=fin; BY variable test NOTSORTED; LENGTH Stationary Lag0-Lag&maxlags $ 3; DROP i L0-L&maxlags Stat; ARRAY l{*} L0-L&maxlags; ARRAY lags{*} $ Lag0-Lag&maxlags; ARRAY varchar{*} _character_; Stationary='No';"  IF NOT(FIRST.variable) THEN variable=' '; IF NOT(FIRST.test) THEN test=' '; DO i=1 TO DIM(lags); IF l(i) < &alpha/100 THEN DO; lags(i)='Yes'; Stationary='Yes'; END; ELSE lags(i)='No'; END; IF LAST.variable THEN DO; OUTPUT;" DO i=1 TO DIM(varchar); varchar(i)=' '; END; END; OUTPUT; RUN; PROC PRINT DATA=tests; TITLE "Stationarity Tests"; ID variable; FORMAT _numeric_ 7.3; RUN; PROC PRINT DATA=level; TITLE"ZN "Stationarity Tests - alpha= %CMPRES(&alpha) %"; ID variable; RUN; TITLE;"(&word EQ YES)"LAGS" "'I0&maxlags1"LAGS"" %TRIM(&lags lag&i)""  DATA _NULL_; SET tests; LENGTH aa $ 250; FILE PRINT; IF _N_=1 THEN DO; aa='Variable;Test;Type;Stat;' || TRANWRD("&lags",' ',';'); PUT aa; END; PUT variable ';' test ';' type ';' stat (Lag0-Lag&maxlags) (';' 7.3); RUN; DATA" _NULL_; SET level; LENGTH aa $ 250; FILE PRINT; IF _N_=1 THEN DO; aa='Variable;Test;Type;Stationary;' || TRANWRD("&lags",' ',';'); PUT aa; END; PUT variable (test type Stationary Lag0-Lag&maxlags) (';'); RUN;""{o PROC DATASETS LIBRARY=work NOLIST; DELETE tests level _TestStats_ _nomvar_ _trav_; RUN; QUIT;"#0` PDP8@0p<\(Tl8 P ` t $ < L `  $ 8 x  D 4 t 8(@Pd<D\l 0Dl$0HXl 0Ph|0HltTh 8 L \ !""\#""tSUPERSMhD9.2  .d>"0DATA"0OUTSM"0VARY"0VARX"0WEIGHT"0EPS"0SPAN"0TMW"0ALPHA"0GRAPH"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"%"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"%(&syserr NE 0)"@0ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;"%"')(%LENGTH(&outsm ) EQ 0)"OUTSM" _smooth_"4">..(%LENGTH(%QSCAN(%BQUOTE(&outsm ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre outsm (&outsm )"FINMACRO" ;"."2& %sasnom(_IN_=&outsm ,TYPE=DATASET);"4 (&_ret_ NE 0)"cSERROR: La valeur du paramtre outsm (&outsm ) doit tre un nom de table SAS valide"FINMACRO" ;"4"&9(%LENGTH(&vary ) EQ 0)"8(ERROR: Le paramtre vary est obligatoire"FINMACRO" ;"E"=>-(%LENGTH(%QSCAN(%BQUOTE(&vary ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre vary (&vary )"FINMACRO" ;">"]Q DATA _NULL_; SET &data (KEEP=&vary OBS=1); ARRAY _xx_(*) &vary ; RUN;"E(&syserr NE 0)"@0ERROR: Problme dans le paramtre vary (&vary )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"E"&J(%LENGTH(&varx ) EQ 0)"8(ERROR: Le #leff; ssq= roweff // residu ; dfe=(year-1)*(period-1)"; dgr= (year-1) // dfe ; msq= (roweff / (year-1)) // (residu / dfe); IF (residu ^= 0) THEN DO; fisher=(roweff / (year-1)) / (residu / dfe) ; prob=1-PROBF(fisher,year-1,dfe); END; ELSE DO; fisher=.; prob=.; END; res="fisher || ROUND(prob,0.0001); FINISH anaregr2; START kw(xserie,res) GLOBAL(period); RUN creertab(xserie,xser); c=LOC(xser ^= .); xser[c]=RANK(xser[c]); srank2=xser[+,]##2; ncas=(xser ^= .)[+,]; nobs=ncas[+];"  chi2=(12/(nobs*(nobs+1)))*(srank2 / ncas)[+] - 3*(nobs+1); prob=1-PROBCHI(chi2,period-1); res=chi2 || ROUND(prob,0.0001); FINISH kw; START Friedman(xserie,res) GLOBAL(period); RUN creertab(xserie,xser); nomiss=("xser ^=.)[,+]; ycomp=LOC(nomiss[,+]=period); nyears=NCOL(ycomp); xser=xser[ycomp,]; DO i=1 TO nyears; xser[i,]=RANK(xser[i,]); END; srank=xser[+,]-(nyears*(period+1)/2); chi2=12*SSQ(srank)/(nyears*period*(period+1)); prob=1-" PROBCHI(chi2,period-1); res=chi2 || ROUND(prob,0.0001); FINISH Friedman; START regm(yser,xreg,minprob); cc=LOC(yser^=.); y=yser[cc,]; nobs=NROW(y); x=xreg[cc,]; x=J(nobs,1,1) || x; nvar=NCOL(x); xpxi=INV(" T(x)*x); beta=xpxi*(T(x)*y); yhat=x*beta; resid=y-yhat; sse=SSQ(resid); dfe=nobs-nvar; mse=sse/dfe; stdb=SQRT(VECDIAG(xpxi)*mse); t=J(NROW(beta),1,.); cc=LOC(stdb^=0); IF (NCOL(cc)^=0) THEN t[cc]=beta[cc]/stdb[cc]; prob=1-" PROBF(t#t,1,dfe); minprob=ROUND(MIN(prob[2:nvar]),0.0001); FINISH regm; START mstat(xser,xtrend,xirreg,xsa,xlin,xseas,xtd,xout,mstats,model) GLOBAL(period); qual=J(31,1,.); nmiss=NMISS(xser||xtrend||xsa||xlin||" xseas||xirreg||xtd||xout)[,+]; cc=LOC(nmiss^=0); IF (NCOL(cc)^=0) THEN DO; dd=LOC(nmiss=0); xser=xser[dd]; xtrend=xtrend[dd]; xsa=xsa[dd]; xlin=xlin[dd]; xseas=xseas[dd]; xirreg=xirreg[dd]; xtd=xtd[dd]; xout=xout[" dd]; END; IF (model=0) THEN xsi=xlin - xtrend; ELSE xsi=xlin / xtrend; lag=period/4; ndon=NROW(xser); *RUN extrem(xirreg,model,4,weight); *e3=CHOOSE(weight=0,model,xirreg); e3=xirreg; f2a=J(period," 5,0); DO i=1 TO period; IF (model=0) THEN DO; f2a[i,1]=ABS(xtrend[1+i:ndon] - xtrend[1:ndon-i])[:]; f2a[i,2]=ABS(xseas[1+i:ndon] - xseas[1:ndon-i])[:]; f2a[i,3]=ABS(xtd[1+i:ndon] - xtd[1:ndon-i])[:]; f2a[i,4]=ABS(e3[1+i:ndon] -"  e3[1:ndon-i])[:]; f2a[i,5]=ABS(xout[1+i:ndon] - xout[1:ndon-i])[:]; END; ELSE DO; f2a[i,1]=ABS(xtrend[1+i:ndon] / xtrend[1:ndon-i] -1)[:]; f2a[i,2]=ABS(xseas[1+i:ndon] / xseas[1:ndon-i] -1)[:]; f2a[i,3]=ABS(xtd[1+i:ndon] / xtd"[1:ndon-i] -1)[:]; f2a[i,4]=ABS(e3[1+i:ndon] / e3[1:ndon-i] -1)[:]; f2a[i,5]=ABS(xout[1+i:ndon] / xout[1:ndon-i] -1)[:]; END; END; f2b=f2a ## 2; sum=f2b[,+]; f2b=f2b/REPEAT(sum,1,5); qual[1]=10*f2b[lag,4]/(1-f2b[lag,5]);" comp=xlin||e3||xtrend||xseas||xout||xtd; IF (model=1) THEN comp=LOG(comp); varend=J(ndon,1,1)||T(1:ndon); ols=varend*INV(T(varend)*varend)*T(varend)*comp[,3]; comp[,1]=comp[,1] - ols; comp[,3]=comp[,3] - ols;" mean=J(1,NCOL(comp),0); mean[,{1 3 5}]=comp[:,{1 3 5}]; f2f=(comp[##,]/NROW(comp))-mean##2; f2f=100*f2f / f2f[,1]; qual[2]=10*f2f[2]/(100-f2f[5]); sum=(f2f[,2:6])[+]; qual[27:31]=ROUND(100#f2f[2:6]/sum,0.01); IF (" model=0) THEN xcvs=xtrend+e3; ELSE xcvs=xtrend#e3; IF (period=12) THEN RUN henders(13,hend); ELSE RUN henders(5,hend); RUN moymob(xcvs,xcycle,hend,0); <"tRESLINEhD9.2  ;>"0DATA"0OUT"0OUTDIAG"0XX"0YY"0DIAGN"0ADJUST"0RESID"0NITER"0GRAPH"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&(%LENGTH(&data ) EQ 0)"DATA" _last_"%"=-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;""8, DATA _NULL_; SET &data (OBS=1); RUN;"%(&syserr NE 0)"@0ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;"%"%)(%LENGTH(&out ) EQ 0)"OUT" _result_"4"<.,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"ZJERROR: Vous devez prciser une seule valeur pour le paramtre out (&out )"FINMACRO" ;"."0$ %sasnom(_IN_=&out ,TYPE=DATASET);"4 (&_ret_ NE 0)"_OERROR: La valeur du paramtre out (&out ) doit tre un nom de table SAS valide"FINMACRO" ;"4")8(%LENGTH(&outdiag ) EQ 0)"OUTDIAG" _diag_"C"@=0(%LENGTH(%QSCAN(%BQUOTE(&outdiag ),2, )) NE 0)"bRERROR: Vous devez prciser une seule valeur pour le paramtre outdiag (&outdiag )"FINMACRO" ;"="4( %sasnom(_IN_=&outdiag ,TYPE=DATASET);"C (&_ret_ NE 0)"gWERROR: La valeur du paramtre outdiag (&outdiag ) doit tre un nom de table SAS valide"FINMACRO" ;"C"$H(%LENGTH(&xx ) EQ 0)"6&ERROR: Le paramtre xx est obligatoire"FINMACRO" ;"T";M+(%LENGTH(%QSCAN(%BQUOTE(&xx ),2, )) NE 0)="XHERROR: Vous devez prciser une seule valeur pour le paramtre xx (&xx )"FINMACRO" ;"M"YM DATA _NULL_; SET &data (KEEP=&xx OBS=1); ARRAY _xx_(*) &xx ; RUN;"T(&syserr NE 0)"<,ERROR: Problme dans le paramtre xx (&xx )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"T"$Y(%LENGTH(&yy ) EQ 0)"6&ERROR: Le paramtre yy est obligatoire"FINMACRO" ;"e";^+(%LENGTH(%QSCAN(%BQUOTE(&yy ),2, )) NE 0)"XHERROR: Vous devez prciser une seule valeur pour le paramtre yy (&yy )"FINMACRO" ;"^"YM DATA _NULL_; SET &data (KEEP=&yy OBS=1); ARRAY _xx_(*) &yy ; RUN;"e(&syserr NE 0)"<,ERROR: Problme dans le paramtre yy (&yy )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"e"'i(%LENGTH(&diagn ) EQ 0)"DIAGN" non"x">n.(%LENGTH(%QSCAN(%BQUOTE(&diagn ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre diagn (&diagn )"FINMACRO" ;"n"*s(%DATATYP(&diagn ) EQ NUM)"RBERROR: La valeur du paramtre diagn (&diagn ) doit tre caractre"FINMACRO" ;"x"Gx7((%UPCASE(&diagn) NE OUI) AND (%UPCASE(&diagn) NE NON))"aQERROR: La valeur du paramtre diagn (&diagn ) doit tre choisie parmi (oui non )"FINMACRO" ;"x"(|(%LENGTH(&adjust ) EQ 0)"ADJUST" _fit_""?/(%LENGTH(%QSCAN(%BQUOTE(&adjust ),2, )) NE 0)"`PERROR: Vous devez prciser une seule valeur pour le paramtre adjust (&adjust )"FINMACRO" ;""& %sasnom(_IN_=&adjust );" (&_ret_ NE 0)"\LERROR: La valeur du paramtre adjust (&adjust ) doit tre un nom SAS valide"FINMACRO" ;""'(%LENGTH(&resid ) EQ 0)"RESID" _resid_"">.(%LENGTH(%QSCAN(%BQUOTE(&resid ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre resid (&resid )"FINMACRO" ;""% %sasnom(_IN_=&resid );" (&_ret_ NE 0)"ZJERROR: La valeur du paramtre resid (&resid ) doit tre un nom SAS valide"FINMACRO" ;""'(%LENGTH(&niter ) EQ 0)"NITER" 5"">.(%LENGTH(%QSCAN(%BQUOTE(&niter ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre niter (&niter )"FINMACRO" ;""+(%DATATYP(&niter ) EQ CHAR)"RBERROR: La valeur du paramtre niter (&niter ) doit tre numrique"FINMACRO" ;""'(%LENGTH(&graph ) EQ 0)"> 0"FINMACRO" ;""& (%LENGTH(&gmax ) EQ 0)"GMAX" 50""=-(%LENGTH(%QSCAN(%BQUOTE(&gmax ),2, )) NE 0)"VFERROR: You must precise just one value for the gmax (&gmax ) parameter"FINMACRO" ;""*(%DATATYP(&gmax ) EQ CHAR)"B2ERROR: The gmax (&gmax ) parameter must be numeric"FINMACRO" ;"" (&gmax LE 0 )"/ERROR: You must have &gmax > 0"FINMACRO" ;""'(%LENGTH(&print ) EQ 0)"PRINT" ".">$.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"XHERROR: You must precise just one value for the print (&print ) parameter"FINMACRO" ;"$"*)(%DATATYP(&print ) EQ NUM)"F6ERROR: The print (&print ) parameter must be character"FINMACRO" ;"."F.6((%UPCASE(&print) NE YES) AND (%UPCASE(&print) NE NO))"TDERROR: The print (&print ) parameter must be choosen among (YES NO )"FINMACRO" ;"."'2(%LENGTH(&format) EQ 0)"FORMAT" 15.3"2"_S DATA _trav_ &outnew; SET &data(KEEP=&var &varexp &idobs &freq) END=fin;"'6(%LENGTH(&idobs ) EQ 0)"SG LENGTH _idobs_ $ 15; _idobs_=COMPRESS('OB'||LEFT(PUT(_N_,14.)));"6"&9(%LENGTH(&freq ) EQ 0)" _frequency_=1;":"' _frequency_=INT(&freq);"oc IF fin THEN DO; CALL SYMPUT('nbobs',LEFT(PUT(_N_,6.))); CALL SYMPUT('freq','_frequency_');"'>(%LENGTH(&idobs ) EQ 0)"0$ CALL SYMPUT('idobs','_idobs_');">"} END; IF (NMISS(OF &var)=0); RUN; PROC SORT DATA=_trav_; BY &idobs; RUN; PROC SORT DATA=&outnew; BY &idobs; RUN;"_NETTOY" _trav_" PROC MEANS DATA=_trav_ NOPRINT; VAR &var; FREQ &freq; OUTPUT OUT=_stats_(DROP=_TYPE_ _FREQ_) VAR=; RUN; PROC TRANSPOSE DATA=_stats_ OUT=_stats_(RENAME=(COL1=Variance)); RUN; DATA _stats_; LENGTH liste $ 30000; RETAIN liste ' ';" SET _stats_ END=f; DROP jj; IF (Variance ^= 0) THEN DO; liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(_name_)); nv+1; END; ELSE jj+1; IF f THEN DO; CALL SYMPUT('listvar',TRIM(LEFT(liste))); CALL SYMPUT('_cstes_',LEFT(PUT(jj,6.)));"@4 CALL SYMPUT('nv',LEFT(PUT(nv,6.))); END; RUN;"G(&_cstes_ NE 0)" DATA _NULL_; SET _stats_; IF (_N_=1) THEN PUT "WARNING: &_cstes_ variables are constant and have been excluded from the cluster analysis"; IF (Variance =0) THEN PUT _name_ $ @@; RUN;"G"_NETTOY" &_nettoy _stats_"_NUMX" "_CHARX" " PROC CONTENTS DATA=_trav_(KEEP=&varexp) OUT=_nomvar_(KEEP=name label type) NOPRINT; RUN; DATA _NULL_; SET _nomvar_ END=f; LENGTH numx charx charxall $ 30000; RETAIN numx charx charxall ' '; IF (type=1) THEN numx=TRIM(LEFT(numx))||' '||TRIM(" LEFT(name)); ELSE IF (type=2) THEN DO; charx=TRIM(LEFT(charx))||' '||TRIM(LEFT(name)); charxall=TRIM(LEFT(charxall))||' '||TRIM(LEFT(name))||' ?ne (&borne )"FINMACRO" ;"Z"+_(%DATATYP(&borne ) EQ CHAR)"QAERROR: La valeur du paramtre borne (&borne ) doit tre numrique"FINMACRO" ;"d"d(&borne LE 0 )"3#ERROR: Vous devez avoir &borne > 0"FINMACRO" ;"d"&h(%LENGTH(&cols ) EQ 0)"COLS" 90"w"=m-(%LENGTH(%QSCAN(%BQUOTE(&cols ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre cols (&cols )"FINMACRO" ;"m"*r(%DATATYP(&cols ) EQ CHAR)"O?ERROR: La valeur du paramtre cols (&cols ) doit tre numrique"FINMACRO" ;"w"w (&cols LE 0 )"2"ERROR: Vous devez avoir &cols > 0"FINMACRO" ;"w"({(%LENGTH(&maxlig ) EQ 0)"MAXLIG" 20""?/(%LENGTH(%QSCAN(%BQUOTE(&maxlig ),2, )) NE 0)"_OERROR: Vous devez prciser une seule valeur pour le paramtre maxlig (&maxlig )"FINMACRO" ;"",(%DATATYP(&maxlig ) EQ CHAR)"SCERROR: La valeur du paramtre maxlig (&maxlig ) doit tre numrique"FINMACRO" ;""(&maxlig LE 0 )"4$ERROR: Vous devez avoir &maxlig > 0"FINMACRO" ;""((%LENGTH(&minlig ) EQ 0)"MINLIG" 10""?/(%LENGTH(%QSCAN(%BQUOTE(&minlig ),2, )) NE 0)"_OERROR: Vous devez prciser une seule valeur pour le paramtre minlig (&minlig )"FINMACRO" ;"",(%DATATYP(&minlig ) EQ CHAR)"SCERROR: La valeur du paramtre minlig (&minlig ) doit tre numrique"FINMACRO" ;""(&minlig LE 0 )"4$ERROR: Vous devez avoir &minlig > 0"FINMACRO" ;""#(&minlig > &maxlig)"@0LE PARAMETRE minlig DOIT ETRE INFERIEUR A maxlig"FINMACRO" ;""((%LENGTH(&ngroup ) NE 0)"?/(%LENGTH(%QSCAN(%BQUOTE(&ngroup ),2, )) NE 0)"_OERROR: Vous devez prciser une seule valeur pour le paramtre ngroup (&ngroup )"FINMACRO" ;"",(%DATATYP(&ngroup ) EQ CHAR)"SCERROR: La valeur du paramtre ngroup (&ngroup ) doit tre numrique"FINMACRO" ;""F6((&ngroup NE 1) AND (&ngroup NE 2) AND (&ngroup NE 5))"`PERROR: La valeur du paramtre ngroup (&ngroup ) doit tre choisie parmi (1 2 5 )"FINMACRO" ;"""ERREUR" 0" DATA _NULL_; IF (INT(&form ) ^= &form ) THEN CALL SYMPUT('erreur','1'); IF (INT(&cols ) ^= &cols ) THEN CALL SYMPUT('erreur','1'); IF (INT(&maxlig ) ^= &maxlig ) THEN CALL SYMPUT('erreur','1'); IF (INT(&minlig ) ^= &minlig ) THEN CALL SYMPUT("'erreur','1');" 8(&ngroup NE )"NB IF (INT(&ngroup ) ^= &ngroup ) THEN CALL SYMPUT('erreur','1');"" RUN;"(&erreur EQ 1)"n^ERROR: Vrifiez le type entier souhait des paramtres (form borne cols maxlig minlig ngroup )"FINMACRO" ;"" PROC CONTENTS DATA=&data(KEEP=&var) OUT=nomvar NOPRINT; RUN; DATA _NULL_; SET nomvar END=fin; nvar+1; CALL SYMPUT('_var'||LEFT(PUT(nvar,3.)),name); IF fin THEN CALL SYMPUT('_nvar',LEFT(PUT(nvar,3.))); RUN; PROC IML;"-! USE &data; READ all VAR{"%'I1&_nvar1" &&_var&i"'"" } INTO donnees;"(&id NE)", READ all VAR{&id} INTO id;"" (&idextr NE)"4( READ all VAR{&idextr} INTO idextr;""J> CLOSE &data; nvar=NCOL(donnees); nobs=NROW(donnees);"(&id NE)"vj IF (TYPE(id)='C') THEN id=SUBSTR(LEFT(id),1,&form); ELSE id=SUBSTR(LEFT(CHAR(id)),1,&form);""/# numobs=LEFT(CHAR(T(1:nobs),4));" (&idextr NE)"~ IF (TYPE(idextr)='C') THEN idextr=SUBSTR(LEFT(idextr),1,&form); ELSE idextr=SUBSTR(LEFT(CHAR(idextr)),1,&form);""5) idextr=SUBSTR(LEFT(numobs),1,&form);"  borne=ABS(&borne); extr=J(nobs,nvar,1); stem=J(nobs,nvar,.); leaf=J(nobs,nvar,.); leaves=CHAR(leaf,20); unite=J(3,nvar,1); pas=J(1,nvar,1); ngroup=J(nobs,nvar,1); cc=LOC(donnees=.); IF (NCOL(cc)^=0) THEN DO; extr["bVcc]=-1; leaves[cc]=REPEAT(idextr,1,nvar)[cc]; END; DO i=1 TO nvar;"'(%LENGTH(&ngroup) EQ 0)" ngr=1;"" ngr=&ngroup;" cc=LOC(donnees[,i] ^=.); quartile=QUARTILE(donnees[cc,i]); iqr=quartile[4]-quartile[2]; up=quartile[4]+borne*iqr; down=quartile[2]-borne*iqr; cc=LOC((donnees[,i]^=.) & (donnees[,i] > up)) ; IF (NCOL(cc)^=0)" THEN DO; extr[cc,i]=2; stem[cc,i]=quartile[5]+(1e10); leaves[cc,i]=idextr[cc]; END; cc=LOC((donnees[,i]^=.) & (donnees[,i] < down)) ; IF (NCOL(cc)^=0) THEN DO; extr[cc,i]=0; stem[cc,i]=quartile[1]-(1e10);"  leaves[cc,i]=idextr[cc]; END; cc=LOC(extr[,i]=1); IF (NCOL(cc)^=0) THEN DO; quart=QUARTILE(donnees[cc,i]); range=quart[5]-quart[1]; unite[1,i]=ROUND(10*LOG10(NCOL(cc))); IF (range/unite[1,i] >0) THEN"  unite[2,i]=ROUND(LOG10(range/unite[1,i])); un1=10**unite[2,i]; un2=un1/10; unite[3,i]=ROUND(range/un1)+(quart[1]<0)*(quart[5]>0); IF (unite[3,i] > &maxlig) THEN DO; un2=un1; un1=10*un1; unite[3,i]=ROUND(range/"un1)+(quart[1]<0)*(quart[5]>0); END; IF ((unite[3,i] < &minlig) | (unite[3,i] > &maxlig)) THEN DO; IF ((%LENGTH(&ngroup)=0) & (unite[3,i] < &minlig)) THEN ngr=2; IF ((%LENGTH(&ngroup)=0) & (unite[3,i] < 3*&minlig/4)) THEN DO;"  ngr=2*(5*unite[3,i] > &maxlig)+5*(5*unite[3,i] <= &maxlig); END; END; around=ROUND(donnees[cc,i],un2); stem[cc,i]=INT(around/un1); leaf[cc,i]=ABS(INT((around-stem[cc,i]#un1)/un2)); leaves[cc,i]=CHAR(leaf[cc,i]" ,1); CALL SYMPUT(CONCAT('_min',LEFT(CHAR(i,4))),CHAR(MIN(stem[cc,i]),4)); CALL SYMPUT(CONCAT('_max',LEFT(CHAR(i,4))),CHAR(MAX(stem[cc,i]),4)); CALL SYMPUT(CONCAT('_min_',LEFT(CHAR(i,4))),CHAR(quart[1])); CALL SYMPUT(CONCAT('_max_',LEFT"(CHAR(i,4))),CHA9"F6ERROR: The regeff (®eff ) parameter must be numeric"FINMACRO" ;""((®eff NE 0) AND (®eff NE 1) AND (®eff NE 2) AND (®eff NE 3) AND (®eff NE 4) AND (®eff NE 5) AND (®eff NE 6))"]MERROR: The regeff (®eff ) parameter must be choosen among (0 1 2 3 4 5 6 )"FINMACRO" ;""%(%LENGTH(&rsa ) EQ 0)"RSA" 0""<,(%LENGTH(%QSCAN(%BQUOTE(&rsa ),2, )) NE 0)"TDERROR: You must precise just one value for the rsa (&rsa ) parameter"FINMACRO" ;"")(%DATATYP(&rsa ) EQ CHAR)"@0ERROR: The rsa (&rsa ) parameter must be numeric"FINMACRO" ;""((&rsa NE 0) AND (&rsa NE 1) AND (&rsa NE 2) AND (&rsa NE 3) AND (&rsa NE 4) AND (&rsa NE 5) AND (&rsa NE 6) AND (&rsa NE 9))"XHERROR: The rsa (&rsa ) parameter must be choosen among (0 1 2 3 4 5 6 9)"FINMACRO" ;""%(%LENGTH(&lam ) EQ 0)"LAM" 0""<,(%LENGTH(%QSCAN(%BQUOTE(&lam ),2, )) NE 0)"TDERROR: You must precise just one value for the lam (&lam ) parameter"FINMACRO" ;"")(%DATATYP(&lam ) EQ CHAR)"@0ERROR: The lam (&lam ) parameter must be numeric"FINMACRO" ;"">.((&lam NE 0) AND (&lam NE 1) AND (&lam NE -1))"P@ERROR: The lam (&lam ) parameter must be choosen among (0 1 -1 )"FINMACRO" ;""((%LENGTH(&easter ) EQ 0)"EASTER" 0""?/(%LENGTH(%QSCAN(%BQUOTE(&easter ),2, )) NE 0)"ZJERROR: You must precise just one value for the easter (&easter ) parameter"FINMACRO" ;"",(%DATATYP(&easter ) EQ CHAR)"F6ERROR: The easter (&easter ) parameter must be numeric"FINMACRO" ;""G7((&easter NE 0) AND (&easter NE 1) AND (&easter NE -1))"VFERROR: The easter (&easter ) parameter must be choosen among (0 1 -1 )"FINMACRO" ;""&(%LENGTH(&idur ) EQ 0)"IDUR" 6""=-(%LENGTH(%QSCAN(%BQUOTE(&idur ),2, )) NE 0)"VFERROR: You must precise just one value for the idur (&idur ) parameter"FINMACRO" ;""*(%DATATYP(&idur ) EQ CHAR)"B2ERROR: The idur (&idur ) parameter must be numeric"FINMACRO" ;"" (&idur LE 0 )"/ERROR: You must have &idur > 0"FINMACRO" ;""$(%LENGTH(&va ) NE 0)";+(%LENGTH(%QSCAN(%BQUOTE(&va ),2, )) NE 0)"RBERROR: You must precise just one value for the va (&va ) parameter"FINMACRO" ;""((%DATATYP(&va ) EQ CHAR)">.ERROR: The va (&va ) parameter must be numeric":R(quart[5])); CALL SYMPUT(CONCAT('_med',LEFT(CHAR(i,4))),CHAR(quart[3])); CALL SYMPUT(CONCAT('_un',LEFT(CHAR(i,4))),CHAR(un1,4));"(&id NE)"' leaves[cc,i]=id[cc];""k_ leaf[cc,i]=ABS(INT((around-stem[cc,i]#un1)/un2)); leaves[cc,i]=CHAR(leaf[cc,i],1);" END; aa=LOC((extr[,i]=1) & (stem[,i]=0) & (donnees[,i] <0)); IF (NCOL(aa)^=0) THEN stem[aa,i]=-1e-10; CALL SYMPUT(CONCAT('_ngr',LEFT(CHAR(i,4))),CHAR(ngr,1)); IF (ngr=1) THEN DO; ngroup[cc,i]=SIGN(donnees[cc,i]);" cc=LOC((leaf[,i]=0) & (stem[,i]=0)); IF (NCOL(cc)^=0) THEN ngroup[cc,i]=1; END; IF (ngr=2) THEN DO; cc=LOC((0<=leaf[,i]) & (leaf[,i] <=4)); IF (NCOL(cc)^=0) THEN ngroup[cc,i]=SIGN(donnees[cc,i]); cc=LOC(leaf[,i]>4);" IF (NCOL(cc)^=0) THEN ngroup[cc,i]=2*SIGN(donnees[cc,i]); cc=LOC((leaf[,i]=0) & (stem[,i]=0)); IF (NCOL(cc)^=0) THEN ngroup[cc,i]=1; END; IF (ngr=5) THEN DO; cc=LOC((leaf[,i]=0) | (leaf[,i]=1)); IF (NCOL(cc)^=0) THEN"  ngroup[cc,i]=SIGN(donnees[cc,i]); cc=LOC((leaf[,i]=2) | (leaf[,i]=3)); IF (NCOL(cc)^=0) THEN ngroup[cc,i]=2*SIGN(donnees[cc,i]); cc=LOC((leaf[,i]=4) | (leaf[,i]=5)); IF (NCOL(cc)^=0) THEN ngroup[cc,i]=3*SIGN(donnees[cc,i]); cc=" LOC((leaf[,i]=6) | (leaf[,i]=7)); IF (NCOL(cc)^=0) THEN ngroup[cc,i]=4*SIGN(donnees[cc,i]); cc=LOC((leaf[,i]=8) | (leaf[,i]=9)); IF (NCOL(cc)^=0) THEN ngroup[cc,i]=5*SIGN(donnees[cc,i]); cc=LOC((leaf[,i]=0) & (stem[,i]=0)); IF ("SGNCOL(cc)^=0) THEN ngroup[cc,i]=1; END; END; colnoms= {"%1I1&_nvar1" STEM&i"1"%2I1&_nvar1" EXTR&i"2"%3I1&_nvar1" NGR&i"3" }; result= stem || extr || ngroup; CREATE stem FROM result[COLNAME=colnoms]; APPEND FROM result; CLOSE stem; colnoms= {"%4I1&_nvar1" LEAF&i"4" }; CREATE leaves FROM leaves[COLNAME=colnoms]; APPEND FROM leaves; CLOSE leaves; QUIT; DATA stem; SET &data(KEEP=&var &id &idextr); SET stem; SET leaves; RUN;"% 5I1&_nvar1"  DATA minmax; * KEEP stem&i ngr&i; ii=&&_min&i-(&&_min&i < 0)*(&&_max&i > 0); DO j=ii TO &&_max&i; stem&i=j+(j < 0); IF ((stem&i=0) AND (j<0)) THEN stem&i=-1e-10; IF (stem&i<0) THEN DO; min=-&&_ngr&i; max=-1; END;"  ELSE DO; max=&&_ngr&i; min=1; END; IF NOT ((stem&i=0)*(&&_max_&i <0)); DO ngr&i=min TO max; OUTPUT; END; END; RUN; PROC SORT DATA=stem OUT=sort(KEEP= &&_var&i &id &idextr extr&i stem&i leaf&i ngr&i);" BY stem&i &&_var&i; RUN; DATA _NULL_; RETAIN _eff_ _rest_ _form_; FILE PRINT COL=_col ; MERGE sort minmax END=_fin_ ; BY stem&i ngr&i; LENGTH stem $ 5; IF (extr&i ^= .) THEN _tot_+1; IF _N_=1 THEN DO; PUT /" "BRANCHAGE DE LA VARIABLE &&_var&i" /; PUT "la plus petite valeur reprsente est : &&_min_&i"; PUT "la plus grande valeur reprsente est : &&_max_&i"; PUT "la mdiane de la distribution est : &&_med&i"; IF (&&_max_&i > 0)" THEN _c_= &&_max_&i; ELSE _c_= &&_min_&i; around=ROUND(_c_,&&_un&i/10); _a_=INT(around/&&_un&i); _b_=ABS(INT(10*(around-_a_*&&_un&i)/&&_un&i));"(&id EQ)"RF PUT _a_ '!' _b_ +1 "reprsente " _c_ +3 "(unit : &&_un&i)";""H< PUT "les individus sont reprs par la variable &id";" (&idextr NE)"L@ PUT "les loi;GRAPH" oui"">.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre graph (&graph )"FINMACRO" ;""*(%DATATYP(&graph ) EQ NUM)"RBERROR: La valeur du paramtre graph (&graph ) doit tre caractre"FINMACRO" ;""G7((%UPCASE(&graph) NE OUI) AND (%UPCASE(&graph) NE NON))"aQERROR: La valeur du paramtre graph (&graph ) doit tre choisie parmi (oui non )"FINMACRO" ;""ERREUR" 0"_S DATA _NULL_; IF (INT(&niter ) ^= &niter ) THEN CALL SYMPUT('erreur','1'); RUN;"(&erreur EQ 1)"B2ERROR: le paramtre iter (niter ) doit tre entier"FINMACRO" ;""  DATA _don_; SET &data; KEEP &xx &yy; IF (&xx+&yy ^=.); RUN; %MACRO calresl(ENTREE=,SORTIE=,VARX=,VARY=,ADJ=_fit_,RESIDU=_resid_); PROC RANK DATA=&entree(KEEP=&varx &vary) GROUP=3 OUT=_don_; VAR &varx; RANKS _rxx_;" RUN; PROC IML; START calmed(mat,_mgxx_,_mmxx_,_mdxx_) GLOBAL(_b_,_a_,_mmyy_); _mgyy_= MEDIAN(mat[loc(mat[,1]=0),3]); _mmyy_= MEDIAN(mat[loc(mat[,1]=1),3]); _mdyy_= MEDIAN(mat[loc(mat[,1]=2),3]);"  IF (_mdxx_-_mgxx_=0) THEN DO; FILE PRINT; PUT "PROBLEME D''EGALITE DES MEDIANES GAUCHE ET DROITE POUR &varx"; CALL SYMPUT('erreur',1); ABORT; END; ELSE _b_=(_mdyy_-_mgyy_)/(_mdxx_-_mgxx_); _a_=((_mgyy_-_b_*("_mgxx_-_mmxx_))+_mmyy_+ (_mdyy_-_b_*(_mdxx_-_mmxx_)))/3; FINISH calmed; USE _don_; READ all VAR { _rxx_ &varx &vary } INTO _donnee_; CLOSE _don_; _resid_=_donnee_; _mgxx_= MEDIAN(_donnee_[loc(_donnee_[,1]=0),2]); _mmxx_="  MEDIAN(_donnee_[loc(_donnee_[,1]=1),2]); _mdxx_= MEDIAN(_donnee_[loc(_donnee_[,1]=2),2]); _mgyy_= MEDIAN(_donnee_[loc(_donnee_[,1]=0),3]); _mmyy_= MEDIAN(_donnee_[loc(_donnee_[,1]=1),3]); _mdyy_= MEDIAN(_donnee_[loc(_donnee_[,1]=2),3]);" IF ((_mgxx_-_mmxx_)*(_mdxx_-_mmxx_)*(_mdyy_-_mmyy_)=0) THEN DO; FILE PRINT; PUT "PROBLEME D'EGALITE DES MEDIANES POUR &varx OU &vary DANS LE CALCUL DES RATIOS HSR"; hsr=.; hsr1=.; END; ELSE DO; pg= (_mgyy_-_mmyy_)/(_mgxx_-" _mmxx_); pd= (_mdyy_-_mmyy_)/(_mdxx_-_mmxx_); hsr=pg / pd; hsr1=MIN(pg,pd)/MAX(pg,pd); END; RUN calmed(_donnee_,_mgxx_,_mmxx_,_mdxx_); _slope_=_b_; _slope0_=_b_;_slope1_=_b_; _resid_[,3]=_donnee_[,3]- (_slope_*("_donnee_[,2]-_mmxx_)); RUN calmed(_resid_,_mgxx_,_mmxx_,_mdxx_); _b1_=_b_; _slope_=_b_+_slope_; _slope2_=_slope_; _resid_[,3]=_donnee_[,3]- (_slope_*(_donnee_[,2]-_mmxx_)); RUN calmed(_resid_,_mgxx_,_mmxx_,_mdxx_);"  _b2_=_b_; IF (_b1_*_b2_ > 0) THEN DO; _slope_=_slope_+_b_; _slope2_=_slope_; END; matrice=I(1); matrice[1,1]=_b1_-_b2_; maxd=max(ABS(matrice)); DO WHILE ((_b1_*_b2_ > 0) & (maxd > 0.001)) ; _b1_=_b2_; _slope1_="_slope2_; _resid_[,3]=_donnee_[,3]- (_slope_*(_donnee_[,2]-_mmxx_)); RUN calmed(_resid_,_mgxx_,_mmxx_,_mdxx_); _b2_=_b_; _slope_=_slope_+_b_; _slope2_=_slope_; matrice[1,1]=_b1_-_b2_; maxd=max(ABS(matrice)); END;"  matrice=I(1); matrice[1,1]=_b_-_slope0_/10000; maxc=max(ABS(matrice)); matrice[1,1]=_b1_-_b2_; maxd=max(ABS(matrice)); n=0; DO WHILE((maxc > 0.01) & (n<&niter) & (maxd > 0.001)); IF _b1_ >= 0 THEN _slope_=_slo4FINMACRO" ;"" (&va LE 0 )"-ERROR: You must have &va > 0"FINMACRO" ;"""* (%LENGTH(&forecast ) EQ 0)"FORECAST" 0""A1(%LENGTH(%QSCAN(%BQUOTE(&forecast ),2, )) NE 0)"^NERROR: You must precise just one value for the forecast (&forecast ) parameter"FINMACRO" ;"".(%DATATYP(&forecast ) EQ CHAR)"J:ERROR: The forecast (&forecast ) parameter must be numeric"FINMACRO" ;""!(&forecast LT 0 )"E5ERROR: You must have &forecast greater of equal to 0"FINMACRO" ;""&(%LENGTH(&trad ) EQ 0)"TRAD" 0"+"=!-(%LENGTH(%QSCAN(%BQUOTE(&trad ),2, )) NE 0)"VFERROR: You must precise just one value for the trad (&trad ) parameter"FINMACRO" ;"!"*&(%DATATYP(&trad ) EQ CHAR)"B2ERROR: The trad (&trad ) parameter must be numeric"FINMACRO" ;"+"+((&trad NE 0) AND (&trad NE 1) AND (&trad NE 2) AND (&trad NE 6) AND (&trad NE 7) AND (&trad NE -1) AND (&trad NE -2) AND (&trad NE -6) AND (&trad NE -7))"aQERROR: The trad (&trad ) parameter must be choosen among (0 1 2 6 7 -1 -2 -6 -7 )"FINMACRO" ;"+"'/(%LENGTH(&print ) EQ 0)"PRINT" NO"@"PRINT" %UPCASE(&print)">6.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"WGERROR: You must precise just one value for the print (&print) parameter"FINMACRO" ;"6"*;(%DATATYP(&print ) EQ NUM)"E5ERROR: The print (&print) parameter must be character"FINMACRO" ;"@"4@$((&print NE YES) AND (&print NE NO))"RBERROR: The print (&print) parameter must be choosen among (YES NO)"FINMACRO" ;"@"ERREUR" 0" DATA _NULL_; IF (INT(&idur ) ^= &idur ) THEN CALL SYMPUT('erreur','1'); IF (INT(&forecast ) ^= &forecast ) THEN CALL SYMPUT('erreur','1'); RUN;"H(&erreur EQ 1)"aQERROR: one of the parameters (idur forecast) is not of the requested integer type"FINMACRO" ;"H"_NETTOY_" ___tt___" X "cd &dtramo"; X "del &dtramo.\serie /Q"; X "del &dtramo.\_vg*.txt /Q"; X "del &dtramo.\seats.itr /Q"; X "del &dtramo.\OUTPUT\*.* /Q"; X "del &dtramo.\GRAPH\*.* /S /Q"; DATA __trav__(DROP=period) __period__(KEEP=period); SET &data("F:KEEP=&date &tseries &varreg) END=fin; period=DIF(&date);"&O(%LENGTH(&tdrop) NE 0)" DROP &tdrop;"O" RUN;"_NETTOY_". &_nettoy_ __trav__ __period__"Y (&period EQ)" PROC SUMMARY DATA=__period__; VAR period; OUTPUT OUT=_means_ MEAN=period; RUN; DATA _NULL_; SET _means_; IF ((25<=period) AND (period<=35)) THEN period=12; ELSE IF ((5pe1_" -_b1_ * (_slope1_-_slope2_)/(_b1_-_b2_); ELSE _slope_=_slope2_ -_b2_ * (_slope1_-_slope2_)/(_b1_-_b2_); _resid_[,3]=_donnee_[,3]- (_slope_*(_donnee_[,2]-_mmxx_)); RUN calmed(_resid_,_mgxx_,_mmxx_,_mdxx_); IF _b_*_b1_ >= 0 THEN DO;" _b1_=_b_; _slope1_=_slope_; END; ELSE DO; _b2_=_b_; _slope2_=_slope_; END; matrice[1,1]=_b_-_slope0_/10000; maxc=max(ABS(matrice)); matrice[1,1]=_b1_-_b2_; maxd=max(ABS(matrice)); n=n+1; END;" _donnee_[,1]=_a_+_slope_*(_donnee_[,2]-_mmxx_); _resid_[,3]=_donnee_[,3]-_donnee_[,1]; stdd=QUARTILE(_donnee_[,3]); stdr=QUARTILE(_resid_[,3]); Radjust=1-(stdr[4]-stdr[2])/(stdd[4]-stdd[2]); FILE PRINT; PUT ; %IF ("&appel = 1) %THEN %DO; PUT 'EQUATION DE LA RESISTANT LINE'// "&yy" +2 '=' +2 _a_ +2 '+' +2 _slope_ +2 '(' +1 "&varx" +1 '-' +1 _mmxx_ +1 ')'; PUT / 'HALF-SLOPE RATIOS:' / 'HSR =' +2 hsr / 'HSR1 =' +2 hsr1; PUT /"  'Adjustment Coefficient:' / 'Radj =' +2 radjust; %END; %ELSE %IF (&appel = 2) %THEN %DO; PUT 'DIAGNOSTICS'//; PUT 'Equation de la Ligne Rsistante du Diagnostic-Plot :'/ "&vary" +2 '=' +2 _a_ +2 '+' +2 _slope_ +2 '(' +1 "&varx" +1" '-' +1 _mmxx_ +1 ')'; PUT / 'HALF-SLOPE RATIOS:' / 'HSR =' +2 hsr / 'HSR1 =' +2 hsr1; PUT / 'Adjustment Coefficient:' / 'Radj =' +2 radjust; _trans_=1-_slope_; PUT / "Essayez d'lever &yy la puissance :" +2 _trans_; %END;"  %IF (&sortie NE) %THEN %DO; _nom_={ &adj , &varx , &vary }; CREATE _out1_ FROM _donnee_[COLNAME=_nom_]; APPEND FROM _donnee_; CLOSE _out1_; _nom_={ _rxx_ , &varx, &residu }; CREATE _out2_ FROM _resid_[COLNAME=_nom_];" APPEND FROM _resid_; CLOSE _out2_; %END; %IF ((&diagn NE ) & (&appel=1)) %THEN %DO; _nom_={ _slope_, _mmyy_ , _mmxx_ }; _param_=J(1,3,1); _param_[1,1]=_slope_; _param_[1,2]=_mmyy_; _param_[1,3]=_mmxx_; CREATE _out3_ FROM" _param_[COLNAME=_nom_]; APPEND FROM _param_; CLOSE _out3_; %END; QUIT; %IF &erreur=1 %THEN %GOTO fincal; %IF &sortie NE %THEN %DO; DATA &sortie; SET _out1_; SET _out2_(DROP=&varx); DROP _rxx_; RUN; %END; %"#fincal: %MEND calresl;"APPEL" 1"C7 %calresl(ENTREE=_don_,SORTIE=&out,VARX=&xx,VARY=&yy);" &erreur=1"FIN""((%UPCASE(&graph) EQ OUI)" PROC GPLOT DATA=&out; SYMBOL1 COLOR=black INTERPOL=none VALUE=circle H=1; SYMBOL2 COLOR=red INTERPOL=join VALUE=none; PLOT &yy*&xx _fit_*&xx/OVERLAY frame; TITLE "Nuage de points (&xx,&yy)"; RUN; QUIT;""((%UPCASE(&diagn) EQ OUI)"((%UPCASE(&graph) EQ OUI)"| PROC GPLOT DATA=&out; PLOT _resid_*&xx/ FRAME; TITLE "Nuage de points (&xx,residus)"; RUN; QUIT; TITLE;"" ; DATA _don_; RETAIN _slope_ _mmxx_ _mmyy_; IF _N_=1 THEN SET _out3_; SET &out; _xxx_=((_slope_*(&xx-_mmxx_))**2)/(2*_mmyy_); _yyy_=&yy-_mmyy_-_slope_*(&xx-_mmxx_); RUN;"APPEL" 2"sg %calresl(ENTREE=_don_,VARX=_xxx_,VARY=_yyy_,SORTIE=&outdiag, ADJ=_fit1_,RESIDU=_resid1_);" &erreur=1"FIN""0$ %STEM(DATA=&out,VAR=&resid);"((%UPCASE(&graph) EQ OUI)"  GOPTIONS CBACK=white; PROC GPLOT DATA=&outdiag; SYMBOL1 COLOR=black INTERPOL=none VALUE=circle H=1; SYMBOL2 COLOR=red INTERPOL=join VALUE=none; PLOT _yyy_*_xxx_ _fit1_*_xxx_/OVERLAY FRAME; TITLE "Graphique de diagnostic"; RUN;" 6paramtre varx est obligatoire"FINMACRO" ;"V"=O-(%LENGTH(%QSCAN(%BQUOTE(&varx ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre varx (&varx )"FINMACRO" ;"O"]Q DATA _NULL_; SET &data (KEEP=&varx OBS=1); ARRAY _xx_(*) &varx ; RUN;"V(&syserr NE 0)"@0ERROR: Problme dans le paramtre varx (&varx )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"V"(d(%LENGTH(&weight ) NE 0)"?\/(%LENGTH(%QSCAN(%BQUOTE(&weight ),2, )) NE 0)"`PERROR: Vous devez prciser une seule valeur pour le paramtre weight (&weight )"FINMACRO" ;"\"aU DATA _NULL_; SET &data (KEEP=&weight OBS=1); ARRAY _xx_(*) &weight ; RUN;"c(&syserr NE 0)"D4ERROR: Problme dans le paramtre weight (&weight )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"c"d"%h(%LENGTH(&eps ) EQ 0)"EPS" 0.001"w"<m,(%LENGTH(%QSCAN(%BQUOTE(&eps ),2, )) NE 0)"ZJERROR: Vous devez prciser une seule valeur pour le paramtre eps (&eps )"FINMACRO" ;"m")r(%DATATYP(&eps ) EQ CHAR)"N>ERROR: La valeur du paramtre eps (&eps ) doit tre numrique"FINMACRO" ;"w"w (&eps LE 0 )"1!ERROR: Vous devez avoir &eps > 0"FINMACRO" ;"w"&{(%LENGTH(&span ) EQ 0)"SPAN" 0""=-(%LENGTH(%QSCAN(%BQUOTE(&span ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre span (&span )"FINMACRO" ;""*(%DATATYP(&span ) EQ CHAR)"P@ERROR: La valeur du paramtre span (&span ) doit tre numrique"FINMACRO" ;""0 ((&span LT 0 ) OR (&span GE 1 ))"UEERROR: Erreur sur le paramtre span, vous devez avoir 0 < &span < 1"FINMACRO" ;""ERREUR" 0"%(%LENGTH(&tmw ) EQ 0)"TMW" 0.05 0.2 0.5"" PROC IML; tmw={&tmw}; IF TYPE(tmw)='C' THEN CALL SYMPUT('erreur','1'); IF NCOL(tmw)^= 3 THEN CALL SYMPUT('erreur','1'); cc=LOC((tmw > 0) & (tmw < 1)); IF NCOL(cc)^= 3 THEN CALL SYMPUT('erreur','1'); QUIT;"(&erreur NE 0)"I9ERROR: Problme dans les valeurs du paramtre tmw (&tmw )"FINMACRO" ;""'(%LENGTH(&alpha ) EQ 0)"ALPHA" 0"">.(%LENGTH(%QSCAN(%BQUOTE(&alpha ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre alpha (&alpha )"FINMACRO" ;""+(%DATATYP(&alpha ) EQ CHAR)"RBERROR: La valeur du paramtre alpha (&alph7a ) doit tre numrique"FINMACRO" ;""3#((&alpha LE 0 ) OR (&alpha GE 10 ))"9)ERROR: Vous devez avoir 0 < &alpha < 10"FINMACRO" ;""'(%LENGTH(&graph ) EQ 0)"GRAPH" oui"">.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre graph (&graph )"FINMACRO" ;""*(%DATATYP(&graph ) EQ NUM)"RBERROR: La valeur du paramtre graph (&graph ) doit tre caractre"FINMACRO" ;""5%((&graph NE oui) AND (&graph NE non))"aQERROR: La valeur du paramtre graph (&graph ) doit tre choisie parmi (oui non )"FINMACRO" ;""  DATA _trav_(KEEP=&varx &vary &weight) ; SET &data END=fin; IF NMISS(OF &varx &vary &weight) THEN DO; miss+1; DELETE; END; IF (fin*miss) THEN PUT miss 'Observations ont t enleves'; RUN; PROC IML; START"  smooth(xser,yser,weight,span,vsmlsq,smo,acvr); nobs=NROW(xser); ibw=MAX(2,INT((span*nobs+1)/2)); acvr=J(nobs,1,0); smo=J(nobs,1,0); DO i=1 TO nobs; low=MAX(1,i-ibw); high=MIN(nobs,i+ibw); k=high-low+1; wt=weight["low:high]; sumwt=wt[+]; xext=xser[low:high]; yext=yser[low:high]; xm=T(wt)*xext/sumwt; ym=T(wt)*yext/sumwt; var=T(wt)*((xext-xm)##2); cvar=T(wt)*((xext-xm)#(yext-ym)); a=0; IF (var>vsmlsq) THEN a=cvar/var;"  smo[i]=a*(xser[i]-xm)+ym; h=1/k; IF (var>vsmlsq) THEN h=h+((xser[i]-xm)**2)/var; a=1-weight[i]*h; IF (a>0) THEN acvr[i]=ABS(yser[i]-smo[i])/a; IF ((a<=0) & (i<=1)) THEN acvr[i]=acvr[i-1]; END; FINISH smooth; START" supersm(xser,yser,weight,span,smooth) GLOBAL(tmw,alpha); nobs=NROW(xser); sc=J(nobs,7,.); small=J(nobs,1,10e-7); quartx=QUARTILE(xser); vsmlsq=(&eps*(quartx[4]-quartx[2]))**2; IF (span ^= 0) THEN DO; RUN smooth(xser,yser,"weight,span,vsmlsq,smooth,acvr); GOTO finsup; END; DO i=1 TO 3; RUN smooth(xser,yser,weight,tmw[i],vsmlsq,smo,acvr); sc[,2*i-1]=smo; sc[,7]=acvr; RUN smooth(xser,sc[,7],weight,tmw[2],vsmlsq,smo,acvr); sc[,2*i]=smo;" END; resmin=(sc[,{2 4 6}])[,><]; resmin2=(sc[,{2 4 6}])[,>:<]; sc[,7]=tmw[resmin2]; cc=LOC((resmin > 0) & (resmin < sc[,6])); maxmax=(small[cc] || resmin[cc]/sc[cc,6])[,<>]; sc[cc,7]=sc[cc,7]+(tmw[3]-sc[cc,7])#maxmax##(10-" &alpha); RUN smooth(xser,sc[,7],weight,tmw[1],vsmlsq,smo,acvr); cc=LOC(sc[,2]<=tmw[1]); IF (NCOL(cc)^=0) THEN sc[cc,2]=tmw[1]; cc=LOC(sc[,2]>=tmw[3]); IF (NCOL(cc)^=0) THEN sc[cc,2]=tmw[3]; f=sc[,2]-tmw[2]; cc=LOC(f <0); IF"  (NCOL(cc)^=0) THEN DO; f[cc]=-f[cc]/(tmw[2]-tmw[1]); sc[cc,4]=(1-f[cc])#sc[cc,3]+f[cc]#sc[cc,1]; END; cc=LOC(f>=0); IF (NCOL(cc)^=0) THEN DO; f[cc]=f[cc]/(tmw[3]-tmw[2]); sc[cc,4]=(1-f[cc])#sc[cc,3]+f[cc]#sc[cc,5]; END"; RUN smooth(xser,sc[,4],weight,tmw[1],vsmlsq,smooth,acvr); finsup: FINISH supersm; USE _trav_; READ all VAR {&varx &vary &weight} INTO varxy; CLOSE _trav_;" (&weight EQ)"4( varxy=varxy || J(NROW(varxy),1,1);"" result=varxy||J(NROW(varxy),1,.); y=result; tmw={&tmw}; alpha=α rank=RANK(result[,1]); y[rank,]=result; result=y; RUN supersm(result[,1],result[,2],re0sult[,3],&span,smooth); result[,4]=smooth; noms={"&varx" "&vary""! "&weight" "smooth"};" (&weight EQ)"NB noms={"&varx" "&vary" "smooth"}; result=result[,{1 2 4}];""i] CREATE &outsm FROM result[COLNAME=noms]; APPEND FROM result; CLOSE &outsm; QUIT;"((%UPCASE(&graph) EQ OUI)" SYMBOL1 I=none CI=black VALUE=circle ; SYMBOL2 I=join CI=red VALUE=none ; PROC GPLOT DATA=&outsm GOUT=aa; PLOT &vary*&varx smooth*&varx/FRAME OVERLAY; TITLE1 "Lissage du nuage (&vary,&varx)";" (&span EQ 0)"5) TITLE2 "Supersmoother automatique";""7+ TITLE2 "Supersmoother d'ordre &span";"2& RUN; QUIT; TITLE; SYMBOL;""d#0` P<XPxTl|(l  T $ D D \ l  4 D X  8H\ 4`xd|$h$L`x$<L`4hH \t 8H\tH`p,H`p 0Xp8P`t 0h ! "(#4$<%D&L'X(d)$*@*t**+++ ,4,,,---.H.|..1G"&K(%LENGTH(&type ) EQ 0)"TYPE" 1"Z"=P-(%LENGTH(%QSCAN(%BQUOTE(&type ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre type (&type )"FINMACRO" ;"P"*U(%DATATYP(&type ) EQ CHAR)"O?ERROR: La valeur du paramtre type (&type ) doit tre numrique"FINMACRO" ;"Z"@Z0((&type NE 1) AND (&type NE 2) AND (&type NE 3))"\LERROR: La valeur du paramtre type (&type ) doit tre choisie parmi (1 2 3 )"FINMACRO" ;"Z"%^(%LENGTH(&pas ) EQ 0)"PAS" 0.5"m"<c,(%LENGTH(%QSCAN(%BQUOTE(&pas ),2, )) NE 0)"YIERROR: Vous devez prciser une seule valeur pour le paramtre pas (&pas )"FINMACRO" ;"c")h(%DATATYP(&pas ) EQ CHAR)"M=ERROR: La valeur du paramtre pas (&pas ) doit tre numrique"FINMACRO" ;"m"m (&pas LE 0 )"1!ERROR: Vous devez avoir &pas > 0"FINMACRO" ;"m"&q(%LENGTH(&ncat ) EQ 0)"NCAT" 7"{"=v-(%LENGTH(%QSCAN(%BQUOTE(&ncat ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre ncat (&ncat )"FINMACRO" ;"v"*{(%DATATYP(&ncat ) EQ CHAR)"O?ERROR: La valeur du paramtre ncat (&ncat ) doit tre numrique"FINMACRO" ;"{"&(%LENGTH(&fuzz ) EQ 0)"FUZZ" 0.5""=-(%LENGTH(%QSCAN(%BQUOTE(&fuzz ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre fuzz (&fuzz )"FINMACRO" ;""*(%DATATYP(&fuzz ) EQ CHAR)"O?ERROR: La valeur du paramtre fuzz (&fuzz ) doit tre numrique"FINMACRO" ;"" (&fuzz LE 0 )"2"ERROR: Vous devez avoir &fuzz > 0"FINMACRO" ;""'(%LENGTH(&print ) EQ 0)"PRINT" yes"">.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre print (&print )"FINMACRO" ;""*(%DATATYP(&print ) EQ NUM)"QAERROR: La valeur du paramtre print (&print ) doit tre caractre"FINMACRO" ;""ERREUR" 0"YM DATA _NULL_; IF (MOD(&ncat ,2) = 0) THEN CALL SYMPUT('erreur','1'); RUN;"(&erreur EQ 1)"N>ERROR: Vrifiez le type entier souhait des paramtres (ncat )"FINMACRO" ;""_NBCOD" %EVAL(&ncat/2)"  DATA _codes_; KEEP plus moins; LENGTH plus moins $ &_nbcod; cplus= '+++++++++'; cmoins='---------'; plus=SUBSTR(' ',1,&_nbcod); moins=SUBSTR(' ',1,&_nbcod); OUTPUT; DO I=21 TO &_nbcod; plus=SUBSTR(cplus,&_nbcod-i+1,i);" moins=SUBSTR(cmoins,&_nbcod-i+1,i); OUTPUT; END; RUN; PROC IML SYMSIZE=200; USE &data; READ all VAR{&var} INTO donnees; CLOSE &data; nvar=NCOL(donnees); nobs=NROW(donnees);" (&idobs EQ )" idobs=1:nobs;""OC USE &data; READ all VAR{&idobs} INTO idobs; CLOSE &data;" USE _codes_; READ all VAR{plus moins} INTO _codes; CLOSE _codes_; IF TYPE(idobs)='N' THEN idobs=CHAR(idobs,8,0); colnames={&idobs} || {&var}; ncat=INT(&ncat/2); tabcod=J(nobs,nvar,' ');" (&type EQ 1)"  med=J(5,nvar,.); DO i=1 TO nvar; cc=LOC(donnees[,i]^=.); IF (NCOL(cc)^=0) THEN DO; IF (NCOL(cc)=1) THEN med[,i]=donnees[cc,i]; ELSE IF ((NCOL(cc)=2) | (NCOL(cc)=3)) THEN DO; med[3,i]=MEDIAN(donnees[cc,i]); med["1,i]=MIN(donnees[cc,i]); med[2,i]=med[1,i]; med[5,i]=MAX(donnees[cc,i]); med[4,i]=med[5,i]; END; ELSE med[,i]=QUARTILE(donnees[cc,i]); END; END;"" (&type EQ 2)"  med=J(5,nobs,.); tdon=T(donnees); DO i=1 TO nobs; cc=LOC(tdon[,i]^=.); IF (NCOL(cc)^=0) THEN DO; IF (NCOL(cc)=1) THEN med[,i]=tdon[cc,i]; ELSE IF ((NCOL(cc)=2) | (NCOL(cc)=3)) THEN DO; med[3,i]=MEDIAN(tdon[cc,i]);" med[1,i]=MIN(tdon[cc,i]); med[2,i]=med[1,i]; med[5,i]=MAX(tdon[cc,i]); med[4,i]=med[5,i]; END; ELSE med[,i]=QUARTILE(tdon[cc,i]); END; END;"" (&type EQ 3)"sg med=J(5,1,.); cc=LOC(donnees^=.); IF (NCOL(cc)^=0) THEN med=QUARTILE(COLVEC(donnees[cc]));""4( iqr=(med[4,]-med[2,]); med=med[3,];" (&type EQ 1)"VJ med=REPEAT(med,NROW(donnees),1); iqr=REPEAT(iqr,NROW(donnees),1);"" (&type EQ 2)"\P med=REPEAT(T(med),1,NCOL(donnees)); iqr=REPEAT(T(iqr),1,NCOL(donnees));""  donn=donnees-med; c= LOC(ABS(donn) < &fuzz#iqr); IF (NCOL(c) ^= 0) THEN donn[c]=0; donn=INT(donn/(&pas#iqr)); c= LOC(ABS(donn) >=&_nbcod); IF (NCOL(c) ^= 0) THEN donn[c]=&_nbcod*SIGN(donn[c]); c= LOC(donn >=0); IF (NCOL(c) ^= 0)" THEN tabcod[c]=_codes[donn[c]+1,1]; c= LOC(donn <0); IF (NCOL(c) ^= 0) THEN tabcod[c]=_codes[ABS(donn[c])+1,2]; c= LOC(donnees=.); IF (NCOL(c) ^= 0) THEN tabcod[c]='.'; tabcod=idobs || tabcod; CREATE &out FROM tabcod[COLNAME=colnames];"9- APPEND FROM tabcod; CLOSE &out; QUIT;"&(%LENGTH(&print) NE 0)"F: PROC PRINT DATA=&out; ID &idobs; VAR &var; RUN;""#0` P (Th H\t$<L`<Tdx x  d | h 4 L \ p  ` DXl4DXP$8L  L(@Pdd|4DXXp(8Ll0D  Ld(HT$@`t !"""<#P#### $($$$%&&'X'l'350<=period) AND (period<=70)) THEN period=6; ELSE IF ((80<=" period) AND (period<=100)) THEN period=4; ELSE IF ((115<=period) AND (period<=135)) THEN period=3; ELSE IF ((175<=period) AND (period<=195)) THEN period=2; ELSE IF ((345<=period) AND (period<=375)) THEN period=1; CALL SYMPUT('period',TRIM(LEFT"&(PUT(period,2.)))); RUN;"_NETTOY_"" &_nettoy_ _means_"Y" PROC CONTENTS DATA=__trav__(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _nomvar_; SET _nomvar_(IN=in); IF in THEN prov=1; name=UPCASE(name); IF (name ^= UPCASE("&date")); RUN;"_NETTOY_"" &_nettoy_ _nomvar_"a (&varreg NE)" PROC CONTENTS DATA=__trav__(KEEP=&varreg) NOPRINT OUT=_nomvar1_(KEEP= name); RUN; DATA _nomvar_; SET _nomvar_ _nomvar1_(IN=in); IF in THEN prov=2; name=UPCASE(name); IF (name ^= UPCASE("&date")); RUN;"_NETTOY_"# &_nettoy_ _nomvar1_"a"s PROC SORT DATA=_nomvar_; BY name prov; RUN; PROC FREQ DATA=_nomvar_ NOPRINT; TABLES name / OUT=table; RUN;"_NETTOY_" &_nettoy_ table" DATA _null_; LENGTH liste $ 30000; RETAIN liste ' '; SET table END=fin; IF (count > 1) THEN liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); IF fin THEN CALL SYMPUT('liste',TRIM(LEFT(liste))); RUN;"i (&liste NE)"tdWARNING: The following variables are both regression variables and variables to be analyzed (&liste)"YIWARNING: They have been removed from the list of variables to be analyzed"i" DATA _null_; LENGTH list2 $ 20000; RETAIN list2 ' '; SET _nomvar_ END=fin; BY name prov; IF LAST.name; IF (prov=1) THEN DO; ii+1; CALL SYMPUT('_var'!!LEFT(PUT(ii,4.)),TRIM(LEFT(name))); END; ELSE IF (prov=2) THEN DO; jj+1;"  CALL SYMPUT('_rvar'!!LEFT(PUT(jj,4.)),TRIM(LEFT(name))); list2=TRIM(LEFT(list2))||' '||TRIM(LEFT(name)); END; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(ii,4.))); CALL SYMPUT('ireg',LEFT(PUT(jj,4.))); CALL SYMPUT('varreg',TRIM(LEFT("WKlist2))); END; RUN; DATA _nomvar_; LENGTH nser 4 series newname $ 32;"%oCI1&_nser1"SG nser=&i; newname=UPCASE("&&_var&i"); series="X&i"; OUTPUT;"C"C7 RUN; PROC IML; USE __trav__; READ all VAR{"%sDI1&_nser1" &&_var&i"D"eY} INTO x; READ all VAR{&date} INTO date; CLOSE __trav__; nvar=NCOL(x); xseries={"%wEI1&_nser1" &&_var&i"E" }; names={"%{FI1&_nser1" X&i"F"_S}; first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0); miss=J(nvar,1,0);" (&add EQ -1)" min=x[><,] - 1; cc=LOC(min <=-1); IF (NCOL(cc)^=0) THEN x[,cc]=x[,cc]-REPEAT(T(min[cc]),NROW(x),1); cc=LOC(min > -1); IF (NCOL(cc)^=0) THEN min[cc]=0; add=ABS(T(min));""0$ add=J(nvar,1,&add); x=x+&add;"  min=T(x[><,]); mean=T(x[:,]); max=T(x[<>,]); period=J(nvar,1,&period); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL"(LOC(aa^=.)); miss[i]=NCOL(LOC(aa=.)); x[cc[1]:cc[NCOL(cc)],i]=CHOOSE(aa=.,-99999,aa); END; END; nbyear=INT(nobs/period);" (&rsa >= 0)"# rsa=J(nvar,1,&rsa);"" (&rsa EQ 9)  ELSE IF (Label1='Pr < h') THEN Label1='Pval_H'; ELSE IF (Label1='Durbin h') THEN Label1='DurbinH'; Label1=COMPRESS(Label1); RUN; PROC TRANSPOSE DATA=FitSummary OUT=FitSummary(DROP=_Name_);":. BY Model; VAR nValue1; ID Label1; RUN;"_NETTOY"@ 0&_nettoy __Mean__ __Cusum__ FitSummary __EstAR__" DWTESTPROB" "0g %SYSFUNC(EXIST(Work.DWTestProb))" PROC SORT DATA=DWTestProb; BY Model Order; RUN; DATA DWTestProb; SET DWTestProb; BY Model Order; IF LAST.Order; RUN; DATA DWTestProb;" ]@I131"i] SET DWTestProb(WHERE=(Order=&i) RENAME=(DW=DW&i ProbDW=ProbDW&i ProbDWNeg=ProbDWNeg&i));"@"$ DROP Order; LABEL" aAI131"-! ProbDW&i=' ' ProbDWNeg&i=' '"A"; RUN;" DWTESTPROB" DWTestProb"_NETTOY"# &_nettoy DWTestProb"g" DATA ResetTest;" kBI241"]Q SET ResetTest(WHERE=(Power=&i) RENAME=(Reset=Reset&i ProbReset=ProbReset&i));"B"" DROP Power; LABEL" oCI241"+ ProbReset&i=' ' Reset&i=' '"C"v; RUN; PROC SORT DATA=ResetTest; BY Model; RUN; PROC SORT DATA=Arch; BY Model Order; RUN; DATA Arch; MERGE"!sDI1121"~r Arch(WHERE=(Order=&i) KEEP=Model Order Q ProbQ LM ProbLM RENAME=(Q=Q&i ProbQ=ProbQ&i LM=LM&i ProbLM=ProbLM&i))"D"!; BY Model; LABEL"!wEI1121"% ProbQ&i=' ' ProbLM&i=' '"E"; DROP Order; RUN; PROC SORT DATA=GodFrey; BY Model Alt; RUN; DATA GodFrey1 GodFrey2; SET GodFrey; BY Model Alt; IF FIRST.Alt THEN OUTPUT GodFrey1; IF LAST.Alt THEN OUTPUT GodFrey2; RUN; DATA GodFrey; MERGE" {FI141" GodFrey1(WHERE=(Alt="AR(&i)") KEEP=Model Alt LM ProbLM RENAME=(LM=G1_LM&i ProbLM=G1_ProbLM&i)) GodFrey2(WHERE=(Alt="AR(&i)") KEEP=Model Alt LM ProbLM RENAME=(LM=G2_LM&i ProbLM=G2_ProbLM&i))"F"!; BY Model; LABEL" GI141", G1_ProbLM&i=' ' G2_ProbLM&i=' '"G"; DROP Alt; RUN; PROC SORT DATA=GodFrey; BY Model; RUN; PROC SORT DATA=PhilOul(RENAME=(Lags=PO_Lags Rho=PO_Rho Tau=PO_Tau)); BY Model; RUN;"_NETTOY"N >&_nettoy ResetTest GodFrey GodFrey1 GodFrey2 PhilOul Arch Chow" DATA &outmod; LENGTH Num 3 Model $ 10 Variables $ 500; MERGE _Variables_ FitSummary &DWTestProb __Mean__ ResetTest Arch GodFrey PhilOul; BY Model; LABEL Model=' '; FORMAT _numeric_; RUN;"&HI1&_nbmod1" DATA extract; SET __travx__(KEEP=Date Yvar &&_Mod&i) END=fin; RETAIN FirstObs All 0; All=(NMISS(OF Yvar &&_Mod&i)=0); DROP All n FirstObs; IF (All AND (FirstObs=0)) THEN FirstObs=_N_; IF ((Yvar^=.) AND FirstObs) THEN n+1; IF fin"UI THEN CALL SYMPUT('_nbobs',TRIM(LEFT(PUT(n,5.)))); IF FirstObs; RUN;".%SYSFUNC(EXIST(Work.InSample))"ma PROC DATASETS LIB=Work NOLIST; DELETE InSample Recursive InSample&i Recursive&i; QUIT;""9 JJ%EVAL(2*&period+1)&_nbobs+11" DATA Subset; SET Extract(OBS=&j) END=fin; IF fin THEN Yvar=.; RUN; PROC AUTOREG DATA=Subset NOPRINT; MODEL Yvar = &&_Mod&i / NLAG=3 BACKSTEP; OUTPUT OUT=Model(KEEP=Date Yhat Yres) P=Yhat R=Yres; RUN; PROC APPEND BASE="InSample DATA=Model(FIRSTOBS=&j KEEP=Date Yha "2& rsa=4*(nbyear <=8)+5*(nbyear > 8);"" results=period || first || last || nobs || nbyear || rsa || miss || add || max || min || mean; nomcols={'Period' 'First' 'Last' 'Nobs' 'Nbyear' 'RSA' 'TSmiss' 'Add' 'Max' 'Min' 'Mean'};" (&varreg NE)"WK USE __trav__; READ all VAR{&varreg} INTO varreg; CLOSE __trav__;""& FILE "&dtramo.\serie";"%LI1&_nser1"  annee=YEAR(first[&i]); nom=names[&i]; perdeb=INT(period[&i] * (MONTH(first[&i]) -1) / 12) +1; per=period[&i]; nnobs=nobs[&i]; PUT @1 nom $32. / @1 nnobs +2 annee +2 perdeb +2 per; cc=LOC(x[,&i]^=.); IF (NCOL(cc)^=0) THEN DO j=cc"ZN[1] TO cc[NCOL(cc)]; xx=x[j,&i]; PUT xx 20.5; END; rrsa=rsa[&i];" (&rsa GT 0)" IF (&i=1) THEN PUT @2 "$INPUT RSA=" rrsa +1 ",ITER=3,SEATS=2,OUT=0,VA=&va,IREG=&ireg$"; ELSE PUT @2 "$INPUT RSA=" rrsa +1 ",SEATS=2,OUT=0,IREG=&ireg$";"" (&model NE)"  PUT @2 "$INPUT LAM=&lam,IEAST=&easter,ITRAD=&trad,IDUR=&idur,IATIP=1,AIO=2,SEATS=2,OUT=0,VA=&va,IREG=&ireg,"; PUT @2 "P=%SCAN(&model,1),D=%SCAN(&model,2),Q=%SCAN(&model,3),BP=%SCAN(&model,4),BD=%SCAN(&model,5),BQ=%SCAN(&model,6)"; IF (&i=1"E9) THEN PUT @2 ",ITER=3$"; ELSE PUT @2 "$";"" IF (&i=1) THEN PUT @2 "$INPUT LAM=&lam,INIC=3,IDIF=3,IEAST=&easter,ITRAD=&trad,IDUR=&idur,IATIP=1,AIO=2,SEATS=2,OUT=0,VA=&va,IREG=&ireg,ITER=3$"; ELSE PUT @2"u "$INPUT LAM=&lam,INIC=3,IDIF=3,IEAST=&easter,ITRAD=&trad,IDUR=&idur,IATIP=1,AIO=2,SEATS=2,OUT=0,VA=&va,IREG=&ireg$";" (&varreg NE)" vv=varreg[cc[1]:NROW(varreg),]; ilong=NROW(vv); PUT @2 "$REG IUSER=-1,NSER=&ireg,REGEFF=®eff,ILONG=" +1 ilong "$"; PUT @2 "_vg&i..txt"; FILE "&dtramo.\_vg&i..txt"; DO j=1 TO ilong; DO k=1 TO NCOL(vv); xx=vv[j,k];"wk IF (xx=.) THEN xx=0; PUT xx 16.5 +1 @; END; PUT; END; FILE "&dtramo.\serie";""L"  CREATE statdes FROM results[COLNAME=nomcols]; APPEND FROM results; CLOSE statdes; QUIT; DATA statdes; LENGTH data $ 50 series $ 32 firstdat lastdat $ 5 period 8; SET _nomvar_; SET statdes; firstdat=PUT(first,MONYY5.); lastdat=PUT("pdlast,MONYY5.); IF INDEX("&data",'.') THEN data=SCAN("&data",2,'.'); ELSE data="&data"; RUN;"_NETTOY_"! &_nettoy_ statdes" X "cd &dtramo"; X "tramo serie"; %lectramo(DIR=&dtramo.\output,TABOUT=tramo,TABSER=outtramo,FSTAT=statdes,PRINT=&print);"_NETTOY_"a Q&_nettoy_ tfit tdeterm tcalend toutlier tregvar tarmapar tramo outtramo _listing_" PROC SORT DATA=statdes; BY series; RUN; PROC SORT DATA=tramo; BY series; RUN; PROC SUMMARY DATA=tramo; VAR td easter; OUTPUT OUT=stats MAX=; RUN; DATA _NULL_; SET stats; CALL SYMPUT('yestd',LEFT(PUT(td,3.))); CALL SYMPUT("6*'yeseast',LEFT(PUT((easter>0),3.))); RUN;"_NETTOY_" &_nettoy_ stats" DATA &out; LENGTH data $ 50 series Nickname $ 32; MERGE statdes tramo(DROP=nobs); BY series; LENGTH liste $ 10000; RETAIN liste ' '; Nickname=series; series=newname; DROP first last nser newname liste" (&rsa EQ)" rsa"" (&yestd LE 0)"SG TD1 TD1_t TD2 TD2_t TD3 TD3_t TD4 TD4_t TD5 TD5_t TD6 TD6_t LY LY_t"" (&yestd EQ 2)"A5 TD2 TD2_t TD3 TD3_t TD4 TD4_t TD5 TD5_t TD6 TD6_t".(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"WGERROR: You must precise just one value for the graph (&graph) parameter"FINMACRO" ;"e"*j(%DATATYP(&graph ) EQ NUM)"E5ERROR: The graph (&graph) parameter must be character"FINMACRO" ;"o"4o$((&graph NE YES) AND (&graph NE NO))"RBERROR: The graph (&graph) parameter must be choosen among (YES NO)"FINMACRO" ;"o"&s(%LENGTH(&gmax ) EQ 0)"GMAX" 5""=x-(%LENGTH(%QSCAN(%BQUOTE(&gmax ),2, )) NE 0)"VFERROR: You must precise just one value for the gmax (&gmax ) parameter"FINMACRO" ;"x"*}(%DATATYP(&gmax ) EQ CHAR)"B2ERROR: The gmax (&gmax ) parameter must be numeric"FINMACRO" ;"" (&gmax LE 0 )"/ERROR: You must have &gmax > 0"FINMACRO" ;""ERREUR" 0" DATA _NULL_; IF (INT(&idur ) ^= &idur ) THEN CALL SYMPUT('erreur','1'); IF (INT(&forecast ) ^= &forecast ) THEN CALL SYMPUT('erreur','1'); RUN;"(&erreur EQ 1)"aQERROR: one of the parameters (idur forecast) is not of the requested integer type"FINMACRO" ;""_NETTOY_" ___tt___" X "cd &dtramo"; X "del &dtramo.\serie /Q"; X "del &dtramo.\seats.itr /Q"; X "del &dtramo.\OUTPUT\*.* /Q"; X "del &dtramo.\GRAPH\*.* /S /Q"; X "cd &dseats"; X "del &dseats.\serie /Q"; X "del &dseats.\OUTPUT\*.* /Q"; X" "del &dseats.\GRAPH\*.* /S /Q"; DATA __trav__(DROP=period) __period__(KEEP=period); SET &data(KEEP=&date &tseries &varreg) END=fin; IF (&date ^=.); period=DIF(&date);"&(%LENGTH(&tdrop) NE 0)" DROP &tdrop;"" RUN;"_NETTOY_". &_nettoy_ __trav__ __period__" (&period EQ)" PROC SUMMARY DATA=__period__; VAR period; OUTPUT OUT=_means_ MEAN=period; RUN; DATA _NULL_; SET _means_; IF ((25<=period) AND (period<=35)) THEN period=12; ELSE IF ((50<=period) AND (period<=70)) THEN period=6; ELSE IF ((80<=" period) AND (period<=100)) THEN period=4; ELSE IF ((115<=period) AND (period<=135)) THEN period=3; ELSE IF ((175<=period) AND (period<=195)) THEN period=2; ELSE IF ((345<=period) AND (period<=375)) THEN period=1; CALL SYMPUT('period',TRIM(LEFT"&(PUT(period,2.)))); RUN;"_NETTOY_"" &_nettoy_ _means_"" PROC CONTENTS DATA=__trav__(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _nomvar_; SET _nomvar_(IN=in); IF in THEN prov=1; name=UPCASE(name); IF (name ^= UPCASE("&date")); RUN;"_NETTOY_"" &_nettoy_ _nomvar_"((%LENGTH(&varreg ) NE 0)" PROC CONTENTS DATA=__trav__(KEEP=&varreg) NOPRINT OUT=_nomvar1_(KEEP= name); RUN; DATA _nomvar_; SET _nomvar_ _nomvar1_(IN=in); IF in THEN prov=2; name=UPCASE(name); IF (name ^= UPCASE("&date")); RUN;"_NETTOY_"# &_nettoy_ _nomvar1_""s PROC SORT DATA=_nomvar_; BY name prov; RUN; PROC FREQ DATA=_nomvar_ NOPRINT; TABLES name / OUT=table; RUN;"_NETTOY_ntains sont reprs par la variable &idextr";""  _form_=&cols-8; PUT / ' STEM' +1 '!' +1 'LEAVES' @_form_ '!' 'EFFECTIF'; PUT &cols*'-'; END; IF (extr&i=-1) THEN stem='MISS'; ELSE IF (extr&i=0) THEN stem='LOW'; ELSE IF ((extr&i=1) OR (extr&i=.)) THEN stem=RIGHT(LEFT(PUT(stem" &i,4.))); ELSE IF (extr&i=2) THEN stem='HIGH'; IF FIRST.ngr&i THEN DO; _eff_=0; _rest_=0; PUT @2 stem $4. +1 '!' +1 @; END; IF (leaf&i ^= ' ') THEN DO; _eff_+1; IF ((_col>=&cols-11) AND (("&id" NE ' ') OR (stem IN('MISS',"'LOW','HIGH')))) THEN PUT @_form_ '!' / @7 '!' +1 @; IF ((stem NOT IN('MISS','LOW','HIGH')) AND ("&id" EQ ' ')) THEN DO; IF (_col < &cols-14) THEN PUT leaf&i 1. @; ELSE _rest_+1; END; ELSE PUT leaf&i @;" END; IF LAST.ngr&i THEN DO; IF (_rest_) THEN DO; rest=COMPRESS('(+'||PUT(_rest_,6.)||')'); PUT rest @; END; PUT @_form_ '!' _eff_ 6.; END; IF _fin_ THEN PUT &cols*'-' / 'TOTAL' @7 '!' @_form_ '!' _tot_ 6.; RUN;"5" TITLE;"@#0` P<X(<|Ll,ThT |D\l @   , @ h | @ X h |  4 T   , l 40@T|Tl| $4Hh,@H,DThp,DTh\t`x4DX(<Ph|$8X <d|Pd@ T ,!@!x!""#(#<#\#d$l%x&'()*H+`+++,-. /,08111111 22<2P2X223,34334(546074889\9p999 :4:@;L<T=X>`>t> difcbar=J(ndon,1,.); difibar=J(ndon,1,.); IF (model=0)"  THEN DO; xirr2=xcvs-xcycle; difibar[2:ndon]=ABS(xirr2[2:ndon] - xirr2[1:ndon-1]); difcbar[2:ndon]=ABS(xcycle[2:ndon] - xcycle[1:ndon-1]); END; ELSE DO; xirr2=xcvs/xcycle; difibar[2:ndon]=ABS(xirr2[2:ndon] / xirr2[1:ndon-1] -1);"  difcbar[2:ndon]=ABS(xcycle[2:ndon] / xcycle[1:ndon-1] -1); END; ibar=difibar[:]; cbar=difcbar[:]; ratio=ibar / cbar; qual[3]=(ratio-1)/2; RUN avrun(xirreg,a,model); qual[4]=ABS((3*(ndon-1)/a) - 2*(ndon-1))/(2.577*SQRT(" 1.6*ndon-2.9)); f2e=J(1,period,.); cc=LOC(f2a[,1]^=0); IF (NCOL(cc)^=0) THEN f2e[cc]=T(f2a[cc,4] / f2a[cc,1]); mcd=1; cc=LOC(f2e >=1); zz=100*f2a; IF (NCOL(cc) ^=0) THEN mcd=MIN(cc[NCOL(cc)]+1,period); IF (mcd = 1) THEN"  DO; IF ((f2e[1]-f2e[2])^=0) THEN rmcd=1+(f2e[mcd]-1)/(f2e[1]-f2e[2]); ELSE rmcd=.; IF (rmcd < 0.5) THEN rmcd=0.5; IF (rmcd > 1) THEN rmcd=1; END; ELSE DO; IF ((f2e[mcd-1]-f2e[mcd])^=0) THEN rmcd=mcd+(f2e[mcd]-1)/(f2e["mcd-1]-f2e[mcd]); ELSE rmcd=mcd; IF ((mcd = period) & (f2e[period-1] <= f2e[period])) THEN rmcd=12*15.5/period; END; qual[5]=(12*rmcd/period - 0.5)/5; IF (model=1) THEN DO; RUN anaregr1(100#xsi,t1);"  RUN anaregr2(100#xsi,t2,1); END; ELSE DO; RUN anaregr1(xsi,t1); RUN anaregr2(xsi,t2,0); END; RUN kw(xsi,res); qual[6]=SQRT((7+3*t2[1])/(2*t1[1])); qual[13:14]=t1; qual[15:16]=t2; qual[17:18]=res; a=xsa[1+lag:ndon] -"  xsa[1:ndon-lag]; RUN anaregr1(a,t1); qual[19:20]=t1; RUN Friedman(a,res); qual[21:22]=res; RUN anaregr1(xirreg,t1); qual[23:24]=t1; RUN Friedman(xirreg,res); qual[25:26]=res; std=SQRT(((xseas - model)##2)[:]); IF (std"  ^= 0) THEN d10bis=(xseas-model)/std; ELSE d10bis=J(NROW(xseas),NCOL(xseas),.); RUN creertab(d10bis,sbis); nrow=NROW(sbis); difsbis=sbis[1:nrow-1,] - sbis[2:nrow,]; qual[7]=10*ABS(difsbis)[:]; qual[8]=10*ABS(difsbis[:,])[:]; qual" [1:10]=CHOOSE(qual[1:10]>3,3,qual[1:10]); qual[1:10]=CHOOSE(qual[1:10]<0,0,qual[1:10]); IF (ndon > 6*period) THEN DO; d10bis=d10bis[ndon-6*period+1:ndon-2*period+1]; sbis=SHAPE(d10bis,4,period); difsbis=sbis[1:3,] - sbis[2:4,]; qual[" 9]=10*ABS(difsbis)[:]; qual[10]=10*ABS(difsbis[:,])[:]; wqual={10 11 10 8 11 18 7 7 4 4}; END; ELSE DO; wqual={17 17 10 5 11 30 7 7 0 0}; END; mstats=qual; mstats[11]=(T(wqual)#qual[1:10]/wqual[+])[+]; cc=LOC(mstats[1:10] > 1" ); mstats[12]=NCOL(cc); FINISH mstat; USE __varraw__; READ all VAR{&varlist} INTO raw; READ all VAR{&date} INTO date; CLOSE __varraw__; USE __varsa__; READ all VAR{&varlist} INTO sa; CLOSE __varsa__; USE __vartcy__; READ all"  VAR{&varlist} INTO trend; CLOSE __vartcy__; USE __varlin__; READ all VAR{&varlist} INTO linear; CLOSE __varlin__; USE __varsf__; READ all VAR{&varlist} INTO season; CLOSE __varsf__; USE __varirr__; READ all VAR{&varlist} INTO irreg;" CLOSE __varirr__; USE __vartd__; READ all VAR{&varlist} INTO tdays; CLOSE __vartd__; USE __varout__; READ all VAR{&varlist} INTO outliers; CLOSE __varout__; USE __varao__; READ all VAR{&varlist} INTO ao; CLOSE __varao__; USE"  __varls__; READ all VAR{&varlist} INTO ls; CLOSE __varls__; USE __vartc__; READ all VAR{&varlist} INTO tc; CLOSE __vartc__; USE TDregressors; READ all VAR{Monday Tuesday Wednesday Thursday Friday Saturday WeekDays LeapYear} INTO tdregr;" CLOSE TDregressors; namecols={&varlist}; nobs=NROW(date); period=date[2]-date[1]; IF ((25<=period) & (period<=35)) THEN period=12; ELSE IF ((80<=period) & (period<=1 00)) THEN period=4; USE _models_; READ all VAR{&varlist} INTO"  models; CLOSE _models_; models=(models>0); IF (tdays=raw) THEN tdays=REPEAT(models,nobs,1); IF (outliers=raw) THEN outliers=REPEAT(models,nobs,1); IF (tc=raw) THEN tc=REPEAT(models,nobs,1); IF (ao=raw) THEN ao=REPEAT(models,nobs,1); IF (ls="raw) THEN ls=REPEAT(models,nobs,1); perdeb=CEIL(MONTH(date[1])*period/12); cycle=T(YEAR(date[1]):YEAR(date[NROW(date)])); year3=LOC(YEAR(date) >= YEAR(date[NROW(date)])-2); IF (period=12) THEN RUN henders(13,hend); ELSE RUN"  henders(5,hend); DifR1=J(nobs,NCOL(sa),.); aa=sa[2:nobs,]-sa[1:nobs-1,]; DO i=1 TO NCOL(aa); cc=LOC(aa[,i]^=.); bb=aa[cc,i]; DifR1[nobs-NROW(bb)+1:nobs,i]=bb; END; Roughness= SQRT((DifR1##2)[:,]); Roughness=Roughness // SQRT(("DifR1[year3,]##2)[:,]); Indicator= {"R1SA","R1SA_3"}; Label= {"R1 (SA)","R1 (SA), Last 3 years"}; moymob=J(nobs,NCOL(sa),.); IrregR2=moymob; DO i=1 TO NCOL(sa); a=sa[,i]; cc=LOC(a^=.); IF (NCOL(cc) >= period) THEN DO; RUN" moymob(a,xcycle,hend,2); moymob[,i]=xcycle[1:nobs]; IF (models[i]=0) THEN aa=(sa[,i]-moymob[,i]); ELSE aa=100#(sa[,i]/moymob[,i]); cc=LOC(aa^=.); bb=aa[cc]; IrregR2[nobs-NROW(bb)+1:nobs,i]=bb; END; END; Roughness="Roughness // SQRT(((IrregR2-REPEAT(IrregR2[:,],NROW(IrregR2),1))##2)[:,]); IrregR2=IrregR2[year3,]; Roughness=Roughness // SQRT(((IrregR2-REPEAT(IrregR2[:,],NROW(IrregR2),1))##2)[:,]); Indicator=Indicator // {"R2SA","R2SA_3"}; Label=Label // {" "R2 (SA)","R2 (SA), Last 3 years"}; IrregR3=J(nobs,NCOL(sa),.); DO i=1 TO NCOL(sa); IF (models[i]=0) THEN aa=(sa[,i]-trend[,i]); ELSE aa=100#(sa[,i]/trend[,i]); cc=LOC(aa^=.); bb=aa[cc]; IrregR3[nobs-NROW(bb)+1:nobs,i]=bb;" END; Roughness=Roughness // SQRT(((IrregR3-REPEAT(IrregR3[:,],NROW(IrregR3),1))##2)[:,]); IrregR3=IrregR3[year3,]; Roughness=Roughness // SQRT(((IrregR3-REPEAT(IrregR3[:,],NROW(IrregR3),1))##2)[:,]); Indicator=Indicator // {"R3SA","R3SA_3"};" Label=Label // {"R3 (SA)","R3 (SA), Last 3 years"}; aa=trend[2:nobs,]-trend[1:nobs-1,]; DifR1=J(nobs,NCOL(season),.); DO i=1 TO NCOL(aa); cc=LOC(aa[,i]^=.); bb=aa[cc,i]; DifR1[nobs-NROW(bb)+1:nobs,i]=bb; END; Roughness=" Roughness // SQRT((DifR1##2)[:,]); Roughness=Roughness // SQRT((DifR1[nobs-3*period:nobs-1,]##2)[:,]); Indicator=Indicator // {"MarTC1","MarTC1_3"}; Label=Label // {"Mar (TC,1)","Mar (TC,1), Last 3 years"}; Dif2R1=DifR1[2:nobs-1,]-DifR1[1:nobs-2,"]; Roughness=Roughness // SQRT((Dif2R1##2)[:,]); Roughness=Roughness // SQRT((Dif2R1[nobs-3*period:nobs-2,]##2)[:,]); Indicator=Indicator // {"MarTC2","MarTC2_3"}; Label=Label // {"Mar (TC,2)","Mar (TC,2), Last 3 years"}; DifR1=J(nobs,NCOL(" season),.); DO i=1 TO NCOL(season); cc=LOC(season[,i]^=.); aa=(T(PRODUCT(T(season[cc,i]),J(1,period,1)/period)))[period:NCOL(cc)]; DifR1[nobs-NROW(aa)+1:nobs,i]=aa; END; DifR1=DifR1-REPEAT(DifR1[:,],NROW(DifR1),1); Roughness=Roughness //"  SQRT((DifR1##2)[:,]); Roughness=Roughness // SQRT((DifR1[NROW(DifR1)-3*period:NROW(DifR1)-1,]##2)[:,]); Indicator=Indicator // {"MarS","MarS_3"}; Label=Label // {"Mar (S)","Mar (S), Last 3 years"}; Mstats=J(31,NCOL(irreg),.); DO i=1 TO"  NCOL(irreg); xser=raw[,i]; m=models[i]; IF (m=0) THEN DO; a=trend[,i]-ls[,i]-tc[,i]; b=irreg[,i]-ao[,i]; g=ls[,i]+tc[,i]+ao[,i]; END; ELSE DO; a=trend[,i]/(ls[,i]#tc[,i]); b=irreg[,i]/ao[,i]; g=ls[,i]#tc[,i]#ao["u,i]; END; c=sa[,i]; d=linear[,i]; e=season[,i]; f=tdays[,i]; a=trend[,i]; b=irreg[,i];"'(%LENGTH(&varout) NE 0)"  g=outliers[  QUIT;"""H< PROC DATASETS NOLIST; DELETE _out1_ _out2_ _don_"((%UPCASE(&diagn) EQ OUI)" _out3_ ;""; QUIT;"((%UPCASE(&graph) EQ OUI)" SYMBOL1;SYMBOL2;"" TITLE;"#0` P<XPxTl|(l L  4  , @ T t   < t D\l8<Tdx $4HlPlTl|< |$d(H 4H$P 4H$P(Tt!!#$%$&0'8(D)@*L+P,T-\.P/\0`1l2t3|44445,5@5T5|5h6|666T7h748L8`88899H9p9|::::;,;D;X;l;;;;; all'; END; IF f THEN DO; CALL SYMPUT('_numx',TRIM(LEFT(numx))); CALL SYMPUT('_charx',TRIM(LEFT"UI(charx))); CALL SYMPUT('_charxall',TRIM(LEFT(charxall))); END; RUN;"_NETTOY"! &_nettoy _nomvar_"(Y(%UPCASE(&dchi2) EQ YES)"  PROC SUMMARY DATA=_trav_; VAR &listvar; FREQ &freq; OUTPUT OUT=_temp_ SUM=zzz1-zzz&nv; RUN; DATA _trav_; RETAIN; SET _trav_; ARRAY __l__ &listvar; ARRAY __z__ zzz1-zzz&nv; IF (_N_=1) THEN DO; SET _temp_; zzztot=SQRT(" SUM(OF zzz1-zzz&nv)); END; zzzlig=0; DO _i_=1 TO &nv; zzzlig+__l__; END; IF (zzzlig ^= 0); DO _i_=1 TO &nv; IF (__z__^=0) THEN __l__=__l__/zzzlig/SQRT(__z__)*zzztot; ELSE __l__=0; END; &freq=ROUND(zzzlig*&freq);"6* DROP zzztot zzzlig zzz1-zzz&nv; RUN;"_NETTOY" &_nettoy _temp_"Y"+\(%UPCASE(&standard) EQ YES)"dX PROC STDIZE DATA=_trav_ OUT=_trav_ METHOD=MAD; VAR &listvar; FREQ &freq; RUN;"\"#b(&nbobs GT &maxobs)"  PROC FASTCLUS DATA=_trav_ MAXCLUSTERS=&nfast NOPRINT LEAST=2 CLUSTER=FastClus MEAN=Means(KEEP=&freq FastClus &listvar) OUT=FastClus(DROP=distance); VAR &listvar; ID &idobs; FREQ &freq; RUN; PROC CLUSTER DATA=Means"j^ METHOD=ward OUTTREE=&outcah NOPRINT ; VAR &listvar ; ID FastClus; FREQ &freq; RUN;"_NETTOY"' &_nettoy FastClus Means"c"v PROC CLUSTER DATA=_trav_ METHOD=ward OUTTREE=&outcah NOPRINT; VAR &listvar ; ID &idobs; FREQ &freq; RUN;"<0 GOPTIONS CBACK=white BORDER; DATA _NULL_;"#g(&nbobs GT &maxobs)", gmax=MIN(&nfast,INT(&gmax));"h", gmax=MIN(&nbobs,INT(&gmax));"  k=LOG(gmax)/LOG(2); gmax=2**(k+1)-1; CALL SYMPUT('gmax',LEFT(PUT(gmax,4.))); RUN; AXIS1 LABEL=NONE; PROC TREE DATA=&outcah(WHERE=(_ncl_ <= &gmax)) HORIZONTAL VAXIS=axis1 NCLUSTERS=&nbclus OUT=_outtree_(RENAME=(_NAME_=&idobs)); RUN; AXIS;TITLE;"%l(%LENGTH(&gmax) NE 0)"ma PROC TREE DATA=&outcah NOPRINT NCLUSTERS=&nbclus OUT=_outtree_(RENAME=(_NAME_=&idobs)); RUN;"l"#p(&nbobs GT &maxobs)" DATA _outtree_; SET _outtree_; FastClus=INPUT(TRIM(LEFT(&idobs)),8.); RUN; PROC SORT DATA=_outtree_(RENAME=(Cluster=&clusname)); BY FastClus; RUN; PROC SORT DATA=FastClus OUT=FastClus; BY FastClus; RUN; DATA _outtree_;" MERGE _outtree_ FastClus; BY FastClus; DROP Fastclus Clusname; RUN; PROC SORT DATA=_outtree_; BY &idobs; RUN;"q"s PROC SORT DATA=_outtree_; BY &idobs; RUN; DATA _outtree_; MERGE _outtree_ _trav_; BY &idobs; RUN;" DATA _outtree_; SET _outtree_; IF (cluster >= 10) THEN clusname=COMPRESS('CL'||LEFT(PUT(cluster,5.))); ELSE clusname=COMPRESS('CL0'||LEFT(PUT(cluster,5.))); IF (cluster=.) THEN Clusname=' '; RUN;"_NETTOY"" &_nettoy _outtree_" PROC IML; USE _outtree_; READ all VAR {&listvar} INTO donnees; READ all VAR {cluster} INTO cluster; READ all VAR {&idobs} INTO _noms_; READ all VAR {&freq} INTO freq; CLOSE _outtree_; nbclus=MAX(cluster); IF (nbclus<10) THEN"  nomclust=ROWCATC(J(nbclus,1,'CL0') || CHAR(T(1:nbclus),1.)); ELSE nomclust=ROWCATC((J(9,1,'CL0') // J(nbclus-9,1,'CL ')) || CHAR(T(1:nbclus),3.)); maxnum=0; rang=J(NROW(_noms_),2,.); DO i=1 TO nbclus; cc=LOC(cluster=i); ser="_noms_[cc,]; aa=donnees[cc,]; ff=freq[ccriod=12; ELSE IF ((80<=period) & (period<=100)) THEN period=4; USE _models_; READ all VAR{&varlist} INTO"  models; CLOSE _models_; models=(models>0); IF (tdays=raw) THEN tdays=REPEAT(models,nobs,1); IF (outliers=raw) THEN outliers=REPEAT(models,nobs,1); IF (tc=raw) THEN tc=REPEAT(models,nobs,1); IF (ao=raw) THEN ao=REPEAT(models,nobs,1); IF (ls="raw) THEN ls=REPEAT(models,nobs,1); perdeb=CEIL(MONTH(date[1])*period/12); cycle=T(YEAR(date[1]):YEAR(date[NROW(date)])); year3=LOC(YEAR(date) >= YEAR(date[NROW(date)])-2); IF (period=12) THEN RUN henders(13,hend); ELSE RUN"  henders(5,hend); DifR1=J(nobs,NCOL(sa),.); aa=sa[2:nobs,]-sa[1:nobs-1,]; DO i=1 TO NCOL(aa); cc=LOC(aa[,i]^=.); bb=aa[cc,i]; DifR1[nobs-NROW(bb)+1:nobs,i]=bb; END; Roughness= SQRT((DifR1##2)[:,]); Roughness=Roughness // SQRT(("DifR1[year3,]##2)[:,]); Indicator= {"R1SA","R1SA_3"}; Label= {"R1 (SA)","R1 (SA), Last 3 years"}; moymob=J(nobs,NCOL(sa),.); IrregR2=moymob; DO i=1 TO NCOL(sa); a=sa[,i]; cc=LOC(a^=.); IF (NCOL(cc) >= period) THEN DO; RUN" moymob(a,xcycle,hend,2); moymob[,i]=xcycle[1:nobs]; IF (models[i]=0) THEN aa=(sa[,i]-moymob[,i]); ELSE aa=100#(sa[,i]/moymob[,i]); cc=LOC(aa^=.); bb=aa[cc]; IrregR2[nobs-NROW(bb)+1:nobs,i]=bb; END; END; Roughness="Roughness // SQRT(((IrregR2-REPEAT(IrregR2[:,],NROW(IrregR2),1))##2)[:,]); IrregR2=IrregR2[year3,]; Roughness=Roughness // SQRT(((IrregR2-REPEAT(IrregR2[:,],NROW(IrregR2),1))##2)[:,]); Indicator=Indicator // {"R2SA","R2SA_3"}; Label=Label // {" "R2 (SA)","R2 (SA), Last 3 years"}; IrregR3=J(nobs,NCOL(sa),.); DO i=1 TO NCOL(sa); IF (models[i]=0) THEN aa=(sa[,i]-trend[,i]); ELSE aa=100#(sa[,i]/trend[,i]); cc=LOC(aa^=.); bb=aa[cc]; IrregR3[nobs-NROW(bb)+1:nobs,i]=bb;" END; Roughness=Roughness // SQRT(((IrregR3-REPEAT(IrregR3[:,],NROW(IrregR3),1))##2)[:,]); IrregR3=IrregR3[year3,]; Roughness=Roughness // SQRT(((IrregR3-REPEAT(IrregR3[:,],NROW(IrregR3),1))##2)[:,]); Indicator=Indicator // {"R3SA","R3SA_3"};" Label=Label // {"R3 (SA)","R3 (SA), Last 3 years"}; aa=trend[2:nobs,]-trend[1:nobs-1,]; DifR1=J(nobs,NCOL(season),.); DO i=1 TO NCOL(aa); cc=LOC(aa[,i]^=.); bb=aa[cc,i]; DifR1[nobs-NROW(bb)+1:nobs,i]=bb; END; Roughness=" Roughness // SQRT((DifR1##2)[:,]); Roughness=Roughness // SQRT((DifR1[nobs-3*period:nobs-1,]##2)[:,]); Indicator=Indicator // {"MarTC1","MarTC1_3"}; Label=Label // {"Mar (TC,1)","Mar (TC,1), Last 3 years"}; Dif2R1=DifR1[2:nobs-1,]-DifR1[1:nobs-2,"]; Roughness=Roughness // SQRT((Dif2R1##2)[:,]); Roughness=Roughness // SQRT((Dif2R1[nobs-3*period:nobs-2,]##2)[:,]); Indicator=Indicator // {"MarTC2","MarTC2_3"}; Label=Label // {"Mar (TC,2)","Mar (TC,2), Last 3 years"}; DifR1=J(nobs,NCOL(" season),.); DO i=1 TO NCOL(season); cc=LOC(season[,i]^=.); aa=(T(PRODUCT(T(season[cc,i]),J(1,period,1)/period)))[period:NCOL(cc)]; DifR1[nobs-NROW(aa)+1:nobs,i]=aa; END; DifR1=DifR1-REPEAT(DifR1[:,],NROW(DifR1),1); Roughness=Roughness //"  SQRT((DifR1##2)[:,]); Roughness=Roughness // SQRT((DifR1[NROW(DifR1)-3*period:NROW(DifR1)-1,]##2)[:,]); Indicator=Indicator // {"MarS","MarS_3"}; Label=Label // {"Mar (S)","Mar (S), Last 3 years"}; Mstats=J(31,NCOL(irreg),.); DO i=1 TO"  NCOL(irreg); xser=raw[,i]; m=models[i]; IF (m=0) THEN DO; a=trend[,i]-ls[,i]-tc[,i]; b=irreg[,i]-ao[,i]; g=ls[,i]+tc[,i]+ao[,i]; END; ELSE DO; a=trend[,i]/(ls[,i]#tc[,i]); b=irreg[,i]/ao[,i]; g=ls[,i]#tc[,i]#ao["u,i]; END; c=sa[,i]; d=linear[,i]; e=season[,i]; f=tdays[,i]; a=trend[,i]; b=irreg[,i];"'(%LENGTH(&va ;"@"%D(%LENGTH(&out ) EQ 0)"OUT" _result_"O"<I,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"I"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"O (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"O")S(%LENGTH(&spectype) EQ 0)"SPECTYPE" arspec"S"(W(%LENGTH(&altfreq) EQ 0)"ALTFREQ" yes"W"&[(%LENGTH(&peakw) EQ 0)"PEAKW" 1"["X11" "SEATS" "  DATA _NULL_; LENGTH softw $ 5; softw=TRIM(LEFT(UPCASE("&softw"))); x11=(softw IN('X12','X11')); seats=(softw='SEATS'); CALL SYMPUT('x11',LEFT(TRIM(PUT((x11>0),1.)))); CALL SYMPUT('seats',LEFT(TRIM(PUT((seats>0),1.)))); RUN; PROC FORMAT;"  VALUE $ ftype 'a1'='Xorig' 'b1'='Xlin' 'd10'='Season' 'd11'='Sadjust' 'd12'='TrendCycle' 'd13'='Irregular' 'd18'='Calendar' 'otl'='Outliers' 'ao'='AO' 'ls'='LS' 'tc'='TC' 'so'='SO' 'rp'='RP' 'td'" ='TradingDays' 'hol'='Holidays' 'usr'='UserReg' 'a13'='RegTrans' 'isa'='Sadjust_Ind' 'iir'='Irregular_Ind' 'itn'='TrendCycle_Ind' 'isf'='Season_Ind' ; RUN; PROC IML; tables=T({a1 b1 d10 d11 d12 d13 d18 otl ao ls tc so"  td hol usr a13 isa iir itn isf &outtabl}); CREATE __tables__ FROM tables[COLNAME={"tables"}]; APPEND FROM tables; CLOSE __tables__; QUIT; PROC SORT DATA=__tables__; BY tables; RUN; DATA _NULL_; LENGTH tab1 tab2 $ 10000; RETAIN tab1 tab2" ' ' ; SET __tables__ END=fin; BY tables; aa=PUT(tables,$ftype.); IF FIRST.tables THEN DO; tab1=COMPBL(TRIM(LEFT(tab1))||' + *.'||TRIM(LEFT(tables))); tab2=COMPBL(TRIM(LEFT(tab2))||' '||TRIM(LEFT(aa))); END; IF fin THEN DO; CALL" SYMPUT('outtb1',TRIM(LEFT(SUBSTR(tab1,2)))); CALL SYMPUT('outtb2',TRIM(LEFT(tab2))); END; RUN; %MACRO ListX12(DIR=,TABOUT=,OUTSER=,OUTT=); %GLOBAL errx12; %LET errx12=0; X "cd &dir."; X "copy *.*dg serudg.txt";"  DATA _NULL_; INFILE "&dir.\serudg.txt" LENGTH=l END=fin; LENGTH trad1 trad2 ly easter constant user seasonal $ 200; RETAIN maxar1 maxar2 maxma1 maxma2 maxao maxls maxtc maxrp maxso maxnuser maxtrig ao ls tc rp so nuser ntrig indirect" 0 trad1 trad2 ly easter constant user seasonal ' '; INPUT xx $VARYING200. l; xx=LEFT(xx); FILE "&dir.\serudg2.txt" RECFM=V LRECL=30000; IF (xx=:'f2.f:') THEN xx=TRANWRD(xx,'********',' 999999 '); IF (xx=:'f2.fsb1:') THEN xx=" TRANWRD(xx,'***********',' 999999 '); IF (xx=:'aape.0:') THEN xx=TRANWRD(xx,'************',' 999999 '); IF (xx=:'aape.1:') THEN xx=TRANWRD(xx,'************',' 999999 '); IF (xx=:'aape.2:') THEN xx=TRANWRD(xx,'************',' 999999 '); IF (xx=":'aape.3:') THEN xx=TRANWRD(xx,'************',' 999999 '); PUT xx $; IF (xx=:'modelspan:') THEN DO; ao=0;ls=0;tc=0;so=0;rp=0;nuser=0;ntrig=0; END; ELSE IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Weekday')) THEN trad2=" 'Weekday SatSun Weekday_t SatSun_t'; ELSE IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Mon:')) THEN trad1='Monday Tuesday Wednesday Thursday Friday Saturday Sunday Monday_t Tuesday_t Wednesday_t Thursday_t Friday_t Saturday_t Sunday_t'; ELSE ,i];"" RUN mstat(xser,a,b,c,d,e,f,g,Mst,m); mstats[,i]=mst; END; Mnames={"M1*", "M2*", "M3*", "M4", "M5","M7*","M8","M9","M10","M11","Qstat","Mfailed", "FS","ProbFS","FM","ProbFM","KW","ProbKW", "FS_SA","ProbFS_SA","Frd_SA"," "ProbFrd_SA","FS_I","ProbFS_I","Frd_I","ProbFrd_I", "Contr_I","Contr_TC","Contr_S","Contr_O","Contr_TD"}; Mnames2={"M1", "M2", "M3", "M4", "M5","M7","M8","M9","M10","M11","Qstat","Mfailed", "FS","ProbFS","FM","ProbFM","KW","ProbKW"," "FS_SA","ProbFS_SA","Frd_SA","ProbFrd_SA","FS_I","ProbFS_I","Frd_I","ProbFrd_I", "Contr_I","Contr_TC","Contr_S","Contr_O","Contr_TD"}; Roughness=Roughness // Mstats; Indicator=Indicator // Mnames2; Label=Label // Mnames;"  TDres=J(2,NCOL(irreg),.); TDreg=TDregr[,1:6]; DO i=1 TO NCOL(irreg); m=models[i]; IF (m=0) THEN DO; a=sa[,i]-ls[,i]-tc[,i]-ao[,i]; b=irreg[,i]-ao[,i]; END; ELSE DO; a=sa[,i]/(ls[,i]#tc[,i]#ao[,i]); b=irreg[,i]/ao"[,i]; END; ndon=NROW(a); lag=period/4; a=a[1+lag:ndon] - a[1:ndon-lag]; RUN regm(a,tdreg,m); TDres[1,i]=m; RUN regm(b,tdreg,m); TDres[2,i]=m; END; Mnames={"ProbTD_SA","ProbTD_I"}; Roughness=Roughness // TDres; Indicator="Indicator // Mnames; Label=Label // Mnames; CREATE &outstats FROM Roughness[COLNAME=namecols ROWNAME=Indicator]; APPEND FROM Roughness[ROWNAME=Indicator]; CLOSE &outstats; Label=Indicator || Label; CREATE _Labels_ FROM Label[COLNAME={"{Indicator _Label_}]; APPEND FROM Label; CLOSE _Labels_; QUIT; DATA &outstats; SET _Labels_; SET &outstats; RUN;" __NETTOY__"$ &__nettoy__ _Labels_"%(&transpose NE)" PROC TRANSPOSE DATA=&outstats OUT=&outstats; ID Indicator; IDLABEL _Label_; RUN; DATA &outstats; SET &outstats; RENAME _name_=Series; LABEL _name_=' '; RUN;"%"( (&debug EQ)"XL PROC DATASETS LIBRARY=work NOLIST; DELETE &__nettoy__; RUN; QUIT;"("#)0` P@p,Ht Hdx@\p,D`,X$Lh| 4 H \ t  , @ P d  0 P l  H d x ( P l (<Tp  0D`0Lh(DXh|Ph0T0Lt|(40X Phx$ !"##$$%%%&&&'$'`'l(t)*+,-./012345689:(;0<8=D>L?X@dApB|CDEFGHIJKLMNOQRS(T4U@VLWTX`YhZt[|\]^_`abcdefghtiiiijklmnpppppqqq0rDr"(&yeseast EQ 0)" EE EE_t"" ;" (&varreg NE)"$UI1&ireg1"QE RENAME reg&i = %SCAN(&varreg,&i) reg&i._t = %SCAN(&varreg,&i)_t ;"U""  overdif=((&limar <= SUM(OF Phi1-Phi3) <= 1) + (&limar <= SUM(OF BPhi1-BPhi2) <= 1) > 0); underdif=((&limma <= SUM(OF Th1-Th3) <= 1) + (&limma <= SUM(OF Bth1-Bth2) <= 1) > 0); CALL SYMPUT('liste',TRIM(LEFT(liste))); CALL SYMPUT('_mean'||LEFT(PUT(" nser,5.)),LEFT(PUT((Lam=0),2.))); RUN; PROC SORT DATA=&out; BY series; RUN; PROC SORT DATA=outtramo; BY series year per; RUN; DATA outtramo(DROP=per year newname nobs oldname) pbtramo(KEEP=oldname pbtramo RENAME=(oldname=series)); LENGTH"  &date 8 pbtramo 3; MERGE statdes(KEEP=series newname nobs period first last) outtramo END=fin; BY series; oldname=series; series=newname; pbtramo=0; IF (per = .) THEN DO; PUT 'WARNING: problem with TRAMO for series' +1 series; pbtramo=" 1; END; ELSE DO; &date=MDY(INT((per-1)*12/period)+1,1,year); OUTPUT outtramo; END; IF FIRST.series THEN OUTPUT pbtramo; RUN; PROC SORT DATA=outtramo OUT=outtramo; BY &date series; RUN; DATA _outts_(DROP=mois); SET outtramo;"  BY &date series; LENGTH forecast mois 3; DROP lastdate first last period; lastdate=INTNX('month',last,&forecast*12/period); mois=MONTH(&date); IF (&date <= last) THEN forecast=0; ELSE IF (&date <= lastdate) THEN forecast=1; ELSE forecast="2;" (&varreg NE)"$VI1&ireg1"1% RENAME reg&i = %SCAN(&varreg,&i);"V"" RUN;"_NETTOY_") &_nettoy_ _outts_ pbtramo" PROC SORT DATA=_outts_; BY series &date; RUN; DATA _outts_; LENGTH &date Xorig Xint Xlin Residuals Calendar TD EE Outliers AO LS TC UserReg 8; MERGE _outts_ &out(KEEP=series Lam); BY series; KEEP Series &date Xorig Xint Xlin"  Residuals Calendar TD EE Outliers AO LS TC UserReg &varreg forecast Lam; ARRAY cent AO LS TC Calendar TD EE; IF (Lam = 1) THEN DO; Preadj=Xorig-Xlin; Calendar=TD+EE; Outliers=AO+LS+TC; UserReg=Preadj-Outliers-Calendar; END; ELSE DO;" Preadj=Xorig/Xlin; DO OVER cent;cent=cent/100;END; Calendar=TD*EE; Outliers=AO*LS*TC; IF (Outliers*Calendar > 0) THEN UserReg=Preadj/(Outliers*Calendar); END; IF (forecast <=1); RUN;"(&outtype EQ 1)" DATA"%XI1&_nser1"." &&_var&i(RENAME=(Xorig=&&_var&i))"X"-!; SET _outts_; DROP series;"%YI1&_nser1";/ IF series="&&_var&i" THEN OUTPUT &&_var&i;"Y" RUN;"_NETTOY_"" &_nettoy_ _nomser_""(&outtype EQ 2)"F: DATA Xorig1 Xlin1 Xint1; SET __trav__; KEEP &date"%[I1&_nser1" &&_var&i"["h\; RUN; DATA Calendar1 Outliers1 UserReg1 TD1 EE1 TC1 AO1 LS1 Residuals1; LENGTH &date"%\I1&_nser1" &&_var&i"\"* 8; SET __trav__(KEEP=&date"%]I1&_nser1" &&_var&i"]");"%^I1&_nser1";/ IF (&&_var&i ^=.) THEN &&_var&i=&&_mean&i;"^" RUN;"_NETTOY_"i Y&_nettoy_ Xorig1 Xlin1 Xint1 Calendar1 Outliers1 UserReg1 Residuals1 TD1 EE1 TC1 AO1 LS1" PROC SA ORT DATA=_outts_; BY &date series; RUN; PROC CONTENTS DATA=_outts_(DROP=&date series forecast lam &varreg) OUT=_nomvar_(KEEP=name) NOPRINT; RUN; DATA _NULL_; SET _nomvar_ END=fin; LENGTH lfiles $ 10000; RETAIN lfiles ' ';" lfiles=TRIM(LEFT(lfiles))||' '||TRIM(LEFT(name)); IF fin THEN DO; CALL SYMPUT('lfiles',TRIM(LEFT(lfiles))); CALL SYMPUT('nbfiles',LEFT(PUT(_N_,5.))); END; RUN;"'_I1&nbfiles1"NNAME"! %SCAN(&lfiles,&i)" PROC TRANSPOSE DATA=_outts_(KEEP=series &date &nname) OUT=&nname(DROP=_NAME_); VAR &nname ; BY &date; ID series; RUN; DATA &nname; MERGE &nname.1 &nname; BY &date; RUN;"_"" (&debug EQ)" X "cd &dtramo"; X "del &dtramo.\serie /Q"; X "del &dtramo.\_vg*.txt /Q"; X "del &dtramo.\seats.itr /Q"; X "del &dtramo.\OUTPUT\*.* /Q"; X "del &dtramo.\GRAPH\*.* /S /Q";""i] DATA ___tt___; SET ___tt___; end=DATETIME(); time=end-start; PUT time= time.; RUN;" (&debug EQ)"VJ PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_; RUN; QUIT;""#0` P@p8h(XDX 4@,4   \ ( H  8 L h | $ 4 H x (Pdx4DX,DXl 0Dt0$8 x(H(<dt0|8t,l0xT,@T  Ld !4!H!\!!!""("T"""""#`#x######$D$$$$$%P%h%x%%%,&D&T&h&&&&& 'd'|''''(((8(L(l((((((8))))))0*H*X*l******+4+L+`+t++,0,@,T,,,,, -0-x------..X...../\/t///P00000101D1X1p111(2@2P2d222233H333333444,5D5T5h555667,7@7T7l777899 :0:D:;4;X;t;`<x<<<0=H=h=H>d>>4?H?P@\AAA0B8B|BBBB,CTClCtCCCCC,DHDE$ETE`FFG8GLGhGGG|HHHI,ITI`JJJKKKLM(MMhNNOPP P,QQQQhRRRS T8TXT@U\UpUUUU V,VpVVVVVVV WtW|WWXYZ[\\\]P]X]l]]]]^_``` a 1) THEN liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); IF fin THEN CALL SYMPUT('liste',TRIM(LEFT(liste))); RUN;" (&liste NE)"tdWARNING: The following variables are both regression variables and variables to be analyzed (&liste)"YIWARNING: They have been removed from the list of variables to be analyzed""  DATA _null_; LENGTH list1 list2 $ 10000; RETAIN list1 list2 ' '; SET _nomvar_ END=fin; BY name prov; IF LAST.name; IF (prov=1) THEN DO; ii+1; CALL SYMPUT('_var'!!LEFT(PUT(ii,4.)),TRIM(LEFT(name))); list1=TRIM(LEFT(list1))||' '||TRIM"(LEFT(name)); END; ELSE IF (prov=2) THEN DO; jj+1; CALL SYMPUT('_rvar'!!LEFT(PUT(jj,4.)),TRIM(LEFT(name))); list2=TRIM(LEFT(list2))||' '||TRIM(LEFT(name)); END; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(ii,4.))); CALL SYMPUT("'ireg',LEFT(PUT(jj,4.))); CALL SYMPUT('tseries',TRIM(LEFT(list1))); CALL SYMPUT('varreg',TRIM(LEFT(list2))); END; RUN; DATA _nomvar_; LENGTH nser 4 series newname $ 32;"%OI1&_nser1"SG nser=&i; newname=UPCASE("&&_var&i"); series="X&i"; OUTPUT;"O" RUN; PROC IML; USE __trav__; READ all VAR{&tseries} INTO x; READ all VAR{&date} INTO date; CLOSE __trav__; nvar=NCOL(x); xseries={&tseries}; names={"%PI1&_nser1" X&i"P"_S}; first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0); miss=J(nvar,1,0);" (&add EQ -1)" min=x[><,] - 1; cc=LOC(min <=-1); IF (NCOL(cc)^=0) THEN x[,cc]=x[,cc]-REPEAT(T(min[cc]),NROW(x),1); cc=LOC(min > -1); IF (NCOL(cc)^=0) THEN min[cc]=0; add=ABS(T(min));""0$ add=J(nvar,1,&add); x=x+&add;"  min=T(x[><,]); mean=T(x[:,]); max=T(x[<>,]); period=J(nvar,1,&period); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL"(LOC(aa^=.)); miss[i]=NCOL(LOC(aa=.)); x[cc[1]:cc[NCOL(cc)],i]=CHOOSE(aa=.,-99999,aa); END; END; nbyear=INT(nobs/period);" (&rsa >= 0)"# rsa=J(nvar,1,&rsa);"" (&rsa EQ 9)"2& rsa=4*(nbyear <=8)+5*(nbyear > 8);"" results=period || first || last || nobs || nbyear || rsa || miss || add || max || min || mean; nomcols={'Period' 'First' 'Last' 'Nobs' 'Nbyear' 'RSA' 'TSmiss' 'Add' 'Max' 'Min' 'Mean'};"((%LENGTH(&varreg ) NE 0)"WK USE __trav__; READ all VAR{&varreg} INTO varreg; CLOSE __trav__;""  FILE "&dtramo.\serie"; DO i=1 TO nvar; annee=YEAR(first[i]); nom=names[i]; perdeb=INT(period[i] * (MONTH(first[i]) -1) / 12) +1; per=period[i]; nnobs=nobs[i]; PUT @1 nom $32. / @1 nnobs +2 annee +2 perdeb +2 per; cc=LOC(x[,i]"^=.); njk=0; IF (NCOL(cc)^=0) THEN DO j=cc[1] TO cc[NCOL(cc)]; njk=njk+1; xx=x[j,i]; IF ((njk > 1) & (MOD(njk,6)=1)) THEN PUT; PUT xx 20.5 @ +1; END; PUT; rrsa=rsa[i];" (&rsa GT 0)" IF (i=1) THEN PUT @2 "$INPUT RSA=" rrsa +1 ",ITER=3,SEATS=2,OUT=0,VA=&va,IREG=&ireg$"; ELSE PUT @2 "$INPUT RSA=" rrsa +1 ",SEATS=2,OUT=0,IREG=&ireg$";""'(%LENGTH(&model ) NE 0)"  PUT @2 "$INPUT LAM=&lam,IEAST=&easter,ITRAD=&trad,IDUR=&idur,IATIP=1,AIO=2,SEATS=2,OUT=0,VA=&va,IREG=&ireg,"; PUT @2 "P=%SCAN(&moLAY HREF=(&listf) LHREF=33 HAXIS=(0, 30, 60, 90, 120, 150, 180) VAXIS=axis1;""ma PLOT s_02*freq / NAME="spectre" OVERLAY HREF=(&listf) LHREF=33 HAXIS=(0,90,180) VAXIS=axis1;"  AXIS1 LABEL=none" (&log EQ NO)"& ORDER=(0 TO &p90 BY &p90)""; TITLE "Spectre de la srie &&_var&i"; RUN; QUIT; SYMBOL2 I=join COLOR=black WIDTH=1 VALUE=none ; PROC GPLOT DATA=_b_ GOUT=&&_var&i UNIFORM; PLOT (&minan - &maxan)*per = 2 /FRAME OVERLAY NAME="annee" VAXIS=axis1;; AXIS1 LABEL=none;" TITLE "Evolution de chaque anne"; FORMAT per &form.; RUN; QUIT; PROC GPLOT DATA= _a_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(a=90); AXIS2 ORDER=(&tick) LABEL=none MINOR=none MAJOR=(H=0.05) VALUE=(" (&per EQ 12)" ' ' 'Jan' ' ' 'Feb' ' ' 'Mar' ' ' 'Apr' ' ' 'May' ' ' 'Jun' ' ' 'Jul' ' ' 'Aug' ' ' 'Sep' ' ' 'Oct' ' ' 'Nov' ' ' 'Dec' ' '"":. ' ' 'Q1' ' ' 'Q2' ' ' 'Q3' ' ' 'Q4' ' '"v); PLOT &&_var&i*nobs avg*nobs / OVERLAY FRAME SKIPMISS NAME="seas" HAXIS=axis2 HREF=(&nref) LHREF=33 VAXIS=axis1;" (&per EQ 12)"2& TITLE "Evolution de chaque mois";""7+ TITLE "Evolution de chaque trimestre";" RUN; QUIT;" &SYSVER >= 7" PROC BOXPLOT DATA=seas(WHERE=(&&_var&i ^=.)) GOUT=&&_var&i; PLOT &&_var&i* year / CAXIS = black CTEXT = black CBOXES = black VAXIS=axis1 BOXSTYLE=schematic BOXCONNECT=median BOXWIDTHSCALE=1 CCONNECT=blue" IDCOLOR = black IDSYMBOL=dot NAME="boxpan"; TITLE "Variable &&_var&i : Boxplots par anne"; SYMBOL1 C=black H=0.5; AXIS1 LABEL=none MAJOR=none VALUE=none; RUN; QUIT;""  SYMBOL1 I=needle CI=grey WIDTH=10 V=none HEIGHT=3; SYMBOL2 I=join V=none CI=black; SYMBOL3 I=join V=none CI=black; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr0 up0 low0) * lag /"  OVERLAY VAXIS=axis1 NAME="corr0"; TITLE "ACF de la variable &&_var&i"; RUN; QUIT; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr1 up1 low1) * lag / OVERLAY VAXIS=axis1 NAME="corr1";" TITLE "ACF de la variable &&_var&i diffrencie I(1,0)"; RUN; QUIT; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr2 up2 low2) * lag / OVERLAY VAXIS=axis1 NAME="corr11"; TITLE1" "ACF de la variable &&_var&i diffrencie I(1,1)"; RUN; QUIT; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr3 up3 low3) * lag / OVERLAY VAXIS=axis1 NAME="corr01"; TITLE1"OC "ACF de la variable &&_var&i diffrencie I(0,1)"; RUN; QUIT;"!(&partinv EQ YES)"  SYMBOL1 I=needle CI=grey WIDTH=10 V=none HEIGHT=3; SYMBOL2 I=join V=none CI=black; SYMBOL3 I=join V=none CI=black; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr0 up0 low0) *" lag / OVERLAY VAXIS=axis1 NAME="pcorr0"; TITLE "PACF de la variable &&_var&i"; RUN; QUIT; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr1 up1 low1) * lag / OVERLAY VAXIS=" axis1 NAME="pcorr1"; TITLE "PACF de la variable &&_var&i diffrencie I(1,0)"; RUN; QUIT; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr2 up2 low2) * lag / OVERLAY VAXIS=axis1LAY HREF=(&listf) LHREF=33 HAXIS=(0, 30, 60, 90, 120, 150, 180) VAXIS=axis1;""ma PLOT s_02*freq / NAME="spectre" OVERLAY HREF=(&listf) LHREF=33 HAXIS=(0,90,180) VAXIS=axis1;"  AXIS1 LABEL=none" (&log EQ NO)"& ORDER=(0 TO &p90 BY &p90)""; TITLE "Spectre de la srie &&_var&i"; RUN; QUIT; SYMBOL2 I=join COLOR=black WIDTH=1 VALUE=none ; PROC GPLOT DATA=_b_ GOUT=&&_var&i UNIFORM; PLOT (&minan - &maxan)*per = 2 /FRAME OVERLAY NAME="annee" VAXIS=axis1;; AXIS1 LABEL=none;" TITLE "Evolution de chaque anne"; FORMAT per &form.; RUN; QUIT; PROC GPLOT DATA= _a_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(a=90); AXIS2 ORDER=(&tick) LABEL=none MINOR=none MAJOR=(H=0.05) VALUE=(" (&per EQ 12)" ' ' 'Jan' ' ' 'Feb' ' ' 'Mar' ' ' 'Apr' ' ' 'May' ' ' 'Jun' ' ' 'Jul' ' ' 'Aug' ' ' 'Sep' ' ' 'Oct' ' ' 'Nov' ' ' 'Dec' ' '"":. ' ' 'Q1' ' ' 'Q2' ' ' 'Q3' ' ' 'Q4' ' '"v); PLOT &&_var&i*nobs avg*nobs / OVERLAY FRAME SKIPMISS NAME="seas" HAXIS=axis2 HREF=(&nref) LHREF=33 VAXIS=axis1;" (&per EQ 12)"2& TITLE "Evolution de chaque mois";""7+ TITLE "Evolution de chaque trimestre";" RUN; QUIT;" &SYSVER >= 7" PROC BOXPLOT DATA=seas(WHERE=(&&_var&i ^=.)) GOUT=&&_var&i; PLOT &&_var&i* year / CAXIS = black CTEXT = black CBOXES = black VAXIS=axis1 BOXSTYLE=schematic BOXCONNECT=median BOXWIDTHSCALE=1 CCONNECT=blue" IDCOLOR = black IDSYMBOL=dot NAME="boxpan"; TITLE "Variable &&_var&i : Boxplots par anne"; SYMBOL1 C=black H=0.5; AXIS1 LABEL=none MAJOR=none VALUE=none; RUN; QUIT;""  SYMBOL1 I=needle CI=grey WIDTH=10 V=none HEIGHT=3; SYMBOL2 I=join V=none CI=black; SYMBOL3 I=join V=none CI=black; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr0 up0 low0) * lag /"  OVERLAY VAXIS=axis1 NAME="corr0"; TITLE "ACF de la variable &&_var&i"; RUN; QUIT; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr1 up1 low1) * lag / OVERLAY VAXIS=axis1 NAME="corr1";" TITLE "ACF de la variable &&_var&i diffrencie I(1,0)"; RUN; QUIT; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr2 up2 low2) * lag / OVERLAY VAXIS=axis1 NAME="corr11"; TITLE1" "ACF de la variable &&_var&i diffrencie I(1,1)"; RUN; QUIT; PROC GPLOT DATA=_dcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (corr3 up3 low3) * lag / OVERLAY VAXIS=axis1 NAME="corr01"; TITLE1"OC "ACF de la variable &&_var&i diffrencie I(0,1)"; RUN; QUIT;"!(&partinv EQ YES)"  SYMBOL1 I=needle CI=grey WIDTH=10 V=none HEIGHT=3; SYMBOL2 I=join V=none CI=black; SYMBOL3 I=join V=none CI=black; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr0 up0 low0) *" lag / OVERLAY VAXIS=axis1 NAME="pcorr0"; TITLE "PACF de la variable &&_var&i"; RUN; QUIT; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr1 up1 low1) * lag / OVERLAY VAXIS=" axis1 NAME="pcorr1"; TITLE "PACF de la variable &&_var&i diffrencie I(1,0)"; RUN; QUIT; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr2 up2 low2) * lag / OVERLAY VAXIS=axis1del,1),D=%SCAN(&model,2),Q=%SCAN(&model,3),BP=%SCAN(&model,4),BD=%SCAN(&model,5),BQ=%SCAN(&model,6)"; IF (i=1)"C7 THEN PUT @2 ",ITER=3$"; ELSE PUT @2 "$";"" IF (i=1) THEN PUT @2 "$INPUT LAM=&lam,INIC=3,IDIF=3,IEAST=&easter,ITRAD=&trad,IDUR=&idur,IATIP=1,AIO=2,SEATS=2,OUT=0,VA=&va,IREG=&ireg,ITER=3$"; ELSE PUT @2"u "$INPUT LAM=&lam,INIC=3,IDIF=3,IEAST=&easter,ITRAD=&trad,IDUR=&idur,IATIP=1,AIO=2,SEATS=2,OUT=0,VA=&va,IREG=&ireg$";"((%LENGTH(&varreg ) NE 0)" nbreg=NCOL(varreg); DO k=1 TO nbreg; vv=varreg[cc[1]:NROW(varreg),]; ilong=NROW(vv); PUT @2 "$REG IUSER=1,REGEFF=®eff,ILONG=" +1 ilong "$"; njk=0; DO j=1 TO ilong; njk=njk+1; xx=vv[j,k]; IF (xx=.)"|p THEN xx=0; IF ((njk > 1) & (MOD(njk,6)=1)) THEN PUT; PUT xx 20.5 @ +1; END; PUT; END;"" END; CREATE statdes FROM results[COLNAME=nomcols]; APPEND FROM results; CLOSE statdes; QUIT; DATA statdes; LENGTH data $ 50 series $ 32 firstdat lastdat $ 5 period 8; SET _nomvar_; SET statdes; firstdat=PUT(first,MONYY5.);"s lastdat=PUT(last,MONYY5.); IF INDEX("&data",'.') THEN data=SCAN("&data",2,'.'); ELSE data="&data"; RUN;"_NETTOY_"! &_nettoy_ statdes" X "cd &dtramo"; X "tramo serie"; X "copy &dtramo.\seats.itr &dseats.\serie"; X "cd &dseats"; X "seats serie"; %lectramo(DIR=&dtramo.\output,TABOUT=tramo,TABSER=outtramo,FSTAT=statdes,PRINT=&print);"_NETTOY_"a Q&_nettoy_ tfit tdeterm tcalend toutlier tregvar tarmapar tramo outtramo _listing_"WK %lecseats(DIR=&dseats.\output,TABOUT=seats,TABSER=outseats,PRINT=&print);"_NETTOY_"B 2&_nettoy_ sgeneral sparami sparamii seats outseats" PROC SORT DATA=statdes; BY series; RUN; PROC SORT DATA=tramo; BY series; RUN; PROC FREQ DATA=tramo NOPRINT; TABLE NbTD / OUT=__NbTD__; RUN;"YESTD1" 0"YESTD6" 0"YESTD0" 0" DATA _NULL_; SET __NbTD__; IF (NbTD=.) THEN NbTD=0; CALL SYMPUT(TRIM(LEFT('yestd'||LEFT(PUT(NbTD,3.)))),LEFT(PUT((Count > 0),3.))); RUN; PROC SUMMARY DATA=tramo; VAR Easter LeapYear; OUTPUT OUT=stats MAX=; RUN; DATA _NULL_; SET stats;"zn CALL SYMPUT('yeseast',LEFT(PUT((Easter^=.),3.))); CALL SYMPUT('yesly',LEFT(PUT((LeapYear^=.),3.))); RUN;"_NETTOY_"( &_nettoy_ stats __NbTD__" PROC SORT DATA=seats; BY series; RUN; DATA &out; LENGTH data $ 50 series Nickname $ 32; MERGE statdes tramo(DROP=nobs"-(%EVAL(&yestd1+&yestd6) EQ 0)" Monday Monday_t Tuesday Tuesday_t Wednesday Wednesday_t Thursday Thursday_t Friday Friday_t Saturday Saturday_t Sunday""(&yestd1 NE 0)"v Tuesday Tuesday_t Wednesday Wednesday_t Thursday Thursday_t Friday Friday_t Saturday Saturday_t Sunday"" (&yesly LE 0)"/# LeapYear LeapYear_t""(&yeseast EQ 0)"+ Easter Easter_t"" (&rsa EQ)" rsa"") seats; BY series; LENGTH liste $ 10000; RETAIN liste ' '; Nickname=series; series=newname; DROP nser newname liste;"((%LENGTH(&varreg ) NE 0)"$_I1&ireg1"QE RENAME reg&i = %SCAN(&varreg,&i) reg&i._t = %SCAN(&varreg,&i) rout) NE 0)"  g=outliers[,i];"" RUN mstat(xser,a,b,c,d,e,f,g,Mst,m); mstats[,i]=mst; END; Mnames={"M1*", "M2*", "M3*", "M4", "M5","M7*","M8","M9","M10","M11","Qstat","Mfailed", "FS","ProbFS","FM","ProbFM","KW","ProbKW", "FS_SA","ProbFS_SA","Frd_SA"," "ProbFrd_SA","FS_I","ProbFS_I","Frd_I","ProbFrd_I", "Contr_I","Contr_TC","Contr_S","Contr_O","Contr_TD"}; Mnames2={"M1", "M2", "M3", "M4", "M5","M7","M8","M9","M10","M11","Qstat","Mfailed", "FS","ProbFS","FM","ProbFM","KW","ProbKW"," "FS_SA","ProbFS_SA","Frd_SA","ProbFrd_SA","FS_I","ProbFS_I","Frd_I","ProbFrd_I", "Contr_I","Contr_TC","Contr_S","Contr_O","Contr_TD"}; Roughness=Roughness // Mstats; Indicator=Indicator // Mnames2; Label=Label // Mnames;"  TDres=J(2,NCOL(irreg),.); TDreg=TDregr[,1:6]; DO i=1 TO NCOL(irreg); m=models[i]; IF (m=0) THEN DO; a=sa[,i]-ls[,i]-tc[,i]-ao[,i]; b=irreg[,i]-ao[,i]; END; ELSE DO; a=sa[,i]/(ls[,i]#tc[,i]#ao[,i]); b=irreg[,i]/ao"[,i]; END; ndon=NROW(a); lag=period/4; a=a[1+lag:ndon] - a[1:ndon-lag]; RUN regm(a,tdreg,m); TDres[1,i]=m; RUN regm(b,tdreg,m); TDres[2,i]=m; END; Mnames={"ProbTD_SA","ProbTD_I"}; Roughness=Roughness // TDres; Indicator="Indicator // Mnames; Label=Label // Mnames; CREATE &outstats FROM Roughness[COLNAME=namecols ROWNAME=Indicator]; APPEND FROM Roughness[ROWNAME=Indicator]; CLOSE &outstats; Label=Indicator || Label; CREATE _Labels_ FROM Label[COLNAME={"{Indicator _Label_}]; APPEND FROM Label; CLOSE _Labels_; QUIT; DATA &outstats; SET _Labels_; SET &outstats; RUN;" __NETTOY__"$ &__nettoy__ _Labels_"%(&transpose NE)" PROC TRANSPOSE DATA=&outstats OUT=&outstats; ID Indicator; IDLABEL _Label_; RUN; DATA &outstats; SET &outstats; RENAME _name_=Series; LABEL _name_=' '; RUN;"%"( (&debug EQ)"XL PROC DATASETS LIBRARY=work NOLIST; DELETE &__nettoy__; RUN; QUIT;"("#)0` P@p,H$T|0Lt (<L`x,D`,X$ L h |  D ` t  0 H d  $ 8 T |  $ @ \ 8L\p$@Tdx(Dd4\x(Pdd$HP\h <d @ 4X !"##$$%8%%&H&&&D'X''()*+,-./02345$60788D9P:\;d<l=x>?@ABCDEFGHIJL MN$O,P8QDRPS\ThUtVWXYZ[\]^_`abcdf gh$iiiij klm(n0o4ppppqqq rdrxr)_t ;"_""(&yestd1 NE 0)"9- RENAME Monday=WeekDay Monday_t=WeekDay_t;""  overdif=((&limar <= SUM(OF Phi1-Phi3) <= 1) + (&limar <= SUM(OF BPhi1-BPhi2) <= 1) > 0); underdif=((&limma <= SUM(OF Th1-Th3) <= 1) + (&limma <= SUM(OF Bth1-Bth2) <= 1) > 0); IF (Model_S ^= ' ') THEN liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(series))"; CALL SYMPUT('liste',TRIM(LEFT(liste))); CALL SYMPUT('_mean'||LEFT(PUT(nser,5.)),LEFT(PUT((Lam=0),2.))); RUN; PROC SORT DATA=&out; BY series; RUN; PROC SORT DATA=outtramo; BY series year per; RUN; DATA outtramo(DROP=per year period"  newname nobs oldname) pbtramo(KEEP=oldname pbtramo RENAME=(oldname=series)); LENGTH &date 8 pbtramo 3; MERGE statdes(KEEP=series newname nobs period first last) outtramo END=fin; BY series; oldname=series; series=newname; pbtramo=0; IF ("per = .) THEN DO; PUT 'WARNING: problem with TRAMO for series' +1 series; pbtramo=1; END; ELSE DO; &date=MDY(INT((per-1)*12/period)+1,1,year); OUTPUT outtramo; END; IF FIRST.series THEN OUTPUT pbtramo; RUN; PROC SORT DATA=outtramo"  OUT=outtramo; BY &date series; RUN; PROC SORT DATA=outseats; BY series year per; RUN; DATA outseats; LENGTH &date 8 liste $ 30000; MERGE statdes(KEEP=series newname nobs period first last) pbtramo outseats END=fin; BY series; RETAIN liste"  ' '; DROP per year newname liste nobs; series=newname; IF (per = .) THEN DO; PUT 'WARNING: problem with SEATS for series' +1 series; IF (pbtramo=0) THEN liste=TRIM(LEFT(TRIM(LEFT(liste)) || ' ' || TRIM(LEFT(series)))); END; ELSE DO;"  &date=MDY(INT((per-1)*12/period)+1,1,year); OUTPUT; END; IF fin THEN CALL SYMPUT('lpbseats',LEFT(TRIM(liste))); RUN; PROC SORT DATA=outseats OUT=outseats; BY &date series; RUN; DATA _outts_(DROP=mois) decomp(KEEP=&date series xx"  TrendCycle SAseries Seasonal TransIR mois RENAME=(SAseries=Sadjust Seasonal=Season)); MERGE outtramo outseats; BY &date series; LENGTH forecast mois 3; DROP lastdate first last period; lastdate=INTNX('month',last",&forecast*12/period); mois=MONTH(&date); IF (&date <= last) THEN forecast=0; ELSE IF (&date <= lastdate) THEN forecast=1; ELSE forecast=2;"((%LENGTH(&varreg ) NE 0)"$aI1&ireg1"1% RENAME reg&i = %SCAN(&varreg,&i);"a""]Q OUTPUT _outts_; IF ((forecast=0) AND (period ^=.)) THEN OUTPUT decomp; RUN;"_NETTOY_") &_nettoy_ _outts_ pbtramo"  PROC SORT DATA=decomp; BY series mois; RUN; PROC SUMMARY DATA=decomp NWAY; CLASS series mois; VAR season; OUTPUT OUT=_mseas_(DROP=_type_ _freq_) MEAN=mseas; RUN; DATA decomp; MERGE decomp _mseas_; BY series mois; eseas=Season-" mseas; si=Season+TransIR; RUN; PROC CORR DATA=decomp COV NOPRINT NOSIMPLE OUTP=_cov_; BY series; VAR TransIR mseas eseas; WITH si; RUN; DATA _cov_; SET _cov_(WHERE=(_type_='COV') RENAME=(TransIR=Irr)); DROP _type_ _name_ sum; sum=SUM(OF" Irr mseas eseas); IF (ABS(sum) > 10**-8) THEN DO; Irr=100*Irr/sum; mseas=100*mseas/sum; eseas=100*eseas/sum; END; RUN; PROC GLM DATA = decomp OUTSTAT = _glm_ NOPRINT ; CLASS mois ; MODEL si=mois ; BY series; RUN ; QUIT ; DATA"  _glm_ ; SET _glm_(WHERE=(_source_='mois' AND _type_='SS1') RENAME=(f=Ftest prob=ProbF)) ; KEEP series Ftest ProbF ; LABEL Ftest='F-test saison.' ProbF = 'PROB > F' ; RUN ; DATA &out; MERGE &out _cov_ _glm_; BY series; DROP nbyear;" RUN;"_NETTOY_"4 $&_nettoy_ _cov_ _glm_ decomp _mseas_t); RUN; PROC APPEND BASE=Recursive DATA=Model(FIRSTOBS=%EVAL(&j-1) OBS=%EVAL(&j-1) KEEP=Date Yres); RUN;"J"  DATA InSample; MERGE Extract(KEEP=Date Yvar) InSample Recursive; BY Date; Horizon1=Yvar-Yhat; RUN; PROC MEANS DATA=InSample VARDEF=DF NOPRINT; VAR Horizon1; OUTPUT OUT=rmse(DROP=_Type_ _Freq_) STD=Horizon1 MEAN=Mean1; RUN; DATA"3' Horizon1; LENGTH Model $ 10; SET" (&i GT 1)" Horizon1""?3 Rmse(IN=in1); IF in1 THEN Model="Mod&i"; RUN;"H" PROC SORT DATA=Horizon1; BY Model; RUN; DATA &outmod; LENGTH Num 3 Model $ 10 Variables $ 500; MERGE &outmod Horizon1; BY Model; LABEL Model=' '; FORMAT _numeric_; RUN;"_NETTOY"N >&_nettoy InSample Recursive Rmse Extract SubSet Horizon1 Model"&(%LENGTH(&debug) EQ 0)"WK PROC DATASETS LIB=WORK NOLIST; DELETE &_nettoy ; RUN; QUIT;"" QUIT;"t#0` P@p0`$8h h D   0 p  < \  0 H \  4hDPhxP H`p0@Tt<\(<Px8(Ph|\t Phx,DXl,@l <Tdx(<P4DX ( 8 L !" "L"t"##@#T####$ %&&&&''8'L'l''''''''(@(X(|(((((()* +@+`++++++,@,t,|,,,,,$-,-4-`-----./l//////00,0@0P0p000001 1 181H1h1111122242X2222223303D3\3`4h5t6789::;<;<<d<l=t>>>>???$@(A0B C4CPCXCCCCC@DhDDDEEEFF$G0H"0DATA"0VAR"0DATE"0STANDARD"0DIF"0METHOD"0NBLAGS"0ARIMA"0VARY"0NLAGX"0NLAGY"0OUTNEW"0OUTCAH"0OUTDATA"0OUTMED"0CLUSTERS"0NBCLUS"0MEDOIDS"0SUMMARY"0GRAPH"0GMAX"0PRINT"0 NOCONTROL"0DEBUG", FINCONTROLg",FINMACROi" (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;""TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;""(&nocontrol NE)" FINCONTROL"""  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index" GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&*(%LENGTH(&data ) EQ 0)"DATA" _last_"6"=/-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"/"8, DATA _NULL_; SET &data (OBS=1); RUN;"6(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"6"%:(%LENGTH(&var ) EQ 0)"VAR" _numeric_"A"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"A(&syserr NE 0)"F6ERROR: There is a problem in the var (&var ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"A"&F(%LENGTH(&vary ) EQ 0)"<,ERROR: You must precise a dependent variable" NAME="pcorr11"; TITLE1 "PACF de la variable &&_var&i diffrencie I(1,1)"; RUN; QUIT; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr3 up3 low3) * lag / OVERLAY VAXIS=axis1" NAME="pcorr01"; TITLE1 "PACF de la variable &&_var&i diffrencie I(0,1)"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr0 up0 low0) * lag / OVERLAY VAXIS=axis1"  NAME="icorr0"; TITLE "IACF de la variable &&_var&i"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr1 up1 low1) * lag / OVERLAY VAXIS=axis1 NAME="icorr1"; TITLE" "IACF de la variable &&_var&i diffrencie I(1,0)"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr2 up2 low2) * lag / OVERLAY VAXIS=axis1 NAME="icorr11"; TITLE1" "IACF de la variable &&_var&i diffrencie I(1,1)"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr3 up3 low3) * lag / OVERLAY VAXIS=axis1 NAME="icorr01"; TITLE1"RF "IACF de la variable &&_var&i diffrencie I(0,1)"; RUN; QUIT;""! GOPTIONS display;" (&eps NE)"cW GOPTIONS DEVICE=psepsf GSFNAME=grafout GSFMODE=replace; FILENAME grafout "&eps";"GRAFOUT" grafout"" (&jpg NE)"aU GOPTIONS DEVICE=jpeg GSFNAME=grafout GSFMODE=replace; FILENAME grafout "&jpg";"GRAFOUT" grafout""GRAFOUT" &&_var&i"  PROC GREPLAY IGOUT=&&_var&i TC=&&_var&i NOFS GOUT=&grafout; TDEF newfour DES='four squares of equal size' 1/LLX=1 LLY=1 ULX=1 ULY=49 URX=49 URY=49 LRX=49 LRY=1 color=grey 2/LLX=51 LLY=1 ULX=51 ULY=49 URX=99 URY=49 LRX="99 LRY=1 color=grey 3/LLX=1 LLY=51 ULX=1 ULY=99 URX=49 URY=99 LRX=49 LRY=51 color=grey 4/LLX=51 LLY=51 ULX=51 ULY=99 URX=99 URY=99 LRX=99 LRY=51 color=grey ; TEMPLATE newfour;" &SYSVER >= 7"aU TREPLAY 1:boxpan 2:spectre 3:loess 4:seas NAME=%CMPRES("&&_var&i.._1"); RUN;""`T TREPLAY 1:annee 2:spectre 3:brute 4:seas NAME=%CMPRES("&&_var&i.._1"); RUN;"`T TREPLAY 1:corr01 2:corr11 3:corr0 4:corr1 NAME=%CMPRES("&&_var&i.._2"); RUN;"!(&partinv EQ YES)" TREPLAY 1:pcorr01 2:pcorr11 3:pcorr0 4:pcorr1 NAME=%CMPRES("&&_var&i.._3"); RUN; TREPLAY 1:icorr01 2:icorr11 3:icorr0 4:icorr1 NAME=%CMPRES("&&_var&i.._4"); RUN;""' QUIT; TITLE; SYMBOL;"" (&debug EQ)"VJ PROC DATASETS LIB=work NOLIST; DELETE _a_ _b_ stats sort nomvar seas" &SYSVER >= 7"-! outloess seasloess sum loess""cW _cov_ _cov1_ _cov2_ _cov3_ _dcov_ _icov_ _pcov_ __spect1__ __spect2__ p90; RUN;"" QUIT;"#0` P 8T8$d $L$8L`Dd ( 8 L ` t X p  , < P  8 L ` t  $ L d x (0H`x(@XK PROC DATASETS LIB=WORK NOLIST; DELETE &_nettoy ; RUN; QUIT;""' QUIT; AXIS;SYMBOL;TITLE;" _outnew_""?/(%LENGTH(%QSCAN(%BQUOTE(&outnew ),2, )) NE 0)"ZJERROR: You must precise just one value for the outnew (&outnew ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outnew ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outnew (&outnew ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outcah ) EQ 0)"OUTCAH" _outcah_""?/(%LENGTH(%QSCAN(%BQUOTE(&outcah ),2, )) NE 0)"ZJERROR: You must precise just one value for the outcah (&outcah ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outcah ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outcah (&outcah ) parameter must be a valid SAS dataset name"FINMACRO" ;"")(%LENGTH(&outdata ) EQ 0)"OUTDATA" _outdata_""@0(%LENGTH(%QSCAN(%BQUOTE(&outdata ),2, )) NE 0)"\LERROR: You must precise just one value for the outdata (&outdata ) parameter"FINMACRO" ;""4( %sasnom(_IN_=&outdata ,TYPE=DATASET);" (&_ret_ NE 0)"YIERROR: The outdata (&outdata ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outmed ) EQ 0)"OUTMED" _outmed_""?/(%LENGTH(%QSCAN(%BQUOTE(&outmed ),2, )) NE 0)"ZJERROR: You must precise just one value for the outmed (&outmed ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outmed ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outmed (&outmed ) parameter must be a valid SAS dataset name"FINMACRO" ;""*(%LENGTH(&clusters ) EQ 0)"CLUSTERS" _clusters_""A1(%LENGTH(%QSCAN(%BQUOTE(&clusters ),2, )) NE 0)"^NERROR: You must precise just one value for the clusters (&clusters ) parameter"FINMACRO" ;""5) %sasnom(_IN_=&clusters ,TYPE=DATASET);" (&_ret_ NE 0)"[KERROR: The clusters (&clusters ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&nbclus ) EQ 0)"NBCLUS" 5""?/(%LENGTH(%QSCAN(%BQUOTE(&nbclus ),2, )) NE 0)"ZJERROR: You must precise just one value for the nbclus (&nbclus ) parameter"FINMACRO" ;"",(%DATATYP(&nbclus ) EQ CHAR)"F6ERROR: The nbclus (&nbclus ) parameter must be numeric"FINMACRO" ;""(&nbclus LE 0 )"1!ERROR: You must have &nbclus > 0"FINMACRO""FINMACRO" ;"R"<K,(%LENGTH(%QSCAN(%BQUOTE(&vary),2, )) NE 0)"UEERROR: You must precise just one value for the vary (&vary) parameter"FINMACRO" ;"K"\P DATA _NULL_; SET &data (KEEP=&vary OBS=1); ARRAY _xx_(*) &vary; RUN;"R(&syserr NE 0)"G7ERROR: There is a problem in the vary (&vary) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"R"&W(%LENGTH(&date ) EQ 0)";+ERROR: You must precise a SAS date variable"FINMACRO" ;"^"]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"^(&syserr NE 0)"H8ERROR: There is a problem in the date (&date ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"^"*b(%LENGTH(&standard ) EQ 0)"STANDARD" NO"q"Ag1(%LENGTH(%QSCAN(%BQUOTE(&standard ),2, )) NE 0)"^NERROR: You must precise just one value for the standard (&standard ) parameter"FINMACRO" ;"g"-l(%DATATYP(&standard ) EQ NUM)"L<ERROR: The standard (&standard ) parameter must be character"FINMACRO" ;"q"Lq<((%UPCASE(&standard) NE YES) AND (%UPCASE(&standard) NE NO))"ZJERROR: The standard (&standard ) parameter must be choosen among (YES NO )"FINMACRO" ;"q"%u(%LENGTH(&dif ) EQ 0)"DIF" 0""<z,(%LENGTH(%QSCAN(%BQUOTE(&dif ),2, )) NE 0)"TDERROR: You must precise just one value for the dif (&dif ) parameter"FINMACRO" ;"z")(%DATATYP(&dif ) EQ CHAR)"@0ERROR: The dif (&dif ) parameter must be numeric"FINMACRO" ;"" (&dif LT 0 )"/ERROR: You must have &dif >= 0"FINMACRO" ;""((%LENGTH(&nblags ) EQ 0)"NBLAGS" 20""?/(%LENGTH(%QSCAN(%BQUOTE(&nblags ),2, )) NE 0)"ZJERROR: You must precise just one value for the nblags (&nblags ) parameter"FINMACRO" ;"",(%DATATYP(&nblags ) EQ CHAR)"F6ERROR: The nblags (&nblags ) parameter must be numeric"FINMACRO" ;""(&nblags LE 0 )"1!ERROR: You must have &nblags > 0"FINMACRO" ;""'(%LENGTH(&arima ) EQ 0)"ARIMA" 2"">.(%LENGTH(%QSCAN(%BQUOTE(&arima ),2, )) NE 0)"XHERROR: You must precise just one value for the arima (&arima ) parameter"FINMACRO" ;""+(%DATATYP(&arima ) EQ CHAR)"D4ERROR: The arima (&arima ) parameter must be numeric"FINMACRO" ;""C3((%UPCASE(&arima) NE 1) AND (%UPCASE(&arima) NE 2))"P@ERROR: The arima (&arima ) parameter must be choosen among (1 2)"FINMACRO" ;""((%LENGTH(&outnew ) EQ 0)"OUTNEW" _outnew_""?/(%LENGTH(%QSCAN(%BQUOTE(&outnew ),2, )) NE 0)"ZJERROR: You must precise just one value for the outnew (&outnew ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outnew ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outnew (&outnew ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outcah ) EQ 0)"OUTCAH" _outcah_""?/(%LENGTH(%QSCAN(%BQUOTE(&outcah ),2, )) NE 0)"ZJERROR: You must precise just one value for the outcah (&outcah ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outcah ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outcah (&outcah ) parameter must be a valid SAS dataset name"FINMACRO" ;"")(%LENGTH(&outdata ) EQ 0)"OUTDATA" _outdata_""@0(%LENGTH(%QSCAN(%BQUOTE(&outdata ),2, )) NE 0)"\LERROR: You must precise just one value for the outdata (&outdata ) parameter"FINMACRO" ;""4( %sasnom(_IN_=&outdata ,TYPE=DATASET);" (&_ret_ NE 0)"YIERROR: The outdata (&outdata ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outmed ) EQ 0)"OUTMED" _outmed_""?/(%LENGTH(%QSCAN(%BQUOTE(&outmed ),2, )) NE 0)"ZJERROR: You must precise just one value for the outmed (&outmed ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outmed ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outmed (&outmed ) parameter must be a valid SAS dataset name"FINMACRO" ;""*(%LENGTH(&clusters ) EQ 0)"CLUSTERS" _clusters_""A1(%LENGTH(%QSCAN(%BQUOTE(&clusters ),2, )) NE 0)"^NERROR: You must precise just one value for the clusters (&clusters ) parameter"FINMACRO" ;""5) %sasnom(_IN_=&clusters ,TYPE=DATASET);" (&_ret_ NE 0)"[KERROR: The clusters (&clusters ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&nbclus ) EQ 0)"NBCLUS" 5""?/(%LENGTH(%QSCAN(%BQUOTE(&nbclus ),2, )) NE 0)"ZJERROR: You must precise just one value for the nbclus (&nbclus ) parameter"FINMACRO" ;"",(%DATATYP(&nbclus ) EQ CHAR)"F6ERROR: The nbclus (&nbclus ) parameter must be numeric"FINMACRO" ;""(&nbclus LE 0 )"1!ERROR: You must have &nbclus > 0"FINMACRO" ;"") (%LENGTH(&summary ) EQ 0)"SUMMARY" 0""@0(%LENGTH(%QSCAN(%BQUOTE(&summary ),2, )) NE 0)"\LERROR: You must precise just one value for the summary (&summary ) parameter"FINMACRO" ;""-(%DATATYP(&summary ) EQ CHAR)"H8ERROR: The summary (&summary ) parameter must be numeric"FINMACRO" ;"" (&summary LT 0 )"3#ERROR: You must have &summary >= 0"FINMACRO" ;""'(%LENGTH(&graph ) EQ 0)"GRAPH" NO".">$.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"XHERROR: You must precise just one value for the graph (&graph ) parameter"FINMACRO" ;"$"*)(%DATATYP(&graph ) EQ NUM)"F6ERROR: The graph (&graph ) parameter must be character"FINMACRO" ;"."F.6((%UPCASE(&graph) NE YES) AND (%UPCASE(&graph) NE NO))"TDERROR: The graph (&graph ) parameter must be choosen among (YES NO )"FINMACRO" ;".")2(%LENGTH(&medoids ) EQ 0)"MEDOIDS" 1"A"@70(%LENGTH(%QSCAN(%BQUOTE(&medoids ),2, )) NE 0)"\LERROR: You must precise just one value for the medoids (&medoids ) parameter"FINMACRO" ;"7"-<(%DATATYP(&medoids ) EQ CHAR)"H8ERROR: The medoids (&medoids ) parameter must be numeric"FINMACRO" ;"A" A(&medoids LE 0 )"2"ERROR: You must have &medoids > 0"FINMACRO" ;"A"&E(%LENGTH(&gmax ) EQ 0)"GMAX" 50"T"=J-(%LENGTH(%QSCAN(%BQUOTE(&gmax ),2, )) NE 0)"VFERROR: You must precise just one value for the gmax (&gmax ) parameter"FINMACRO" ;"J"*O(%DATATYP(&gmax ) EQ CHAR)"B2ERROR: The gmax (&gmax ) parameter must be numeric"FINMACRO" ;"T"T (&gmax LE 0 )"/ERROR: You must have &gmax > 0"FINMACRO" ;"T"'X(%LENGTH(&print ) EQ 0)"PRINT" NO"g">].(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"XHERROR: You must precise just one value for the print (&print ) parameter"FINMACRO" ;"]"*b(%DATATYP(&print ) EQ NUM)"F6ERROR: The print (&print ) parameter must be character"FINMACRO" ;"g"Fg6((%UPCASE(&print) NE YES) AND (%UPCASE(&print) NE NO))"TDERROR: The print (&print ) parameter must be choosen among (YES NO )"FINMACRO" ;"g"(k(%LENGTH(&method ) EQ 0)"METHOD" 2"k"ERREUR" 0"l` PROC IML; method={&method}; IF (TYPE(method) = 'C') THEN CALL SYMPUT('erreur','1'); QUIT;"s(&erreur EQ 1)"XHERROR: the method parameter (&method) should contain numeric values only"FINMACRO" ;"s"ERREUR" 0"  PROC IML; method={&method}; newmeth=.; cc=LOC((method=0) | (method=1) | (method=2) | (method=3) | (method=4) | (method=9)); IF (NCOL(cc)=0) THEN CALL SYMPUT('erreur','1'); IF (NCOL(LOC(method=9))^=0) THEN newmeth={. 0 1 2 3 4}; ELSE DO;"  IF (NCOL(LOC(method=0))^=0) THEN newmeth=newmeth || {0}; IF (NCOL(LOC(method=1))^=0) THEN newmeth=newmeth || {1}; IF (NCOL(LOC(method=2))^=0) THEN newmeth=newmeth || {2}; IF (NCOL(LOC(method=3))^=0) THEN newmeth=newmeth || {3}; IF (NCOL("LOC(method=4))^=0) THEN newmeth=newmeth || {4}; END; CALL SYMPUT('newmeth',TRIM(LEFT(COMPBL(ROWCAT(CHAR(newmeth,5,0)))))); QUIT;"}(&erreur EQ 1)"n^ERROR: the method parameter (&method) should contain at least a value among (0, 1, 2, 3, 4, 9)"FINMACRO" ;"}"METHOD" &newmeth"  DATA _NULL_; CALL SYMPUT('nblags',TRIM(LEFT(PUT(INT(&nblags),10.)))); CALL SYMPUT('summary',TRIM(LEFT(PUT(INT(&summary),10.)))); CALL SYMPUT('gmax',TRIM(LEFT(PUT(INT(&gmax),10.)))); CALL SYMPUT('medoids',TRIM(LEFT(PUT(INT(&medoids),10.))"|p)); RUN; DATA _trav_; SET &data; KEEP &var &date &vary _datechar_; _datechar_=PUT(&date,MONYY5.); RUN;"_NETTOY" _trav_"  PROC CONTENTS DATA=_trav_(KEEP=&var) OUT=_nomvar_(KEEP=name label) NOPRINT; RUN; DATA _nomvar_; SET _nomvar_ END=f; KEEP name label; RENAME name=series; IF ((UPCASE(name) ^= UPCASE("&date")) AND (UPCASE(name) ^= UPCASE("&vary"))) THEN DO"; ii+1; CALL SYMPUT('_var'!!LEFT(PUT(ii,6.)),TRIM(LEFT(name))); OUTPUT; END; IF f THEN CALL SYMPUT('_nvar',LEFT(PUT(ii,6.))); RUN; PROC SORT DATA=_nomvar_; BY series; RUN;"LISTVAR" "%HI1&_nvar1"LISTVAR"! &listvar &&_var&i"H"_NETTOY"! &_nettoy _nomvar_"((%UPCASE(&graph) EQ YES)" (&gmax EQ)"GMAX" &_nvar"" GOPTIONS CBACK=white BORDER; DATA _NULL_; gmax=MIN(&_nvar,INT(&gmax)); k=LOG(gmax)/LOG(2); gmax=2**(k+1)-1; CALL SYMPUT('gmax',LEFT(PUT(gmax,4.))); CALL SYMPUT('div',LEFT(PUT(INT(&nbclus/4),4.))); CALL SYMPUT('mod',LEFT(PUT(MOD("$&nbclus,4),4.))); RUN;""  PROC IML; USE _trav_; READ all VAR{&listvar &vary} INTO x; READ all VAR{&date} INTO date; CLOSE _trav_; nvar=NCOL(x); nobs=NROW(x); series=T({&listvar &vary}); mean=x[:,]; std=SQRT((x-REPEAT(mean,nobs,1))[##,]); first=J("nvar,1,.); last=J(nvar,1,.); numobs=J(nvar,1,0); nmiss=J(nvar,1,0); max=x[<>,]; min=x[><,]; period=J(nvar,1,.); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]];"  aa=x[cc,i]; numobs[i]=NCOL(cc); nmiss[i]=(cc[NCOL(cc)]-cc[1]+1)-numobs[i]; jj=(last[i]-first[i])/numobs[i]; IF ((25<=jj) & (jj<=35)) THEN period[i]=12; ELSE IF ((50<=jj) & (jj<=70)) THEN period[i]=6; ELSE IF ((80<=jj) & (jj<=" 100)) THEN period[i]=4; ELSE IF ((115<=jj) & (jj<=135)) THEN period[i]=3; ELSE IF ((175<=jj) & (jj<=195)) THEN period[i]=2; ELSE IF ((345<=jj) & (jj<=375)) THEN period[i]=1; END; END; nbyear=INT(numobs/period); results=period || first" || last || numobs || nmiss || nbyear || T(max) || T(min) || T(mean) || T(std); nomcols={period first last nobs nmiss nbyear max min mean std}; CREATE &outdata FROM results[ROWNAME=series COLNAME=nomcols]; APPEND FROM results[ROWNAME=series];" CLOSE &outdata; CALL SYMPUT('nbmiss',TRIM(LEFT(CHAR(MAX(nmiss),5,0)))); CALL SYMPUT('nbper',TRIM(LEFT(CHAR(RANGE(period),5,0)))); QUIT;"(&nbmiss NE 0)"RBERROR: No series should have missing values (see &outdata dataset)"FINMACRO" ;"" (&nbper NE 0)"QAERROR: Mixed periodicities are not allowed (see &outdata dataset)"FINMACRO" ;"" PROC SORT DATA=&outdata; BY series; RUN; PROC IML; START moymob(xserie,movav,coef); movav=J(NROW(xserie),1,0); mmob1=xserie[LOC(xserie ^= .)]; nobs=NROW(mmob1); mmob2=J(nobs,1,.); ordre=NROW(coef); ncols=NCOL(coef);"  nb=INT(ordre / 2); IF (ordre <= nobs) THEN DO; mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef[,ncols]),T(mmob1))[ordre:nobs]); END; ELSE mmob2=J(nobs,1,mmob1[:]); mmob2[1:nb]=T(T(mmob1[1:ordre])*coef[,1:nb]); mmob2[nobs:nobs-nb+1]=T(T(mmob1[" nobs:nobs-ordre+1])*coef[,1:nb]); movav[LOC(xserie ^= .)]=mmob2; FINISH moymob; USE _trav_; READ all VAR{&listvar &vary} INTO x; READ all VAR{&date} INTO date; READ all VAR{_datechar_} INTO datechar; CLOSE _trav_; nvar=NCOL(x); nobs"=NROW(x); xx=J(nobs,nvar,.); listvar={"&date" &listvar &vary}; series={&listvar}; numobs=J(nvar,1,0); mean=x[:,]; std=SQRT((x-REPEAT(mean,nobs,1))[##,]); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; aa=x[cc,i];"$ numobs[i]=NCOL(cc);"$(%UPCASE(&dif) NE 0)"qe x[cc[1+&dif]:cc[NCOL(cc)],i]=aa[&dif+1:numobs[i]]-aa[1:numobs[i]-&dif]; x[1:cc[&dif],i]=.;"" END; END;"+(%UPCASE(&standard) EQ YES)" cc=LOC(std > 10**-8); ncolcc=NCOL(cc); IF (ncolcc ^=0) THEN DO i=1 TO ncolcc; dd=LOC(x[,cc[i]]^=.); IF (NCOL(dd)^=0) THEN DO; aa=(x[dd,cc[i]]-REPEAT(mean[cc[i]],NCOL(dd),1))/REPEAT(std[cc[i]],NCOL(dd),1); x[dd,cc[i]]=aa;" END; END; cc=LOC(std < 10**-8); ncolcc=NCOL(cc); IF (ncolcc ^=0) THEN DO i=1 TO ncolcc; dd=LOC(x[,cc[i]]^=.); IF (NCOL(dd)^=0) THEN x[dd,cc[i]]=0; END;"" x0= date || x; CREATE _trav_ FROM x0[ROWNAME=datechar COLNAME=listvar]; APPEND FROM x0[ROWNAME=datechar]; CLOSE _trav_;"!%INDEX(&method,0)" missing=(NMISS(x))[,+]; cc=LOC(missing=0); newvar=date[cc]||x[cc,]; CALL SYMPUT('namenew0',TRIM(LEFT("&listvar"))); CREATE &outnew._0 FROM newvar[COLNAME=listvar]; APPEND FROM newvar; CLOSE &outnew._0;""!%INDEX(&method,1)" missing=(NMISS(x))[,+]; cc=LOC(missing=0); newvar=T(x[cc,]); namenew=datechar[cc]; CALL SYMPUT('namenew1',COMPBL(ROWCAT(namenew))); cc=LOC(UPCASE(series)^=UPCASE("&var")); IF (NCOL(cc)^=0) THEN newvar=newvar[cc,]; CREATE"u &outnew._1 FROM newvar[ROWNAME=series COLNAME=namenew]; APPEND FROM newvar[ROWNAME=series]; CLOSE &outnew._1;""!%INDEX(&method,2)" pi=2*ARCOS(0); frq=DO(0,0.5,1/120); frq=frq || {.348125 .431458}; frq=frq || {.294375 .338750}; frq=T(frq)*2*pi; CALL SORT(frq,{1}); nfrq=NROW(frq); nq=INT(2*(nfrq**(1/5))/3); ww=T(DO(-nq,nq,1))/(2*nq+1);"" NAME="pcorr11"; TITLE1 "PACF de la variable &&_var&i diffrencie I(1,1)"; RUN; QUIT; PROC GPLOT DATA=_pcov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (pcorr3 up3 low3) * lag / OVERLAY VAXIS=axis1" NAME="pcorr01"; TITLE1 "PACF de la variable &&_var&i diffrencie I(0,1)"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr0 up0 low0) * lag / OVERLAY VAXIS=axis1"  NAME="icorr0"; TITLE "IACF de la variable &&_var&i"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr1 up1 low1) * lag / OVERLAY VAXIS=axis1 NAME="icorr1"; TITLE" "IACF de la variable &&_var&i diffrencie I(1,0)"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr2 up2 low2) * lag / OVERLAY VAXIS=axis1 NAME="icorr11"; TITLE1" "IACF de la variable &&_var&i diffrencie I(1,1)"; RUN; QUIT; PROC GPLOT DATA=_icov_ GOUT=&&_var&i UNIFORM; AXIS1 LABEL=(R=0 a=90) ORDER=(-1 TO 1 BY 0.5); PLOT (icorr3 up3 low3) * lag / OVERLAY VAXIS=axis1 NAME="icorr01"; TITLE1"RF "IACF de la variable &&_var&i diffrencie I(0,1)"; RUN; QUIT;""! GOPTIONS display;" (&eps NE)"cW GOPTIONS DEVICE=psepsf GSFNAME=grafout GSFMODE=replace; FILENAME grafout "&eps";"GRAFOUT" grafout"" (&jpg NE)"aU GOPTIONS DEVICE=jpeg GSFNAME=grafout GSFMODE=replace; FILENAME grafout "&jpg";"GRAFOUT" grafout""GRAFOUT" &&_var&i"  PROC GREPLAY IGOUT=&&_var&i TC=&&_var&i NOFS GOUT=&grafout; TDEF newfour DES='four squares of equal size' 1/LLX=1 LLY=1 ULX=1 ULY=49 URX=49 URY=49 LRX=49 LRY=1 color=grey 2/LLX=51 LLY=1 ULX=51 ULY=49 URX=99 URY=49 LRX="99 LRY=1 color=grey 3/LLX=1 LLY=51 ULX=1 ULY=99 URX=49 URY=99 LRX=49 LRY=51 color=grey 4/LLX=51 LLY=51 ULX=51 ULY=99 URX=99 URY=99 LRX=99 LRY=51 color=grey ; TEMPLATE newfour;" &SYSVER >= 7"aU TREPLAY 1:boxpan 2:spectre 3:loess 4:seas NAME=%CMPRES("&&_var&i.._1"); RUN;""`T TREPLAY 1:annee 2:spectre 3:brute 4:seas NAME=%CMPRES("&&_var&i.._1"); RUN;"`T TREPLAY 1:corr01 2:corr11 3:corr0 4:corr1 NAME=%CMPRES("&&_var&i.._2"); RUN;"!(&partinv EQ YES)" TREPLAY 1:pcorr01 2:pcorr11 3:pcorr0 4:pcorr1 NAME=%CMPRES("&&_var&i.._3"); RUN; TREPLAY 1:icorr01 2:icorr11 3:icorr0 4:icorr1 NAME=%CMPRES("&&_var&i.._4"); RUN;""' QUIT; TITLE; SYMBOL;"" (&debug EQ)"VJ PROC DATASETS LIB=work NOLIST; DELETE _a_ _b_ stats sort nomvar seas" &SYSVER >= 7"-! outloess seasloess sum loess""cW _cov_ _cov1_ _cov2_ _cov3_ _dcov_ _icov_ _pcov_ __spect1__ __spect2__ p90; RUN;"" QUIT;"#0` P 8T8$d $L$8L`Dd ( 8 L ` t X p  , < P  8 L ` t  $ L d x (0H`x(@X ;"C"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"I (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"I"M (&add EQ)"ADD" 0"M"Q (&ndec EQ)"NDEC" 3"Q"U (&maxlead EQ)"MAXLEAD" 12"U" %MACRO ListX12(DIR=,SOFT=,TABOUT=,OUTSER=); %GLOBAL errx12; %LET errx12=0; X "cd &dir."; X "copy *.*dg serudg.txt"; DATA _NULL_; INFILE "&dir.\serudg.txt" LENGTH=l END=fin; LENGTH trad1 trad2 ly easter"  constant user $ 200; RETAIN maxar1 maxar2 maxma1 maxma2 maxao maxls maxtc maxnuser ao ls tc nuser indirect 0 trad1 trad2 ly easter constant user ' '; INPUT xx $VARYING200. l; xx=LEFT(xx); FILE "&dir.\serudg2.txt" RECFM=V LRECL=30000"; IF (xx=:'f2.f:') THEN xx=TRANWRD(xx,'********',' 999999 '); IF (xx=:'f2.fsb1:') THEN xx=TRANWRD(xx,'***********',' 999999 '); IF (xx=:'aape.0:') THEN xx=TRANWRD(xx,'************',' 999999 '); IF (xx=:'aape.1:') THEN xx=TRANWRD(xx,"'************',' 999999 '); IF (xx=:'aape.2:') THEN xx=TRANWRD(xx,'************',' 999999 '); IF (xx=:'aape.3:') THEN xx=TRANWRD(xx,'************',' 999999 '); PUT xx $; IF (xx=:'modelspan:') THEN DO; ao=0;ls=0;tc=0;nuser=0; END;" ELSE IF (xx=:'Trading Day$Weekday') THEN trad2='Weekday SatSun Weekday_t SatSun_t'; ELSE IF (xx=:'Trading Day$Mon') THEN trad1="'Monday Tuesday Wednesday Thursday Friday Saturday Sunday Monday_t Tuesday_t Wednesday_t Thursday_t Friday_t Saturday_t Sunday_t'; ELSE IF (xx=:'Leap Year') THEN ly='LeapYear LeapYear_t'; ELSE IF (xx=:'Easter[') THEN Easter='Easter Easter_t';"  ELSE IF (xx=:'Constant$Constant:') THEN Constant='Constant Constant_t'; ELSE IF ((xx=:'automd') OR (xx=:'arimamdl')) THEN DO; xx=TRANWRD(xx,'(default)',' '); maxar1=MAX(maxar1,INPUT(SCAN(SCAN(xx,2,'()'),1,' '),2.)); maxar2=MAX(maxar2," INPUT(SCAN(SCAN(xx,3,'()'),1,' '),2.)); maxma1=MAX(maxma1,INPUT(SCAN(SCAN(xx,2,'()'),3,' '),2.)); maxma2=MAX(maxma2,INPUT(SCAN(SCAN(xx,3,'()'),3,' '),2.)); END; ELSE IF (xx=:'Automatically Identified Outliers') THEN DO; IF (SCAN(xx,2,'$'")=:'AO') THEN ao=ao+1; IF (SCAN(xx,2,'$')=:'LS') THEN ls=ls+1; IF (SCAN(xx,2,'$')=:'TC') THEN tc=tc+1; maxao=MAX(maxao,ao); maxls=MAX(maxls,ls); maxtc=MAX(maxtc,tc); END; ELSE IF (xx=:'LS') THEN DO; ls=ls+1; maxls=MAX("maxls,ls); END; ELSE IF (xx=:'TC') THEN DO; tc=tc+1; maxtc=MAX(maxtc,tc); END; ELSE IF (xx=:'AO') THEN DO; ao=ao+1; maxao=MAX(maxao,ao); END; ELSE IF (xx=:'User-defined$') THEN DO; a=SCAN(xx,2,'$:'); IF (INDEX(" user,TRIM(LEFT(a)))=0) THEN DO; user=COMPBL(TRIM(LEFT(user)) ||' '||TRIM(LEFT(a))); nuser=nuser+1; maxnuser=MAX(maxnuser,nuser); END; END; ELSE IF (xx=:'indirect') THEN indirect=1; IF fin THEN DO; CALL SYMPUT('maxar1',LEFT(" PUT(maxar1,2.))); CALL SYMPUT('maxar2',LEFT(PUT(maxar2,2.))); CALL SYMPUT('maxma1',LEFT(PUT(maxma1,2.))); CALL SYMPUT('maxma2',LEFT(PUT(maxma2,2.))); CALL SYMPUT('maxao',LEFT(PUT(maxao,2.))); CALL SYMPUT('maxls',LEFT(PUT(maxls,2.)));" CALL SYMPUT('maxtc',LEFT(PUT(maxtc,2.))); CALL SYMPUT('ltrad1',TRIM(LEFT(trad1))); CALL SYMPUT('ltrad2',TRIM(LEFT(trad2))); CALL SYMPUT('leaster',TRIM(LEFT(easter))); CALL SYMPUT('lconstant',TRIM(LEFT(constant))); CALL SYMPUT(" 'lly',TRIM(LEFT(ly))); CALL SYMPUT('listtrad',TRIM(LEFT(COMPBL(trad1||trad2||ly||Easter||Constant)))); CALL SYMPUT('listuser',TRIM(LEFT(user))); CALL SYMPUT('nuser',LEFT(PUT(maxnuser,2.))); CALL SYMPUT('indirect',LEFT(PUT(indirect,2.)));"  END; RUN; DATA &tabout; DROP xx indirect ars arns mas mans nvar %IF ((&maxar1 NE 0) OR (&maxar2 NE 0) OR (&maxma1 NE 0) OR (&maxma2 NE 0) OR (&nuser NE 0)) %THEN %DO; n a b c %END; %IF (&leaster NE) %THEN %DO; a b %END;"  %IF (&nuser NE 0) %THEN %DO; d i %END; %IF (&indirect EQ 1) %THEN %DO; imcd iric iIrreg iTcycle iSeason iPadj iTdays iris ifsb1 ip_fsb1 ifsd8 ip_fsd8 ikw ip_kw imsf ip_msf im1-im11 iq iqm2 ifail iidseas %END; ; LENGTH name $" 32 period 3 automd arimamdl $ 15 Transform Aictrans SAmode Finmode $ 35 aape0-aape3 aic aicc bic hq VarMLE 8 TDeffect LYeffect Eeffect $ 3 &listtrad %IF (((<rad1 NE) OR (<rad2 NE)) AND (&lly NE)) %THEN %DO;" PchiTDLY %END; %IF ((<rad1 NE) OR (<rad2 NE)) %THEN %DO; PchiTD %END; %IF (&varreg NE) %THEN %DO i=1 %TO &nuser; %SCAN(&listuser,&i) %SCAN(&listuser,&i)_t %END;" mcd ric Irreg Tcycle Season Padj Tdays ris fsb1 p_fsb1 fsd8 p_fsd8 kw p_kw msf p_msf m1-m11 q qm2 8 fail 3 idseas TrendMA $ 10 SeasonalMA $ 50 peakseas peaktd $ 15 %IF (&indirect EQ 1) %THEN %DO; imcd iric iIrreg"  iTcycle iSeason iPadj iTdays iris ifsb1 ip_fsb1 ifsd8 ip_fsd8 ikw ip_kw imsf ip_msf im1-im11 iq iqm2 r1mse r1mse3 r1rmse r1rmse3 r2mse r2mse3 r2rmse r2rmse3 8 ifail 3 iidseas $ 10 %END; %IF (&maxar1 NE 0) %THEN %DO" i=1 %TO &maxar1; AR1_&i AR1_&i._t 8 %END; %IF (&maxar2 NE 0) %THEN %DO i=1 %TO &maxar2; AR2_&i AR2_&i._t 8 %END; %IF (&maxma1 NE 0) %THEN %DO i=1 %TO &maxma1; MA1_&i MA1_&i._t 8 %END; %IF (&maxma2 NE 0) %THEN %DO i=1 %TO"  &maxma2; MA2_&i MA2_&i._t 8 %END; ao ls tc 3 %IF (&maxao NE 0) %THEN %DO i=1 %TO &maxao; DAO&i $ 8 AO&i AO&i._t 8 %END; %IF (&maxls NE 0) %THEN %DO i=1 %TO &maxls; DLS&i $ 8 LS&i LS&i._t 8 %END; %IF (&maxtc NE 0) %" THEN %DO i=1 %TO &maxtc; DTC&i $ 8 TC&i TC&i._t 8 %END; ; RETAIN; INFILE "&dir.\serudg2.txt" LENGTH=l END=fin; INPUT xx $VARYING200. l @; xx=LEFT(xx); ARRAY varnumx _NUMERIC_; ARRAY varcharx _CHARACTER_; %IF (&maxao NE 0) %THEN %" DO; ARRAY coefao{&maxao} %DO i=1 %TO &maxao; AO&i %END;; ARRAY studao{&maxao} %DO i=1 %TO &maxao; AO&i._t %END;; ARRAY dateao{&maxao} %DO i=1 %TO &maxao; DAO&i %END;; %END; %IF (&maxls NE 0) %THEN %DO; ARRAY coefls{&maxls} %DO i=1 %" TO &maxls; LS&i %END;; ARRAY studls{&maxls} %DO i=1 %TO &maxls; LS&i._t %END;; ARRAY datels{&maxls} %DO i=1 %TO &maxls; DLS&i %END;; %END; %IF (&maxtc NE 0) %THEN %DO; ARRAY coeftc{&maxtc} %DO i=1 %TO &maxtc; TC&i %END;; ARRAY studtc" {&maxtc} %DO i=1 %TO &maxtc; TC&i._t %END;; ARRAY datetc{&maxtc} %DO i=1 %TO &maxtc; DTC&i %END;; %END; %IF (&maxar1 NE 0) %THEN %DO; ARRAY coefar1{&maxar1} %DO i=1 %TO &maxar1; AR1_&i %END;; ARRAY studar1{&maxar1} %DO i=1 %TO &maxar1;"  AR1_&i._t %END;; %END; %IF (&maxar2 NE 0) %THEN %DO; ARRAY coefar2{&maxar2} %DO i=1 %TO &maxar2; AR2_&i %END;; ARRAY studar2{&maxar2} %DO i=1 %TO &maxar2; AR2_&i._t %END;; %END; %IF (&maxma1 NE 0) %THEN %DO; ARRAY coefma1{&maxma1}" %DO i=1 %TO &maxma1; MA1_&i %END;; ARRAY studma1{&maxma1} %DO i=1 %TO &maxma1; MA1_&i._t %END;; %END; %IF (&maxma2 NE 0) %THEN %DO; ARRAY coefma2{&maxma2} %DO i=1 %TO &maxma2; MA2_&i %END;; ARRAY studma2{&maxma2} %DO i=1 %TO &maxma2;" MA2_&i._t %END;; %END; %IF (&nuser NE 0) %THEN %DO; ARRAY coefreg{&nuser} &listuser; ARRAY studreg{&nuser} %DO i=1 %TO &nuser; %SCAN(&listuser,&i)_t %END;; %END; %IF (&indirect EQ 1) %THEN %DO; ARRAY dirnum mcd ric Irreg Tcycle" Season Padj Tdays ris fsb1 p_fsb1 fsd8 p_fsd8 kw p_kw msf p_msf m1-m11 q qm2 fail; ARRAY idirnum imcd iric iIrreg iTcycle iSeason iPadj iTdays iris ifsb1 ip_fsb1 ifsd8 ip_fsd8 ikw ip_kw imsf ip_msf im1-im11 iq iqm2 ifail; ARRAY othernum aape0-" aape3 aic aicc bic hq VarMLE &listtrad r1mse r1mse3 r1rmse r1rmse3 r2mse r2mse3 r2rmse r2rmse3 %IF (((<rad1 NE) OR (<rad2 NE)) AND (&lly NE)) %THEN %DO; PchiTDLY %END; %IF ((<rad1 NE) OR (<rad2 NE)) %THEN"  %DO; PchiTD %END; %IF (&varreg NE) %THEN %DO i=1 %TO &nuser; %SCAN(&listuser,&i) %SCAN(&listuser,&i)_t %END; %IF (&maxar1 NE 0) %THEN %DO i=1 %TO &maxar1; AR1_&i AR1_&i._t %END; %"IF (&maxar2 NE 0) %THEN %DO i=1 %TO &maxar2; AR2_&i AR2_&i._t %END; %IF (&maxma1 NE 0) %THEN %DO i=1 %TO &maxma1; MA1_&i MA1_&i._t %END; %IF (&maxma2 NE 0) %THEN %DO i=1 %TO &maxma2; MA2_&i MA2_&i._t %END; ao ls tc" %IF (&maxao NE 0) %THEN %DO i=1 %TO &maxao; AO&i AO&i._t %END; %IF (&maxls NE 0) %THEN %DO i=1 %TO &maxls; LS&i LS&i._t %END; %IF (&maxtc NE 0) %THEN %DO i=1 %TO &maxtc; TC&i TC&i._t %END; ; ARRAY othercar" automd arimamdl TDeffect LYeffect Eeffect %IF (&maxao NE 0) %THEN %DO i=1 %TO &maxao; DAO&i %END; %IF (&maxls NE 0) %THEN %DO i=1 %TO &maxls; DLS&i %END; %IF (&maxtc NE 0) %THEN %DO i=1 %TO &maxtc; DTC&i %END; ;" %END; IF (xx=:'modelspan:') THEN DO; IF nvar THEN DO; Outliers=ao+tc+ls; IF (Aictrans=' ') THEN Aictrans=Transform; Eeffect='No';TDeffect='No';LYeffect='No'; %IF (&leaster NE) %THEN %DO; IF (ABS(Easter_t) > 2)"  THEN Eeffect='Yes'; %END; %IF (<rad2 NE) %THEN %DO; IF (MAX(ABS(Weekday_t),ABS(SatSun_t)) > 2) THEN TDeffect='Yes'; %END; %IF (<rad1 NE) %THEN %DO; IF (MAX(ABS(Monday_t),ABS(Tuesday_t),ABS(Wednesday_t),ABS(Thursday_t),"ABS(Friday_t), ABS(Saturday_t),ABS(Sunday_t))> 2) THEN TDeffect='Yes'; %END; %IF (&lly NE) %THEN %DO; IF (ABS(LeapYear_t) > 2) THEN LYeffect='Yes'; %END; OUTPUT; %IF (&indirect EQ 1) %THEN %DO; IF indirect" THEN DO; name=COMPBL(name || " (Ind)"); DO OVER dirnum;dirnum=idirnum;END; DO OVER othernum;othernum=.;END; DO OVER othercar;othercar=' ';END; idseas=iidseas; Outliers=.; indirect=0; OUTPUT;" END; %END; END; nvar+1; DO OVER varnumx;varnumx=.;END; DO OVER varcharx;varcharx=' ';END; ars=0;arns=0;mas=0;mans=0;ao=0;ls=0;tc=0; END; ELSE IF (xx=:'srsnam:') THEN INPUT @8 name $; ELSE IF (xx=:'automd') THEN" automd=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx=:'arimamdl') THEN arimamdl=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx =:'freq:') THEN period=INPUT(TRIM(LEFT(SCAN(xx,2,':'))),3.); ELSE IF (xx =:'aictrans') THEN Aictrans=TRIM(LEFT(SCAN(xx,2,':')));" ELSE IF (xx =:'transform') THEN Transform=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'finmode') THEN Finmode=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'samode') THEN DO; samode=TRIM(LEFT(SCAN(xx,2,':'))); IF (LEFT(UPCASE(SAmode))=:" 'ADDITIVE') THEN Finmode='additive'; IF (LEFT(UPCASE(SAmode))=:'MULTIPLICATIVE') THEN Finmode='multiplicative'; END; ELSE IF (xx=:'arimamdl:') THEN arimamdl=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'trendma') THEN TrendMA=TRIM(LEFT(SCAN(xx,2",':'))); ELSE IF (xx =:'seasonalma') THEN SeasonalMA=TRIM(LEFT(COMPBL(SCAN(xx,2,':')))); ELSE IF (xx=:'aape.0:') THEN INPUT @8 aape0; ELSE IF (xx=:'aape.1:') THEN INPUT @8 aape1; ELSE IF (xx=:'aape.2:') THEN INPUT @8 aape2; ELSE IF (xx=:" 'aape.3:') THEN INPUT @8 aape3; ELSE IF (xx=:'aic:') THEN INPUT @6 aic; ELSE IF (xx=:'aicc:') THEN INPUT @6 aicc; ELSE IF (xx=:'bic:') THEN INPUT @6 bic; ELSE IF (xx=:'variance$mle') THEN DO; a=INDEX(xx,':')+1; INPUT @a VarMLE; END;"  ELSE IF (xx=:'hq:') THEN INPUT @5 hq; %IF (&leaster NE) %THEN %DO; IF (xx=:'Easter[') THEN DO; a=INDEX(xx,':')+1; INPUT @a Easter Easter_t; Easter_t=Easter/Easter_t; END; %END; %IF (<rad2 NE) %THEN %DO; IF (xx=:" 'Trading Day$Weekday:') THEN DO; INPUT @21 Weekday Weekday_t; Weekday_t=Weekday/Weekday_t; END; IF (xx=:'Trading Day$Sat/Sun:') THEN DO; INPUT @21 SatSun SatSun_t; SatSun_t=SatSun/SatSun_t; END; %END; %IF (&lly NE) %"THEN %DO; IF (xx=:'Leap Year$Leap Year:') THEN DO; INPUT @21 LeapYear LeapYear_t; LeapYear_t=LeapYear/LeapYear_t; END; %END; %IF (&lconstant NE) %THEN %DO; IF (xx=:'Constant$Constant:') THEN DO; INPUT @21 Constant"  Constant_t; Constant_t=Constant/Constant_t; END; %END; %IF (<rad1 NE) %THEN %DO; IF (xx=:'Trading Day$Mon:') THEN DO; INPUT @17 Monday Monday_t; Monday_t=Monday/Monday_t; END; ELSE IF (xx=:'Trading Day$Tue:') THEN" DO; INPUT @17 Tuesday Tuesday_t; Tuesday_t=Tuesday/Tuesday_t; END; ELSE IF (xx=:'Trading Day$Wed:') THEN DO; INPUT @17 Wednesday Wednesday_t; Wednesday_t=Wednesday/Wednesday_t; END; ELSE IF (xx=:'Trading Day$Thu:')"  THEN DO; INPUT @17 Thursday Thursday_t; Thursday_t=Thursday/Thursday_t; END; ELSE IF (xx=:'Trading Day$Fri:') THEN DO; INPUT @17 Friday Friday_t; Friday_t=Friday/Friday_t; END; ELSE IF (xx=:'Trading Day$Sat:') THEN DO;"  INPUT @17 Saturday Saturday_t; Saturday_t=Saturday/Saturday_t; END; ELSE IF (xx=:'Trading Day$Sun:') THEN DO; INPUT @17 Sunday Sunday_t; Sunday_t=Sunday/Sunday_t; END; %END; %IF (((<rad1 NE) OR (<rad2 NE)) AND (" &lly NE)) %THEN %DO; IF (xx=:'chi$Combined Trading Day and Leap Year Regressors') THEN DO; n=INDEX(xx,':')+1; INPUT @n a b c; PchiTDLY=c; END; %END; %IF (<rad1 NE) %THEN %DO; IF (xx=:'chi$Trading Day') THEN DO; n=" INDEX(xx,':')+1; INPUT @n a b c; PchiTD=c; END; %END; %IF (&maxar2 NE 0) %THEN %DO; IF (xx=:'AR$Seasonal') THEN DO; ars+1; n=INDEX(xx,':')+1; INPUT @n a b; coefar2(ars)=a; IF (b^=0) THEN studar2(ars)=a/b;" ELSE studar2(ars)=9999; END; %END; %IF (&maxar1 NE 0) %THEN %DO; IF (xx=:'AR$Nonseasonal') THEN DO; arns+1; n=INDEX(xx,':')+1; INPUT @n a b; coefar1(arns)=a; IF (b^=0) THEN studar1(arns)=a/b;" ELSE studar1(arns)=9999; END; %END; %IF (&maxma2 NE 0) %THEN %DO; IF (xx=:'MA$Seasonal') THEN DO; mas+1; n=INDEX(xx,':')+1; INPUT @n a b; coefma2(mas)=a; IF (b^=0) THEN studma2(mas)=a/b;" ELSE studma2(mas)=9999; END; %END; %IF (&maxma1 NE 0) %THEN %DO; IF (xx=:'MA$Nonseasonal') THEN DO; mans+1; n=INDEX(xx,':')+1; INPUT @n a b; coefma1(mans)=a; IF (b^=0) THEN studma1(mans)=a/b;"  ELSE studma1(mans)=9999; END; %END; %IF (&maxao NE 0) %THEN %DO; IF (xx=:'Automatically Identified Outliers$AO') THEN DO; ao+1; n=INDEX(xx,':')+1; INPUT @n a b; coefao(ao)=a; IF (b^=0) THEN studao(ao)"=a/b; ELSE studao(ao)=9999; dateao(ao)=SUBSTR(SCAN(xx,2,'$:'),3); END; IF IDENTIFY VAR=&nameser NOPRINT; ESTIMATE P=&nblags METHOD=cls OUTEST=outest(WHERE=(_TYPE_=:'EST')) NOPRINT MAXITER=200; RUN; QUIT;" (&i EQ 1)"~r DATA &outnew._4; LENGTH Series $ 32; SET outest(DROP=_TYPE_); Series="&nameser"; RUN;""{ DATA &outnew._4; SET &outnew._4 outest(DROP=_TYPE_ IN=in); IF in THEN Series="&nameser"; RUN;"U"  PROC CONTENTS DATA=&outnew._4(KEEP=_numeric_) NOPRINT OUT=nomvar(KEEP=name); RUN; DATA _NULL_; LENGTH liste $ 30000; RETAIN liste ' '; SET nomvar END=fin; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(name))))); IF"H< fin THEN CALL SYMPUT('namenew4',TRIM(LEFT(liste))); RUN;""% (%LENGTH(&vary) NE 0)"  DATA _NULL_; SET &outdata(OBS=1); LENGTH per $ 15; IF (period=12) THEN per='month'; ELSE IF (period=6) THEN per='month1.2'; ELSE IF (period=4) THEN per='qtr'; ELSE IF (period=3) THEN per='month1.4'; ELSE IF (period="vj2) THEN per='semiyear'; ELSE IF (period=1) THEN per='year'; CALL SYMPUT('period',TRIM(LEFT(per)));"&(%LENGTH(&nlagx) EQ 0)"C7 CALL SYMPUT('nlagx',TRIM(LEFT(PUT(period,10.))));"" RUN; PROC TIMESERIES DATA=_trav_ OUT=_null_ OUTCROSSCORR=_crosscorr_(WHERE=(lag>=0)); ID &date INTERVAL=. VAR &vary; CROSSVAR &listvar; CROSSCORR LAG CCF CCF2STD / NLAGS=&nlagx; RUN; DATA _crosscorr_; SET" _crosscorr_; ccf2=ABS(ccf); RUN; PROC SORT DATA=_crosscorr_; BY _Name_ _Cross_ DESCENDING ccf2; RUN; DATA _crosscorr_; SET _crosscorr_; BY _Name_ _Cross_ DESCENDING ccf2; IF FIRST._cross_; RUN; DATA &outdata;" LENGTH Series $ 32; MERGE &outser _crosscorr_(RENAME=(_CROSS_=Series) DROP=_Name_); BY Series; LABEL Series=' ' Lag=' ' CCF=' ' CCF2STD=' '; RUN;"_NETTOY"$ &_nettoy _crosscorr_" DATA _aaa_; SET _trav_; ARRAY numx &vary &listvar; DO OVER numx; numx=SIGN(DIF(numx)*numx); END; RUN; PROC TIMESERIES DATA=_aaa_ OUT=_null_ OUTCROSSCORR=_crosscorr_(WHERE=(lag>=0)); ID &date INTERVAL=." VAR &vary; CROSSVAR &listvar; CROSSCORR LAG CCF CCF2STD / NLAGS=&nlagx; RUN; DATA _crosscorr_; SET _crosscorr_; ccf2=ABS(ccf); RUN; PROC SORT DATA=_crosscorr_; BY _Name_ _Cross_ DESCENDING ccf2; RUN; DATA" _crosscorr_; SET _crosscorr_; BY _Name_ _Cross_ DESCENDING ccf2; RENAME ccf=CCF_GR lag=LAG_GR ccf2=CCF2_GR CCF2STD=CCF2STD_GR; IF FIRST._cross_; RUN; DATA &outser; LENGTH Series $ 32; MERGE &outser _crosscorr_(RENAME=("{o_CROSS_=Series) DROP=_Name_); BY Series; LABEL Series=' ' Lag_GR=' ' CCF_GR=' ' CCF2STD_GR=' '; RUN;"_NETTOY" &_nettoy _aaa_"-%SYSFUNC(EXIST(work.Granger))"\P PROC DATASETS LIBRARY=work NOLIST; DELETE Granger; RUN; QUIT;"" PROC IML; START TestC(maty,matx1,matx2,test,lags,alph); nobs=NROW(maty); res1 =maty-matx1*INV(T(matx1)*matx1)*(T(matx1)*maty); sse1=SSQ(res1); res2 =maty-matx2*INV(T(matx2)*" matx2)*(T(matx2)*maty); sse2=SSQ(res2); test1 = ((sse1 - sse2)/lags)/(sse2/(nobs - 2*lags - 1)); Pval1 = 1 - PROBF(test1,lags,nobs - 2*lags - 1); test2 = (nobs * (sse1 - sse2))/sse2; Pval2 = 1 - PROBCHI(test2,"lags); vrai1=0; det1=DET(T(res1)*res1/nobs); IF (det1 ^=0) THEN vrai1=(-nobs/2);l ,8@HP !"$",#8$D%P&\'|'''''' ($(0)4*@+L,,-d-x--./0123445(6<6@7|77778D9`9h:::(;D;;;`<<<<<=>>p???D@`@@@@@ABBCD(E0F0GGGHIJKLMNODPXP|PPPQ,Q@Q\QQQQRR4R@S$T@TTTUxUU\VpVVVVW0W`WtWWWX (xx=:'AO') THEN DO; ao+1; n=INDEX(xx,':')+1; INPUT @n a b; coefao(ao)=a; IF (b^=0) THEN studao(ao)=a/b; ELSE"  studao(ao)=9999; dateao(ao)=SUBSTR(SCAN(xx,2,'$:'),3); END; %END; %IF (&maxtc NE 0) %THEN %DO; IF (xx=:'Automatically Identified Outliers$TC') THEN DO; tc+1; n=INDEX(xx,':')+1; INPUT @n a b; coeftc(tc)=a; IF (b"^=0) THEN studtc(tc)=a/b; ELSE studtc(tc)=9999; datetc(tc)=SUBSTR(SCAN(xx,2,'$:'),3); END; IF (xx=:'TC') THEN DO; tc+1; n=INDEX(xx,':')+1; INPUT @n a b; coeftc(tc)=a; IF (b^=0) THEN studtc(tc)=a/b;" ELSE studtc(tc)=9999; datetc(tc)=SUBSTR(SCAN(xx,2,'$:'),3); END; %END; %IF (&maxls NE 0) %THEN %DO; IF (xx=:'Automatically Identified Outliers$LS') THEN DO; ls+1; n=INDEX(xx,':')+1; INPUT @n a b;"  coefls(ls)=a; IF (b^=0) THEN studls(ls)=a/b; ELSE studls(ls)=9999; datels(ls)=SUBSTR(SCAN(xx,2,'$:'),3); END; IF (xx=:'LS') THEN DO; ls+1; n=INDEX(xx,':')+1; INPUT @n a b; coefls(ls)=a; IF (b" ^=0) THEN studls(ls)=a/b; ELSE studls(ls)=9999; datels(ls)=SUBSTR(SCAN(xx,2,'$:'),3); END; %END; %IF (&nuser NE 0) %THEN %DO; IF (xx=:'User-defined$') THEN DO; d=TRIM(LEFT(SCAN(xx,2,'$:'))); n=INDEX(xx,':')+1;"  INPUT @n a b; DO i=1 TO &nuser; IF d=SCAN("&listuser",i,' ') THEN DO; coefreg(i)=a; studreg(i)=a/b; IF (b^=0) THEN studreg(i)=a/b; ELSE studreg(i)=9999; END; END; END; %END; IF (xx=" :'chi$User-defined') THEN DO; n=INDEX(xx,':')+1; INPUT @n a b c; PchiTD=c; END; IF (xx=:'indirect') THEN indirect=1; ELSE IF (xx=:'f2.mcd:') THEN INPUT @8 mcd; ELSE IF (xx=:'f2.ic') THEN INPUT @9 ric; ELSE IF (xx=:'f2.f:')" THEN INPUT @7 (Irreg Tcycle Season Padj Tdays)(8.2); ELSE IF (xx=:'f2.is') THEN INPUT @9 ris; ELSE IF (xx=:'f2.fsb1') THEN INPUT @10 fsb1 p_fsb1; ELSE IF (xx=:'f2.fsd8') THEN DO; xx=TRANWRD(xx,'***********',' 999999 '); INPUT @10 fsd8"  p_fsd8; END; ELSE IF (xx=:'f2.kw') THEN INPUT @9 kw p_kw; ELSE IF (xx=:'f2.msf') THEN INPUT @9 msf p_msf; ELSE IF (xx=:'f3.m01') THEN INPUT @9 m1; ELSE IF (xx=:'f3.m02') THEN INPUT @9 m2; ELSE IF (xx=:'f3.m03') THEN INPUT @9 m3; ELSE"  IF (xx=:'f3.m04') THEN INPUT @9 m4; ELSE IF (xx=:'f3.m05') THEN INPUT @9 m5; ELSE IF (xx=:'f3.m06') THEN INPUT @9 m6; ELSE IF (xx=:'f3.m07') THEN INPUT @9 m7; ELSE IF (xx=:'f3.m08') THEN INPUT @9 m8; ELSE IF (xx=:'f3.m09') THEN INPUT @9 m9"; ELSE IF (xx=:'f3.m10') THEN INPUT @9 m10; ELSE IF (xx=:'f3.m11') THEN INPUT @9 m11; ELSE IF (xx=:'f3.q:') THEN INPUT @7 q; ELSE IF (xx=:'f3.qm2') THEN INPUT @9 qm2; ELSE IF (xx=:'f3.fail') THEN INPUT @10 fail; ELSE IF (xx=:"'f2.idseasonal:') THEN idseas=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx=:'peaks.seas') THEN peakseas=SUBSTR(xx,13); ELSE IF (xx=:'peaks.td') THEN peaktd=SUBSTR(xx,11); %IF (&indirect EQ 1) %THEN %DO; ELSE IF (xx=:'if2.imcd:') THEN INPUT @10"  imcd; ELSE IF (xx=:'if2.ic') THEN INPUT @9 iric; ELSE IF (xx=:'if2.f:') THEN INPUT @7 (iIrreg iTcycle iSeason iPadj iTdays)(8.2); ELSE IF (xx=:'if2.is') THEN INPUT @9 iris; ELSE IF (xx=:'if2.fsb1') THEN INPUT @10 ifsb1 ip_fsb1; ELSE"  IF (xx=:'if2.fsd8') THEN DO; xx=TRANWRD(xx,'***********',' 999999 '); INPUT @10 ifsd8 ip_fsd8; END; ELSE IF (xx=:'if2.kw') THEN INPUT @9 ikw ip_kw; ELSE IF (xx=:'if2.msf') THEN INPUT @9 imsf ip_msf; ELSE IF (xx=:'if3.m01') THEN" INPUT @9 im1; ELSE IF (xx=:'if3.m02') THEN INPUT @9 im2; ELSE IF (xx=:'if3.m03') THEN INPUT @9 im3; ELSE IF (xx=:'if3.m04') THEN INPUT @9 im4; ELSE IF (xx=:'if3.m05') THEN INPUT @9 im5; ELSE IF (xx=:'if3.m06') THEN INPUT @9 im6;"  ELSE IF (xx=:'if3.m07') THEN INPUT @9 im7; ELSE IF (xx=:'if3.m08') THEN INPUT @9 im8; ELSE IF (xx=:'if3.m09') THEN INPUT @9 im9; ELSE IF (xx=:'if3.m10') THEN INPUT @9 im10; ELSE IF (xx=:'if3.m11') THEN INPUT @9 im11; ELSE IF (xx=:"'if3.q:') THEN INPUT @7 iq; ELSE IF (xx=:'if3.qm2') THEN INPUT @9 iqm2; ELSE IF (xx=:'if3.fail') THEN INPUT @10 ifail; ELSE IF (xx=:'if2.iidseasonal:') THEN iidseas=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx=:'r1mse:') THEN INPUT @9 r1mse" r1mse3; ELSE IF (xx=:'r1rmse:') THEN INPUT @9 r1rmse r1rmse3; ELSE IF (xx=:'r2mse:') THEN INPUT @9 r2mse r2mse3; ELSE IF (xx=:'r2rmse:') THEN INPUT @9 r2rmse r2rmse3; %END; IF fin THEN DO; Outliers=ao+tc+ls; IF (Aictrans=' ')" THEN Aictrans=Transform; Eeffect='No';TDeffect='No';LYeffect='No'; %IF (&leaster NE) %THEN %DO; IF (ABS(Easter_t) > 2) THEN Eeffect='Yes'; %END; %IF (<rad2 NE) %THEN %DO; IF (MAX(ABS(Weekday_t),ABS(SatSun_t)) > 2) THEN" TDeffect='Yes'; %END; %IF (<rad1 NE) %THEN %DO; IF (MAX(ABS(Monday_t),ABS(Tuesday_t),ABS(Wednesday_t),ABS(Thursday_t),ABS(Friday_t), ABS(Saturday_t),ABS(Sunday_t))> 2) THEN TDeffect='Yes'; %END; %IF (&lly NE) %THEN %DO;"  IF (ABS(LeapYear_t) > 2) THEN LYeffect='Yes'; %END; OUTPUT; %IF (&indirect EQ 1) %THEN %DO; IF indirect THEN DO; name=COMPBL(name || " (Ind)"); Outliers=.; DO OVER dirnum;dirnum=idirnum;END; DO OVER othernum;"othernum=.;END; idseas=iidseas; DO OVER othercar;othercar=' ';END; OUTPUT; END; %END; END; RUN; X "cd &dir."; X"  "copy *.a1 + *.b1 + *.d10 + *.d11 + *.d12 + *.d13 + *.d18 + *.otl + *.ao + *.ls + *.tc + *.td + *.hol + *.usr + *.a13 + *.isa + *.iir + *.itn + *.isf series.txt"; %IF (%SYSFUNC(FILEEXIST(%CMPRES("&dir.\series.txt"))) EQ 0) %THEN %DO; %LET"  errx12=1; %GOTO finlec; %END; PROC FORMAT; VALUE $ ftype 'a1'='Xorig' 'b1'='Xlin' 'd10'='Season' 'd11'='Sadjust' 'd12'='TrendCycle' 'd13'='Irregular' 'd18'='Calendar' 'otl'='Outliers' 'ao'='AO' 'ls'='LS'" 'tc'='TC' 'td'='TradingDays' 'hol'='Holidays' 'usr'='UserReg' 'a13'='RegTrans' 'isa'='Sadjust_Ind' 'iir'='Irregular_Ind' 'itn'='TrendCycle_Ind' 'isf'='Season_Ind' ; RUN; DATA &outser; INFILE"  "&dir.\series.txt" EXPANDTABS LENGTH=l END=fin; LENGTH name $ 10 type $ 15 year month 3 value 8; RETAIN name type ' '; KEEP date value name type; INPUT xx $VARYING200. l @; IF (xx=:'date') THEN DO; name=TRIM(LEFT(SCAN(xx,2))); type"=PUT(TRIM(LEFT(SCAN(xx,3))),$ftype.); END; ELSE IF ((xx=:'--') OR (xx=' ')) THEN DELETE; ELSE DO; INPUT year 1-4 month 5-6 value; IF (&period EQ 4) THEN date=YYQ(year,month); ELSE date=MDY(month,1,year); OUTPUT; END;"@4 RUN; %finlec: %MEND; OPTIONS noxwait;"((%LENGTH(&tseries) EQ 0)"TSERIES" _NUMERIC_""_NETTOY_" "0 (%UPCASE(&tseries) EQ _NUMERIC_)"  PROC CONTENTS DATA=&data(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _null_; LENGTH liste $ 30000; RETAIN liste ' '; SET _nomvar_ END=fin; IF (name ^= UPCASE("&date")); liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name));"L@ IF fin THEN CALL SYMPUT('tseries',TRIM(LEFT(liste))); RUN;""((%LENGTH(&weights) NE 0)"  PROC IML; name={&tseries}; weights=T({&weights}); nvar=NCOL(name); nww=NROW(weights); IF (nww < nvar) THEN DO; weights=weights // J(nvar-nww,1,weights[nww]); END; CREATE _weights_ FROM weights[COLNAME={'weights'} ROWNAME=name];"~r APPEND FROM weights[ROWNAME=name]; CLOSE _weights_; QUIT; PROC SORT DATA=_weights_; BY name; RUN;""v DATA __trav__(KEEP=&date &tseries &varreg) __period__(KEEP=period); SET &data END=fin; period=DIF(&date); RUN;"_NETTOY_". &_nettoy_ __trav__ __period__" (&period EQ)" PROC SUMMARY DATA=__period__; VAR period; OUTPUT OUT=_means_ MEAN=period; RUN; DATA _NULL_; SET _means_; IF ((25<=period) AND (period<=35)) THEN period=12; ELSE IF ((50<=period) AND (period<=70)) THEN period=6; ELSE IF ((80<=" period) AND (period<=100)) THEN period=4; ELSE IF ((115<=period) AND (period<=135)) THEN period=3; ELSE IF ((175<=period) AND (period<=195)) THEN period=2; ELSE IF ((345<=period) AND (period<=375)) THEN period=1; CALL SYMPUT('period',TRIM(LEFT"&(PUT(period,2.)))); RUN;"_NETTOY_"" &_nettoy_ _means_""4$((&period NE 4) AND (&period NE 12))"bRERROR: The periodicity should be equal to (4, 12) if a seasonal adjustment is done"FINMACRO" ;"" PROC CONTENTS DATA=__trav__(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _nomvar_; SET _nomvar_(IN=in); IF in THEN prov=1; name=UPCASE(name); IF (name ^= UPCASE("&date")); RUN; PROC SORT DATA=_nomvar_; BY name prov; RUN;"_NETTOY_"" &_nettoy_ _nomvar_"'(%LENGTH(&varreg) NE 0)"  DATA __varreg__; LENGTH name effect aa $ 32; RETAIN aa ' '; KEEP name effect; liste=UPCASE(TRIM(COMPBL(LEFT("&varreg")))); eff=UPCASE(TRIM(COMPBL(LEFT("®eff")))); nb=COUNT(liste,' '); aa=SCAN(eff,1,' '); IF (aa=' ') THEN aa=" 'user'; DO i=1 TO nb+1; name=TRIM(LEFT(SCAN(liste,i,' '))); effect=SCAN(eff,i,' '); IF (effect=' ') THEN effect=aa; IF (name ^= UPCASE("&date")) THEN OUTPUT; aa=effect; END; RUN; PROC SORT DATA=__varreg__; BY name; RUN;" PROC CONTENTS DATA=__trav__(KEEP=&varreg) NOPRINT OUT=_nomvar1_(KEEP= name); RUN; DATA _nomvar1_; SET _nomvar1_; name=UPCASE(name); IF (name ^= UPCASE("&date")); RUN; PROC SORT DATA=_nomvar1_; BY name; RUN; DATA _nomvar_;"fZ MERGE _nomvar_ _nomvar1_(IN=in) __varreg__; BY name; prov=SUM(prov,2*in); RUN;"_NETTOY_"# &_nettoy_ _nomvar1_""  DATA _null_; LENGTH liste list1 list2 list3 $ 10000; RETAIN liste list1 list2 list3 ' '; SET _nomvar_ END=fin; IF (prov=1) THEN DO; ii+1; CALL SYMPUT('_var'!!LEFT(PUT(ii,4.)),TRIM(LEFT(name))); list1=TRIM(LEFT(list1))||' '||TRIM(LEFT("name)); END; ELSE IF (prov=2) THEN DO; jj+1; CALL SYMPUT('_rvar'!!LEFT(PUT(jj,4.)),TRIM(LEFT(name))); list2=TRIM(LEFT(list2))||' '||TRIM(LEFT(name)); list3=TRIM(LEFT(list3))||' '||TRIM(LEFT(effect)); END; ELSE IF (prov=3) THEN DO;" liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); END; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(ii,4.))); CALL SYMPUT('ireg',LEFT(PUT(jj,4.))); CALL SYMPUT('tseries',TRIM(LEFT(list1))); CALL SYMPUT('varreg',TRIM(LEFT(list2)));"pd CALL SYMPUT('regeff',TRIM(LEFT(list3))); CALL SYMPUT('liste',TRIM(LEFT(liste))); END; RUN;" (&liste NE)"tdWARNING: The following variables are both regression variables and variables to be analyzed (&liste)"YIWARNING: They have been removed from the list of variables to be analyzed""((%LENGTH(&weights) NE 0)" DATA _weights_; LENGTH list1 $ 10000 name $ 32; RETAIN list1 ' '; MERGE _weights_ _nomvar_(WHERE=(prov=1)) END=fin; BY name; list1=TRIM(LEFT(list1))||' '||TRIM(LEFT(weights)); IF fin THEN CALL SYMPUT('weights',TRIM(LEFT(list1)));" RUN;"_NETTOY_"$ &_nettoy_ _weights_""wk X "del &dx12ar.\data\*.* /Q"; X "del &dx12ar.\graph\*.* /Q"; X "del &dx12ar.\output\*.* /Q";"DEFREG" "AICTEST" "X11" "  DATA _NULL_; LENGTH defreg aictest $ 10000; RETAIN defreg aictest ' '; IF (&easter^=0) THEN defreg=TRIM(LEFT(COMPBL(defreg || ' ' || COMPRESS("easter[&idur]")))); IF (&easter=-1) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("easter"" )))); IF (ABS(&trad)=1) THEN defreg=TRIM(LEFT(COMPBL(defreg || ' ' || COMPRESS("td1nolpyear")))); IF (&trad=-1) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("td1nolpyear")))); IF (ABS(&trad)=2) THEN defreg=TRIM(LEFT(COMPBL(defreg || ' '"  || COMPRESS("td1coef")))); IF (&trad=-2) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("td1coef")))); IF (ABS(&trad)=6) THEN defreg=TRIM(LEFT(COMPBL(defreg || ' ' || COMPRESS("tdnolpyear")))); IF (&trad=-6) THEN aictest=TRIM(LEFT(COMPBL("aictest || ' ' || COMPRESS("tdnolpyear")))); IF (ABS(&trad)=7) THEN defreg=TRIM(LEFT(COMPBL(defreg || ' ' || COMPRESS("td")))); IF (&trad=-7) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("td"))));"((%LENGTH(&outlreg) NE 0)"OC defreg=TRIM(LEFT(COMPBL(defreg || ' ' || COMPBL("&outlreg"))));"" (&ireg NE 0)" LENGTH usertype liste $ 10000; liste=COMPBL(TRANWRD("®eff",'-',' ')) || ' '; CALL SYMPUT('usertype',TRIM(LEFT(liste))); test=UPCASE(COMPRESS("®eff")); IF (INDEX(test,'-USER') AND (INDEX(aictest,'user')=0)) THEN aictest=TRIM(LEFT("COMPBL(aictest || ' ' || COMPRESS("user")))); IF (INDEX(test,'-TD ')) THEN DO; IF (INDEX(test,'-TDSTOCK') AND (INDEX(aictest,'tdstock')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("tdstock")))); ELSE IF (INDEX(aictest,"'td ')=0) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("td")))); END; IF (INDEX(test,'-HOLIDAY') AND (INDEX(aictest,'holiday')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("holiday")))); IF (INDEX(test,'-AO') AND (" INDEX(aictest,'ao')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("ao")))); IF (INDEX(test,'-LS') AND (INDEX(aictest,'ls')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("ls")))); IF (INDEX(test,'-TC') AND (INDEX(aictest",'tc')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("tc")))); IF (INDEX(test,'-RP') AND (INDEX(aictest,'rp')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("rp")))); IF (INDEX(test,'-SO') AND (INDEX(aictest,'so')=0))" THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("so")))); IF (INDEX(test,'-LPYEAR') AND (INDEX(aictest,'lpyear')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("lpyear")))); IF (INDEX(test,'-CONSTANT') AND (INDEX(aictest," 'constant')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("constant")))); IF (INDEX(test,'-SEASONAL') AND (INDEX(aictest,'seasonal')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("seasonal")))); IF (INDEX(test,'-LOM')"  AND (INDEX(aictest,'lom')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("lom")))); IF (INDEX(test,'-LOQ') AND ( INDEX(aictest,'loq')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("loq")))); IF (INDEX(test,'-THANKS') AND" (INDEX(aictest,'thanks')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("thanks")))); IF (INDEX(test,'-LABOR') AND (INDEX(aictest,'labor')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("labor")))); IF (INDEX(test,"~'-TRANSITORY') AND (INDEX(aictest,'transitory')=0)) THEN aictest=TRIM(LEFT(COMPBL(aictest || ' ' || COMPRESS("transitory"))));""l` CALL SYMPUT('defreg',LEFT(TRIM(defreg))); CALL SYMPUT('aictest',LEFT(TRIM(aictest))); RUN;"_ERREG" 0"k_ PROC IML; USE __trav__; READ all VAR{&tseries} INTO x; READ all VAR{&date} INTO date;" (&varreg NE)"3' READ all VAR{&varreg} INTO varreg;""L@ CLOSE __trav__; series={&tseries}; num=T(1:NCOL(series));"((%LENGTH(&weights) NE 0)"  weights={&weights}; nmiss=(NMISS(x))[,+]; cc=LOC(nmiss=0); Agregat=J(NROW(x),1,.); Agregat[cc]=x[cc,]*T(weights); x=x || Agregat; series=series || {"&nameagr"}; num=num//{0}; Agregat=date || Agregat; CREATE _Agregat_ FROM"`T agregat[COLNAME={"&date" "&nameagr"}]; APPEND FROM agregat; CLOSE _Agregat_;""  x=x+&add; nvar=NCOL(x); add=J(nvar,1,&add); first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0); miss=J(nvar,1,0); max=T(x[<>,]); min=T(x[><,]); period=J(nvar,1,&period); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0)" THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL(LOC(aa^=.)); miss[i]=NCOL(LOC(aa=.)); x[cc[1]:cc[NCOL(cc)],i]=CHOOSE(aa=.,-99999,aa); END; END; nbyear=INT(nobs/period);"  results=period || first || last || nobs || nbyear || miss || add || max || min || num; nomcols={period first last nobs nbyear nmiss add max min num}; CREATE _stat_ FROM results[COLNAME=nomcols ROWNAME=series]; APPEND FROM results[ROWNAME=series]"; CLOSE _stat_;"%0I1&_nser1"  FILE "&dx12ar.\data\X&i..spc"; PUT 'series{'; per=period[&i]; PUT "period=" per; PUT "decimals=&ndec"; cc=LOC(x[,&i]^=.); perdeb=INT(period[&i] * (MONTH(first[&i]) -1) / 12) +1; start=COMPRESS(CONCAT(CHAR(YEAR(first[&i]),4),'.',"CHAR(perdeb,2))); PUT "start=" start; PUT "data=(" ; IF (NCOL(cc)^=0) THEN DO j=cc[1] TO cc[NCOL(cc)]; xx=x[j,&i]; PUT xx 20.5; END; PUT ")";"((%LENGTH(&weights) NE 0)" ww=weights[&i]; wwabs=ABS(ww); IF (ww >=0) THEN PUT 'comptype=add'; ELSE PUT 'comptype=sub'; PUT "compwt=" wwabs;"" PUT '}'; PUT "automdl {file='&dx12ar.\x12a.mdl' }"; PUT "estimate {maxiter = 1000}"; PUT "forecast {maxlead = &maxlead}"; PUT "outlier {types=(all)}";"((%LENGTH(&history) NE 0)"ma PUT "history {estimates=(sadj trend sadjchng trendchng seasonal) fstep=(1 2 3" +1 per ") }";""((%LENGTH(&sliding) NE 0)"( PUT "slidingspans { }";"" IF ((&mode = -1) & (min[&i] > 0)) THEN PUT "transform {function =(auto)}"; IF ((&mode = 0) & (min[&i] > 0)) THEN PUT "transform {function =(log)}"; PUT "x11 {appendfcst=yes ";"*(%UPCASE(&listing) EQ ALL)"# PUT "print=(all)";""% (%UPCASE(&seasma) NE)", PUT "seasonalma=(&seasma)";" "##(%UPCASE(&tcma) NE)"' PUT "tre  ndma=(&tcma)";"#" IF ((&mode = 0) & (min[&i] > 0)) THEN PUT "mode=mult"; IF ((&mode = 1) | (min[&i]<=0)) THEN PUT "mode=add"; PUT "}"; PUT 'regression {save=(otl ao ls tc td hol usr) ';"' (&defreg NE)"+ PUT "variables=(&defreg)";"'"* (&aictest NE)"* PUT "aictest=(&aictest)";"*". (&varreg NE)"  PUT "user=(&varreg)";PUT "usertype=(&usertype)"; PUT "data=(" ; IF (NCOL(cc)^=0) THEN DO j=cc[1] TO (cc[NCOL(cc)]+ &maxlead); DO k=1 TO NCOL(varreg); IF (j <= NROW(varreg)) THEN xx=varreg[j,k]; ELSE DO; CALL"~ SYMPUT('_erreg','1'); xx=0; END; IF (xx=.) THEN xx=0; PUT xx 20.5; END; END; PUT ")";"." PUT "}";""3(&_erreg EQ 1)"gWWARNING: For some user regression variables, forecasted values have been put equal to 0"3"(M(%LENGTH(&weights) NE 0)" small=min[><]; FILE "&dx12ar.\data\X0.spc"; PUT 'composite{'; PUT "decimals=&ndec"; PUT '}'; PUT "automdl {file='&dx12ar.\x12a.mdl' }"; PUT "estimate {maxiter = 1000}"; PUT "forecast {maxlead = &maxlead}"; PUT"% "outlier {types=(all)}";"(9(%LENGTH(&history) NE 0)"ma PUT "history {estimates=(sadj trend sadjchng trendchng seasonal) fstep=(1 2 3" +1 per ") }";"9"(<(%LENGTH(&sliding) NE 0)"( PUT "slidingspans { }";"<" IF ((&mode = -1) & (small > 0)) THEN PUT "transform {function =(auto)}"; IF ((&mode = 0) & (small > 0)) THEN PUT "transform {function =(log)}"; PUT "x11 {appendfcst=yes ";"*@(%UPCASE(&listing) EQ ALL)"# PUT "print=(all)";"@" IF ((&mode = 0) & (small > 0)) THEN PUT "mode=mult"; IF ((&mode = 1) | (small <=0)) THEN PUT "mode=add"; PUT "}"; PUT 'regression { ';"D (&defreg NE)"+ PUT "variables=(&defreg)";"D"G (&aictest NE)"* PUT "aictest=(&aictest)";"G"K (&varreg NE)"  PUT "user=(&varreg)";PUT "usertype=(&usertype)"; PUT "data=(" ; IF (NCOL(cc)^=0) THEN DO j=cc[1] TO (cc[NCOL(cc)]+ &maxlead); DO k=1 TO NCOL(varreg); IF (j <= NROW(varreg)) THEN xx=varreg[j,k]; ELSE DO; CALL"~ SYMPUT('_erreg','1'); xx=0; END; IF (xx=.) THEN xx=0; PUT xx 20.5; END; END; PUT ")";"K" PUT "}";"M"." FILE "&dx12ar.\data\metaf.mta";"%Q&I1&_nser1";/ PUT "&dx12ar\data\X&i &dx12ar.\output\X&i";"&"(T(%LENGTH(&weights) NE 0)"9- PUT "&dx12ar\data\X0 &dx12ar.\output\X0";"T" FILE "&dx12ar.\data\x12arima.bat"; PUT "&dx12ar.\x12a -m &dx12ar.\data\metaf -g &dx12ar.\graph -s -w> &dx12ar.\data\x12arima.txt"; QUIT;"_NETTOY_"! &_nettoy_ _stat_"([(%LENGTH(&weights) NE 0)"_NETTOY_"$ &_nettoy_ _agregat_"["v X "cd .."; X "cd &dx12ar.\data"; X "x12arima"; %ListX12(DIR=&dx12ar.\graph,TABOUT=&out,OUTSER=_series_);"b(&errx12 EQ 1)"H8ERROR: A problem occured in the execution of X-12-ARIMA."N>ERROR: Check the error files in the &dx12ar.\OUTPUT directory."  FINMACRO" ;"b"_NETTOY_"" &_nettoy_ _series_" DATA &out; SET &out; LENGTH series $ 32; DROP num name; IF INDEX(name,'X0') THEN DO; series=TRANWRD(name,'X0',"&nameagr"); END; ELSE DO; num=INPUT(SUBSTR(SCAN(name,1),2),5.); series=TRIM(LEFT(SCAN("&tseries",num))); END; RUN;"  PROC SORT DATA=&out OUT=&out; BY series; RUN; PROC SORT DATA=_stat_; BY series; RUN; DATA &out; LENGTH library data series $ 32 period 3 firstdat lastdat $5 nobs nmiss nbyear 3 max min 8; RETAIN maxdate 0; MERGE _stat_ &out END=fin; BY" series; firstdat=PUT(first,MONYY5.); lastdat=PUT(last,MONYY5.); maxdate=MAX(maxdate,last); DROP num maxdate; IF INDEX("&data",'.') THEN DO; data=SCAN("&data",2,'.'); library=SCAN("&data",1,'.'); END; ELSE DO; data="&data";" library='Work'; END; IF (num>=0) THEN CALL SYMPUT('_mean'||LEFT(PUT(num,5.)),LEFT(PUT((Finmode='multiplicative'),2.))); IF fin THEN CALL SYMPUT('maxdate',TRIM(LEFT(PUT(maxdate,10.)))); RUN; DATA _NULL_; LENGTH liste $ 30000; SET"  &out END=fin; RETAIN liste ' '; IF (fail = .) THEN DO; PUT 'WARNING: problem with X12arima with series' +1 series; liste=TRIM(LEFT(TRIM(LEFT(liste)) || ' ' || TRIM(LEFT(series)))); END; IF fin THEN CALL SYMPUT('pbx12a',LEFT(TRIM(liste" ))); RUN;"&m(%LENGTH(&excel) NE 0)" X "del &excel\&out..xls"; PROC DBLOAD DBMS=EXCEL DATA=&out; PATH="&excel\&out..xls"; PUTNAMES YES; LIMIT=0; LOAD; RUN;"m"*s(%UPCASE(&listing) EQ YES)"%r+I1&_nser1"  DATA _null_; INFILE "&dx12ar.\output\X&i..out" LENGTH=l; INPUT xx $varying200. l; FILE PRINT; IF INDEX(xx,"U. S. Department of Commerce") THEN DO; xx="X-12-ARIMA run of &&_var&i"; PUT / xx $varying200. l /; END; ELSE"+ PUT xx $varying200. l; RUN;"+"s"(z(%LENGTH(&weights) NE 0)"DEB" 0"_VAR0" &nameagr"NB DATA __trav__; MERGE _Agregat_ __trav__; BY &date; RUN;"|"DEB" 1"0 ((&outtype EQ 1) OR (&graph NE))" PROC SORT DATA=_series_ OUT=_seriesb_; BY name date type; RUN; PROC TRANSPOSE DATA=_seriesb_ OUT=_seriesb_(RENAME=(date=&date)); BY name date; VAR value; ID type; RUN; DATA"%.I1&_nser1"." &&_var&i(RENAME=(Xorig=&&_var&i))"."; LENGTH &date Xorig Xlin Calendar Outliers UserReg TrendCycle Sadjust Season Irregular AO LS TC 8; KEEP &date Xorig Xlin Calendar Outliers UserReg TrendCycle Sadjust Season Irregular AO LS TC; ARRAY varx Calendar Outliers UserReg AO LS TC;" SET _seriesb_;"%/I1&_nser1"|p IF name="X&i" THEN DO; DO OVER varx; IF varx=. THEN varx=&&_mean&i;END; OUTPUT &&_var&i; END;"/" RUN;"(&outtype EQ 2)"%0I1&_nser1"_NETTOY_"# &_nettoy_ &&_var&i"0""((%LENGTH(&weights) NE 0)" DATA &nameagr(RENAME=(Xorig=&nameagr)); LENGTH &date Xorig Xlin Calendar Outliers UserReg TrendCycle Sadjust Season Irregular Season_Ind Irregular_Ind TrendCycle_Ind Sadjust_Ind 8; KEEP &date Xorig Xlin Calendar Outliers UserReg"  TrendCycle Sadjust Season Irregular Season_Ind Irregular_Ind TrendCycle_Ind Sadjust_Ind; ARRAY varx Calendar Outliers UserReg; SET _seriesb_(WH  ERE=(name='X0')); DO OVER varx; IF varx=. THEN varx=&_mean0;END; RUN; DATA &nameagr"A5; MERGE _Agregat_ &nameagr; BY &date; RUN;"(&outtype EQ 2)"_NETTOY_"" &_nettoy_ &nameagr"""&(%LENGTH(&excel) NE 0)"(2I&deb&_nser1" X "del &excel\&&_var&i...xls"; PROC DBLOAD DBMS=EXCEL DATA=&&_var&i; PATH="&excel\&&_var&i...xls"; PUTNAMES YES; FORMAT &date eurdfde9.; LIMIT=0; LOAD; RUN;"2""_NETTOY_"# &_nettoy_ _seriesb_" (&graph NE)" (&_nser > &gmax)"O?ERROR: The graphs will not be output: there are too many series"/ERROR: Check the GMAX parameter""%5I1&_nser1" %SAgraph(DATA=&&_var&i,DATE=&date,RAW=&&_var&i,XLIN=xlin,SA=Sadjust,SEASON=Season,IRR=Irregular, TREND=TrendCycle,TDAYS=Calendar,OUTL=Outliers,DEBUG=);"(&outtype NE 1)"_NETTOY_"" &_nettoy_ &&_var&i""5"""(&outtype EQ 2)"((%LENGTH(&weights) NE 0)"TSERIES"! &tseries &nameagr""5) DATA Xorig1 Xlin1 TrendCycle1 Sadjust1"((%LENGTH(&weights) NE 0)"-! TrendCycle_Ind1 Sadjust_Ind1""t; SET __trav__; KEEP &date &tseries; RUN; DATA Season1 Calendar1 Outliers1 UserReg1 Irregular1 ao1 ls1 tc1"((%LENGTH(&weights) NE 0)"+ Season_Ind1 Irregular_Ind1""1%; SET Xorig1(KEEP=&date &tseries);"%9I1&_nser1";/ IF (&&_var&i ^=.) THEN &&_var&i=&&_mean&i;"9" RUN;"_NETTOY_"x h&_nettoy_ Xorig1 Xlin1 TrendCycle1 Sadjust1 Season1 ao1 ls1 tc1 Calendar1 Outliers1 UserReg1 Irregular1"((%LENGTH(&weights) NE 0)"_NETTOY_"Q A&_nettoy_ TrendCycle_Ind1 Sadjust_Ind1 Season_Ind1 Irregular_Ind1""  PROC SORT DATA=_series_ OUT=_series_; WHERE type IN ('Xorig','Xlin','Calendar','Outliers','UserReg','TrendCycle','Sadjust','Season', 'Irregular','TrendCycle_Ind','Sadjust_Ind','Season_Ind','Irregular_Ind', 'AO',"sg'LS','TC'); BY type date name; RUN; PROC TRANSPOSE DATA=_series_ OUT=_series_(RENAME=(date=&date"(;I&deb&_nser1" X&i=&&_var&i";")); BY type date; VAR value; ID name; RUN; PROC FREQ DATA=_series_ NOPRINT; TABLES type / OUT=_nomser_; RUN; DATA _NULL_; RETAIN nser 0; SET _nomser_; CALL SYMPUT('_typ'!!LEFT(PUT(_N_,4.)),TRIM(LEFT(type))); CALL SYMPUT("5)'_ntyp',LEFT(PUT(_N_,4.))); RUN; DATA"%<I1&_ntyp1" &&_typ&i"<"; LENGTH &date"(=I&deb&_nser1"&&_var&i"="=1 8; DROP type _name_ &pbx12a; SET _series_;"%>I1&_ntyp1"9- IF type="&&_typ&i" THEN OUTPUT &&_typ&i;">" RUN;"%?I1&_ntyp1"oc DATA &&_typ&i; MERGE &&_typ&i..1 &&_typ&i; BY &date; IF &date <= &maxdate; RUN;"?"((%LENGTH(&weights) NE 0)"`T DATA Xorig; MERGE Xorig __trav__(KE EP=&date &nameagr); BY &date; RUN;""&(%LENGTH(&excel) NE 0)"%AI1&_ntyp1" X "del &excel\&&_typ&i...xls"; PROC DBLOAD DBMS=EXCEL DATA=&&_typ&i; PATH="&excel\&&_typ&i...xls"; PUTNAMES YES; FORMAT &date eurdfde9.; LIMIT=0; LOAD; RUN;"A""_NETTOY_"" &_nettoy_ _nomser_""0 ((&errx12 EQ 0) AND (&debug EQ))"oc X "del &dx12ar.\data\*.* /Q"; X "del &dx12ar.\graph\*.* /Q"; X "del &dx12ar.\output\*.* /Q";""j^ DATA ___tt___; SET ___tt___; end=DATETIME(); time=end-start; PUT time= time.; RUN;"0 ((&errx12 EQ 0) AND (&debug EQ))"_S PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_ ___tt___; RUN; QUIT;""#0` PDt4d,\L|<X <  ( t  0 H \ ,\| (<Pd$004$0< L?X@\AhBpC|DEFGHIJKLMNOPQRT UV$W$X,Y8ZD[L\X]`^h_l`tab$c0d"0DATA"0TSERIES"0DATE"0ADD"0PERIOD"0NDEC"0VARREG"0USERREG"0REGEFF"0AICTEST"0XVARREG"0XUSERREG"0XREGEFF"0XAICTEST"0MODE"0MODEL"0PICKMDL"0AUTOMDL"0MAXLEAD"0SPECTYPE"1PEAKW1"0 SPECSERIES"0 SPECFDATE"0WEIGHTS"0COMPTYPE"7NAMEAGRAgregat"0XX11"0HISTORY"0SLIDING"0SEASMA"0TCMA"0OUT"0OUTTYPE"0OUTTABL"0EXCEL"0LISTING"0GRAPH"1GMAX5"0DX12AR"0DEBUG",FINMACRO"- (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;"."TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"  DATA ___tt___; start=DATETIME(); RUN; %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %"LET index=%INDEX(&table,.); %IF (&index GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%" VERIFY(&lib,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY("{&table,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&6(%LENGTH(&data ) EQ 0)"DATA" _last_"B"=;-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;";"8, DATA _NULL_; SET &data (OBS=1); RUN;"B(&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A"FINMACRO" ;""+(%DATATYP(&nlagy ) EQ CHAR)"D4ERROR: The nlagy (&nlagy ) parameter must be numeric"FINMACRO" ;""(&nlagy LT 0 )"1!ERROR: You must have &nlagy >= 0"FINMACRO" ;""pd DATA _NULL_; nlagy=INT(&nlagy); CALL SYMPUT('nlagy',TRIM(LEFT(PUT(nlagy,10.)))); RUN;"'(%LENGTH(&nlags ) EQ 0)"NLAGS" 3""eY PROC IML; x={&nlags}; CALL SYMPUT('_TypeS',UPCASE(TRIM(LEFT(TYPE(x))))); QUIT;"(&_TypeS NE N)"D4ERROR: The nlags (&nlags ) parameter must be numeric"FINMACRO" ;""h\ PROC IML; x={&nlags}; minx=MIN(x); CALL SYMPUT('_MinS',CHAR(minx,10,0)); QUIT;"(&_MinS LT 0 )"0 ERROR: You must have &nlags > 0"FINMACRO" ;""xl PROC IML; x=INT({&nlags}); CALL SYMPUT('nlags',TRIM(LEFT(COMPBL(ROWCAT(CHAR(x,5,0)))))); RUN;"'(%LENGTH(&nlagm ) EQ 0)"NLAGM" 3"">.(%LENGTH(%QSCAN(%BQUOTE(&nlagm ),2, )) NE 0)"XHERROR: You must precise just one value for the nlagm (&nlagm ) parameter"FINMACRO" ;""+(%DATATYP(&nlagm ) EQ CHAR)"D4ERROR: The nlagm (&nlagm ) parameter must be numeric"FINMACRO" ;""(&nlagm LE 0 )"0 ERROR: You must have &nlagm > 0"FINMACRO" ;""pd DATA _NULL_; nlagm=INT(&nlagm); CALL SYMPUT('nlagm',TRIM(LEFT(PUT(nlagm,10.)))); RUN;"_NETTOY" "%(%LENGTH(&varx) EQ 0)"oc PROC CONTENTS DATA=&data(DROP=&date &vary &varsup) OUT=_nomvarx_(KEEP=Name Type) NOPRINT; RUN;""aU PROC CONTENTS DATA=&data(KEEP=&varx) OUT=_nomvarx_(KEEP=Name Type) NOPRINT; RUN;" PROC SORT DATA=_nomvarx_; BY Name; RUN; DATA _nomvarx_; SET _nomvarx_; DROP type; IF (UPCASE(Name) ^= "OUTLIERY"); IF (Type=1); RUN; PROC CONTENTS DATA=&data(KEEP=&date &vary) OUT=_nomvary_(KEEP=Name) NOPRINT; RUN; PROC SORT DATA="'_nomvary_; BY Name; RUN;"_NETTOY", &_nettoy _nomvarx_ _nomvary_"'(%LENGTH(&varsup) NE 0)" PROC CONTENTS DATA=&data(KEEP=&varsup) OUT=_nomvars_(KEEP=Name) NOPRINT; RUN; PROC SORT DATA=_nomvars_; BY Name; RUN;"_NETTOY"" &_nettoy _nomvars_""I= DATA _nomvarx_; MERGE _nomvarx_(IN=inx) _nomvary_(IN=iny)"'(%LENGTH(&varsup) NE 0)"! _nomvars_(IN=ins)""  END=f; BY Name; LENGTH Name Series $ 32; KEEP Name Series; IF (iny) THEN DO; IF (UPCASE(name)=UPCASE("&vary")) THEN DO; Series='YVAR'; OUTPUT; END; END; ELSE DO; IF (ins) THEN DO; is+1; CALL SYMPUT('_vars'!!LEFT(" PUT(is,6.)),TRIM(LEFT(name))); Series=TRIM(LEFT(COMPRESS('S'||TRIM(LEFT(PUT(is,10.)))))); OUTPUT; END; ELSE IF (inx) THEN DO; ix+1; CALL SYMPUT('_varx'!!LEFT(PUT(ix,6.)),TRIM(LEFT(name))); Series=TRIM(LEFT(COMPRESS('Z'||TRIM(LEFT"(PUT(ix,10.)))))); OUTPUT; END; END; IF f THEN DO; CALL SYMPUT('_nva1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"B"%F(%LENGTH(&out ) EQ 0)"OUT" _result_"Q"<K,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"K"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"Q (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"Q")U(%LENGTH(&spectype) EQ 0)"SPECTYPE" arspec"U"&Y(%LENGTH(&peakw) EQ 0)"PEAKW" 1"Y"+](%LENGTH(&specseries) EQ 0)" SPECSERIES" e1"]"%a(%LENGTH(&xx11) EQ 0)"XX11" YES"a"%e(%LENGTH(&ndec) EQ 0)"NDEC" 2"e"XX11" %UPCASE(&xx11)" PROC FORMAT; VALUE $ ftype 'a1'='Xorig' 'b1'='Xlin' 'd10'='Season' 'd11'='Sadjust' 'd12'='TrendCycle' 'd13'='Irregular' 'd18'='Calendar' 'otl'='Outliers' 'ao'='AO' 'ls'='LS' 'tc'='TC' 'so'='SO'" 'rp'='RP' 'td'='TradingDays' 'hol'='Holidays' 'usr'='UserReg' 'a13'='RegTrans' 'isa'='Sadjust_Ind' 'iir'='Irregular_Ind' 'itn'='TrendCycle_Ind' 'isf'='Season_Ind' ; RUN; PROC IML; tables=T({a1 b1 d10 d11 d12"  d13 d18 otl ao ls tc so rp td hol usr a13 isa iir itn isf &outtabl}); CREATE __tables__ FROM tables[COLNAME={"tables"}]; APPEND FROM tables; CLOSE __tables__; QUIT; PROC SORT DATA=__tables__; BY tables; RUN; DATA _NULL_; LENGTH tab1 tab2" $ 10000; RETAIN tab1 tab2 ' ' ; SET __tables__ END=fin; BY tables; aa=PUT(tables,$ftype.); IF FIRST.tables THEN DO; tab1=COMPBL(TRIM(LEFT(tab1))||' + *.'||TRIM(LEFT(tables))); tab2=COMPBL(TRIM(LEFT(tab2))||' '||TRIM(LEFT(aa))); END;" IF fin THEN DO; CALL SYMPUT('outtb1',TRIM(LEFT(SUBSTR(tab1,2)))); CALL SYMPUT('outtb2',TRIM(LEFT(tab2))); END; RUN; %MACRO ListX12(DIR=,TABOUT=,OUTSER=,OUTT=); %GLOBAL errx12; %LET errx12=0; X "cd &dir."; X" "copy *.*dg serudg.txt"; %IF (%SYSFUNC(FILEEXIST("&dir.\serudg.txt")) EQ 0) %THEN %DO; %PUT ERROR: A problem occured during the X12 seasonal adjustment.; %PUT ERROR: Check the X12 error files. ; %LET errx12=1; DATA _null_;"  INFILE "&dx12ar.\output\X1.err" LENGTH=l; INPUT xx $varying200. l; FILE PRINT; PUT xx $varying200. l; RUN; %GOTO finlec; %END; DATA _NULL_; INFILE "&dir.\serudg.txt" LENGTH=l END=fin; LENGTH trad1 trad2 ly easter constant" user seasonal $ 200; RETAIN maxar1 maxar2 maxma1 maxma2 maxao maxls maxtc maxnuser maxtrig ao ls tc nuser ntrig indirect 0 trad1 trad2 ly easter constant user seasonal ' '; INPUT xx $VARYING200. l; xx=LEFT(xx); FILE"  "&dir.\serudg2.txt" RECFM=V LRECL=30000; IF (xx=:'f2.f:') THEN xx=TRANWRD(xx,'********',' 999999 '); IF (xx=:'f2.fsb1:') THEN xx=TRANWRD(xx,'***********',' 999999 '); IF (xx=:'aape.0:') THEN xx=TRANWRD(xx,'************',' 999999 '); IF (xx=:" 'aape.1:') THEN xx=TRANWRD(xx,'************',' 999999 '); IF (xx=:'aape.2:') THEN xx=TRANWRD(xx,'************',' 999999 '); IF (xx=:'aape.3:') THEN xx=TRANWRD(xx,'************',' 999999 '); PUT xx $; IF (xx=:'modelspan:') THEN DO; ao=0;ls="0;tc=0;nuser=0;ntrig=0; END; ELSE IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Weekday')) THEN trad2='Weekday SatSun Weekday_t SatSun_t'; ELSE IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Mon:')) THEN trad1="'Monday Tuesday Wednesday Thursday Friday Saturday Sunday Monday_t Tuesday_t Wednesday_t Thursday_t Friday_t Saturday_t Sunday_t'; ELSE IF (xx=:'Leap Year') THEN ly='LeapYear LeapYear_t'; ELSE IF (xx=:'Easter[') THEN Easter='Easter Easter_t';"  ELSE IF (xx=:'Constant$Constant:') THEN Constant='Constant Constant_t'; ELSE IF (xx=:'Seasonal$') THEN seasonal='Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Jan_t Feb_t Mar_t Apr_t May_t Jun_t Jul_t Aug_t Sep_t Oct_t Nov_t Dec_t'; ELSE IF ((" xx=:'automd') OR (xx=:'arimamdl')) THEN DO; xx=TRANWRD(xx,'(default)',' '); maxar1=MAX(maxar1,INPUT(SCAN(SCAN(xx,2,'()'),1,' '),2.)); maxar2=MAX(maxar2,INPUT(SCAN(SCAN(xx,3,'()'),1,' '),2.)); maxma1=MAX(maxma1,INPUT(SCAN(SCAN(xx,2,'()'),3,"' '),2.)); maxma2=MAX(maxma2,INPUT(SCAN(SCAN(xx,3,'()'),3,' '),2.)); END; ELSE IF (xx=:'AutoOutlier') THEN DO; IF (SCAN(xx,2,'$')=:'AO') THEN ao=ao+1; IF (SCAN(xx,2,'$')=:'LS') THEN ls=ls+1; IF (SCAN(xx,2,'$')=:'TC') THEN tc=tc+1;"  maxao=MAX(maxao,ao); maxls=MAX(maxls,ls); maxtc=MAX(maxtc,tc); END; ELSE IF (xx=:'Trigonometric Seasonal') THEN DO; IF (INDEX(xx,' I:')=0) THEN ntrig=ntrig+1; maxtrig=MAX(maxtrig,ntrig); END; ELSE IF (xx=:'User-defined$')" THEN DO; a=SCAN(xx,2,'$:'); IF (INDEX(user,TRIM(LEFT(a)))=0) THEN DO; user=COMPBL(TRIM(LEFT(user)) ||' '||TRIM(LEFT(a))); nuser=nuser+1; maxnuser=MAX(maxnuser,nuser); END; END; ELSE IF (xx=:'indirect') THEN indirect=1;"  IF fin THEN DO; CALL SYMPUT('maxar1',LEFT(PUT(maxar1,2.))); CALL SYMPUT('maxar2',LEFT(PUT(maxar2,2.))); CALL SYMPUT('maxma1',LEFT(PUT(maxma1,2.))); CALL SYMPUT('maxma2',LEFT(PUT(maxma2,2.))); CALL SYMPUT('maxao',LEFT(PUT(maxao,2.))"); CALL SYMPUT('maxls',LEFT(PUT(maxls,2.))); CALL SYMPUT('maxtc',LEFT(PUT(maxtc,2.))); CALL SYMPUT('maxtrig',LEFT(PUT(maxtrig,2.))); CALL SYMPUT('ltrad1',TRIM(LEFT(trad1))); CALL SYMPUT('ltrad2',TRIM(LEFT(trad2))); CALL SYMPUT(" 'leaster',TRIM(LEFT(easter))); CALL SYMPUT('lconstant',TRIM(LEFT(constant))); CALL SYMPUT('lseasonal',TRIM(LEFT(seasonal))); CALL SYMPUT('lly',TRIM(LEFT(ly))); CALL SYMPUT('listtrad',TRIM(LEFT(COMPBL(trad1||trad2||ly||Easter||Constant))));"  CALL SYMPUT('listuser',TRIM(LEFT(user))); CALL SYMPUT('nuser',LEFT(PUT(maxnuser,2.))); CALL SYMPUT('indirect',LEFT(PUT(indirect,2.))); END; RUN; DATA &tabout; DROP xx indirect ars arns mas mans nvar %IF ((&maxar1 NE 0) OR ("&maxar2 NE 0) OR (&maxma1 NE 0) OR (&maxma2 NE 0) OR (&nuser NE 0)) %THEN %DO; n a b c %END; %IF (&nuser NE 0) %THEN %DO; d i %END; %IF ((<rad2 NE) OR (<rad1 NE) OR (&lconstant NE) OR (&lly NE ) OR (&lseasonal NE ) OR (" &leaster NE ) OR (&maxtrig NE 0)) %THEN %DO; n a %END; %IF (&indirect EQ 1) %THEN %DO; imcd iric iIrreg iTcycle iSeason iPadj iTdays iris ifsb1 ip_fsb1 ifsd8 ip_fsd8 ikw ip_kw imsf ip_msf im1-im11 iq iqm2 ifail iidseas ipeaktd ipeakseas"  %END; ; LENGTH name $ 32 period 8 automd arimamdl $ 15 Transform Aictrans SAmode Finmode $ 35 aape0-aape3 aic aicc bic hq VarMLE 8 TDeffect LYeffect Eeffect $ 3 &listtrad %IF (((<rad1 NE) OR (<rad2 NE)) AND (" &lly NE)) %THEN %DO; PchiTDLY %END; %IF ((<rad1 NE) OR (<rad2 NE)) %THEN %DO; PchiTD %END; %IF (&lseasonal NE ) %THEN %DO; &lseasonal %END; %IF (&u,]; mean=(aa#ff)[:,]/ff[+]; aa=(aa-REPEAT(mean,NROW(aa),1))[,##]; rank=RANK(aa); rang[cc,]=rank || aa; ser2=ser; ser2[rank]=ser; num=MIN(&medoids,NROW(ser)); IF (maxnum < num) THEN"  maxnum=num; nom=COMPBL(ROWCAT(T(ROWCAT(ser2[1:num] || J(num,1," "))))); CALL SYMPUT(ROWCATC('CL'|| CHAR(i,3.)),nom); END; CALL SYMPUT('maxnum',CHAR(maxnum,3.)); CREATE _rangs_ FROM rang[COLNAME={medoids dist} ROWNAME=_noms_]; APPEND FROM":. rang[ROWNAME=_noms_]; CLOSE _rangs_; QUIT;"_NETTOY" &_nettoy _rangs_"  DATA _outtree_; MERGE _outtree_ _rangs_(RENAME=(_noms_=&idobs)); BY &idobs; RUN; PROC SORT DATA=_outtree_; BY clusname medoids; RUN; PROC TABULATE DATA=_outtree_; CLASS clusname; VAR dist; FREQ &freq; TABLE clusname all,dist*((Mean"  Median STD Qrange Min Max)*F=10.3 N*F=9.0 COLPCTN*F=5.1) /RTS=15; KEYLABEL COLPCTN='%'; LABEL dist='Dispersion of the Observations in each Cluster'; RUN; PROC BOXPLOT DATA=_outtree_; PLOT (dist)* clusname / CAXIS=black CTEXT=black CBOXES=black" VAXIS=axis1 HAXIS=axis1 BOXSTYLE=schematic BOXWIDTHSCALE=0.5 IDCOLOR=black IDSYMBOL=dot ; TITLE ' '; SYMBOL1 C=black H=0.5; AXIS1 LABEL=none; RUN; QUIT; SYMBOL; AXIS; TITLE; PROC FREQ DATA=_outtree_ NOPRINT;" TABLE clusname/OUT=eff; RUN; PROC SORT DATA=eff; BY DESCENDING count; RUN; DATA _null_; SET eff(OBS=1); CALL SYMPUT('maxeff',LEFT(PUT(count,5.))); RUN; PROC TRANSPOSE DATA=_outtree_ OUT=_t1_; VAR &idobs; BY clusname; RUN; PROC"}q TRANSPOSE DATA=_t1_(DROP=_name_ _label_) OUT=&clusters(DROP=_name_); ID clusname; VAR COL1-COL&maxeff; RUN;"((%UPCASE(&print) EQ YES)"( PROC PRINT DATA=&clusters" (&medoids NE)"(OBS=&medoids)""<0; TITLE 'Composition of the Clusters'; RUN;""_NETTOY"! &_nettoy eff _t1_"  SYMBOL;TITLE; PROC SORT DATA=_outtree_; BY &idobs; RUN; DATA &outnew; MERGE &outnew _outtree_(KEEP=&idobs Cluster ClusName); BY &idobs; RUN; PROC SUMMARY DATA=&outnew; CLASS clusname; VAR &var &_numx; FREQ &freq; OUTPUT OUT="mean MEAN=; OUTPUT OUT=Variance VAR=; RUN; DATA Mean; LENGTH liste $ 10000; SET Mean END=fin; RETAIN liste ' '; IF ClusName=' ' THEN ClusName='Total'; ELSE liste= COMPBL(TRIM(LEFT(liste)) || ' ' || TRIM(LEFT(ClusName))); DROP _type_" liste; RENAME _FREQ_=Frequency; IF fin THEN CALL SYMPUT('vvlistx',TRIM(LEFT(liste))); RUN; PROC TRANSPOSE DATA=Mean OUT=Mean; ID ClusName; RUN; DATA Mean; SET Mean END=fin; LENGTH st1-st&nbclus $ 8 plus1-plus&nbclus moins1-moins&nbclus $" 1000 ; RETAIN plus1-plus&nbclus moins1-moins&nbclus; ARRAY cl &vvlistx; ARRAY ec ec1-ec&nbclus; ARRAY st $ st1-st&nbclus; ARRAY plus $ plus1-plus&nbclus; ARRAY moins $ moins1-moins&nbclus; KEEP _Name_ Total &vvlistx st1-st&nbclus; P="'++++++++'; M='--------'; IF (_Name_^='Frequency') THEN DO; DO OVER cl; ec=cl-Total; END; std=IQR(OF ec1-ec&nbclus); IF std THEN DO OVER ec; a=MIN(INT(ABS(ec/std)),8); IF ((a>0) AND (ec >0)) THEN DO; st=SUBSTR(P,1,a);"  IF (a>1) THEN plus=TRIM(LEFT(COMPBL(TRIM(LEFT(plus))||' '||TRIM(LEFT(_Name_))))); END; IF ((a>0) AND (ec <0)) THEN DO; st=SUBSTR(M,1,a); IF (a>1) THEN moins=TRIM(LEFT(COMPBL(TRIM(LEFT(moins))||' '||TRIM(LEFT(_Name_))))); END;" END; END; IF fin THEN DO OVER plus; PUT 'Cluster' _i_ @10 '+ =' plus $; PUT 'Cluster' _i_ @10 '- =' moins $; END; RUN; PROC PRINT DATA=Mean; ID _name_; VAR Total &vvlistx; FORMAT _NUMERIC_ &format; RUN;"'(%LENGTH(&_charx) NEserreg NE)" %THEN %DO; %DO i=1 %TO &nuser; %SCAN(&listuser,&i) %SCAN(&listuser,&i)_t %END; PchiUser %END; mcd ric Irreg Tcycle Season Padj Tdays ris fsb1 p_fsb1 fsd8 p_fsd8 kw p_kw msf" p_msf m1-m11 q qm2 8 fail 3 idseas TrendMA $ 10 SeasonalMA $ 50 peakseas peaktd $ 15 %IF (&indirect EQ 1) %THEN %DO; imcd iric iIrreg iTcycle iSeason iPadj iTdays iris ifsb1 ip_fsb1 ifsd8 ip_fsd8 ikw ip_kw imsf ip_msf im1-" im11 iq iqm2 r1mse r1mse3 r1rmse r1rmse3 r2mse r2mse3 r2rmse r2rmse3 8 ifail 3 iidseas ipeakseas ipeaktd $ 15 %END; %IF (&maxar1 NE 0) %THEN %DO i=1 %TO &maxar1; AR1_&i AR1_&i._t 8 %END; %IF (&maxar2 NE 0) %THEN %DO"  i=1 %TO &maxar2; AR2_&i AR2_&i._t 8 %END; %IF (&maxma1 NE 0) %THEN %DO i=1 %TO &maxma1; MA1_&i MA1_&i._t 8 %END; %IF (&maxma2 NE 0) %THEN %DO i=1 %TO &maxma2; MA2_&i MA2_&i._t 8 %END; ao ls tc 3 %IF (&maxao NE 0) %"THEN %DO i=1 %TO &maxao; DAO&i $ 8 AO&i AO&i._t 8 %END; %IF (&maxls NE 0) %THEN %DO i=1 %TO &maxls; DLS&i $ 8 LS&i LS&i._t 8 %END; %IF (&maxtc NE 0) %THEN %DO i=1 %TO &maxtc; DTC&i $ 8 TC&i TC&i._t 8 %END; ; RETAIN; INFILE" "&dir.\serudg2.txt" LENGTH=l END=fin; INPUT xx $VARYING200. l @; xx=LEFT(xx); ARRAY varnumx _NUMERIC_; ARRAY varcharx _CHARACTER_; %IF (&maxao NE 0) %THEN %DO; ARRAY coefao{&maxao} %DO i=1 %TO &maxao; AO&i %END;; ARRAY studao{" &maxao} %DO i=1 %TO &maxao; AO&i._t %END;; ARRAY dateao{&maxao} %DO i=1 %TO &maxao; DAO&i %END;; %END; %IF (&maxls NE 0) %THEN %DO; ARRAY coefls{&maxls} %DO i=1 %TO &maxls; LS&i %END;; ARRAY studls{&maxls} %DO i=1 %TO &maxls; LS&i._t %" END;; ARRAY datels{&maxls} %DO i=1 %TO &maxls; DLS&i %END;; %END; %IF (&maxtc NE 0) %THEN %DO; ARRAY coeftc{&maxtc} %DO i=1 %TO &maxtc; TC&i %END;; ARRAY studtc{&maxtc} %DO i=1 %TO &maxtc; TC&i._t %END;; ARRAY datetc{&maxtc} %DO i=1"  %TO &maxtc; DTC&i %END;; %END; %IF (&maxar1 NE 0) %THEN %DO; ARRAY coefar1{&maxar1} %DO i=1 %TO &maxar1; AR1_&i %END;; ARRAY studar1{&maxar1} %DO i=1 %TO &maxar1; AR1_&i._t %END;; %END; %IF (&maxar2 NE 0) %THEN %DO; ARRAY coefar2{"&maxar2} %DO i=1 %TO &maxar2; AR2_&i %END;; ARRAY studar2{&maxar2} %DO i=1 %TO &maxar2; AR2_&i._t %END;; %END; %IF (&maxma1 NE 0) %THEN %DO; ARRAY coefma1{&maxma1} %DO i=1 %TO &maxma1; MA1_&i %END;; ARRAY studma1{&maxma1} %DO i=1 %TO"  &maxma1; MA1_&i._t %END;; %END; %IF (&maxma2 NE 0) %THEN %DO; ARRAY coefma2{&maxma2} %DO i=1 %TO &maxma2; MA2_&i %END;; ARRAY studma2{&maxma2} %DO i=1 %TO &maxma2; MA2_&i._t %END;; %END; %IF (&nuser NE 0) %THEN %DO; ARRAY coefreg{"&nuser} &listuser; ARRAY studreg{&nuser} %DO i=1 %TO &nuser; %SCAN(&listuser,&i)_t %END;; %END; %IF (&indirect EQ 1) %THEN %DO; ARRAY dirnum mcd ric Irreg Tcycle Season Padj Tdays ris fsb1 p_fsb1 fsd8 p_fsd8 kw p_kw msf p_msf m1-m11 q qm2"  fail; ARRAY idirnum imcd iric iIrreg iTcycle iSeason iPadj iTdays iris ifsb1 ip_fsb1 ifsd8 ip_fsd8 ikw ip_kw imsf ip_msf im1-im11 iq iqm2 ifail; ARRAY othernum aape0-aape3 aic aicc bic hq VarMLE &listtrad r1mse r1mse3 r1rmse r1rmse3 r2mse r2mse3"  r2rmse r2rmse3 %IF (((<rad1 NE) OR (<rad2 NE)) AND (&lly NE)) %THEN %DO; PchiTDLY %END; %IF ((<rad1 NE) OR (<rad2 NE)) %THEN %DO; PchiTD %END; %IF (&lseasonal NE ) %THEN %DO;"  &lseasonal %END; %IF (&userreg NE) %THEN %DO i=1 %TO &nuser; %SCAN(&listuser,&i) %SCAN(&listuser,&i)_t %END; %IF (&maxar1 NE 0) %THEN %DO i=1 %TO &maxar1; AR1_&i AR1_&i._t %END; %"IF (&maxar2 NE 0) %THEN %DO i=1 %TO &maxar2; AR2_&i AR2_&i._t %END; %IF (&maxma1 NE 0) %THEN %DO i=1 %TO &maxma1; MA1_&i MA1_&i._t %END; %IF (&maxma2 NE 0) %THEN %DO i=1 %TO &maxma2; MA2_&i MA2_&i._t %END; ao ls tc" %IF (&maxao NE 0) %THEN %DO i=1 %TO &maxao; AO&i AO&i._t %END; %IF (&maxls NE 0) %THEN %DO i=1 %TO &maxls; LS&i LS&i._t %END; %IF (&maxtc NE 0) %THEN %DO i=1 %TO &maxtc; TC&i TC&i._t %END; ; ARRAY othercar"  automd arimamdl TDeffect LYeffect Eeffect Transform Aictrans SAmode Finmode %IF (&maxao NE 0) %THEN %DO i=1 %TO &maxao; DAO&i %END; %IF (&maxls NE 0) %THEN %DO i=1 %TO &maxls; DLS&i %END; %IF (&maxtc NE 0) %THEN %DO i=1 %TO" &maxtc; DTC&i %END; ; %END; IF (xx=:'srsnam:') THEN DO; IF nvar THEN DO; Outliers=ao+tc+ls; IF (Aictrans=' ') THEN Aictrans=Transform; Eeffect='No';TDeffect='No';LYeffect='No'; %IF (&leaster NE) %THEN %DO;"  IF (ABS(Easter_t) > 2) THEN Eeffect='Yes'; %END; %IF (<rad2 NE) %THEN %DO; IF (MAX(ABS(Weekday_t),ABS(SatSun_t)) > 2) THEN TDeffect='Yes'; %END; %IF (<rad1 NE) %THEN %DO; IF (MAX(ABS(Monday_t),ABS(Tuesday_t),ABS(" Wednesday_t),ABS(Thursday_t),ABS(Friday_t), ABS(Saturday_t),ABS(Sunday_t))> 2) THEN TDeffect='Yes'; %END; %IF (&lly NE) %THEN %DO; IF (ABS(LeapYear_t) > 2) THEN LYeffect='Yes'; %END; OUTPUT; %IF (&indirect EQ 1) %"THEN %DO; IF indirect THEN DO; name=COMPBL(name || " (Ind)"); DO OVER dirnum;dirnum=idirnum;END; DO OVER othernum;othernum=.;END; DO OVER othercar;othercar=' ';END; idseas=iidseas; peakseas=ipeakseas;" peaktd=ipeaktd; Outliers=.; indirect=0; OUTPUT; END; %END; END; nvar+1; DO OVER varnumx;varnumx=.;END; DO OVER varcharx;varcharx=' ';END; ars=0;arns=0;mas=0;mans=0;ao=0;ls=0;tc=0; INPUT @8" name $; END; ELSE IF (xx=:'automd') THEN automd=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx=:'arimamdl') THEN arimamdl=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx =:'freq:') THEN period=INPUT(TRIM(LEFT(SCAN(xx,2,':'))),3.); ELSE IF (xx =:" 'aictrans') THEN Aictrans=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'transform') THEN Transform=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'finmode') THEN Finmode=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'samode') THEN DO; samode=TRIM(LEFT(" SCAN(xx,2,':'))); IF (LEFT(UPCASE(SAmode))=:'ADDITIVE') THEN Finmode='additive'; IF (LEFT(UPCASE(SAmode))=:'MULTIPLICATIVE') THEN Finmode='multiplicative'; END; ELSE IF (xx=:'arimamdl:') THEN arimamdl=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF ("xx =:'trendma') THEN TrendMA=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'seasonalma') THEN SeasonalMA=TRIM(LEFT(COMPBL(SCAN(xx,2,':')))); ELSE IF (xx=:'aape.0:') THEN INPUT @8 aape0; ELSE IF (xx=:'aape.1:') THEN INPUT @8 aape1; ELSE IF (xx=:"'aape.2:') THEN INPUT @8 aape2; ELSE IF (xx=:'aape.3:') THEN INPUT @8 aape3; ELSE IF (xx=:'aic:') THEN INPUT @6 aic; ELSE IF (xx=:'aicc:') THEN INPUT @6 aicc; ELSE IF (xx=:'bic:') THEN INPUT @6 bic; ELSE IF (xx=:'variance$mle') THEN DO;"  n=INDEX(xx,':')+1; INPUT @n VarMLE; END; ELSE IF (xx=:'hq:') THEN INPUT @5 hq; %IF (&leaster NE) %THEN %DO; IF (xx=:'Easter[') THEN DO; n=INDEX(xx,':')+1; INPUT @n Easter a Easter_t; END; %END; %IF (<rad2 NE) %" THEN %DO; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Weekday:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Weekday a Weekday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Sat/Sun:')) THEN DO; n=INDEX(xx,':')+1; INPUTh" @n SatSun a SatSun_t; END; %END; %IF (&lly NE) %THEN %DO; IF ((xx=:'Leap Year') AND (SCAN(xx,2,'$')=:'Leap Year:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n LeapYear a LeapYear_t; END; %END; %IF (&lconstant NE) %THEN %DO;" n=INDEX(xx,':')+1; IF (xx=:'Constant$Constant:') THEN INPUT @n Constant a Constant_t; %END; %IF (&lseasonal NE) %THEN %DO; n=INDEX(xx,':')+1; IF (xx=:'Seasonal$Jan:') THEN INPUT @n Jan a Jan_t; IF (xx=:'Seasonal$Feb:') THEN"  INPUT @n Feb a Feb_t; IF (xx=:'Seasonal$Mar:') THEN INPUT @n Mar a Mar_t; IF (xx=:'Seasonal$Apr:') THEN INPUT @n Apr a Apr_t; IF (xx=:'Seasonal$May:') THEN INPUT @n May a May_t; IF (xx=:'Seasonal$Jun:') THEN INPUT @n Jun a Jun_t; IF (" xx=:'Seasonal$Jul:') THEN INPUT @n Jul a Jul_t; IF (xx=:'Seasonal$Aug:') THEN INPUT @n Aug a Aug_t; IF (xx=:'Seasonal$Sep:') THEN INPUT @n Sep a Sep_t; IF (xx=:'Seasonal$Oct:') THEN INPUT @n Oct a Oct_t; IF (xx=:'Seasonal$Nov:') THEN INPUT"  @n Nov a Nov_t; IF (xx=:'Seasonal$Dec:') THEN INPUT @n Dec a Dec_t; %END; %IF (<rad1 NE) %THEN %DO; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Mon:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Monday a Monday_t; END; IF ((" xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Tue:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Tuesday a Tuesday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Wed:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Wednesday a Wednesday_t;" END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Thu:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Thursday a Thursday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Fri:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n"  Friday a Friday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Sat:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Saturday a Saturday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Sun:')) THEN DO; n=INDEX(xx,':')+1" ; INPUT @n Sunday a Sunday_t; END; %END; %IF (((<rad1 NE) OR (<rad2 NE)) AND (&lly NE)) %THEN %DO; IF (xx=:'chi$Combined Trading Day and Leap Year Regressors') THEN DO; n=INDEX(xx,':')+1; INPUT @n a b c; PchiTDLY=c;"  END; %END; %IF (<rad1 NE) %THEN %DO; IF (xx=:'chi$Trading Day') THEN DO; n=INDEX(xx,':')+1; INPUT @n a b c; PchiTD=c; END; %END; %IF (&maxar2 NE 0) %THEN %DO; IF (xx=:'AR$Seasonal') THEN DO; ars+1; n"=INDEX(xx,':')+1; INPUT @n a b c; coefar2(ars)=a; studar2(ars)=c; END; %END; %IF (&maxar1 NE 0) %THEN %DO; IF (xx=:'AR$Nonseasonal') THEN DO; arns+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefar1(arns)=a;"  studar1(arns)=c; END; %END; %IF (&maxma2 NE 0) %THEN %DO; IF (xx=:'MA$Seasonal') THEN DO; mas+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefma2(mas)=a; studma2(mas)=c; END; %END; %IF (&maxma1 NE 0) %THEN"  %DO; IF (xx=:'MA$Nonseasonal') THEN DO; mans+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefma1(mans)=a; studma1(mans)=c; END; %END; %IF (&maxao NE 0) %THEN %DO; IF (xx=:'AutoOutlier$AO') THEN DO; ao+1; n=" INDEX(xx,':')+1; INPUT @n a b c; coefao(ao)=a; studao(ao)=c; dateao(ao)=SUBSTR(SCAN(xx,2,'$:'),3); END; %END; %IF (&maxtc NE 0) %THEN %DO; IF (xx=:'AutoOutlier$TC') THEN DO; tc+1; n=INDEX(xx,':')+1; INPUT @" n a b c; coeftc(tc)=a; studtc(tc)=c; datetc(tc)=SUBSTR(SCAN(xx,2,'$:'),3); END; %END; %IF (&maxls NE 0) %THEN %DO; IF (xx=:'AutoOutlier$LS') THEN DO; ls+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefls*LOG(det1); vrai2=0; det2=DET(T(res2)*res2/nobs); IF (det2 ^=0) THEN vrai2=(-nobs/2)*LOG(det2); test3=2*(vrai2-vrai1);" Pval3 = 1 - PROBCHI(test3,lags); Test=Test1 || Pval1 || Test2 || Pval2 || Test3 || Pval3; FINISH TestC; START Hsiao(maty,matx,test); ylag=NCOL(maty); xlag=NCOL(matx); test=J(1,3,.);" DO i=1 TO ylag; DO j=1 TO xlag; nmiss=(NMISS(maty[,1:i] || matx[,1:j]))[,+]; cc=LOC(nmiss=0); nobs=NCOL(cc); IF nobs THEN DO; y=maty[cc,1]; IF (i>1) THEN x=J(nobs,1,1) || maty[cc,2:i] ||" matx[cc,1:j]; ELSE x=J(nobs,1,1) || matx[cc,1:j]; END; res =y-x*INV(T(x)*x)*(T(x)*y); sse=SSQ(res); fpe=sse*(nobs+i+j-1)/(nobs-i-j+1); test=test // ((i-1)||(j-1)||fpe); END; END; test=test[2:" NROW(test),]; FINISH Hsiao; USE _trav_ ; READ all VAR {&vary} INTO y; READ all VAR {&listvar} INTO x; CLOSE _trav_; Series={&listvar}; nlags=MAX(&nlagy,&nlagx); nobs=NROW(y); Granger=J(1,6,.); Coherence=." ; Hsiao=J(1,3,.); NamesHsiao=' '; ylag=J(nobs,nlags+1,.); DO i=1 TO nlags+1; ylag[i:nobs,i]=y[1:nobs-i+1]; END; signgry=SIGN(ylag[,2]-ylag[,1]); ylag=ylag[,2:nlags+1]; nvar=NCOL"(x); DO i=1 TO nvar; xlag=J(nobs,nlags+1,.); DO j=1 TO nlags+1; xlag[j:nobs,j]=x[1:nobs-j+1,i]; END; signgrx=SIGN(xlag[,2]-xlag[,1]); xlag2= ylag || xlag; nmissx=(NMISS(xlag2))[,+]; cc=LOC(nmissx=0); IF"  NCOL(cc) THEN DO; xlag2=J(NCOL(cc),1,1) || xlag2[cc,]; ylag2=J(NCOL(cc),1,1) || ylag[cc,]; END; vary=y[cc]; RUN TestC(vary,ylag2,xlag2,test,nlags,0.05); Granger=Granger // test; aa=(signgry[cc,]#signgrx[cc,] > 0)" [:]; Coherence=Coherence // aa; vary=ylag[,1:(&nlagy+1)]; varx=xlag[,1:(&nlagx+1)]; RUN Hsiao(vary,varx,Htest); NamesHsiao=NamesHsiao // J(NROW(Htest),1,Series[i]); Hsiao=Hsiao // Htest; END; Granger=Granger[2:" NROW(Granger),] || Coherence[2:NROW(Granger),]; CREATE Granger FROM Granger[COLNAME={'Ftest' 'Pval_F' 'Chi2' 'Pval_C' 'Wald' 'Pval_W' 'Coherence'} ROWNAME=Series]; APPEND FROM Granger[ROWNAME=Series]; CLOSE Granger; Hsiao=Hsiao[2:NROW(" Hsiao),]; Series=NamesHsiao[2:NROW(NamesHsiao),]; CREATE Hsiao FROM Hsiao[COLNAME={'Ylag' 'Xlag' 'FPE'} ROWNAME=Series]; APPEND FROM Hsiao[ROWNAME=Series]; CLOSE Hsiao; QUIT; PROC SORT DATA=Hsiao; BY Series FPE; RUN; PROC" SORT DATA=Granger; BY Series; RUN; DATA &outdata; MERGE &outdata Granger Hsiao; BY Series; IF FIRST.Series; FORMAT First Last MONYY7. CCF CCF_GR Pval_F Pval_C Pval_W Coherence 7.4; RUN;"_NETTOY"& &_nettoy Granger Hsiao" "xl DATA _NULL_; CALL SYMPUT('nbmeth',TRIM(LEFT(PUT(COUNT(TRIM(LEFT("&method")),' ')+1,5.)))); RUN;"&d[I1&nbmeth1"JJ"! %SCAN(&method,&i)" (&jj EQ 0)"|p PROC VARCLUS DATA=&outnew._0 OUTTREE=&outcah._0 CENTROID NOPRINT MAXC=&nbclus; VAR &namenew0; RUN;""rf PROC CLUSTER DATA=&outnew._&jj METHOD=ward OUTTREE=&outcah._&jj NOPRINT; ID series; RUN;"((%UPCASE(&graph) EQ YES)"7'(%SYSFUNC(CEXIST(work.Method&jj)) EQ 1)"@4 PROC CATALOG C=work.Method&jj KILL; QUIT;"" AXIS1 LABEL=NONE; PROC TREE DATA=&outcah._&jj(WHERE=(_ncl_ <= &gmax)) HORIZONTAL VAXIS=axis1 NCLUSTERS=&nbcl?"tPATG9.2  x >"0DATA"0OUT"0XX"0DATE"0NFOR"0ITERM"0LCYCLE"0LPHASE"0MOYMOB"0MCD"0LOG"0NMONTH"0IRD"0NDTR"0INV"0AMUL"0PRINT"0GRAPH"0CLIS"0CBRUT"0CTURNP"0DEBUG",FINMACRO" (&debug NE)", OPTIONS MPRINT NOTES NOXWAIT;"":. OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT;"  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index GT" 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&$(%LENGTH(&data ) EQ 0)"DATA" _last_"0"=)-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre data (&data )"FINMACRO" ;")"8, DATA _NULL_; SET &data (OBS=1); RUN;"0(&syserr NE 0)"@0ERROR: Problme dans le paramtre data (&data )"C3ERROR: Table SAS inexistante ? Nom SAS non valide ?"FINMACRO" ;"0"%4(%LENGTH(&out ) EQ 0)"OUT" _result_"?"<9,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"ZJERROR: Vous devez prciser une seule valeur pour le paramtre out (&out )"FINMACRO" ;"9"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"? (&_ret_ NE 0)"_OERROR: La valeur du paramtre out (&out ) doit tre un nom de table SAS valide"FINMACRO" ;"?"$D(%LENGTH(&xx ) EQ 0)"6&ERROR: Le paramtre xx est obligatoire"FINMACRO" ;"P";I+(%LENGTH(%QSCAN(%BQUOTE(&xx ),2, )) NE 0)"XHERROR: Vous devez prciser une seule valeur pourus GOUT=Method&jj; RUN; AXIS;TITLE;"" PROC TREE DATA=&outcah._&jj NOPRINT NCLUSTERS=&nbclus OUT=_outtree_&jj(RENAME=(_name_=series)); RUN; PROC SORT DATA=_outtree_&jj(KEEP=Series Cluster); BY series; RUN; DATA &outdata; LENGTH Series $ 32; MERGE &outdata"  _outtree_&jj(RENAME=(Cluster=Cluster&jj)); BY series; LABEL Series=' ' Cluster&jj=' '; RUN; PROC SORT DATA=_outtree_&jj; BY Cluster; RUN; PROC TRANSPOSE DATA=_outtree_&jj OUT=_t1_; VAR series; BY Cluster; RUN; PROC"y TRANSPOSE DATA=_t1_(DROP=_name_ _label_ Cluster) OUT=&clusters._&jj(DROP=_name_) PREFIX=CL; VAR _CHARACTER_; RUN;"((%UPCASE(&print) EQ YES)"nb PROC PRINT DATA=&clusters._&jj; TITLE 'Composition of the Clusters'; RUN; TITLE;""_NETTOY"% &_nettoy _outtree_&jj"4#$(%SYSFUNC(EXIST(work.Medoids)) EQ 1)"RF PROC DATASETS LIBRARY=work NOLIST; DELETE Medoids; QUIT;"#"  DATA _NULL_; SET _outtree_&jj END=fin; LENGTH liste $ 30000; RETAIN liste; BY Cluster; IF FIRST.Cluster THEN DO; liste=' '; n+1; NbCl=0; END; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series)))" )); NbCl+1; IF LAST.Cluster THEN DO; CALL SYMPUT('ListCl'||TRIM(LEFT(PUT(Cluster,5.))),TRIM(LEFT(liste))); CALL SYMPUT('NbCl'||TRIM(LEFT(PUT(Cluster,5.))),TRIM(LEFT(PUT(NbCl,5.)))); END; IF fin THEN CALL SYMPUT('NumCl',TRIM(LEFT("!PUT(n,5.)))); RUN;") (&jj NE 0)"j^ PROC TRANSPOSE DATA=&outnew._&jj OUT=Factor; VAR _numeric_; ID Series; RUN;"*"=1 DATA Factor; SET &outnew._&jj; RUN;"F: DATA &outmed._&jj; SET _trav_(KEEP=&date); RUN;"&=dIK1&NumCl1" ;(&&NbCl&ik GT 1)" PROC FACTOR DATA=Factor(KEEP=&&ListCl&ik) NOPRINT NFACTORS=1 OUTSTAT=Fstat(WHERE=(_TYPE_=:'PATTERN')); VAR &&ListCl&ik; RUN; PROC TRANSPOSE DATA=Fstat OUT=Fstat(KEEP=_Name_ Factor1 RENAME=(_Name_=Series)); VAR _NUMERIC_;" RUN; PROC RANK DATA=Fstat OUT=Fstat TIES=LOW DESCENDING; VAR Factor1; RANKS Medoids&jj; RUN; PROC APPEND BASE=Medoids DATA=Fstat; RUN; DATA _NULL_; SET Fstat END=fin; LENGTH liste $ 30000;"  RETAIN liste ' '; IF (Medoids&jj <= &medoids) THEN liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series))))); IF fin THEN CALL SYMPUT('ListCl',TRIM(LEFT(liste))); RUN; DATA _NULL_; IF (&&NbCl&ik <= &summary)"  THEN nbfact=&&NbCl&ik -1; ELSE nbfact=&summary; CALL SYMPUT('nbfact',TRIM(LEFT(PUT(nbfact,5.)))); RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT NFACTORS=&nbfact OUT=FactorX(KEEP=&date Factor1-"OCFactor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"5(&syserr NE 0)" PROC PRINCOMP DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT N=&nbfact PREFIX=Factor OUT=FactorX(KEEP=&date Factor1-Factor&nbfact); VAR &&ListCl&ik; RUN;"5"ui DATA &outmed._&jj; MERGE &outmed._&jj _trav_(KEEP=&date &ListCl) FactorX(RENAME=("'9gIJ1&nbfact1"( Factor&ij=M&jj._CL&ik._F&ij"g"))); BY &date; RUN;"<"wk DATA &outmed._&jj; MERGE &outmed._&jj _trav_(KEEP=&date &&ListCl&ik); BY &date; RUN;"d" PROC SORT DATA=Medoids; BY series; RUN; DATA &outdata(DROP=Factor1) Medoids(KEEP=Series Cluster&jj Factor1 Medoids&jj); LENGTH Series $ 32; MERGE &outdata Medoids; BY series; IF ((Medoids&jj=.) AND (UPCASE(Series)^=UPCASE(""&vary"))) THEN Medoids&jj=1; IF (Factor1=.) THEN Factor1=1; LABEL Medoids&jj=' '; RUN; PROC SORT DATA=Medoids; BY Cluster&jj Medoids&jj; RUN;"(C(%UPCASE(&print) EQ YES)" PROC TABULATE DATA=Medoids; CLASS Cluster&jj; VAR Factor1; TABLE Cluster&jj all,Factor1*((Mean Median STD Qrange Min Q1 Q3 Max)*F=6.3 N*F=5.0 COLPCTN*F=5.1) /RTS=15; KEYLABEL COLPCTN='%'; LABEL Factor1="@4'Dispersion of the Series in each Cluster'; RUN;"C"(c(%UPCASE(&graph) EQ YES)"  PROC BOXPLOT DATA=Medoids GOUT=Method&jj; PLOT Factor1* Cluster&jj / CAXIS=black CTEXT=black CBOXES=black VAXIS=axis1 HAXIS=axis1 BOXSTYLE=schematic BOXWIDTHSCALE=0.5 IDCOLOR=black IDSYMBOL=dot; TITLE ' ';"  SYMBOL1 C=black H=0.5; AXIS1 LABEL=none; RUN; QUIT; SYMBOL;AXIS;TITLE; DATA _NULL_; SET Medoids END=fin; LENGTH liste $ 30000; RETAIN liste; BY Cluster&jj; IF FIRST.Cluster&jj THEN DO; liste=' ';"  n+1; END; IF (Medoids&jj <= &medoids) THEN liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series))))); IF LAST.Cluster&jj THEN CALL SYMPUT('ListCl'||TRIM(LEFT(PUT(Cluster&jj,5.))),TRIM(LEFT(liste))); IF fin THEN CALL"pd SYMPUT('NumCl',TRIM(LEFT(PUT(n,5.)))); RUN; PROC IML; USE _trav_; READ all VAR {"&KkIJ1&NumCl1" &&ListCl&ij"k" } INTO medoids; CLOSE _trav_; max=ROUND(MAX(medoids)+0.1,0.1); min=ROUND(MIN(medoids)-0.1,0.1); k=(max-min)/10; IF (k>=1) THEN pas=CEIL(k); ELSE pas=CEIL(10*k)/10; maxcoef=100+(INT((max-100)/pas)+1)#pas;"  mincoef=100-(INT((100-min)/pas)+1)#pas; CALL SYMPUT('maxcoef',CHAR(maxcoef,20.1)); CALL SYMPUT('mincoef',CHAR(mincoef,20.1)); CALL SYMPUT('pas',CHAR(pas,20.1)); CALL SYMPUT('div',CHAR(INT(&NumCl/4),4.)); CALL SYMPUT('mod',"."CHAR(MOD(&NumCl,4),4.)); QUIT;"(QlIJ1&medoids1"* SYMBOL&ij I=join V=none;"l" GOPTIONS CBACK=white BORDER DEVICE=win FTEXT=swissb noPROMPT noDISPLAY; PROC GPLOT DATA=_trav_ UNIFORM GOUT=Method&jj; AXIS1 LABEL=NONE ORDER=&mincoef TO &maxcoef BY &pas;"&UmIJ1&NumCl1" PLOT (&&ListCl&ij) * &date / OVERLAY FRAME VAXIS=axis1 NAME="cl&ij"; FORMAT &date MONYY5.; TITLE "Cluster &ij"; RUN;"m"  QUIT; GOPTIONS display; PROC GREPLAY IGOUT=Method&jj TC=Method&jj NOFS GOUT=Method&jj; TDEF newfour DES='four squares of equal size' 1/LLX=1 LLY=51 ULX=1 ULY=99 URX=49 URY=99 LRX=49 LRY=51 color=grey 2/LLX=51 LLY=51 ULX=51" ULY=99 URX=99 URY=99 LRX=99 LRY=51 color=grey 3/LLX=1 LLY=1 ULX=1 ULY=49 URX=49 URY=49 LRX=49 LRY=1 color=grey 4/LLX=51 LLY=1 ULX=51 ULY=49 URX=99 URY=49 LRX=99 LRY=1 color=grey ; TEMPLATE newfour;"$ZnIJ1&div1"ym TREPLAY 1: cl%EVAL(4*(&ij-1)+1) 2:cl%EVAL(4*(&ij-1)+2) 3:cl%EVAL(4*(&ij-1)+3) 4:cl%EVAL(4*(&ij-1)+4);"n"a (&mod NE 0)" TREPLAY"$_pIJ1&mod1"% &ij: cl%EVAL(4*&div+&ij)"p" ;"a"6* RUN; QUIT; AXIS;SYMBOL;TITLE;"c"["_NETTOY"A 1&_nettoy _t1_ _eff_ Fstat Factor Medoids FactorX"&i(%LENGTH(&debug) EQ 0)"WK PROC DATASETS LIB=WORK NOLIST; DELETE &_nettoy ; RUN; QUIT;"i"' QUIT; AXIS;SYMBOL;TITLE;" #k0` P@p0` P<Pt  t  P ( < l $4Ht4L\ppD\l0H`p,DTh\t,@\0p4| $4HpH`p 0t(@Xl 0Dx,Tl4 L \ p !4!D!X!!!!! "h""""""T#l#|######<$$$$$%(%%%%%%&&0&t&&&&'H'h''''(((@(T(h(()),)@)l)))))*D*\*l******,++++++<,T,d,x,,,,,-0-H-\-p--. .0.D.p.....>>>?@@@@A,A4ALApAAAAAAB C4C@DHETF`GhHI$IxIIIII(J@JPJdJlKxLMNNNHO\OxOOPhQ|QR4R$S8S\SdTTT U(V0W8X@YdYxYYZ[p\\\\]]]]]]^`,`D`h`tabc`dtddddef4fffPgXgdhhhhiljjjjklmmmnoppqqqq4rHrPs\t`uhvpwxxyz{|}~Āx؁p X\px 4Ї,ЊXl<@@LXȐ$Lt|4<DPd H`hp|ԜН8@\xġ̡ܡ(<D\Ȣ 4\rx',LEFT(PUT(ix,6.))); CALL SYMPUT('_nvars',LEFT(PUT(is,6.))); END; RUN;"VARX" "LISTX" "&0I1&_nvarx1"VARX" &varx &&_varx&i"LISTX"  &listx Z&i"0"VARSUP" "LISTS" "(&_nvars NE 0)"&1I1&_nvars1"VARSUP"! &varsup &&_vars&i"LISTS"  &lists S&i"1""_NETTOY"! &_nettoy _nomvar_"  PROC IML; x={&nlagx}; nlags=NCOL(x); IF (nlags < &_nvarx) THEN x=x || J(1,&_nvarx-nlags,x[nlags]); CALL SYMPUT('nlagx',TRIM(LEFT(COMPBL(ROWCAT(CHAR(x,5,0)))))); x={&nlags}; nlags=NCOL(x); IF (nlags < &_nvars) THEN x=x || J(1,&_nvars-" nlags,x[nlags]); CALL SYMPUT('nlags',TRIM(LEFT(COMPBL(ROWCAT(CHAR(x,5,0)))))); QUIT; DATA __travx__(DROP=&varsup &varx DifDate) _DifDate_(KEEP=DifDate); SET &data(KEEP=&date &varx &vary &varsup); DifDate=DIF(Date); RENAME &date=Date &vary=Yvar;" LABEL &vary=' ';" (&nlagy GT 1)"%2I1&nlagy1"# Y_&i=LAG&i(&vary);"2"" 3I121"$ Y_&i=LAG&i(&vary);"3"(&_nvars NE 0)"& 4I1&_nvars1"/ 5J0%SCAN(&nlags,&i)1"3' S&i._&j=LAG&j(%SCAN(&varsup,&i));"5"4""&6I1&_nvarx1"/7J0%SCAN(&nlagx,&i)1"1% Z&i._&j=LAG&j(%SCAN(&varx,&i));"7"6")(%LENGTH(&firstdat) NE 0)"+ IF (&Date >= "&firstdat"d);""((%LENGTH(&lastdat) NE 0)"* IF (&Date <= "&lastdat"d);""  RUN; PROC MEANS DATA=_DifDate_ NOPRINT; VAR DifDate; OUTPUT OUT=_DifDate_ MEAN=; RUN; DATA _NULL_; SET _DifDate_; Period=12*(25<=DifDate<=35)+6*(50<=DifDate<=70)+4*(80<=DifDate<=100)+3*(115<=DifDate<=135) +2*(175<=DifDate<=195)+(345"VJ<=DifDate<=375); CALL SYMPUT('period',TRIM(LEFT(PUT(period,5.)))); RUN;"VACTY" "# (&nlagy GT 0)"%":I1&nlagy1"VACTY"  &vacty Y_&i":"#"VSUP" "-(&_nvars NE 0)"&,;I1&_nvars1"/+<J0%SCAN(&nlags,&i)1"VSUP"  &vsup S&i._&j"<";"-"VACTX" "7(&_nvarx NE 0)"&6=I1&_nvarx1"/5>J0%SCAN(&nlagx,&i)1"VACTX" &vactx Z&i._&j">"="7"_NETTOY"" &_nettoy _DifDate_"  PROC IML; USE __travx__; READ all VAR{yvar &vactx} INTO x; READ all VAR{&date} INTO date; CLOSE __travx__; nvar=NCOL(x); Name={yvar &vactx}; first=J(nvar,1,.); last=J(nvar,1,.); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc")^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]]; END; END; results=first || last || (last-last[1]); nomcols={'First' 'Last' 'OK'}; CREATE _statdes_ FROM results[COLNAME=nomcols ROWNAME=Name]; APPEND FROM resultW 0)"  PROC RANK DATA=&outnew OUT=ranks GROUPS=5; VAR &_numx; RANKS &_numx; RUN; PROC TABULATE DATA=Ranks; CLASS clusname &_charx &_numx; TABLE (&_charxall &_numx)*(COLPCTN*F=5.1),clusname all/RTS=20 ROW=float; KEYLABEL COLPCTN=' '; RUN;"" (&debug EQ)"XL PROC DATASETS LIB=WORK NOLIST; DELETE &_nettoy Ranks; RUN; QUIT;"" QUIT;"d#0` P@p0`T`HP $8x D d   , T h  \  , t L d t 8,L(<Px(8Lp,p <lPXp0HXlp 8H\|,@T(T$<L` hPhx8 !$!|!!!!!!","p"""" #D#d#####($@$X$l$$$% %0%D%l%%%%%H&`&p&&&&' '4'T''''''((0(p(((()8))))))*(*8*L*t*****H+`+p++++ ,,0,P,,,,,,, - -`----- .h.....@/X/h/|/////D0l0000101X111 24222235@5`586L6d66666678@9X9|99:;; <,<@<l<<<=>>>>>X?????$@0AXAAABCCC$DE,EPEXFdGlHxIIIIJL MNNNNOO0OlOOOOPQRSTUV WX,XHXXXXs["ROWNAME=Name]; CLOSE _statdes_; QUIT; DATA _NULL_; SET _statdes_(FIRSTOBS=2)END=fin; LENGTH list $ 30000; RETAIN list ' '; IF (OK > 0) THEN list=TRIM(LEFT(COMPBL(list||' '||Name))); IF fin THEN CALL SYMPUT('vactx',TRIM(LEFT(list))); RUN;"_NETTOY"" &_nettoy _statdes_"+D(%UPCASE(&crit) EQ RSQUARE)"START" %EVAL(&maxvar-1)"BEST" %EVAL(&nbmod/2)"H"START" 1"BEST" &nbmod"  PROC DATASETS LIB=work NOLIST; DELETE _Linear_; RUN; QUIT; DATA _travbis_; SET __travx__(KEEP=&vacty &vactx); z=RANUNI(0); RUN; ODS SELECT NONE; ODS OUTPUT DependenceEquations=_Linear_; PROC REG DATA=_travbis_ SINGULAR=1E-5 ; MODEL z="3' &vactx ; RUN; QUIT; ODS SELECT ALL;".O%SYSFUNC(EXIST(work._Linear_))"  DATA _Linear_; SET _Linear_(KEEP=LeftHandSide) END=fin; BY LeftHandSide; IF FIRST.LeftHandSide; RENAME LeftHandSide=Name; RUN; PROC CONTENTS DATA=__travx__(KEEP=&vactx) OUT=_nomvarx_(KEEP=Name) NOPRINT; RUN; DATA _Linear_; LENGTH"  Name $ 32; SET _nomvarx_ _Linear_; RUN; PROC FREQ DATA=_Linear_ NOPRINT; TABLES Name / OUT=_nomvarx_; RUN; DATA _NULL_; SET _nomvarx_ END=fin; LENGTH list $ 30000; RETAIN list ' '; IF (Count=1) THEN list=TRIM(LEFT(COMPBL(list||"VJ' '||Name))); IF fin THEN CALL SYMPUT('vactx',TRIM(LEFT(list))); RUN;"O"  PROC REG DATA=__travx__ OUTEST=__Est0__(DROP=_MODEL_ _TYPE_ _DEPVAR_ Yvar) NOPRINT; MODEL Yvar = Y_1 Y_2 / SELECTION=&crit BEST=&nbmod ADJRSQ AIC B BIC CP RMSE PC EDF; RUN; QUIT; PROC SORT DATA=__Est0__; BY DESCENDING _rsq_; RUN; PROC REG"  DATA=__travx__ OUTEST=__Est__(DROP=_MODEL_ _TYPE_ _DEPVAR_ Yvar) NOPRINT; MODEL Yvar = &vacty &vactx / SELECTION=&crit START=&start STOP=&maxvar BEST=&nbmod ADJRSQ AIC B BIC CP RMSE PC EDF; RUN; QUIT; PROC SORT DATA=__Est__; BY DESCENDING _rsq_;"  RUN; DATA _Variables_; SET __Est__ __Est0__ END=fin; LENGTH Num 3 Model LagDep $ 10 Variables TrueNames Chow $ 500 Var True $ 40; ARRAY numx{*} Y_1 Y_2 &vactx; KEEP Num Model Variables TrueNames _IN_; Variables=' '; TrueNames=' '; Chow=" ' '; LagDep=' '; DO i=1 TO DIM(numx); IF (numx(i)^=.) THEN DO; Var=TRIM(LEFT(SCAN("Y_1 Y_2 &vactx",i,' '))); Index=INDEX(Var,'_')-2; IF (Var=:'Y') THEN DO; True=TRANWRD(Var,'Y',"&vary"); IF (LagDep=' ') THEN LagDep=TRIM(LEFT(" COMPRESS('LAGDEP='||Var))); END; ELSE IF (Var=:'S') THEN True=TRANWRD(Var,TRIM(LEFT(SCAN(Var,1,'_'))),TRIM(LEFT(SCAN("&varsup",INPUT(SUBSTR(Var,2,Index),3.))))); ELSE IF (Var=:'Z') THEN True=TRANWRD(Var,TRIM(LEFT(SCAN(Var,1,'_'))),TRIM(LEFT(" SCAN("&varx",INPUT(SUBSTR(Var,2,Index),3.))))); Variables=TRIM(LEFT(COMPBL(TRIM(LEFT(Variables))||' '||Var))); TrueNames=UPCASE(TRIM(LEFT(COMPBL(TRIM(LEFT(TrueNames))||' '||True)))); END; END; nbobs=_P_+_EDF_; nbyear=INT(nbobs/&period);" DO i=2 TO (nbyear-2); Chow=TRIM(LEFT(COMPBL(TRIM(LEFT(Chow))||' '||TRIM(LEFT(PUT(i*&period,5.)))))); END; Num=_N_; Model=COMPRESS('Mod'||TRIM(LEFT(PUT(_N_,5.)))); CALL SYMPUT('_Mod'||TRIM(LEFT(PUT(_N_,5.))),TRIM(LEFT(Variables))); CALL"  SYMPUT('_ObsMod'||TRIM(LEFT(PUT(_N_,5.))),TRIM(LEFT(PUT(nbobs,5.)))); CALL SYMPUT('_Chow'||TRIM(LEFT(PUT(_N_,5.))),TRIM(LEFT(Chow))); CALL SYMPUT('_LagDep'||TRIM(LEFT(PUT(_N_,5.))),TRIM(LEFT(LagDep))); IF fin THEN CALL SYMPUT('_nbmod',TRIM(LEFT(PUT"MA(_N_,5.)))); RUN; PROC SORT DATA=_Variables_; BY Model; RUN;"_NETTOY"5 %&_nettoy __Est__ __Est0__ _Variables_"(&method EQ 1)" ODS SELECT NONE; ODS OUTPUT FitSummary=FitSummary(DROP=cValue1 cValue2) ResetTest=ResetTest DWTest=DWTestProb ChowTest=Chow ARCHTest=Arch Godfrey=Godfrey PhilOul=PhilOul; PROC AUTOREG DATA=__travx__ OUTEST=__EstAR__;"&aCI1&_nbmod1" Mod&i : MODEL Yvar = &&_Mod&i / RESET NLAG=&nlagm BACKSTEP DW=3 DWPROB NORMAL &&_LagDep&i CHOW=(&&_Chow&i) PCHOW=(&&_Chow&i) ARCHTEST GODFREY STATIONARITY=(PHILLIPS); OUTPUT OUT=Model&i(KEEP=Date Yvar Res&i" RecPEV&i RecRES&i Yhat&i Cusum&i CusumLB&i CusumUB&i CusumSq&i CusumSqLB&i CusumSqUB&i) P=Yhat&i R=Res&i RecPEV=RecPEV&i RecRES=RecRES&i CUSUM=Cusum&i CUSUMLB=CusumLB&i CUSUMUB=CusumUB&i CUSUMSQ=CusumSq&i CUSUMSQLB=CusumSqLB&i CUSUMSQUB="&CusumSqUB&i ALPHACSM=0.05;"C"{o RUN; ODS SELECT ALL; DATA __Cusum__ &outfor(KEEP=Date Yvar Yhat1-Yhat&_nbmod Res1-Res&_nbmod); MERGE"&eDI1&_nbmod1" Model&i"D"; BY Date; ARRAY model Cusum1-Cusum&_nbmod; ARRAY cusum Cusum1-Cusum&_nbmod; ARRAY cusumlb CusumLB1-CusumLB&_nbmod; ARRAY cusumub CusumUB1-CusumUB&_nbmod; ARRAY cusumSq CusumSq1-CusumSq&_nbmod; ARRAY cusumSqlb CusumSqLB1-CusumSqLB" &_nbmod; ARRAY cusumSqub CusumSqUB1-CusumSqUB&_nbmod; ARRAY Hat Yhat1-Yhat&_nbmod; ARRAY Coher Coherence1-Coherence&_nbmod; ARRAY CoherSG CoherSG1-CoherSG&_nbmod; DO OVER Cusum; IF (Cusum^=.) THEN DO; Cusum=1-(Cusumlb <= Cusum <="  Cusumub); CusumSq=1-(CusumSqlb <= CusumSq <= CusumSqub); END; END; DO OVER hat; aaa=DIF(Hat)*DIF(Yvar); IF (aaa^=.) THEN Coher=(aaa>=0); aaa=Hat*Yvar; IF (aaa^=.) THEN CoherSG=(aaa >=0); END; DROP aaa CusumLB1-CusumLB"&_nbmod CusumUB1-CusumUB&_nbmod CusumSqLB1-CusumSqLB&_nbmod CusumSqUB1-CusumSqUB&_nbmod; RUN; PROC MEANS DATA=__Cusum__ NOPRINT; VAR Cusum1-Cusum&_nbmod CusumSq1-CusumSq&_nbmod Coherence1-Coherence&_nbmod CoherSG1-CoherSG&_nbmod; OUTPUT OUT="__Mean__(DROP=_TYPE_ _FREQ_) MEAN=; RUN; DATA __Mean__; LENGTH _Name_ $ 32; SET __Mean__(KEEP=Cusum1-Cusum&_nbmod RENAME=("&mEI1&_nbmod1" Cusum&i=Mod&i"E"K?) IN=in1) __Mean__(KEEP=CusumSq1-CusumSq&_nbmod RENAME=("&qFI1&_nbmod1"CusumSq&i=Mod&i"F"OC) IN=in2) __Mean__(KEEP=Coherence1-Coherence&_nbmod RENAME=("&uGI1&_nbmod1"Coherence&i=Mod&i"G"K?) IN=in3) __Mean__(KEEP=CoherSG1-CoherSG&_nbmod RENAME=("&yHI1&_nbmod1"CoherSG&i=Mod&i"H" ) IN=in4); IF in1 THEN _Name_='Cusum'; IF in2 THEN _Name_='CusumSq'; IF in3 THEN _Name_='Coherence'; IF in4 THEN _Name_='CoherSG'; RUN; PROC TRANSPOSE DATA=__Mean__ OUT=__Mean__(RENAME=(_Name_=Model)); VAR Mod1-Mod&_nbmod; RUN; PROC"cW SORT DATA=__Mean__; BY Model; RUN; PROC DATASETS LIBRARY=work NOLIST; DELETE"&~II1&_nbmod1" Model&i"I"; QUIT; PROC SORT DATA=&outfor(WHERE=(Yvar^=.)) OUT=__rmse3__; BY DESCENDING Date; RUN; PROC MEANS DATA=__rmse3__(OBS=%EVAL(3*&period)) VARDEF=DF NOPRINT; VAR Res1-Res&_nbmod; OUTPUT OUT=rmse3(DROP=_Type_ _Freq_) STD=; RUN; PROC"* TRANSPOSE DATA=rmse3(RENAME=("&JI1&_nbmod1" Res&i=Mod&i"J" )) OUT=__rmse3__(RENAME=(_Name_=Model Col1=RMSE3)); VAR Mod1-Mod&_nbmod; RUN; PROC SORT DATA=__rmse3__; BY Model; RUN; DATA FitSummary; LENGTH Model Label1 Label2 $ 32; SET FitSummary(KEEP=Model Label1 nValue1) FitSummary(KEEP="Model Label2 nValue2 RENAME=(Label2=Label1 nValue2=nValue1)); RUN; PROC SORT DATA=FitSummary; BY Model Label1; RUN; DATA FitSummary; SET FitSummary; BY Model Label1; IF LAST.Label1; IF (Label1='Regress R-Square') THEN Label1="'RegressR2'; ELSE IF (Label1='Total R-Square') THEN Label1='TotalR2'; ELSE IF (Label1='Root MSE') THEN Label1='RMSE'; ELSE IF (Label1='Normal Test') THEN Label1='JB_Ntest'; ELSE IF (Label1='Pr > ChiSq') THEN Label1='Pval_JB'; ELSE IF ("Label1='Pr < h') THEN Label1='Pval_H'; ELSE IF (Label1='Durbin h') THEN Label1='DurbinH'; Label1=COMPRESS(Label1); RUN; PROC TRANSPOSE DATA=FitSummary OUT=FitSummary(DROP=_Name_); BY Model; VAR nValue1; ID Label1; RUN;"_NETTOY"P @&_nettoy __Mean__ __Cusum__ FitSummary __EstAR__ __rmse3__ rmse3" DWTESTPROB" "0 %SYSFUNC(EXIST(Work.DWTestProb))" PROC CONTENTS DATA=DWTestProb OUT=_nomvarx_ NOPRINT; RUN; DATA _NULL_; RETAIN ErrorDW '1'; SET _nomvarx_ END=fin; IF UPCASE(Name)='PROBDWNEG' THEN ErrorDW='0'; IF fin THEN CALL SYMPUT('ErrorDW',TRIM(LEFT(ErrorDW))); RUN;" PROC SORT DATA=DWTestProb; BY Model Order; RUN; DATA DWTestProb; SET DWTestProb; BY Model Order; IF LAST.Order; RUN; DATA DWTestProb;" LI131"UI SET DWTestProb(WHERE=(Order=&i) RENAME=(DW=DW&i"(&ErrorDW EQ 0)"2& ProbDW=ProbDW&i ProbDWNeg=ProbDWNeg&i""));"L" DROP Order;"(&ErrorDW EQ 0)" LABEL" OI131"/# ProbDW&i=' ' ProbDWNeg&i=' '"O" ;"" RUN;" DWTESTPROB" DWTestProb"_NETTOY"# &_nettoy DWTestProb"" DATA ResetTest;" PI241"^R SET ResetTest(WHERE=(Power=&i) RENAME=(Reset=Reset&i ProbReset=ProbReset&i));"P"$ DROP Power; LABEL" QI241", ProbReset&i=' ' Reset&i=' '"Q"; RUN; PROC SORT DATA=ResetTest; BY Model; RUN; PROC SORT DATA=Arch; BY Model Order; RUN; DATA Arch; MERGE"!RI1121"s Arch(WHERE=(Order=&i) KEEP=Model Order Q ProbQ LM ProbLM RENAME=(Q=Q&i ProbQ=ProbQ&i LM=LM&i ProbLM=ProbLM&i))"R"#; BY Model; LABEL"!SI1121"% ProbQ&i=' ' ProbLM&i=' '"S"; DROP Order; RUN; PROC SORT DATA=GodFrey; BY Model Alt; RUN; DATA GodFrey1 GodFrey2; SET GodFrey; BY Model Alt; IF FIRST.Alt THEN OUTPUT GodFrey1; IF LAST.Alt THEN OUTPUT GodFrey2; RUN; DATA GodFrey; MERGE" TI141" GodFrey1(WHERE=(Alt="AR(&i)") KEEP=Model Alt LM ProbLM RENAME=(LM=G1_LM&i ProbLM=G1_ProbLM&i)) GodFrey2(WHERE=(Alt="AR(&i)") KEEP=Model Alt LM ProbLM RENAME=(LM=G2_LM&i ProbLM=G2_ProbLM&i))"T"#; BY Model; LABEL" UI141", G1_ProbLM&i=' ' G2_ProbLM&i=' '"U"; DROP Alt; RUN; PROC SORT DATA=GodFrey; BY Model; RUN; PROC SORT DATA=PhilOul(RENAME=(Lags=PO_Lags Rho=PO_Rho Tau=PO_Tau)); BY Model; RUN;"_NETTOY"N >&_nettoy ResetTest GodFrey GodFrey1 GodFrey2 PhilOul Arch Chow" DATA &outmod; LENGTH Num 3 Model $ 10 Variables $ 500; M%ERGE _Variables_ FitSummary &DWTestProb __Mean__ __rmse3__ ResetTest Arch GodFrey PhilOul; BY Model; LABEL Model=' '; FORMAT _numeric_; RUN; DATA &outfor; MERGE" &data(KEEP=&date &vary OutlierY) &outfor(RENAME=(Date=&date)); BY &date; RUN; PROC MEANS DATA=&outfor NOPRINT; VAR OutlierY; OUTPUT OUT=lam MIN=; RUN; DATA _NULL_; SET lam; IF (OutlierY < 0) THEN CALL SYMPUT('lamy','1');"  ELSE CALL SYMPUT('lamy','0'); RUN; DATA &outfor; SET &outfor; ARRAY hat yvar yhat1-yhat&_nbmod; IF (OutlierY^=.) THEN DO OVER hat; IF (&lamy = 0) THEN DO; IF (OutlierY > 0) THEN hat=hat/OutlierY; END; ELSE IF (&lamy = 1)"D8 THEN DO; hat=hat+OutlierY; END; END; RUN;"&VI1&_nbmod1" DATA extract; SET __travx__(KEEP=Date Yvar &&_Mod&i) END=fin; RETAIN FirstObs All 0; All=(NMISS(OF Yvar &&_Mod&i)=0); DROP All n FirstObs; IF (All AND (FirstObs=0)) THEN FirstObs=_N_; IF ((Yvar^=.) AND FirstObs) THEN n+1;"bV IF fin THEN CALL SYMPUT('_nbobs',TRIM(LEFT(PUT(n,5.)))); IF FirstObs; RUN;".%SYSFUNC(EXIST(Work.InSample))"pd PROC DATASETS LIB=Work NOLIST; DELETE InSample Recursive InSample&i Recursive&i; QUIT;""9 XJ%EVAL(2*&period+1)&_nbobs+11" DATA Subset; SET Extract(OBS=&j) END=fin; IF fin THEN Yvar=.; RUN; PROC AUTOREG DATA=Subset NOPRINT; MODEL Yvar = &&_Mod&i / NLAG=3 BACKSTEP; OUTPUT OUT=Model(KEEP=Date Yhat Yres) P=Yhat R=Yres; RUN; PROC APPEND" BASE=InSample DATA=Model(FIRSTOBS=&j KEEP=Date Yhat); RUN; PROC APPEND BASE=Recursive DATA=Model(FIRSTOBS=%EVAL(&j-1) OBS=%EVAL(&j-1) KEEP=Date Yres); RUN;"X"  DATA InSample; MERGE Extract(KEEP=Date Yvar) InSample Recursive; BY Date; Horizon1=Yvar-Yhat; RUN; PROC MEANS DATA=InSample VARDEF=DF NOPRINT; VAR Horizon1; OUTPUT OUT=rmse(DROP=_Type_ _Freq_) STD=Horizon1 MEAN=Mean1; RUN;"  PROC SORT DATA=InSample(WHERE=(Yvar^=.)) OUT=__Horiz3__; BY DESCENDING Date; RUN; PROC MEANS DATA=__Horiz3__(OBS=%EVAL(3*&period)) VARDEF=DF NOPRINT; VAR Horizon1; OUTPUT OUT=rmse3(DROP=_Type_ _Freq_) STD=Horiz3Y MEAN=Mean3Y; RUN;" DATA Rmse; LENGTH Model $ 10; MERGE Rmse Rmse3; Model="Mod&i"; RUN; PROC APPEND DATA=Rmse BASE=Horizon1; RUN;"V" PROC SORT DATA=Horizon1; BY Model; RUN; DATA &outmod; LENGTH Num 3 Model $ 10 Variables $ 500; MERGE &outmod Horizon1; BY Model; LABEL Model=' '; FORMAT _numeric_; RUN;"_NETTOY"_ O&_nettoy InSample Recursive Rmse Rmse3 __Horiz3__ Extract SubSet Horizon1 Model""(&method EQ 2)"(ZIZI1&_nbmod1"  DATA Extract; SET __travx__(KEEP=Date Yvar &&_Mod&izi) END=fin; RETAIN FirstObs All 0; All=(NMISS(OF Yvar &&_Mod&izi)=0); DROP All n FirstObs; IF (All AND (FirstObs=0)) THEN FirstObs=_N_; IF ((Yvar^=.) AND FirstObs) THEN n+1;"bV IF fin THEN CALL SYMPUT('_nbobs',TRIM(LEFT(PUT(n,5.)))); IF FirstObs; RUN;"_NBY"- %EVAL(&_nbobs - 3*&period -1)"  DATA Extract; SET Extract; DROP i; ARRAY vary{*} Y1-Y&_nby; DO i=1 TO DIM(vary); IF (_N_ > 3*&period +i) THEN vary(i)=.; ELSE vary(i)=Yvar; END; RUN; %RunTramo(DATA=Extract,TSERIES=Yvar,VARREG=&&_Mod&izi,DATE"=date,OUT=_OutTS, RSA=9,ADD=0,REGEFF=0,LAM=0,EASTER=-1,TRAD=-7,OUTTYPE=2,FORECAST=1,VA=,PRINT=, DTRAMO=c:\tramo,CONTROL=no,DEBUG=,MODEL=&nlagm 0 0 0 0 0); DATA _NULL_; SET _OutTS; CAL̖! "tRUNX13WH9.2 (  |8>"0DATA"0TSERIES"0DATE"0ADD"0PERIOD"0NDEC"0VARREG"0USERREG"0REGEFF"0AICTEST"0XVARREG"0XUSERREG"0XREGEFF"0XAICTEST"0MODE"0MODEL"0PICKMDL"0MAXLEAD"0SPECTYPE"1PEAKW1"0 SPECSERIES"0ALTFREQ"0 SPECFDATE"0WEIGHTS"0COMPTYPE"7NAMEAGRAgregat"0SOFTW"0HISTORY"0SLIDING"0SEASMA"0TCMA"0OUT"0OUTTYPE"0OUTTABL"0EXCEL"0LISTING"0GRAPH"1GMAX5"0DX12AR"0DEBUG",FINMACRO"- (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;"."TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"  DATA ___tt___; start=DATETIME(); RUN; %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %"LET index=%INDEX(&table,.); %IF (&index GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%" VERIFY(&lib,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY("{&table,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&6(%LENGTH(&data ) EQ 0)"DATA" _last_"B"=;-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"WGERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;";"8, DATA _NULL_; SET &data (OBS=1); RUN;"B(&syserr NE 0)"I9ERROR: There is a problem in the data (&data ) parameter"A͖2!1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"B"%F(%LENGTH(&out ) EQ 0)"OUT" _result_"Q"<K,(%LENGTH(%QSCAN(%BQUOTE(&out ),2, )) NE 0)"UEERROR: You must precise just one value for the out (&out ) parameter"FINMACRO" ;"K"0$ %sasnom(_IN_=&out ,TYPE=DATASET);"Q (&_ret_ NE 0)"RBERROR: The out (&out ) parameter must be a valid SAS dataset name"FINMACRO" ;"Q"(U(%LENGTH(&altfreq) EQ 0)"ALTFREQ" yes"U")Y(%LENGTH(&spectype) EQ 0)"SPECTYPE" arspec"Y"&](%LENGTH(&peakw) EQ 0)"PEAKW" 1"]"+a(%LENGTH(&specseries) EQ 0)" SPECSERIES" e1"a"X11" "SEATS" "  DATA _NULL_; LENGTH softw $ 5; softw=TRIM(LEFT(UPCASE("&softw"))); x11=(softw IN('X12','X11')); seats=(softw='SEATS'); CALL SYMPUT('x11',LEFT(TRIM(PUT((x11>0),1.)))); CALL SYMPUT('seats',LEFT(TRIM(PUT((seats>0),1.)))); RUN; PROC FORMAT;"  VALUE $ ftype 'a1'='Xorig' 'b1'='Xlin' 'd10'='Season' 'd11'='Sadjust' 'd12'='TrendCycle' 'd13'='Irregular' 'd18'='Calendar' 'otl'='Outliers' 'ao'='AO' 'ls'='LS' 'tc'='TC' 'so'='SO' 'rp'='RP' 'td'" ='TradingDays' 'hol'='Holidays' 'usr'='UserReg' 'a13'='RegTrans' 'isa'='Sadjust_Ind' 'iir'='Irregular_Ind' 'itn'='TrendCycle_Ind' 'isf'='Season_Ind' ; RUN; PROC IML; tables=T({a1 b1 d10 d11 d12 d13 d18 otl ao ls tc so"  td hol usr a13 isa iir itn isf &outtabl}); CREATE __tables__ FROM tables[COLNAME={"tables"}]; APPEND FROM tables; CLOSE __tables__; QUIT; PROC SORT DATA=__tables__; BY tables; RUN; DATA _NULL_; LENGTH tab1 tab2 $ 10000; RETAIN tab1 tab2" ' ' ; SET __tables__ END=fin; BY tables; aa=PUT(tables,$ftype.); IF FIRST.tables THEN DO; tab1=COMPBL(TRIM(LEFT(tab1))||' + *.'||TRIM(LEFT(tables))); tab2=COMPBL(TRIM(LEFT(tab2))||' '||TRIM(LEFT(aa))); END; IF fin THEN DO; CALL"  SYMPUT('outtb1',TRIM(LEFT(SUBSTR(tab1,2)))); CALL SYMPUT('outtb2',TRIM(LEFT(tab2))); END; RUN; %MACRO ListX12(DIR=,TABOUT=,OUTSER=,OUTT=); %GLOBAL errx12; %LET errx12=0; X "cd &dir."; X "copy *.*dg serudg.txt"; %" IF (%SYSFUNC(FILEEXIST("&dir.\serudg.txt")) EQ 0) %THEN %DO; %PUT ERROR: A problem occured during the X12 seasonal adjustment.; %PUT ERROR: Check the X12 error files. ; %LET errx12=1; DATA _null_; INFILE "&dx12ar.\output\X1.err" LENGTH=l;"  INPUT xx $varying200. l; FILE PRINT; PUT xx $varying200. l; RUN; %GOTO finlec; %END; DATA _NULL_; INFILE "&dir.\serudg.txt" LENGTH=l END=fin; LENGTH trad1 trad2 ly easter constant user seasonal $ 200; RETAIN maxar1 maxar2" maxma1 maxma2 maxao maxls maxtc maxrp maxso maxnuser maxtrig ao ls tc rp so nuser ntrig indirect 0 trad1 trad2 ly easter constant user seasonal ' '; INPUT xx $VARYING200. l; xx=LEFT(xx); FILE "&dir.\serudg2.txt" RECFM=V LRECL=30000;" IF (xx=:'f2.f:') THEN xx=TRANWRD(xx,'********',' 999999 '); IF (xx=:'f2.fsb1:') THEN xx=TRANWRD(xx,'***********',' 999999 '); IF (xx=:'aape.0:') THEN xx=TRANWRD(xx,'************',' 999999 '); IF (xx=:'aape.1:') THEN xx=TRANWRD(xx," Ζ"l ,8@HP !"$",#8$D%P&\'|'''''' ($(0)4*@+L,,-d-x--./0123445(6<6@7|77778D9`9h:::(;D;;;`<<<<<=>>p???D@`@@@@@ABBCD(E0F0GGGHIJKLMNODPXP|PPPQ,Q@Q\QQQQRR4R@S$T@TTTUxUU\VpVVVVW0W`WtWWWXϖ#"tHCAOFTScH9.2  A >"0DATA"0VAR"0DATE"0STANDARD"0DIF"0METHOD"0NBLAGF"0ARIMA"0NBLAGA"0VARY"0NLAGX"0NLAGY"0NBCOMP"0OUTNEW"0OUTCAH"0OUTDATA"0OUTMED"0CLUSTERS"0NBCLUS"0MEDOIDS"0SUMMARY"0EXCEL"0GRAPH"0GMAX"0GRAPHSH"0EPS"0JPEG"0PRINT"0 NOCONTROL"0DEBUG", FINCONTROL",FINMACRO?"$ (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;"%"TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"((&nocontrol NE)" FINCONTROL"("  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index" GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&0(%LENGTH(&data ) EQ 0)"DATA" _last_"<"=5-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"5"8, DATA _NULL_; SET &data (OBS=1); RUN;"<(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"<"%@(%LENGTH(&var ) EQ 0)"VAR" _numeric_"G"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"G(&syserr NE 0)"F6ERROR: There is a problem in tȖ&$"tHCAOFTScH9.2  A >"0DATA"0VAR"0DATE"0STANDARD"0DIF"0METHOD"0NBLAGF"0ARIMA"0NBLAGA"0VARY"0NLAGX"0NLAGY"0NBCOMP"0OUTNEW"0OUTCAH"0OUTDATA"0OUTMED"0CLUSTERS"0NBCLUS"0MEDOIDS"0SUMMARY"0EXCEL"0GRAPH"0GMAX"0GRAPHSH"0EPS"0JPEG"0PRINT"0 NOCONTROL"0DEBUG", FINCONTROL",FINMACRO?"$ (&debug NE)"F: OPTIONS MPRINT NOTES NOXWAIT NOMACROGEN PS=1000 LS=250;"%"TH OPTIONS NOMPRINT NONOTES NOSOURCE2 NOXWAIT NOMACROGEN PS=1000 LS=250;"((&nocontrol NE)" FINCONTROL"("  %MACRO sasnom(_IN_=,TYPE=); %GLOBAL _ret_; %LET _ret_=0; %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32; %LET table=%UPCASE(%TRIM(&_in_)); %IF (%UPCASE(&type) EQ DATASET) %THEN %DO; %LET index=%INDEX(&table,.); %IF (&index" GT 1) %THEN %DO; %LET lib=%SUBSTR(&table,1,&index-1); %LET table=%SUBSTR(&table,&index+1); %LET c1=%LENGTH(&lib); %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&lib,"'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %END; %END; %LET c1=%LENGTH(&table); %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %LET c3=%VERIFY(&table,"t'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1; %MEND;"&0(%LENGTH(&data ) EQ 0)"DATA" _last_"<"=5-(%LENGTH(%QSCAN(%BQUOTE(&data ),2, )) NE 0)"VFERROR: You must precise just one value for the data (&data ) parameter"FINMACRO" ;"5"8, DATA _NULL_; SET &data (OBS=1); RUN;"<(&syserr NE 0)"H8ERROR: There is a problem in the data (&data ) parameter"A1ERROR: Non valid SAS dataset? Non valid SAS name?"FINMACRO" ;"<"%@(%LENGTH(&var ) EQ 0)"VAR" _numeric_"G"[O DATA _NULL_; SET &data (KEEP=&var OBS=1); ARRAY _xx_(*) &var ; RUN;"G(&syserr NE 0)"F6ERROR: There is a problem in tɖe %L SYMPUT('lamy',PUT(Lam,5.));"  RUN; %RunTramo(DATA=Extract,TSERIES=Yvar Y1-Y&_nby,VARREG=&&_Mod&izi,DATE=date,OUT=_OutTS, RSA=0,ADD=0,REGEFF=0,LAM=&lamy,EASTER=-1,TRAD=-7,OUTTYPE=2,FORECAST=1,VA=,PRINT=, DTRAMO=c:\tramo,CONTROL=no,DEBUG=,MODEL=&nlagm 0" 0 0 0 0); DATA Residuals; SET Residuals; ARRAY vary Yvar Y1-Y&_nby; DO OVER vary;IF (vary=0) THEN vary=.;END; RUN; PROC SORT DATA=_OutTS; BY Nobs; RUN; DATA &outmod; LENGTH Model $ 10; SET" (&izi NE 1)" &outmod""F: _OutTS (IN=in1); IF in1 THEN Model="Mod&izi"; RUN;"Z""&(%LENGTH(&debug) EQ 0)"WK PROC DATASETS LIB=WORK NOLIST; DELETE &_nettoy ; RUN; QUIT;"" QUIT;"#0` P@p0`44HT@H  0 p  < \  $ L d | , D T h  , < P x Xp@Xh|XHh 0Dl x4|8`x4T 0DX(H0P8`x8P`t  @t H`tTl| H ` p $!?0?<@HATB`ClDxEFGGG,HLHLItI|JKKK0LXLlLtL|MNOP,QTQpQxQQQRR`RRRRR$S@SHSTTTTTTV0VXVpVxVWXYZZZ[ [P[X\ ],]]]]]]^ ^@^X^x^^^^^^_ _8_\_p___``<`\```a@aaaab8b@b= 0"FINMACRO" ;""((%LENGTH(&nblagf ) EQ 0)"NBLAGF" 20""?/(%LENGTH(%QSCAN(%BQUOTE(&nblagf ),2, )) NE 0)"ZJERROR: You must precise just one value for the nblagf (&nblagf ) parameter"FINMACRO" ;"",(%DATATYP(&nblagf ) EQ CHAR)"F6ERROR: The nblagf (&nblagf ) parameter must be numeric"FINMACRO" ;""(&nblagf LE 0 )"1!ERROR: You must have &nblagf > 0"FINMACRO" ;""((%LENGTH(&nblaga ) EQ 0)"NBLAGA" 20""?/(%LENGTH(%QSCAN(%BQUOTE(&nblaga ),2, )) NE 0)"ZJERROR: You must precise just one value for the nblaga (&nblaga ) parameter"˖'v_(KEEP=&date &ListCl) FactorX(RENAME=("'IkIJ1&nbfact1"( Factor&ij=M&jj._CL&ik._F&ij"k"))); BY &date; RUN;"L"wk DATA &outmed._&jj; MERGE &outmed._&jj _trav_(KEEP=&date &&ListCl&ik); BY &date; RUN;"h"%j(%LENGTH(&vary) NE 0)"&gnIK1&NumCl1" e(&&NbCl&ik GT 1)"  DATA _NULL_; SET &outdata(KEEP=Series MedoidsC&jj MedoidsH&jj Cluster&jj) END=fin; LENGTH listC listH $ 30000; RETAIN listC listH ' '; IF (Cluster&jj=&ik) THEN DO; IF (0 < MedoidsC&jj <= &medoids) THEN listC=TRIM"(LEFT(COMPBL(TRIM(LEFT(listC))||' '||TRIM(LEFT(Series))))); IF (0 < MedoidsH&jj <= &medoids) THEN listH=TRIM(LEFT(COMPBL(TRIM(LEFT(listH))||' '||TRIM(LEFT(Series))))); END; IF fin THEN DO; CALL SYMPUT('ListClC',TRIM(LEFT(" listC))); CALL SYMPUT('ListClH',TRIM(LEFT(listH))); END; RUN; DATA _NULL_; IF (&&NbCl&ik <= &summary) THEN nbfact=&&NbCl&ik -1; ELSE nbfact=&summary; CALL SYMPUT('nbfact',TRIM(LEFT(PUT(nbfact,5.))))"; RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT NFACTORS=&nbfact OUT=FactorC(KEEP=&date Factor1-Factor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"W(&syserr NE 0)" PROC PRINCOMP DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT N=&nbfact PREFIX=Factor OUT=FactorC(KEEP=&date Factor1-Factor&nbfact); VAR &&ListCl&ik; RUN;"W"{o DATA &outmed.C_&jj; MERGE &outmed.C_&jj _trav_(KEEP=&date &ListClC) FactorC(RENAME=("'[qIJ1&nbfact1") Factor&ij=MC&jj._CL&ik._F&ij"q")); BY &date; RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT NFACTORS=&nbfact OUT=FactorH(KEEP=&date Factor1-Factor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"_(&syserr NE 0)" PROC PRINCOMP DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT N=&nbfact PREFIX=Factor OUT=FactorH(KEEP=&date Factor1-Factor&nbfact); VAR &&ListCl&ik; RUN;"_"{o DATA &outmed.H_&jj; MERGE &outmed.H_&jj _trav_(KEEP=&date &ListClH) FactorH(RENAME=("'csIJ1&nbfact1") Factor&ij=MH&jj._CL&ik._F&ij"s"+)); BY &date; RUN;"f" DATA &outmed.C_&jj; MERGE &outmed.C_&jj _trav_(KEEP=&date &&ListCl&ik); BY &date; RUN; DATA &outmed.H_&jj; MERGE &outmed.H_&jj _trav_(KEEP=&date &&ListCl&ik); BY &date; RUN;"n"_NETTOY"( &_nettoy FactorC FactorH"j" PROC SORT DATA=Medoids; BY series; RUN; DATA &outdata(DROP=Factor1) Medoids(KEEP=Series Cluster&jj Factor1 Medoids&jj); LENGTH Series $ 32; MERGE &outdata Medoids; BY series; IF ((Medoids&jj=.) AND (UPCASE(Series)^=UPCASE("pd"&vary"))) THEN Medoids&jj=1; IF (Factor1=.) THEN Factor1=1; LABEL Series=' ' Medoids&jj=' '"%o(%LENGTH(&vary) NE 0)"2& MedoidsH&jj=' ' MedoidsC&jj=' '"o"VJ; RUN; PROC SORT DATA=Medoids; BY Cluster&jj Medoids&jj; RUN;"(t(%UPCASE(&print) EQ YES)" PROC TABULATE DATA=Medoids; CLASS Cluster&jj; VAR Factor1; TABLE Cluster&jj all,Factor1*((Mean Median STD Qrange Min Q1 Q3 MaxĖ()*F=6.3 N*F=5.0 COLPCTN*F=5.1) /RTS=15; KEYLABEL COLPCTN='%'; LABEL Factor1="@4'Dispersion of the Series in each Cluster'; RUN;"t"((%UPCASE(&graph) EQ YES)"  PROC BOXPLOT DATA=Medoids GOUT=Method&jj; PLOT Factor1* Cluster&jj / CAXIS=black CTEXT=black CBOXES=black VAXIS=axis1 HAXIS=axis1 BOXSTYLE=schematic BOXWIDTHSCALE=0.5 IDCOLOR=black IDSYMBOL=dot; TITLE ' ';"  SYMBOL1 C=black H=0.5; AXIS1 LABEL=none; RUN; QUIT; SYMBOL;AXIS;TITLE; DATA _NULL_; SET Medoids END=fin; LENGTH liste $ 30000; RETAIN liste; BY Cluster&jj; IF FIRST.Cluster&jj THEN DO; liste=' ';"  n+1; END; IF (Medoids&jj <= &medoids) THEN liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series))))); IF LAST.Cluster&jj THEN CALL SYMPUT('ListCl'||TRIM(LEFT(PUT(Cluster&jj,5.))),TRIM(LEFT(liste))); IF fin THEN CALL"pd SYMPUT('NumCl',TRIM(LEFT(PUT(n,5.)))); RUN; PROC IML; USE _trav_; READ all VAR {"&|xIJ1&NumCl1" &&ListCl&ij"x" } INTO medoids; CLOSE _trav_; max=ROUND(MAX(medoids)+0.1,0.1); min=ROUND(MIN(medoids)-0.1,0.1); k=(max-min)/10; IF (k>=1) THEN pas=CEIL(k); ELSE pas=CEIL(10*k)/10; maxcoef=100+(INT((max-100)/pas)+1)#pas;"  mincoef=100-(INT((100-min)/pas)+1)#pas; CALL SYMPUT('maxcoef',CHAR(maxcoef,20.1)); CALL SYMPUT('mincoef',CHAR(mincoef,20.1)); CALL SYMPUT('pas',CHAR(pas,20.1)); CALL SYMPUT('div',CHAR(INT(&NumCl/4),4.)); CALL SYMPUT('mod',"."CHAR(MOD(&NumCl,4),4.)); QUIT;"(yIJ1&medoids1"* SYMBOL&ij I=join V=none;"y" GOPTIONS CBACK=white BORDER DEVICE=win FTEXT=swissb noPROMPT noDISPLAY; PROC GPLOT DATA=_trav_ UNIFORM GOUT=Method&jj; AXIS1 LABEL=NONE ORDER=&mincoef TO &maxcoef BY &pas;"&zIJ1&NumCl1" PLOT (&&ListCl&ij) * &date / OVERLAY FRAME VAXIS=axis1 NAME="cl&ij"; FORMAT &date MONYY5.; TITLE "Cluster &ij"; RUN;"z"  QUIT; GOPTIONS display; PROC GREPLAY IGOUT=Method&jj TC=Method&jj NOFS GOUT=Method&jj; TDEF newfour DES='four squares of equal size' 1/LLX=1 LLY=51 ULX=1 ULY=99 URX=49 URY=99 LRX=49 LRY=51 color=grey 2/LLX=51 LLY=51 ULX=51" ULY=99 URX=99 URY=99 LRX=99 LRY=51 color=grey 3/LLX=1 LLY=1 ULX=1 ULY=49 URX=49 URY=49 LRX=49 LRY=1 color=grey 4/LLX=51 LLY=1 ULX=51 ULY=49 URX=99 URY=49 LRX=99 LRY=1 color=grey ; TEMPLATE newfour;"${IJ1&div1"ym TREPLAY 1: cl%EVAL(4*(&ij-1)+1) 2:cl%EVAL(4*(&ij-1)+2) 3:cl%EVAL(4*(&ij-1)+3) 4:cl%EVAL(4*(&ij-1)+4);"{" (&mod NE 0)" TREPLAY"$}IJ1&mod1"% &ij: cl%EVAL(4*&div+&ij)"}" ;""6* RUN; QUIT; AXIS;SYMBOL;TITLE;""^"_NETTOY"A 1&_nettoy _t1_ _eff_ Fstat Factor Medoids FactorX"&(%LENGTH(&debug) EQ 0)"WK PROC DATASETS LIB=WORK NOLIST; DELETE &_nettoy ; RUN; QUIT;""' QUIT; AXIS;SYMBOL;TITLE;"t #0` P@p0` P$l$0$ L  8 ( < X l 0 <,L(<d<\Ŗ+)" PROC SORT DATA=_outts_; BY series &date; RUN; DATA _outts_; LENGTH &date Xorig Xint Xlin Calendar TD EE Outliers AO LS TC UserReg &varreg TrendCycle SAseries Seasonal TransIR 8; MERGE _outts_ &out(KEEP=series Lam); BY series;"  KEEP Series &date Xorig Xint Xlin Calendar TD EE Outliers AO LS TC UserReg TrendCycle SAseries Seasonal TransIR forecast Lam; RENAME TransIR=Irregular SAseries=Sadjust Seasonal=Season TD=TradingDays EE=Holidays; ARRAY cent AO LS TC Calendar TD EE"ui TransIR Seasonal; IF (Lam = 1) THEN DO; Preadj=Xorig-Xlin; Calendar=TD+EE; Outliers=AO+LS+TC;"(!(%LENGTH(&varreg ) NE 0)"2& UserReg=Preadj-Outliers-Calendar;""" UserReg=0;" END; ELSE DO; Preadj=Xorig/Xlin; DO OVER cent;cent=cent/100;END; Calendar=TD*EE; Outliers=AO*LS*TC; IF (Outliers*Calendar > 0) THEN DO;"(&(%LENGTH(&varreg ) NE 0)"4( UserReg=Preadj/(Outliers*Calendar);"'" UserReg=1;"! END; END; RUN;"=J-((&outtype EQ 1) OR (%UPCASE(&graph) EQ YES))" DATA"%-gI1&_nser1"." &&_var&i(RENAME=(Xorig=&&_var&i))"g"-!; SET _outts_; DROP series;"%1hI1&_nser1";/ IF series="&&_var&i" THEN OUTPUT &&_var&i;"h" RUN;"<7,((&outtype EQ 1) AND (%LENGTH(&excel) NE 0))"%6iI1&_nser1" X "del &excel\&&_var&i...xls"; PROC DBLOAD DBMS=EXCEL DATA=&&_var&i; PATH="&excel\&&_var&i...xls"; PUTNAMES YES; FORMAT &date eurdfde9.; LIMIT=0; LOAD; RUN;"i"7"_NETTOY_"" &_nettoy_ _nomser_"I(&graph NE NO)" >(&_nser > &gmax)"O?ERROR: The graphs will not be output: there are too many series"/ERROR: Check the GMAX parameter"H"_NETTOY_"# &_nettoy_ __graph__"&HmIZ1&_nser1" DATA __graph__; SET &&_var&iz(WHERE=(forecast=0)); RUN; %SAgraph(DATA=__graph__,DATE=&date,CATG=&&_var&iz.._TS,RAW=&&_var&iz,XLIN=xlin,SA=Sadjust,SEASON=Season,IRR=Irregular, TREND=TrendCycle,TDAYS=Calendar,OUTL="/#Outliers,USR=UserReg,DEBUG=&debug);"G(&outtype NE 1)"_NETTOY_"# &_nettoy_ &&_var&iz"G"m"I"J"?k/((&outtype EQ 2) OR (%UPCASE(&x12diag) EQ YES))"N (&forecast=0)"I= DATA _outts_; SET _outts_; IF forecast=0; RUN;"N"  DATA Xorig1 Xlin1 Xint1 Sadjust1 TrendCycle1; SET __trav__; KEEP &date &tseries; RUN; DATA Season1 Calendar1 Outliers1 UserReg1 Irregular1 TradingDays1 Holidays1 TC1 AO1 LS1; LENGTH &date &tseries 8; SET __trav__(KEEP=&date &tseries);"%RpI1&_nser1";/ IF (&&_var&i ^=.) THEN &&_var&i=&&_mean&i;"p" RUN;"_NETTOY_" &_nettoy_ Xorig1 Xlin1 Xint1 TrendCycle1 Sadjust1 Season1 Calendar1 Outliers1 UserReg1 Irregular1 TradingDays1 Holidays1 TC1 AO1 LS1"  PROC SORT DATA=_outts_; BY &date series; RUN; PROC CONTENTS DATA=_outts_(DROP=&date series forecast lam) OUT=_nomvar_(KEEP=name) NOPRINT; RUN; DATA _NULL_; SET _nomvar_ END=fin; LENGTH lfiles $ 10000; RETAIN lfiles ' '; lfiles="TRIM(LEFT(lfiles))||' '||TRIM(LEFT(name)); IF fin THEN DO; CALL SYMPƖ*"F6ERROR: The regeff (®eff ) parameter must be numeric"FINMACRO" ;""((®eff NE 0) AND (®eff NE 1) AND (®eff NE 2) AND (®eff NE 3) AND (®eff NE 4) AND (®eff NE 5) AND (®eff NE 6))"]MERROR: The regeff (®eff ) parameter must be choosen among (0 1 2 3 4 5 6 )"FINMACRO" ;""%(%LENGTH(&rsa ) EQ 0)"RSA" 0""<,(%LENGTH(%QSCAN(%BQUOTE(&rsa ),2, )) NE 0)"TDERROR: You must precise just one value for the rsa (&rsa ) parameter"FINMACRO" ;"")(%DATATYP(&rsa ) EQ CHAR)"@0ERROR: The rsa (&rsa ) parameter must be numeric"FINMACRO" ;""((&rsa NE 0) AND (&rsa NE 1) AND (&rsa NE 2) AND (&rsa NE 3) AND (&rsa NE 4) AND (&rsa NE 5) AND (&rsa NE 6) AND (&rsa NE 9))"XHERROR: The rsa (&rsa ) parameter must be choosen among (0 1 2 3 4 5 6 9)"FINMACRO" ;""%(%LENGTH(&lam ) EQ 0)"LAM" 0""<,(%LENGTH(%QSCAN(%BQUOTE(&lam ),2, )) NE 0)"TDERROR: You must precise just one value for the lam (&lam ) parameter"FINMACRO" ;"")(%DATATYP(&lam ) EQ CHAR)"@0ERROR: The lam (&lam ) parameter must be numeric"FINMACRO" ;"">.((&lam NE 0) AND (&lam NE 1) AND (&lam NE -1))"P@ERROR: The lam (&lam ) parameter must be choosen among (0 1 -1 )"FINMACRO" ;""((%LENGTH(&easter ) EQ 0)"EASTER" 0""?/(%LENGTH(%QSCAN(%BQUOTE(&easter ),2, )) NE 0)"ZJERROR: You must precise just one value for the easter (&easter ) parameter"FINMACRO" ;"",(%DATATYP(&easter ) EQ CHAR)"F6ERROR: The easter (&easter ) parameter must be numeric"FINMACRO" ;""G7((&easter NE 0) AND (&easter NE 1) AND (&easter NE -1))"VFERROR: The easter (&easter ) parameter must be choosen among (0 1 -1 )"FINMACRO" ;""&(%LENGTH(&idur ) EQ 0)"IDUR" 6""=-(%LENGTH(%QSCAN(%BQUOTE(&idur ),2, )) NE 0)"VFERROR: You must precise just one value for the idur (&idur ) parameter"FINMACRO" ;""*(%DATATYP(&idur ) EQ CHAR)"B2ERROR: The idur (&idur ) parameter must be numeric"FINMACRO" ;"" (&idur LE 0 )"/ERROR: You must have &idur > 0"FINMACRO" ;""$(%LENGTH(&va ) NE 0)";+(%LENGTH(%QSCAN(%BQUOTE(&va ),2, )) NE 0)"RBERROR: You must precise just one value for the va (&va ) parameter"FINMACRO" ;""((%DATATYP(&va ) EQ CHAR)">.ERROR: The va (&va ) parameter must be numeric"ǖ<+UT('lfiles',TRIM(LEFT(lfiles))); CALL SYMPUT('nbfiles',LEFT(PUT(_N_,5.))); END; RUN;"'cqI1&nbfiles1"NNAME"! %SCAN(&lfiles,&i)" PROC TRANSPOSE DATA=_outts_(KEEP=series &date &nname) OUT=&nname(DROP=_NAME_); VAR &nname ; BY &date; ID series; RUN; DATA &nname; MERGE &nname.1 &nname"^((&lpbseats NE) AND ((&nname EQ TrendCycle) OR (&nname EQ Sadjust) OR (&nname EQ Irregular) OR (&nname EQ Calendar) OR (&nname EQ Season)))") (DROP=&lpbseats)"^"( ; BY &date; RUN;"<b,((&outtype EQ 2) AND (%LENGTH(&excel) NE 0))" X "del &excel\&nname..xls"; PROC DBLOAD DBMS=EXCEL DATA=&nname; PATH="&excel\&nname..xls"; PUTNAMES YES; FORMAT &date eurdfde9.; LIMIT=0; LOAD; RUN;"b"q"*j(%UPCASE(&x12diag) EQ YES)" DATA _NULL_; SET &out END=fin; LENGTH lseries $ 10000; RETAIN lseries ' '; IF (Model_S=' ') THEN lseries=TRIM(LEFT(lseries))||' '||TRIM(LEFT(series)); IF fin THEN CALL SYMPUT('lseries',TRIM(LEFT(lseries))); RUN; %"Characteristics_D(VARRAW=Xint,VARSA=Sadjust,VARTCY=TrendCycle,VARLIN=Xlin, VARSF=Season,VARIRR=Irregular,VARTD=calendar,VAROUT=outliers, VARAO=ao,VARTC=tc,VARLS=ls,VDROP=&lseries, DATE=date,"OUTSTATS=__OutStats__,TRANSPOSE=yes,DEBUG=&debug); PROC SORT DATA=__OutStats__; BY series; RUN; DATA &out; MERGE &out __OutStats__; BY series; RUN;"_NETTOY_"& &_nettoy_ __OutStats__"j"k"&o(%LENGTH(&excel) NE 0)"  DATA _NULL_; CALL SYMPUT('out1',TRIM(LEFT(SUBSTR("&out",INDEX("&out",'.')+1)))); RUN; X "del &excel\&out1..xls"; PROC DBLOAD DBMS=EXCEL DATA=&out; PATH="&excel\&out1..xls"; PUTNAMES YES; FORMAT RSA Mean P D Q BP BD BQ TD EEaster 1.0;"( LIMIT=0; LOAD; RUN;"o"s (&debug EQ)" X "cd &dtramo"; X "del &dtramo.\serie /Q"; X "del &dtramo.\seats.itr /Q"; X "del &dtramo.\OUTPUT\*.* /Q"; X "del &dtramo.\GRAPH\*.* /S /Q"; X "cd &dseats"; X "del &dseats.\serie /Q"; X "del &dseats.\OUTPUT\*.* /Q"; X", "del &dseats.\GRAPH\*.* /S /Q";"s"i] DATA ___tt___; SET ___tt___; end=DATETIME(); time=end-start; PUT time= time.; RUN;"w (&debug EQ)"VJ PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_; RUN; QUIT;"w" #x0` P@p8h(XHx,h p  p  L  $ 8 t 4T  4H@(h0xD\lXx4L\pP \t0HXl8Xx0HXl(4L\ppL H ` p !x!!!!!!""T"""""#P#h#x###$4$D$X$$$$$%\%t%%%% &$&4&H&&&''$'L'`'t''' (8(H(\((((()()X)p)))))H*`*p****++(+D+t++++++,,0,t,,,,-@------4.L.,FINMACRO" ;"" (&va LE 0 )"-ERROR: You must have &va > 0"FINMACRO" ;"""* (%LENGTH(&forecast ) EQ 0)"FORECAST" 0""A1(%LENGTH(%QSCAN(%BQUOTE(&forecast ),2, )) NE 0)"^NERROR: You must precise just one value for the forecast (&forecast ) parameter"FINMACRO" ;"".(%DATATYP(&forecast ) EQ CHAR)"J:ERROR: The forecast (&forecast ) parameter must be numeric"FINMACRO" ;""!(&forecast LT 0 )"E5ERROR: You must have &forecast greater of equal to 0"FINMACRO" ;""&(%LENGTH(&trad ) EQ 0)"TRAD" 0"+"=!-(%LENGTH(%QSCAN(%BQUOTE(&trad ),2, )) NE 0)"VFERROR: You must precise just one value for the trad (&trad ) parameter"FINMACRO" ;"!"*&(%DATATYP(&trad ) EQ CHAR)"B2ERROR: The trad (&trad ) parameter must be numeric"FINMACRO" ;"+"+((&trad NE 0) AND (&trad NE 1) AND (&trad NE 2) AND (&trad NE 6) AND (&trad NE 7) AND (&trad NE -1) AND (&trad NE -2) AND (&trad NE -6) AND (&trad NE -7))"aQERROR: The trad (&trad ) parameter must be choosen among (0 1 2 6 7 -1 -2 -6 -7 )"FINMACRO" ;"+"'/(%LENGTH(&print ) EQ 0)"PRINT" NO"@"PRINT" %UPCASE(&print)">6.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"WGERROR: You must precise just one value for the print (&print) parameter"FINMACRO" ;"6"*;(%DATATYP(&print ) EQ NUM)"E5ERROR: The print (&print) parameter must be character"FINMACRO" ;"@"4@$((&print NE YES) AND (&print NE NO))"RBERROR: The print (&print) parameter must be choosen among (YES NO)"FINMACRO" ;"@"ERREUR" 0" DATA _NULL_; IF (INT(&idur ) ^= &idur ) THEN CALL SYMPUT('erreur','1'); IF (INT(&forecast ) ^= &forecast ) THEN CALL SYMPUT('erreur','1'); RUN;"H(&erreur EQ 1)"aQERROR: one of the parameters (idur forecast) is not of the requested integer type"FINMACRO" ;"H"_NETTOY_" ___tt___" X "cd &dtramo"; X "del &dtramo.\serie /Q"; X "del &dtramo.\_vg*.txt /Q"; X "del &dtramo.\seats.itr /Q"; X "del &dtramo.\OUTPUT\*.* /Q"; X "del &dtramo.\GRAPH\*.* /S /Q"; DATA __trav__(DROP=period) __period__(KEEP=period); SET &data("F:KEEP=&date &tseries &varreg) END=fin; period=DIF(&date);"&O(%LENGTH(&tdrop) NE 0)" DROP &tdrop;"O" RUN;"_NETTOY_". &_nettoy_ __trav__ __period__"Y (&period EQ)" PROC SUMMARY DATA=__period__; VAR period; OUTPUT OUT=_means_ MEAN=period; RUN; DATA _NULL_; SET _means_; IF ((25<=period) AND (period<=35)) THEN period=12; ELSE IF ((-50<=period) AND (period<=70)) THEN period=6; ELSE IF ((80<=" period) AND (period<=100)) THEN period=4; ELSE IF ((115<=period) AND (period<=135)) THEN period=3; ELSE IF ((175<=period) AND (period<=195)) THEN period=2; ELSE IF ((345<=period) AND (period<=375)) THEN period=1; CALL SYMPUT('period',TRIM(LEFT"&(PUT(period,2.)))); RUN;"_NETTOY_"" &_nettoy_ _means_"Y" PROC CONTENTS DATA=__trav__(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _nomvar_; SET _nomvar_(IN=in); IF in THEN prov=1; name=UPCASE(name); IF (name ^= UPCASE("&date")); RUN;"_NETTOY_"" &_nettoy_ _nomvar_"a (&varreg NE)" PROC CONTENTS DATA=__trav__(KEEP=&varreg) NOPRINT OUT=_nomvar1_(KEEP= name); RUN; DATA _nomvar_; SET _nomvar_ _nomvar1_(IN=in); IF in THEN prov=2; name=UPCASE(name); IF (name ^= UPCASE("&date")); RUN;"_NETTOY_"# &_nettoy_ _nomvar1_"a"s PROC SORT DATA=_nomvar_; BY name prov; RUN; PROC FREQ DATA=_nomvar_ NOPRINT; TABLES name / OUT=table; RUN;"_NETTOY_" &_nettoy_ table" DATA _null_; LENGTH liste $ 30000; RETAIN liste ' '; SET table END=fin; IF (count > 1) THEN liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); IF fin THEN CALL SYMPUT('liste',TRIM(LEFT(liste))); RUN;"i (&liste NE)"tdWARNING: The following variables are both regression variables and variables to be analyzed (&liste)"YIWARNING: They have been removed from the list of variables to be analyzed"i"  DATA _null_; LENGTH list1 list2 $ 10000; RETAIN list1 list2 ' '; SET _nomvar_ END=fin; BY name prov; IF LAST.name; IF (prov=1) THEN DO; ii+1; CALL SYMPUT('_var'!!LEFT(PUT(ii,4.)),TRIM(LEFT(name))); list1=TRIM(LEFT(list1))||' '||TRIM"(LEFT(name)); END; ELSE IF (prov=2) THEN DO; jj+1; CALL SYMPUT('_rvar'!!LEFT(PUT(jj,4.)),TRIM(LEFT(name))); list2=TRIM(LEFT(list2))||' '||TRIM(LEFT(name)); END; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(ii,4.))); CALL SYMPUT("'ireg',LEFT(PUT(jj,4.))); CALL SYMPUT('tseries',TRIM(LEFT(list1))); CALL SYMPUT('varreg',TRIM(LEFT(list2))); END; RUN; DATA _nomvar_; LENGTH nser 4 series newname $ 32;"%oCI1&_nser1"SG nser=&i; newname=UPCASE("&&_var&i"); series="X&i"; OUTPUT;"C" RUN; PROC IML; USE __trav__; READ all VAR{&tseries} INTO x; READ all VAR{&date} INTO date; CLOSE __trav__; nvar=NCOL(x); xseries={&tseries}; names={"%sDI1&_nser1" X&i"D"_S}; first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0); miss=J(nvar,1,0);"w (&add EQ -1)" min=x[><,] - 1; cc=LOC(min <=-1); IF (NCOL(cc)^=0) THEN x[,cc]=x[,cc]-REPEAT(T(min[cc]),NROW(x),1); cc=LOC(min > -1); IF (NCOL(cc)^=0) THEN min[cc]=0; add=ABS(T(min));"x"0$ add=J(nvar,1,&add); x=x+&add;"  min=T(x[><,]); mean=T(x[:,]); max=T(x[<>,]); period=J(nvar,1,&period); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL"(LOC(aa^=.)); miss[i]=NCOL(LOC(aa=.)); x[cc[1]:cc[NCOL(cc)],i]=CHOOSE(aa=.,-99999,aa); END; END; nbyear=INT(nobs/period);"} (&rsa >= 0)"# rsa=J(nvar,1,&rsa);"}" (&rsa EQ 9)"2& rsa=4*(nbyear <=8)+5*(nbyear > 8);"–." results=period || first || last || nobs || nbyear || rsa || miss || add || max || min || mean; nomcols={'Period' 'First' 'Last' 'Nobs' 'Nbyear' 'RSA' 'TSmiss' 'Add' 'Max' 'Min' 'Mean'};" (&varreg NE)"WK USE __trav__; READ all VAR{&varreg} INTO varreg; CLOSE __trav__;""& FILE "&dtramo.\serie";"%JI1&_nser1"  annee=YEAR(first[&i]); nom=names[&i]; perdeb=INT(period[&i] * (MONTH(first[&i]) -1) / 12) +1; per=period[&i]; nnobs=nobs[&i]; PUT @1 nom $32. / @1 nnobs +2 annee +2 perdeb +2 per; cc=LOC(x[,&i]^=.); IF (NCOL(cc)^=0) THEN DO j=cc"ZN[1] TO cc[NCOL(cc)]; xx=x[j,&i]; PUT xx 20.5; END; rrsa=rsa[&i];" (&rsa GT 0)" IF (&i=1) THEN PUT @2 "$INPUT RSA=" rrsa +1 ",ITER=3,SEATS=2,OUT=0,VA=&va,IREG=&ireg$"; ELSE PUT @2 "$INPUT RSA=" rrsa +1 ",SEATS=2,OUT=0,IREG=&ireg$";"" (&model NE)"  PUT @2 "$INPUT LAM=&lam,IEAST=&easter,ITRAD=&trad,IDUR=&idur,IATIP=1,AIO=2,SEATS=2,OUT=0,VA=&va,IREG=&ireg,"; PUT @2 "P=%SCAN(&model,1),D=%SCAN(&model,2),Q=%SCAN(&model,3),BP=%SCAN(&model,4),BD=%SCAN(&model,5),BQ=%SCAN(&model,6)"; IF (&i=1"E9) THEN PUT @2 ",ITER=3$"; ELSE PUT @2 "$";"" IF (&i=1) THEN PUT @2 "$INPUT LAM=&lam,INIC=3,IDIF=3,IEAST=&easter,ITRAD=&trad,IDUR=&idur,IATIP=1,AIO=2,SEATS=2,OUT=0,VA=&va,IREG=&ireg,ITER=3$"; ELSE PUT @2"u "$INPUT LAM=&lam,INIC=3,IDIF=3,IEAST=&easter,ITRAD=&trad,IDUR=&idur,IATIP=1,AIO=2,SEATS=2,OUT=0,VA=&va,IREG=&ireg$";" (&varreg NE)" vv=varreg[cc[1]:NROW(varreg),]; ilong=NROW(vv); PUT @2 "$REG IUSER=-1,NSER=&ireg,REGEFF=®eff,ILONG=" +1 ilong "$"; PUT @2 "_vg&i..txt"; FILE "&dtramo.\_vg&i..txt"; DO j=1 TO ilong; DO k=1 TO NCOL(vv); xx=vv[j,k];"wk IF (xx=.) THEN xx=0; PUT xx 16.5 +1 @; END; PUT; END; FILE "&dtramo.\serie";""J"  CREATE statdes FROM results[COLNAME=nomcols]; APPEND FROM results; CLOSE statdes; QUIT; DATA statdes; LENGTH data $ 50 series $ 32 firstdat lastdat $ 5 period 8; SET _nomvar_; SET statdes; firstdat=PUT(first,MONYY5.); lastdat=PUT("pdlast,MONYY5.); IF INDEX("&data",'.') THEN data=SCAN("&data",2,'.'); ELSE data="&data"; RUN;"_NETTOY_"! &_nettoy_ statdes" X "cd &dtramo"; X "tramo serie"; %lectramo(DIR=&dtramo.\output,TABOUT=tramo,TABSER=outtramo,FSTAT=statdes,PRINT=&print);"_NETTOY_"a Q&_nettoy_ tfit tdeterm tcalend toutlier tregvar tarmapar tramo outtramo _listing_" PROC SORT DATA=statdes; BY series; RUN; PROC SORT DATA=tramo; BY series; RUN; PROC SUMMARY DATA=tramo; VAR td easter; OUTPUT OUT=stats MAX=; RUN; DATA _NULL_; SET stats; CALL SYMPUT('yestd',LEFT(PUT(td,3.))); CALL SYMPUT("6*'yeseast',LEFT(PUT((easter>0),3.))); RUN;"_NETTOY_" &_nettoy_ stats" DATA &out; LENGTH data $ 50 series Nickname $ 32; MERGE statdes tramo(DROP=nobs); BY series; LENGTH liste $ 10000; RETAIN liste ' '; Nickname=series; series=newname; DROP first last nser newname liste" (&rsa EQ)" rsa"" (&yestd LE 0)"SG TD1 TD1_t TD2 TD2_t TD3 TD3_t TD4 TD4_t TD5 TD5_t TD6 TD6_t LY LY_t"" (&yestd EQ 2)"A5 TD2 TD2_t TD3 TD3_t TD4 TD4_t TD5 TD5_t TD6 TD6_t""(&yeseast EQ 0)" EE EE_tÖ/"" ;" (&varreg NE)"$SI1&ireg1"QE RENAME reg&i = %SCAN(&varreg,&i) reg&i._t = %SCAN(&varreg,&i)_t ;"S""  overdif=((&limar <= SUM(OF Phi1-Phi3) <= 1) + (&limar <= SUM(OF BPhi1-BPhi2) <= 1) > 0); underdif=((&limma <= SUM(OF Th1-Th3) <= 1) + (&limma <= SUM(OF Bth1-Bth2) <= 1) > 0); CALL SYMPUT('liste',TRIM(LEFT(liste))); CALL SYMPUT('_mean'||LEFT(PUT(" nser,5.)),LEFT(PUT((Lam=0),2.))); RUN; PROC SORT DATA=&out; BY series; RUN; PROC SORT DATA=outtramo; BY series year per; RUN; DATA outtramo(DROP=per year newname nobs oldname) pbtramo(KEEP=oldname pbtramo RENAME=(oldname=series)); LENGTH"  &date 8 pbtramo 3; MERGE statdes(KEEP=series newname nobs period first last) outtramo END=fin; BY series; oldname=series; series=newname; pbtramo=0; IF (per = .) THEN DO; PUT 'WARNING: problem with TRAMO for series' +1 series; pbtramo=" 1; END; ELSE DO; &date=MDY(INT((per-1)*12/period)+1,1,year); OUTPUT outtramo; END; IF FIRST.series THEN OUTPUT pbtramo; RUN; PROC SORT DATA=outtramo OUT=outtramo; BY &date series; RUN; DATA _outts_(DROP=mois); SET outtramo;"  BY &date series; LENGTH forecast mois 3; DROP lastdate first last period; lastdate=INTNX('month',last,&forecast*12/period); mois=MONTH(&date); IF (&date <= last) THEN forecast=0; ELSE IF (&date <= lastdate) THEN forecast=1; ELSE forecast="2;" (&varreg NE)"$TI1&ireg1"1% RENAME reg&i = %SCAN(&varreg,&i);"T"" RUN;"_NETTOY_") &_nettoy_ _outts_ pbtramo" PROC SORT DATA=_outts_; BY series &date; RUN; DATA _outts_; LENGTH &date Xorig Xint Xlin Residuals Calendar TD EE Outliers AO LS TC UserReg 8; MERGE _outts_ &out(KEEP=series Lam); BY series; KEEP Series &date Xorig Xint Xlin"  Residuals Calendar TD EE Outliers AO LS TC UserReg &varreg forecast Lam; ARRAY cent AO LS TC Calendar TD EE; IF (Lam = 1) THEN DO; Preadj=Xorig-Xlin; Calendar=TD+EE; Outliers=AO+LS+TC; UserReg=Preadj-Outliers-Calendar; END; ELSE DO;" Preadj=Xorig/Xlin; DO OVER cent;cent=cent/100;END; Calendar=TD*EE; Outliers=AO*LS*TC; IF (Outliers*Calendar > 0) THEN UserReg=Preadj/(Outliers*Calendar); END; IF (forecast <=1); RUN;"(&outtype EQ 1)" DATA"%VI1&_nser1"." &&_var&i(RENAME=(Xorig=&&_var&i))"V"-!; SET _outts_; DROP series;"%WI1&_nser1";/ IF series="&&_var&i" THEN OUTPUT &&_var&i;"W" RUN;"_NETTOY_"" &_nettoy_ _nomser_""(&outtype EQ 2)" DATA Xorig1 Xlin1 Xint1; SET __trav__; KEEP &date &tseries; RUN; DATA Calendar1 Outliers1 UserReg1 TD1 EE1 TC1 AO1 LS1 Residuals1; LENGTH &date &tseries 8; SET __trav__(KEEP=&date &tseries);"%YI1&_nser1";/ IF (&&_var&i ^=.) THEN &&_var&i=&&_mean&i;"Y" RUN;"_NETTOY_"i Y&_nettoy_ Xorig1 Xlin1 Xint1 Calendar1 Outliers1 UserReg1 Residuals1 TD1 EE1 TC1 AO1 LS1" PROC SORT DATA=_outts_; BY &date series; RUN; PROC CONTENTS DATA=_outts_(DROP=&date series forecast lam &varreg) OUT=_nomvar_(KEEP=name) NOPRINT; RUN; DATA _NULL_; SET _nomvar_ END=fin; LENGTH lfiles $ 10000; RETAIN lfiles ' ';" lfiles=TRIM(LEFT(lfiles))||' '||TRIM(LEFT(name)); IF fin THEN DO; CALL SYMPUT('lfiles',TRIMܖ0UE fr&i._"( J0&&grank&i1"A5 &&rval&i._&j = "de &&rmin&i._&j &&rmax&i._&j""" ;"" RUN;"" PROC MEANS DATA=_trav_ NOPRINT MISSING COMPLETETYPES NWAY; CLASS &newvar ; VAR &respvar; OUTPUT OUT=_&stat._(DROP=_type_ _freq_) &stat=&respvar;" (&newform NE)"  FORMAT &newform;""3' RUN; DATA _&stat._ ; SET _&stat._;"(&nbrank GE 1)" RENAME"&"I1&nbrank1" r&i=&&vrank&i""" ;""0$ LABEL &respvar="&respvar (&stat)""(&nbrank GE 1)"&#I1&nbrank1" r&i=' '"#""u; RUN; DATA _&stat._ ; SET _&stat._; LENGTH _Label_ Rows $ 50; _Label_=%SCAN(&vars,1); Rows=%SCAN(&vars,2);"(&nbrank GE 1)"&$I1&nbrank1" IF (TRIM(LEFT("&&vrank&i"))=SCAN(UPCASE("&vars"),1)) THEN _Label_=TRIM(LEFT(PUT(&&vrank&i,fr&i._.))); IF (TRIM(LEFT("&&vrank&i"))=SCAN(UPCASE("&vars"),2)) THEN Rows=TRIM(LEFT(PUT(&&vrank&i,fr&i._.)));"$"" RUN;"NAME" %SCAN(&vars,1)" PROC SORT DATA= _&stat._; BY &name; RUN; DATA _&stat._; LENGTH Columns $ 32; SET _&stat._ END=fin; BY &name; RETAIN n 0; DROP n; IF FIRST.&name THEN DO; n=n+1; CALL SYMPUT("_label_"||TRIM(LEFT(PUT(n,5.))),TRIM(LEFT(_Label_)));" END; Columns = TRIM(LEFT(COMPRESS("&name"||'_'||PUT(n,5.)))); IF fin THEN CALL SYMPUT('nbcols',TRIM(LEFT(PUT(n,5.)))); RUN;"NAME" %SCAN(&vars,2)" PROC SORT DATA= _&stat._; BY &name; RUN; PROC TRANSPOSE DATA=_&stat._ OUT=MyTable(DROP=_Name_ _Label_); BY Rows NOTSORTED; ID Columns; VAR &respvar; IDLABEL _Label_; RUN;"NAME" %SCAN(&vars,1)" %mpolish(DATA=MyTable,COLS=&name._1-&name._&nbcols,LIGNES=Rows,DIAGN=oui,PRINT=non,ITER=,FORMAT=,POWER=,CRES=,CREG=,DEBUG=&debug);" (&debug NE)"C7 OPTIONS MPRINT NOTES NOXWAIT NOCENTER LS=250 PS=500;""QE OPTIONS NOMPRINT NONOTES NOSOURCE2 NOCENTER NOXWAIT LS=250 PS=500;"s PROC PRINT DATA=MyTable NOOBS LABEL; TITLE "Raw Table (&vars)"; RUN; DATA _mpolish_; SET _mpolish_; LABEL"&'I1&nbcols1") &name._&i ="&&_label_&i""'"{o; PROC PRINT DATA=_mpolish_ NOOBS LABEL; TITLE "Result of the Median Polish Analysis (&vars)"; RUN; TITLE;"#0` P  thp,DX,d(8LtD \ l $ < L ` ( h   @ X l H`pX<Pdx(8Lxx(8Pd|\| 0X`lx\ l !(!p!!!! "$"4"H"""#l#####$$$,$L$t$$$%%%%&'<(d())L)l)))))*L+T+x++++,,4,H,P,d,x, -@-`-t----.$.,.<.P.......|///000001 2222333\4x444$55556|6ݖ1(LEFT(lfiles))); CALL SYMPUT('nbfiles',LEFT(PUT(_N_,5.))); END; RUN;"'ZI1&nbfiles1"NNAME"! %SCAN(&lfiles,&i)" PROC TRANSPOSE DATA=_outts_(KEEP=series &date &nname) OUT=&nname(DROP=_NAME_); VAR &nname ; BY &date; ID series; RUN; DATA &nname; MERGE &nname.1 &nname; BY &date; RUN;"Z"" (&debug EQ)" X "cd &dtramo"; X "del &dtramo.\serie /Q"; X "del &dtramo.\_vg*.txt /Q"; X "del &dtramo.\seats.itr /Q"; X "del &dtramo.\OUTPUT\*.* /Q"; X "del &dtramo.\GRAPH\*.* /S /Q";""i] DATA ___tt___; SET ___tt___; end=DATETIME(); time=end-start; PUT time= time.; RUN;" (&debug EQ)"VJ PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_; RUN; QUIT;""#0` P@p8h(XDX 4@,4   \ ( H  8 L h | $ 4 H x (Pdx4DX,DXl 0Dt0$8 x(H(<dt0|8t,l0xT,@T  Ld !4!H!\!!!""("T"""""#`#x######$D$$$$$%P%h%x%%%,&D&T&h&&&&& 'd'|''''(((8(L(l((((((8))))))0*H*X*l******+4+L+`+t++,0,@,T,,,,, -0-x------..X...../\/t///P00000101D1X1p111(2@2P2d222233H333333444,5D5T5h555667,7@7T7l777899 :0:D:;4;X;t;`<x<<<0=H=h=H>d>>4?H?T@\ABDBBBXCCCCCDDD E,FFFGG4GhG|GHHdHHHH I,JJJ\KpKKLLLM4NPNXOOOOPhQQQ4RLRRSST$T U(U 0"FINMACRO" ;""((%LENGTH(&nbcomp ) EQ 0)"NBCOMP" 10""?/(%LENGTH(%QSCAN(%BQUOTE(&nbcomp ),2, )) NE 0)"ZJERROR: You must precise just one value for the nbcomp (&nbcomp ) parameter"FINMACRO" ;"",(%DATATYP(&nbcomp ) EQ CHAR)"F6ERROR: The nbcomp (&nbcomp ) parameter must be numeric"FINMACRO" ;""(&nbcomp LE 0 )"1!ERROR: You must have &nbcomp > 0"FINMACRO" ;""'(%LENGTH(&arima ) EQ 0)"ARIMA" 2"">.(%LENGTH(%QSCAN(%BQUOTE(&arima ),2, )) NE 0)"XHERROR: You must precise just one value for the arima (&arima ) parameter"FINMACRO" ;""+(%DATATYP(&arima ) EQ CHAR)"D4ERROR: The arima (&arima ) parameter must be numeric"FINMACRO" ;""C3((%UPCASE(&arima) NE 1) AND (%UPCASE(&arima) NE 2))"P@ERROR: The arima (&arima ) parameter must be choosen among (1 2)"FINMACRO" ;""((%LENGTH(&outnew ) EQ 0)"OUTNEW" _outnew_""?/(%LENGTH(%QSCAN(%BQUOTE(&outnew ),2, )) NE 0)"ZJERROR: You must precise just one value for the outnew (&outnew ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outnew ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outnew (&outnew ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outcah ) EQ 0)"OUTCAH" _outcah_""?/(%LENGTH(%QSCAN(%BQUOTE(&outcah ),2, )) NE 0)"ZJERROR: You must precise just one value for the outcah (&outcah ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outcah ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outcah (&outcah ) parameter must be a valid SAS dataset name"FINMACRO" ;"")(%LENGTH(&outdata ) EQ 0)"OUTDATA" _outdata_""@0(%LENGTH(%QSCAN(%BQUOTE(&outdata ),2, )) NE 0)"\LERROR: You must precise just one value for the outdata (&outdata ) parameter"FINMACRO" ;""4( %sasnom(_IN_=&outdata ,TYPE=DATASET);" (&_ret_ NE 0)"YIERROR: The outdata (&outdata ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outmed ) EQ 0)"OUTMED" _outmed_""? /(%LENGTH(%QSCAN(%BQUOTE(&outmed ),2, )) NE 0)ٖ65"ZJERROR: You must precise just one value for the outmed (&outmed ) parameter"FINMACRO" ;" "3' %sasnom(_IN_=&outmed ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outmed (&outmed ) parameter must be a valid SAS dataset name"FINMACRO" ;""*(%LENGTH(&clusters ) EQ 0)"CLUSTERS" _clusters_""A1(%LENGTH(%QSCAN(%BQUOTE(&clusters ),2, )) NE 0)"^NERROR: You must precise just one value for the clusters (&clusters ) parameter"FINMACRO" ;""5) %sasnom(_IN_=&clusters ,TYPE=DATASET);" (&_ret_ NE 0)"[KERROR: The clusters (&clusters ) parameter must be a valid SAS dataset name"FINMACRO" ;""("(%LENGTH(&nbclus ) EQ 0)"NBCLUS" 5"1"?'/(%LENGTH(%QSCAN(%BQUOTE(&nbclus ),2, )) NE 0)"ZJERROR: You must precise just one value for the nbclus (&nbclus ) parameter"FINMACRO" ;"'",,(%DATATYP(&nbclus ) EQ CHAR)"F6ERROR: The nbclus (&nbclus ) parameter must be numeric"FINMACRO" ;"1"1(&nbclus LE 0 )"1!ERROR: You must have &nbclus > 0"FINMACRO" ;"1")5(%LENGTH(&summary ) EQ 0)"SUMMARY" 0"D"@:0(%LENGTH(%QSCAN(%BQUOTE(&summary ),2, )) NE 0)"\LERROR: You must precise just one value for the summary (&summary ) parameter"FINMACRO" ;":"-?(%DATATYP(&summary ) EQ CHAR)"H8ERROR: The summary (&summary ) parameter must be numeric"FINMACRO" ;"D" D(&summary LT 0 )"3#ERROR: You must have &summary >= 0"FINMACRO" ;"D"'H(%LENGTH(&graph ) EQ 0)"GRAPH" NO"W">M.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"XHERROR: You must precise just one value for the graph (&graph ) parameter"FINMACRO" ;"M"*R(%DATATYP(&graph ) EQ NUM)"F6ERROR: The graph (&graph ) parameter must be character"FINMACRO" ;"W"FW6((%UPCASE(&graph) NE YES) AND (%UPCASE(&graph) NE NO))"TDERROR: The graph (&graph ) parameter must be choosen among (YES NO )"FINMACRO" ;"W")[(%LENGTH(&graphsh ) EQ 0)"GRAPHSH" NO"j"@`0(%LENGTH(%QSCAN(%BQUOTE(&graphsh ),2, )) NE 0)"\LERROR: You must precise just one value for the graphsh (&graphsh ) parameter"FINMACRO" ;"`",e(%DATATYP(&graphsh ) EQ NUM)"J:ERROR: The graphsh (&graphsh ) parameter must be character"FINMACRO" ;"j"Jj:((%UPCASE(&graphsh) NE YES) AND (%UPCASE(&graphsh) NE NO))"XHERROR: The graphsh (&grapږ76hsh ) parameter must be choosen among (YES NO )"FINMACRO" ;"j")n(%LENGTH(&medoids ) EQ 0)"MEDOIDS" 1"}"@s0(%LENGTH(%QSCAN(%BQUOTE(&medoids ),2, )) NE 0)"\LERROR: You must precise just one value for the medoids (&medoids ) parameter"FINMACRO" ;"s"-x(%DATATYP(&medoids ) EQ CHAR)"H8ERROR: The medoids (&medoids ) parameter must be numeric"FINMACRO" ;"}" }(&medoids LE 0 )"2"ERROR: You must have &medoids > 0"FINMACRO" ;"}"&(%LENGTH(&gmax ) EQ 0)"GMAX" 50""=-(%LENGTH(%QSCAN(%BQUOTE(&gmax ),2, )) NE 0)"VFERROR: You must precise just one value for the gmax (&gmax ) parameter"FINMACRO" ;""*(%DATATYP(&gmax ) EQ CHAR)"B2ERROR: The gmax (&gmax ) parameter must be numeric"FINMACRO" ;"" (&gmax LE 0 )"/ERROR: You must have &gmax > 0"FINMACRO" ;""'(%LENGTH(&print ) EQ 0)"PRINT" NO"">.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"XHERROR: You must precise just one value for the print (&print ) parameter"FINMACRO" ;""*(%DATATYP(&print ) EQ NUM)"F6ERROR: The print (&print ) parameter must be character"FINMACRO" ;""F6((%UPCASE(&print) NE YES) AND (%UPCASE(&print) NE NO))"TDERROR: The print (&print ) parameter must be choosen among (YES NO )"FINMACRO" ;""((%LENGTH(&method ) EQ 0)"METHOD" 2""ERREUR" 0"l` PROC IML; method={&method}; IF (TYPE(method) = 'C') THEN CALL SYMPUT('erreur','1'); QUIT;"(&erreur EQ 1)"XHERROR: the method parameter (&method) should contain numeric values only"FINMACRO" ;""ERREUR" 0"  PROC IML; method={&method}; newmeth=.; cc=LOC((method=0) | (method=1) | (method=2) | (method=3) | (method=4) | (method=5) | (method=9)); IF (NCOL(cc)=0) THEN CALL SYMPUT('erreur','1'); IF (NCOL(LOC(method=9))^=0) THEN newmeth={. 0 1 2 3 4};" ELSE DO; IF (NCOL(LOC(method=0))^=0) THEN newmeth=newmeth || {0}; IF (NCOL(LOC(method=1))^=0) THEN newmeth=newmeth || {1}; IF (NCOL(LOC(method=2))^=0) THEN newmeth=newmeth || {2}; IF (NCOL(LOC(method=3))^=0) THEN newmeth=newmeth || {3};" IF (NCOL(LOC(method=4))^=0) THEN newmeth=newmeth || {4}; IF (NCOL(LOC(method=5))^=0) THEN newmeth=newmeth || {5}; END; CALL SYMPUT('newmeth',TRIM(LEFT(COMPBL(ROWCAT(CHAR(newmeth,5,0)))))); QUIT;"(&erreur EQ 1)"qaERROR: the method parameter (&method) should contain at least a value among (0, 1, 2, 3, 4, 5, 9)"FINMACRO" ;""METHOD" &newmeth"  DATA _NULL_; CALL SYMPUT('nblaga',TRIM(LEFT(PUT(INۖ=7T(&nblaga),10.)))); CALL SYMPUT('nblagf',TRIM(LEFT(PUT(INT(&nblagf),10.)))); CALL SYMPUT('summary',TRIM(LEFT(PUT(INT(&summary),10.)))); CALL SYMPUT('gmax',TRIM(LEFT(PUT(INT(&gmax),10.))))" ; CALL SYMPUT('medoids',TRIM(LEFT(PUT(INT(&medoids),10.)))); RUN; PROC CONTENTS DATA=&data(KEEP=&var) OUT=_nomvar_(KEEP=name label) NOPRINT; RUN; DATA _nomvar_; LENGTH List $ 32000;; SET _nomvar_ END=f; KEEP Name Series Label; RETAIN" List ' '; RENAME name=Ident; IF ((UPCASE(name) ^= UPCASE("&date")) AND (UPCASE(name) ^= UPCASE("&vary"))) THEN DO; ii+1; Series=TRIM(LEFT(COMPRESS('X'||PUT(ii,8.)))); CALL SYMPUT('_v'!!LEFT(PUT(ii,6.)),TRIM(LEFT(name))); CALL SYMPUT("'_var'!!LEFT(PUT(ii,6.)),TRIM(LEFT(Series))); List=TRIM(LEFT(COMPBL(TRIM(LEFT(List))||' '||TRIM(LEFT(Series))))); OUTPUT; END; IF f THEN DO; CALL SYMPUT('_nvar',LEFT(PUT(ii,6.))); CALL SYMPUT ('listvar',TRIM(LEFT(List))); END; RUN;"9- PROC SORT DATA=_nomvar_; BY Series; RUN;"_NETTOY" _nomvar_"h\ DATA _trav_; SET &data(KEEP=&var &date &vary); _datechar_=PUT(&date,MONYY5.); RENAME"%SI1&_nvar1" &&_v&i=&&_var&i"S"; RUN;"_NETTOY" &_nettoy _trav_"((%UPCASE(&graph) EQ YES)" (&gmax EQ)"GMAX" &_nvar""L@ GOPTIONS CBACK=white BORDER DEVICE=win FTEXT=swissb noPROMPT"$(%LENGTH(&eps) NE 0)"bV DEVICE=psepsf GSFNAME=grafout GSFMODE=replace &rotate; FILENAME grafout "&eps";""%(%LENGTH(&jpeg) NE 0)"YM DEVICE=jpeg GSFNAME=grafout GSFMODE=replace; FILENAME grafout "&jpeg";""; DATA _NULL_; gmax=MIN(&_nvar,INT(&gmax)); k=LOG(gmax)/LOG(2); gmax=2**(k+1)-1; CALL SYMPUT('gmax',LEFT(PUT(gmax,4.))); CALL SYMPUT('div',LEFT(PUT(INT(&nbclus/4),4.))); CALL SYMPUT('mod',LEFT(PUT(MOD(&nbclus,4),4.))); RUN;""  PROC IML; USE _trav_; READ all VAR{&listvar &vary} INTO x; READ all VAR{&date} INTO date; CLOSE _trav_; nvar=NCOL(x); nobs=NROW(x); series=T({&listvar &vary}); mean=x[:,]; std=SQRT((x-REPEAT(mean,nobs,1))[##,]); first=J("nvar,1,.); last=J(nvar,1,.); numobs=J(nvar,1,0); nmiss=J(nvar,1,0); max=x[<>,]; min=x[><,]; period=J(nvar,1,.); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]];"  aa=x[cc,i]; numobs[i]=NCOL(cc); nmiss[i]=(cc[NCOL(cc)]-cc[1]+1)-numobs[i]; jj=(last[i]-first[i])/numobs[i]; IF ((25<=jj) & (jj<=35)) THEN period[i]=12; ELSE IF ((50<=jj) & (jj<=70)) THEN period[i]=6; ELSE IF ((80<=jj) & (jj<=" 100)) THEN period[i]=4; ELSE IF ((115<=jj) & (jj<=135)) THEN period[i]=3; ELSE IF ((175<=jj) & (jj<=195)) THEN period[i]=2; ELSE IF ((345<=jj) & (jj<=375)) THEN period[i]=1; END; END; nbyear=INT(numobs/period); results=period || first" || last || numobs || nmiss || nbyear || T(max) || T(min) || T(mean) || T(std); nomcols={period first last nobs nmiss nbyear max min mean std}; CREATE &outdata FROM results[ROWNAME=series COLNAME=nomcols]; APPEND FROM results[ROWNAME=series];" CLOSE &outdata; missing=(NMISS(x))[,+]; cc=LOC(missing=0); CALL SYMPUT('nbcom',TRIM(LEFT(CHAR((NCOL(cc)>=(3*period[1])),5,0)))); cc=LOC(std=0); CALL SYMPUT('nbcst',TRIM(LEFT(CHAR(NCOL(cc),5,0)))); CALL SYMPUT('nbmiss',TRIM(LEFT(CHAR(MAX("^Rnmiss),5,0)))); CALL SYMPUT('nbper',TRIM(LEFT(CHAR(RANGE(period),5,0)))); QUIT;"(&nbmiss NE 0)"RBEԖ98;; %END; %IF (&nuser NE 0) %THEN %DO; ARRAY coefreg{&nuser} &listuser; ARRAY studreg{&nuser} %DO i=1 %TO &nuser; %SCAN(&listuser,&i)_t %END;; %END; %IF (&indirect EQ 1) %THEN %DO; ARRAY"  dirnum mcd ric Irreg Tcycle Season Padj Tdays ris fsb1 p_fsb1 fsd8 p_fsd8 kw p_kw msf p_msf m1-m11 q qm2 fail; ARRAY idirnum imcd iric iIrreg iTcycle iSeason iPadj iTdays iris ifsb1 ip_fsb1 ifsd8 ip_fsd8 ikw ip_kw imsf ip_msf im1-im11 iq iqm2 ifail;"  ARRAY othernum aape0-aape3 aic aicc bic hq VarMLE &listtrad r1mse r1mse3 r1rmse r1rmse3 r2mse r2mse3 r2rmse r2rmse3 %IF (((<rad1 NE) OR (<rad2 NE)) AND (&lly NE)) %THEN %DO; PchiTDLY %END; %IF ((<rad1"  NE) OR (<rad2 NE)) %THEN %DO; PchiTD %END; %IF (&lseasonal NE ) %THEN %DO; &lseasonal %END; %IF (&userreg NE) %THEN %DO i=1 %TO &nuser; %SCAN(&listuser,&i) %SCAN(&listuser,&i)_t"  %END; %IF (&maxar1 NE 0) %THEN %DO i=1 %TO &maxar1; AR1_&i AR1_&i._t %END; %IF (&maxar2 NE 0) %THEN %DO i=1 %TO &maxar2; AR2_&i AR2_&i._t %END; %IF (&maxma1 NE 0) %THEN %DO i=1 %TO &maxma1; MA1_&i MA1_&i._t %END"; %IF (&maxma2 NE 0) %THEN %DO i=1 %TO &maxma2; MA2_&i MA2_&i._t %END; ao ls tc rp so %IF (&maxao NE 0) %THEN %DO i=1 %TO &maxao; AO&i AO&i._t %END; %IF (&maxls NE 0) %THEN %DO i=1 %TO &maxls; LS&i LS&i._t %END;" %IF (&maxtc NE 0) %THEN %DO i=1 %TO &maxtc; TC&i TC&i._t %END; %IF (&maxrp NE 0) %THEN %DO i=1 %TO &maxrp; RP&i RP&i._t %END; %IF (&maxso NE 0) %THEN %DO i=1 %TO &maxso; SO&i SO&i._t %END; ; ARRAY othercar"  automd arimamdl TDeffect LYeffect Eeffect Transform Aictrans SAmode Finmode %IF (&maxao NE 0) %THEN %DO i=1 %TO &maxao; DAO&i %END; %IF (&maxls NE 0) %THEN %DO i=1 %TO &maxls; DLS&i %END; %IF (&maxtc NE 0) %THEN %DO i=1 %TO"  &maxtc; DTC&i %END; %IF (&maxrp NE 0) %THEN %DO i=1 %TO &maxrp; DRP&i %END; %IF (&maxso NE 0) %THEN %DO i=1 %TO &maxso; DSO&i %END; ; %END; IF (xx=:'srsnam:') THEN DO; IF nvar THEN DO; Outliers=ao+tc+ls"+rp+so; IF (Aictrans=' ') THEN Aictrans=Transform; Eeffect='No';TDeffect='No';LYeffect='No'; %IF (&leaster NE) %THEN %DO; IF (ABS(Easter_t) > 2) THEN Eeffect='Yes'; %END; %IF (<rad2 NE) %THEN %DO; IF (MAX(ABS("Weekday_t),ABS(SatSun_t)) > 2) THEN TDeffect='Yes'; %END; %IF (<rad1 NE) %THEN %DO; IF (MAX(ABS(Monday_t),ABS(Tuesday_t),ABS(Wednesday_t),ABS(Thursday_t),ABS(Friday_t), ABS(Saturday_t),ABS(Sunday_t))> 2) THEN TDeffect='Yes';" %END; %IF (&lly NE) %THEN %DO; IF (ABS(LeapYear_t) > 2) THEN LYeffect='Yes'; %END; OUTPUT; %IF (&indirect EQ 1) %THEN %DO; IF indirect THEN DO; name=COMPBL(name || " (Ind)"); DO OVER dirnum;dirnum="idirnum;END; DO OVER othernum;othernum=.;END; DO OVER othercar;othercar=' ';END; idseas=iidseas; peakseas=ipeakseas; peaktd=ipeaktd; Outliers=.; indirect=0; OUTPUT; END; %END; END;"  nvar+1; DO OVER varnumx;varnumx=.;END; DO OVER varcharx;varcharx=' ';END; ars=0;arns=0;mas=0;mans=0;ao=0;ls=0;tc=0;rp=0;so=0; INPUT @8 name $; END; ELSE IF (xx=:'automd') THEN automd=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx=:" 'arimamdl') THEN arimamdl=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx =:'freq:') THEN period=INPUT(TRIM(LEFT(SCAN(xx,2,':'))),3.); ELSE IF (xx =:'aictrans') THEN Aictrans=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'transform') THEN Transform=TRIM(LEFT"(SCAN(xx,2,':'))); ELSE IF (xx =:'finmode') THՖ:9EN Finmode=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'samode') THEN DO; samode=TRIM(LEFT(SCAN(xx,2,':'))); IF (LEFT(UPCASE(SAmode))=:'ADDITIVE') THEN Finmode='additive'; IF (LEFT(UPCASE(" SAmode))=:'MULTIPLICATIVE') THEN Finmode='multiplicative'; END; ELSE IF (xx=:'arimamdl:') THEN arimamdl=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'trendma') THEN TrendMA=TRIM(LEFT(SCAN(xx,2,':'))); ELSE IF (xx =:'seasonalma') THEN SeasonalMA="TRIM(LEFT(COMPBL(SCAN(xx,2,':')))); ELSE IF (xx=:'aape.0:') THEN INPUT @8 aape0; ELSE IF (xx=:'aape.1:') THEN INPUT @8 aape1; ELSE IF (xx=:'aape.2:') THEN INPUT @8 aape2; ELSE IF (xx=:'aape.3:') THEN INPUT @8 aape3; ELSE IF (xx=:'aic:')" THEN INPUT @6 aic; ELSE IF (xx=:'aicc:') THEN INPUT @6 aicc; ELSE IF (xx=:'bic:') THEN INPUT @6 bic; ELSE IF (xx=:'variance$mle') THEN DO; n=INDEX(xx,':')+1; INPUT @n VarMLE; END; ELSE IF (xx=:'hq:') THEN INPUT @5 hq; %IF (" &leaster NE) %THEN %DO; IF (xx=:'Easter[') THEN DO; n=INDEX(xx,':')+1; INPUT @n Easter a Easter_t; END; %END; %IF (<rad2 NE) %THEN %DO; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Weekday:')) THEN DO; n=INDEX(xx,':')+1" ; INPUT @n Weekday a Weekday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Sat/Sun:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n SatSun a SatSun_t; END; %END; %IF (&lly NE) %THEN %DO; IF ((xx=:'Leap Year') AND (SCAN"(xx,2,'$')=:'Leap Year:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n LeapYear a LeapYear_t; END; %END; %IF (&lconstant NE) %THEN %DO; n=INDEX(xx,':')+1; IF (xx=:'Constant$Constant:') THEN INPUT @n Constant a Constant_t; %END;"  %IF (&lseasonal NE) %THEN %DO; n=INDEX(xx,':')+1; IF (xx=:'Seasonal$Jan:') THEN INPUT @n Jan a Jan_t; IF (xx=:'Seasonal$Feb:') THEN INPUT @n Feb a Feb_t; IF (xx=:'Seasonal$Mar:') THEN INPUT @n Mar a Mar_t; IF (xx=:'Seasonal$Apr:')" THEN INPUT @n Apr a Apr_t; IF (xx=:'Seasonal$May:') THEN INPUT @n May a May_t; IF (xx=:'Seasonal$Jun:') THEN INPUT @n Jun a Jun_t; IF (xx=:'Seasonal$Jul:') THEN INPUT @n Jul a Jul_t; IF (xx=:'Seasonal$Aug:') THEN INPUT @n Aug a Aug_t;"  IF (xx=:'Seasonal$Sep:') THEN INPUT @n Sep a Sep_t; IF (xx=:'Seasonal$Oct:') THEN INPUT @n Oct a Oct_t; IF (xx=:'Seasonal$Nov:') THEN INPUT @n Nov a Nov_t; IF (xx=:'Seasonal$Dec:') THEN INPUT @n Dec a Dec_t; %END; %IF (<rad1 NE) %" THEN %DO; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Mon:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Monday a Monday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Tue:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Tuesday" a Tuesday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Wed:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Wednesday a Wednesday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Thu:')) THEN DO; n=INDEX(xx,':')+1;"  INPUT @n Thursday a Thursday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Fri:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Friday a Friday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Sat:')) THEN DO; n=" INDEX(xx,':')+1; INPUT @n Saturday a Saturday_t; END; IF ((xx=:'Trading Day') AND (SCAN(xx,2,'$')=:'Sun:')) THEN DO; n=INDEX(xx,':')+1; INPUT @n Sunday a Sunday_t; END; %END; %IF (((<rad1 NE) OR (<rad2 NE)) AND (&lly"  NE)) %THEN %DO; IF (xx=:'chi$Combined Trading Day and Leap Year Regressors') THEN DO; n=INDEX(xx,':')+1; INPUT @n a b c; PchiTDLY=c; END; %END; %IF (<rad1 NE) %THEN %DO; IF (xx=:'chi$Trading Day') THEN DO; n=INDEX(" xx,':')+1; INPUT @n a b c; PchiTD=c; ֖;: END; %END; %IF (&maxar2 NE 0) %THEN %DO; IF (xx=:'AR$Seasonal') THEN DO; ars+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefar2(ars)=a; studar2(ars)=c; END; %END; %" IF (&maxar1 NE 0) %THEN %DO; IF (xx=:'AR$Nonseasonal') THEN DO; arns+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefar1(arns)=a; studar1(arns)=c; END; %END; %IF (&maxma2 NE 0) %THEN %DO; IF (xx=:'MA$Seasonal') THEN DO"; mas+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefma2(mas)=a; studma2(mas)=c; END; %END; %IF (&maxma1 NE 0) %THEN %DO; IF (xx=:'MA$Nonseasonal') THEN DO; mans+1; n=INDEX(xx,':')+1; INPUT @n a b c;" coefma1(mans)=a; studma1(mans)=c; END; %END; %IF (&maxao NE 0) %THEN %DO; IF INDEX(UPCASE(xx),'OUTLIER$AO') THEN DO; ao+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefao(ao)=a; studao(ao)=c; dateao(ao)=" SUBSTR(SCAN(xx,2,'$:'),3); END; %END; %IF (&maxtc NE 0) %THEN %DO; IF INDEX(UPCASE(xx),'OUTLIER$TC') THEN DO; tc+1; n=INDEX(xx,':')+1; INPUT @n a b c; coeftc(tc)=a; studtc(tc)=c; datetc(tc)=SUBSTR(SCAN(xx,2,'$:'" ),3); END; %END; %IF (&maxls NE 0) %THEN %DO; IF INDEX(UPCASE(xx),'OUTLIER$LS') THEN DO; ls+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefls(ls)=a; studls(ls)=c; datels(ls)=SUBSTR(SCAN(xx,2,'$:'),3); END; %" END; %IF (&maxrp NE 0) %THEN %DO; IF INDEX(UPCASE(xx),'OUTLIER$RP') THEN DO; rp+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefrp(rp)=a; studrp(rp)=c; daterp(rp)=SUBSTR(SCAN(xx,2,'$:'),3); END; %END; %IF (&maxso" NE 0) %THEN %DO; IF INDEX(UPCASE(xx),'OUTLIER$SO') THEN DO; so+1; n=INDEX(xx,':')+1; INPUT @n a b c; coefso(so)=a; studso(so)=c; dateso(so)=SUBSTR(SCAN(xx,2,'$:'),3); END; %END; %IF (&nuser NE 0) %THEN %DO;" IF (xx=:'User-defined$') THEN DO; d=TRIM(LEFT(SCAN(xx,2,'$:'))); n=INDEX(xx,':')+1; INPUT @n a b c; DO i=1 TO &nuser; IF d=SCAN("&listuser",i,' ') THEN DO; coefreg(i)=a; studreg(i)=c; END; END;" END; IF (xx=:'chi$User-defined') THEN DO; n=INDEX(xx,':')+1; INPUT @n a b c; PchiUser=c; END; %END; IF (xx=:'indirect') THEN indirect=1; ELSE IF (xx=:'f2.mcd:') THEN INPUT @8 mcd; ELSE IF (xx=:'f2.ic') THEN" INPUT @9 ric; ELSE IF (xx=:'f2.f:') THEN INPUT @7 (Irreg Tcycle Season Padj Tdays)(8.2); ELSE IF (xx=:'f2.is') THEN INPUT @9 ris; ELSE IF (xx=:'f2.fsb1') THEN INPUT @10 fsb1 p_fsb1; ELSE IF (xx=:'f2.fsd8') THEN DO; xx=TRANWRD(xx,"'***********',' 999999 '); INPUT @10 fsd8 p_fsd8; END; ELSE IF (xx=:'f2.kw') THEN INPUT @9 kw p_kw; ELSE IF (xx=:'f2.msf') THEN INPUT @9 msf p_msf; ELSE IF (xx=:'f3.m01') THEN INPUT @9 m1; ELSE IF (xx=:'f3.m02') THEN INPUT @9 m2;" ELSE IF (xx=:'f3.m03') THEN INPUT @9 m3; ELSE IF (xx=:'f3.m04') THEN INPUT @9 m4; ELSE IF (xx=:'f3.m05') THEN INPUT @9 m5; ELSE IF (xx=:'f3.m06') THEN INPUT @9 m6; ELSE IF (xx=:'f3.m07') THEN INPUT @9 m7; ELSE IF (xx=:'f3.m08') THEN" INPUT @9 m8; ELSE IF (xx=:'f3.m09') THEN INPUT @9 m9; ELSE IF (xx=:'f3.m10') THEN INPUT @9 m10; ELSE IF (xx=:'f3.m11') THEN INPUT @9 m11; ELSE IF (xx=:'f3.q:') THEN INPUT @7 q; ELSE IF (xx=:'f3.qm2') THEN INPUT @9 qm2; ELSE IF (xx=:"'f3.fail') THEN INPUT @10 fail; ELSE IF (xx=:'f2.idseasonal:') THEN idseas=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF ((xx=:'peaks.seas:') OR (xx=:'peaks.seas.dir:')) THEN peakseas=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF ((xx=:'peaks.td:') OR (xx=:" 'peaks.td.dir:')) THEN peaktd=LEFT(TRIM(SCAN(xx,2,':'))); %IF (&indirect ז@;EQ 1) %THEN %DO; ELSE IF (xx=:'if2.mcd:') THEN INPUT @9 imcd; ELSE IF (xx=:'if2.ic') THEN INPUT @9 iric; ELSE IF (xx=:'if2.f:') THEN INPUT @7 (iIrreg iTcycle iSeason" iPadj iTdays)(8.2); ELSE IF (xx=:'if2.is') THEN INPUT @9 iris; ELSE IF (xx=:'if2.fsb1') THEN INPUT @10 ifsb1 ip_fsb1; ELSE IF (xx=:'if2.fsd8') THEN DO; xx=TRANWRD(xx,'***********',' 999999 '); INPUT @10 ifsd8 ip_fsd8; END;" ELSE IF (xx=:'if2.kw') THEN INPUT @9 ikw ip_kw; ELSE IF (xx=:'if2.msf') THEN INPUT @9 imsf ip_msf; ELSE IF (xx=:'if3.m01') THEN INPUT @9 im1; ELSE IF (xx=:'if3.m02') THEN INPUT @9 im2; ELSE IF (xx=:'if3.m03') THEN INPUT @9 im3;"  ELSE IF (xx=:'if3.m04') THEN INPUT @9 im4; ELSE IF (xx=:'if3.m05') THEN INPUT @9 im5; ELSE IF (xx=:'if3.m06') THEN INPUT @9 im6; ELSE IF (xx=:'if3.m07') THEN INPUT @9 im7; ELSE IF (xx=:'if3.m08') THEN INPUT @9 im8; ELSE IF (xx=:"'if3.m09') THEN INPUT @9 im9; ELSE IF (xx=:'if3.m10') THEN INPUT @9 im10; ELSE IF (xx=:'if3.m11') THEN INPUT @9 im11; ELSE IF (xx=:'if3.q:') THEN INPUT @7 iq; ELSE IF (xx=:'if3.qm2') THEN INPUT @9 iqm2; ELSE IF (xx=:'if3.fail') THEN"  INPUT @10 ifail; ELSE IF (xx=:'if2.idseasonal:') THEN iidseas=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx=:'r1mse:') THEN INPUT @9 r1mse r1mse3; ELSE IF (xx=:'r1rmse:') THEN INPUT @9 r1rmse r1rmse3; ELSE IF (xx=:'r2mse:') THEN INPUT @9 r2mse" r2mse3; ELSE IF (xx=:'r2rmse:') THEN INPUT @9 r2rmse r2rmse3; ELSE IF (xx=:'peaks.seas.ind:') THEN ipeakseas=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx=:'peaks.td.ind:') THEN ipeaktd=LEFT(TRIM(SCAN(xx,2,':'))); %END; IF (xx=:" 'seatsmdl:') THEN Seatsmdl=TRIM(LEFT(SCAN(xx,2,':'))); IF fin THEN DO; Outliers=ao+tc+ls+rp+so; IF (Aictrans=' ') THEN Aictrans=Transform; Eeffect='No';TDeffect='No';LYeffect='No'; %IF (&leaster NE) %THEN %DO; IF (ABS(Easter_t)" > 2) THEN Eeffect='Yes'; %END; %IF (<rad2 NE) %THEN %DO; IF (MAX(ABS(Weekday_t),ABS(SatSun_t)) > 2) THEN TDeffect='Yes'; %END; %IF (<rad1 NE) %THEN %DO; IF (MAX(ABS(Monday_t),ABS(Tuesday_t),ABS(Wednesday_t),ABS("Thursday_t),ABS(Friday_t), ABS(Saturday_t),ABS(Sunday_t))> 2) THEN TDeffect='Yes'; %END; %IF (&lly NE) %THEN %DO; IF (ABS(LeapYear_t) > 2) THEN LYeffect='Yes'; %END; OUTPUT; %IF (&indirect EQ 1) %THEN %DO; IF" indirect THEN DO; name=COMPBL(name || " (Ind)"); DO OVER dirnum;dirnum=idirnum;END; DO OVER othernum;othernum=.;END; DO OVER othercar;othercar=' ';END; idseas=iidseas; peakseas=ipeakseas; peaktd=ipeaktd;" Outliers=.; OUTPUT; END; %END; END; RUN; X "cd &dir."; X "copy &outt series.txt"; %IF (%SYSFUNC(FILEEXIST(%CMPRES("&dir.\series.txt"))) EQ 0) %THEN %DO; %LET errx12=1; %GOTO finlec; %END; DATA &outser;" INFILE "&dir.\series.txt" EXPANDTABS LENGTH=l END=fin; LENGTH name type $ 15 year month 3 value 8; RETAIN name type ' '; KEEP date value name type; INPUT xx $VARYING200. l @; IF (xx=:'date') THEN DO; name=TRIM(LEFT(SCAN(xx,2)));" type=PUT(TRIM(LEFT(SCAN(xx,3))),$ftype.); END; ELSE IF ((xx=:'--') OR (xx=' ')) THEN DELETE; ELSE DO; INPUT year 1-4 month 5-6 value; IF (&period EQ 12) THEN date=MDY(month,1,year); ELSE date=YYQ(year,month); OUTPUT;"/# END; RUN; %finlec: %MEND;"((%LENGTH(&tseries) EQ 0)"TSERIES" _NUMERIC_""_NETTOY_" __tables__"((%LENGTH(&tseries) NE 0)"  PROC CONTENTS DATA=&data(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUNЖq<\.p...../l/////000@0T0 1p11111122,2L2222 3 3L333334X4p44444455<5|55566@666667X7p7777777848t8888949|99999@:X:h:|::::: ;x;;;;;$<<<L<`<<<<<<====@>X>h>|>>>?`@@@@@@A0A8BDClCCCCDDDDEE F4FFFFGG\HHHIJKKL$LLMM MMMdNxNNOLPhPPPPPQQQPRdRpSDT`TU(UPU\VVVpWWX$YYYZ8[P[t[T\l\\(]@]],^D^X^p^^^^_4`L`t`a8aaabbbbbbcHc\cxcccDdldddde e\epe|fghijklmhnnnnnodo|oopqrsst4t.ERROR: The summary parameter is also set to 0."SUMMARY" 0" DATA _NULL_; method=COMPBL(TRANWRD("&method",'0',' ')); method=COMPBL(TRANWRD(method,'1',' ')); method=COMPBL(TRANWRD(method,'5',' ')); CALL SYMPUT('method',TRIM(LEFT(method))); RUN;" (&method EQ)"*ERROR: No method to apply."FINMACRO" ;"""9- PROC SORT DATA=&outdata; BY series; RUN;"ERROR" 0"  PROC IML; START moymob(xserie,movav,coef); movav=J(NROW(xserie),1,0); mmob1=xserie[LOC(xserie ^= .)]; nobs=NROW(mmob1); mmob2=J(nobs,1,.); ordre=NROW(coef); ncols=NCOL(coef); nb=INT(ordre / 2); IF (ordre <= nobs) THEN DO;"  mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef[,ncols]),T(mmob1))[ordre:nobs]); END; ELSE mmob2=J(nobs,1,mmob1[:]); mmob2[1:nb]=T(T(mmob1[1:ordre])*coef[,1:nb]); mmob2[nobs:nobs-nb+1]=T(T(mmob1[nobs:nobs-ordre+1])*coef[,1:nb]); movav[LOC(xserie" ^= .)]=mmob2; FINISH moymob; USE _trav_; READ all VAR{&listvar &vary} INTO x; READ all VAR{&date} INTO date; READ all VAR{_datechar_} INTO datechar; CLOSE _trav_; nvar=NCOL(x); nobs=NROW(x); xx=J(nobs,nvar,.); listvar={"&date"" &listvar &vary}; series={&listvar}; numobs=J(nvar,1,0); mean=x[:,]; std=SQRT((x-REPEAT(mean,nobs,1))[##,]); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; aa=x[cc,i]; numobs[i]=NCOL(cc);"$(%UPCASE(&dif) NE 0)"qe x[cc[1+&dif]:cc[NCOL(cc)],i]=aa[&dif+1:numobs[i]]-aa[1:numobs[i]-&dif]; x[1:cc[&dif],i]=.;"" END; END;"+ (%UPCASE(&standard) EQ YES)" cc=LOC(std > 10**-8); ncolcc=NCOL(cc); IF (ncolcc ^=0) THEN DO i=1 TO ncolcc; dd=LOC(x[,cc[i]]^=.); IF (NCOL(dd)^=0) THEN DO; aa=(x[dd,cc[i]]-REPEAT(mean[cc[i]],NCOL(dd),1))/REPEAT(std[cc[i]],NCOL(dd),1); x[dd,cc[i]]=aa;" END; END; cc=LOC(std < 10**-8); ncolcc=NCOL(cc); IF (ncolcc ^=0) THEN DO i=1 TO ncolcc; dd=LOC(x[,cc[i]]^=.); IF (NCOL(dd)^=0) THEN x[dd,cc[i]]=0; END;" " x0= date || x; CREATE _trav_ FROM x0[ROWNAME=datechar COLNAME=listvar]; APPEND FROM x0[ROWNAME=datechar]; CLOSE _trav_;"!%INDEX(&method,0)" missing=(NMISS(x))[,Җ>he var (&var ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"G"&U(%LENGTH(&vary ) NE 0)"<M,(%LENGTH(%QSCAN(%BQUOTE(&vary),2, )) NE 0)"UEERROR: You must precise just one value for the vary (&vary) parameter"FINMACRO" ;"M"\P DATA _NULL_; SET &data (KEEP=&vary OBS=1); ARRAY _xx_(*) &vary; RUN;"T(&syserr NE 0)"G7ERROR: There is a problem in the vary (&vary) parameter"VFERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type?"FINMACRO" ;"T"U"&Z(%LENGTH(&date ) EQ 0)";+ERROR: You must precise a SAS date variable"FINMACRO" ;"a"]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"a(&syserr NE 0)"H8ERROR: There is a problem in the date (&date ) parameter"jZERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?"FINMACRO" ;"a"*e(%LENGTH(&standard ) EQ 0)"STANDARD" NO"t"Aj1(%LENGTH(%QSCAN(%BQUOTE(&standard ),2, )) NE 0)"^NERROR: You must precise just one value for the standard (&standard ) parameter"FINMACRO" ;"j"-o(%DATATYP(&standard ) EQ NUM)"L<ERROR: The standard (&standard ) parameter must be character"FINMACRO" ;"t"Lt<((%UPCASE(&standard) NE YES) AND (%UPCASE(&standard) NE NO))"ZJERROR: The standard (&standard ) parameter must be choosen among (YES NO )"FINMACRO" ;"t"%x(%LENGTH(&dif ) EQ 0)"DIF" 0""<},(%LENGTH(%QSCAN(%BQUOTE(&dif ),2, )) NE 0)"TDERROR: You must precise just one value for the dif (&dif ) parameter"FINMACRO" ;"}")(%DATATYP(&dif ) EQ CHAR)"@0ERROR: The dif (&dif ) parameter must be numeric"FINMACRO" ;"" (&dif LT 0 )"/ERROR: You must have &dif >= 0"FINMACRO" ;""((%LENGTH(&nblagf ) EQ 0)"NBLAGF" 20""?/(%LENGTH(%QSCAN(%BQUOTE(&nblagf ),2, )) NE 0)"ZJERROR: You must precise just one value for the nblagf (&nblagf ) parameter"FINMACRO" ;"",(%DATATYP(&nblagf ) EQ CHAR)"F6ERROR: The nblagf (&nblagf ) parameter must be numeric"FINMACRO" ;""(&nblagf LE 0 )"1!ERROR: You must have &nblagf > 0"FINMACRO" ;""((%LENGTH(&nblaga ) EQ 0)"NBLAGA" 20""?/(%LENGTH(%QSCAN(%BQUOTE(&nblaga ),2, )) NE 0)"ZJERROR: You must precise just one value for the nblaga (&nblaga ) parameter"ӖE? le paramtre xx (&xx )"FINMACRO" ;"I"YM DATA _NULL_; SET &data (KEEP=&xx OBS=1); ARRAY _xx_(*) &xx ; RUN;"P(&syserr NE 0)"<,ERROR: Problme dans le paramtre xx (&xx )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"P"&U(%LENGTH(&date ) EQ 0)"8(ERROR: Le paramtre date est obligatoire"FINMACRO" ;"a"=Z-(%LENGTH(%QSCAN(%BQUOTE(&date ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre date (&date )"FINMACRO" ;"Z"]Q DATA _NULL_; SET &data (KEEP=&date OBS=1); ARRAY _xx_(*) &date ; RUN;"a(&syserr NE 0)"@0ERROR: Problme dans le paramtre date (&date )"iYERROR: Table SAS inexistante ? Nom SAS non valide ? Type de variable ? Liste non valide ?"FINMACRO" ;"a"&e(%LENGTH(&nfor ) EQ 0)"NFOR" 1"t"=j-(%LENGTH(%QSCAN(%BQUOTE(&nfor ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre nfor (&nfor )"FINMACRO" ;"j"*o(%DATATYP(&nfor ) EQ CHAR)"P@ERROR: La valeur du paramtre nfor (&nfor ) doit tre numrique"FINMACRO" ;"t"/t((&nfor NE 1) AND (&nfor NE 2))"[KERROR: La valeur du paramtre nfor (&nfor ) doit tre choisie parmi (1 2 )"FINMACRO" ;"t"'x(%LENGTH(&iterm ) EQ 0)"ITERM" 75"">}.(%LENGTH(%QSCAN(%BQUOTE(&iterm ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre iterm (&iterm )"FINMACRO" ;"}"+(%DATATYP(&iterm ) EQ CHAR)"RBERROR: La valeur du paramtre iterm (&iterm ) doit tre numrique"FINMACRO" ;""((%LENGTH(&lcycle ) EQ 0)"LCYCLE" 15""?/(%LENGTH(%QSCAN(%BQUOTE(&lcycle ),2, )) NE 0)"`PERROR: Vous devez prciser une seule valeur pour le paramtre lcycle (&lcycle )"FINMACRO" ;"",(%DATATYP(&lcycle ) EQ CHAR)"TDERROR: La valeur du paramtre lcycle (&lcycle ) doit tre numrique"FINMACRO" ;""(&lcycle LE 0 )"4$ERROR: Vous devez avoir &lcycle > 0"FINMACRO" ;""((%LENGTH(&lphase ) EQ 0)"LPHASE" 5""?/(%LENGTH(%QSCAN(%BQUOTE(&lphase ),2, )) NE 0)"`PERROR: Vous devez prciser une seule valeur pour le paramtre lphase (&lphase )"FINMACRO" ;"",(%DATATYP(&lphase ) EQ CHAR)"TDERROR: La valeur du paramtre lphase (&lphase ) doit tre numrique"FINMACRO" ;""(&lphase LE 0 )A@; DATA _null_; LENGTH liste $ 30000; RETAIN liste ' '; SET _nomvar_ END=fin; IF (name ^= UPCASE("&date")); liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name));"L@ IF fin THEN CALL SYMPUT('tseries',TRIM(LEFT(liste))); RUN;""((%LENGTH(&weights) NE 0)"  PROC IML; name={&tseries}; weights=T({&weights}); nvar=NCOL(name); nww=NROW(weights); IF (nww < nvar) THEN DO; weights=weights // J(nvar-nww,1,weights[nww]); END; CREATE _weights_ FROM weights[COLNAME={'weights'} ROWNAME="|name]; APPEND FROM weights[ROWNAME=name]; CLOSE _weights_; QUIT; PROC SORT DATA=_weights_; BY name; RUN;""w DATA __trav__(KEEP=&date &tseries &userreg) __period__(KEEP=period); SET &data END=fin; period=DIF(&date); RUN;"_NETTOY_". &_nettoy_ __trav__ __period__" (&period EQ)" PROC SUMMARY DATA=__period__; VAR period; OUTPUT OUT=_means_ MEAN=period; RUN; DATA _NULL_; SET _means_; IF ((25<=period) AND (period<=35)) THEN period=12; ELSE IF ((50<=period) AND (period<=70)) THEN period=6; ELSE IF ((80<=" period) AND (period<=100)) THEN period=4; ELSE IF ((115<=period) AND (period<=135)) THEN period=3; ELSE IF ((175<=period) AND (period<=195)) THEN period=2; ELSE IF ((345<=period) AND (period<=375)) THEN period=1; CALL SYMPUT('period',TRIM(LEFT"&(PUT(period,2.)))); RUN;"_NETTOY_"" &_nettoy_ _means_""4$((&period NE 4) AND (&period NE 12))"bRERROR: The periodicity should be equal to (4, 12) if a seasonal adjustment is done"FINMACRO" ;"" PROC CONTENTS DATA=__trav__(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _nomvar_; SET _nomvar_(IN=in); LENGTH effect $ 32; IF in THEN prov=1; name=UPCASE(name); IF (name ^= UPCASE("&date")); effect=' '; RUN; PROC SORT"1% DATA=_nomvar_; BY name prov; RUN;"_NETTOY_"" &_nettoy_ _nomvar_"((%LENGTH(&userreg) NE 0)"  DATA __userreg__; LENGTH name effect aa $ 32; RETAIN aa ' '; KEEP name effect; liste=UPCASE(TRIM(COMPBL(LEFT("&userreg")))); eff=UPCASE(TRIM(COMPBL(LEFT("®eff")))); nb=COUNT(liste,' '); aa=SCAN(eff,1,' '); IF (aa=' ') THEN aa" ='user'; DO i=1 TO nb+1; name=TRIM(LEFT(SCAN(liste,i,' '))); effect=SCAN(eff,i,' '); IF (effect=' ') THEN effect=aa; IF (name ^= UPCASE("&date")) THEN OUTPUT; aa=effect; END; RUN; PROC SORT DATA=__userreg__; BY name; RUN"; PROC CONTENTS DATA=__trav__(KEEP=&userreg) NOPRINT OUT=_nomvar1_(KEEP= name); RUN; DATA _nomvar1_; SET _nomvar1_; name=UPCASE(name); IF (name ^= UPCASE("&date")); RUN; PROC SORT DATA=_nomvar1_; BY name; RUN; DATA _nomvar_;"g[ MERGE _nomvar_ _nomvar1_(IN=in) __userreg__; BY name; prov=SUM(prov,2*in); RUN;"_NETTOY_"# &_nettoy_ _nomvar1_""  DATA _null_; LENGTH liste list1 list2 list3 $ 10000; RETAIN liste list1 list2 list3 ' '; SET _nomvar_ END=fin; IF (prov=1) THEN DO; ii+1; CALL SYMPUT('_var'!!LEFT(PUT(ii,4.)),TRIM(LEFT(name))); list1=TRIM(LEFT(list1))||' '||TRIM(LEFT(" name)); END; ELSE IF (prov IN(2,3)) THEN DO; jj+1; CALL SYMPUT('_rvar'!!LEFT(PUT(jj,4.)),TRIM(LEFT(name))); list2=TRIM(LEFT(list2))||' '||TRIM(LEFT(name)); list3=TRIM(LEFT(list3))||' '||TRIM(LEFT(effect)); IF (prov=3) THEN DO; liste"=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); END; END; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(BAPUT(ii,4.))); CALL SYMPUT('ireg',LEFT(PUT(jj,4.))); CALL SYMPUT('tseries',TRIM(LEFT(list1))); CALL SYMPUT('userreg',TRIM(LEFT(list2)));"pd CALL SYMPUT('regeff',TRIM(LEFT(list3))); CALL SYMPUT('liste',TRIM(LEFT(liste))); END; RUN;" (&liste NE)"tdWARNING: The following variables are both regression variables and variables to be analyzed (&liste)"YIWARNING: They have been removed from the list of variables to be analyzed""((%LENGTH(&weights) NE 0)" DATA _weights_; LENGTH list1 $ 10000 name $ 32; RETAIN list1 ' '; MERGE _weights_ _nomvar_(WHERE=(prov=1)) END=fin; BY name; list1=TRIM(LEFT(list1))||' '||TRIM(LEFT(weights)); IF fin THEN CALL SYMPUT('weights',TRIM(LEFT(list1)));" RUN;"_NETTOY_"$ &_nettoy_ _weights_""wk X "del &dx12ar.\data\*.* /Q"; X "del &dx12ar.\graph\*.* /Q"; X "del &dx12ar.\output\*.* /Q";"_ERREG" 0"k_ PROC IML; USE __trav__; READ all VAR{&tseries} INTO x; READ all VAR{&date} INTO date;" (&userreg NE)"5) READ all VAR{&userreg} INTO userreg;""L@ CLOSE __trav__; series={&tseries}; num=T(1:NCOL(series));"( (%LENGTH(&weights) NE 0)"  weights={&weights}; nmiss=(NMISS(x))[,+]; cc=LOC(nmiss=0); Agregat=J(NROW(x),1,.); Agregat[cc]=x[cc,]*T(weights); x=x || Agregat; series=series || {"&nameagr"}; num=num//{0}; Agregat=date || Agregat; CREATE _Agregat_ FROM"`T agregat[COLNAME={"&date" "&nameagr"}]; APPEND FROM agregat; CLOSE _Agregat_;" "  x=x+&add; nvar=NCOL(x); add=J(nvar,1,&add); first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0); miss=J(nvar,1,0); max=T(x[<>,]); min=T(x[><,]); period=J(nvar,1,&period); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0)" THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL(LOC(aa^=.)); miss[i]=NCOL(LOC(aa=.)); x[cc[1]:cc[NCOL(cc)],i]=CHOOSE(aa=.,-99999,aa); END; END; nbyear=INT(nobs/period);"  results=period || first || last || nobs || nbyear || miss || add || max || min || num; nomcols={period first last nobs nbyear nmiss add max min num}; CREATE _stat_ FROM results[COLNAME=nomcols ROWNAME=series]; APPEND FROM results[ROWNAME=series]"; CLOSE _stat_;"%NI1&_nser1"  FILE "&dx12ar.\data\X&i..spc"; PUT 'series{'; per=period[&i]; PUT "period=" per; PUT "decimals=&ndec"; cc=LOC(x[,&i]^=.); perdeb=INT(period[&i] * (MONTH(first[&i]) -1) / 12) +1; start=COMPRESS(CONCAT(CHAR(YEAR(first[&i]),4),'.',"CHAR(perdeb,2))); PUT "start=" start; PUT "data=(" ; IF (NCOL(cc)^=0) THEN DO j=cc[1] TO cc[NCOL(cc)]; xx=x[j,&i]; IF ((j > 1) & (MOD(j,6)=1)) THEN PUT; PUT xx 20.5 @ +1; END; PUT ")";"((%LENGTH(&weights) NE 0)" ww=weights[&i]; wwabs=ABS(ww); IF (ww >=0) THEN PUT 'comptype=add'; ELSE PUT 'comptype=sub'; PUT "compwt=" wwabs;"" PUT '}';"&(%LENGTH(&model) NE 0)"-! PUT "arima {model=&model }";""((%LENGTH(&pickmdl) NE 0)";/ PUT "pickmdl {file='&dx12ar.\&pickmdl' }";""# PUT "automdl { }";"  PUT "estimate {}"; PUT "forecast {maxlead = &maxlead}"; PUT "outlier {types=(all)}"; IF ((&mode = -1) & (min[&i] > 0)) THEN PUT "transform {function =(auto)}"; FB IF ((&mode = 0) & (min[&i] > 0)) THEN PUT "transform {function =(log)}";"" (&seats EQ 1)"." PUT "seats {appendfcst=yes}";"""A (&x11 EQ 1)" PUT "x11 { ";"('(%UPCASE(&maxlead) NE 0)"( PUT "appendfcst=yes ";"'"**(%UPCASE(&listing) EQ ALL)"$ PUT "print=(all)";"*"%-(%UPCASE(&seasma) NE)"-! PUT "seasonalma=(&seasma)";"-"#0(%UPCASE(&tcma) NE)"( PUT "trendma=(&tcma)";"0" IF ((&mode = 0) & (min[&i] > 0)) THEN PUT "mode=mult"; IF ((&mode = 1) | (min[&i]<=0)) THEN PUT "mode=add"; PUT "}";":(&xvarreg EQ 1)"B6 PUT 'x11regression {save=(ao td hol usr xrm) ';"(6(%LENGTH(&xvarreg) NE 0)"." PUT "variables=(&xvarreg)";"6"9(&xaictest NE)"-! PUT "aictest=(&xaictest)";"9":"(=(%LENGTH(&history) NE 0)"nb PUT "history {estimates=(sadj trend sadjchng trendchng seasonal) fstep=(1 2 3" +1 per ") }";"="(@(%LENGTH(&sliding) NE 0)") PUT "slidingspans { }";"@"A"G; PUT 'regression {save=(otl ao ls tc td hol usr rmx) ';"'E(%LENGTH(&varreg) NE 0)"+ PUT "variables=(&varreg)";"E"H (&aictest NE)"* PUT "aictest=(&aictest)";"H"L (&userreg NE)"  PUT "user=(&userreg)"; PUT "usertype=(®eff)"; PUT "data=(" ; njk=0; IF (NCOL(cc)^=0) THEN DO j=cc[1] TO (cc[NCOL(cc)]+ &maxlead); DO k=1 TO NCOL(userreg); njk=njk+1; IF (j <= NROW(userreg)) THEN xx=userreg[j",k]; ELSE DO; CALL SYMPUT('_erreg','1'); xx=0; END; IF (xx=.) THEN xx=0; IF ((njk > 1) & (MOD(njk,6)=1)) THEN PUT; PUT xx 20.5 @ +1; END; END; PUT ")";"L" PUT "}";""Q(&_erreg EQ 1)"gWWARNING: For some user regression variables, forecasted values have been put equal to 0"Q"((%LENGTH(&weights) NE 0)"ym small=min[><]; FILE "&dx12ar.\data\X0.spc"; PUT 'composite {'; PUT "decimals=&ndec"; PUT '}';"&V(%LENGTH(&model) NE 0)"-! PUT "arima {model=&model }";"Z"(Y(%LENGTH(&pickmdl) NE 0)";/ PUT "pickmdl {file='&dx12ar.\&pickmdl' }";"Z"# PUT "automdl { }";"  PUT "spectrum {type=&spectype altfreq=&altfreq peakwidth=&peakw}"; PUT "estimate {}"; PUT "forecast {maxlead = &maxlead}"; PUT "outlier {types=(all)}"; IF ((&mode = -1) & (small > 0)) THEN PUT "transform {function =(auto)}"; IF ((&mode"I= = 0) & (small > 0)) THEN PUT "transform {function =(log)}";"_ (&seats EQ 1)"." PUT "seats {appendfcst=yes}";"_"x (&x11 EQ 1)" PUT "x11 { ";"(d(%UPCASE(&maxlead) NE 0)"( PUT "appendfcst=yes ";"d"*g(%UPCASE(&listing) EQ ALL)"$ PUT "print=(all)";"g"~ IF ((&mode = 0) & (small > 0)) THEN PUT "mode=mult"; IF ((&mode = 1) | (small <=0)) THEN PUT "mode=add"; PUT "}";"qDC+]; cc=LOC(missing=0); newvar=date[cc]||x[cc,]; CALL SYMPUT('namenew0',TRIM(LEFT("&listvar"))); CREATE &outnew._0 FROM newvar[COLNAME=listvar]; APPEND FROM newvar; CLOSE &outnew._0;""!%INDEX(&method,1)" missing=(NMISS(x))[,+]; cc=LOC(missing=0); newvar=T(x[cc,]); namenew=datechar[cc]; CALL SYMPUT('namenew1',COMPBL(ROWCAT(namenew))); cc=LOC(UPCASE(series)^=UPCASE("&var")); IF (NCOL(cc)^=0) THEN newvar=newvar[cc,]; CREATE"u &outnew._1 FROM newvar[ROWNAME=series COLNAME=namenew]; APPEND FROM newvar[ROWNAME=series]; CLOSE &outnew._1;""!%INDEX(&method,2)" pi=2*ARCOS(0); frq=DO(0,0.5,1/120); frq=frq || {.348125 .431458}; frq=frq || {.294375 .338750}; frq=T(frq)*2*pi; CALL SORT(frq,{1}); nfrq=NROW(frq); nq=INT(2*(nfrq**(1/5))/3); ww=T(DO(-nq,nq,1))/(2*nq+1);" ww2=(1+cos(pi*ww))/2; wn=ww2/(4*pi*ww2[+]); newvar=J(NROW(frq),nvar,.); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; xx=x[cc,i]; nobs=NROW(xx); dd=REPEAT(DO(0,nobs-1,1),nfrq,1)#REPEAT(frq,1,nobs);" xsin=SIN(dd)*xx; xcos=COS(dd)*xx; fft=(2*(xcos#xcos+xsin#xsin)/nobs); RUN moymob(fft,mfft,wn); newvar[,i]=mfft; END; END; newvar=T(newvar[2:nfrq-1,]); namenew=CONCAT(J(1,nfrq-2,'FREQ'),LEFT(CHAR(1:(nfrq-2),5)));" CALL SYMPUT('namenew2',COMPBL(ROWCAT(namenew))); cc=LOC(UPCASE(series)^=UPCASE("&var")); IF (NCOL(cc)^=0) THEN newvar=newvar[cc,]; CREATE &outnew._2 FROM newvar[ROWNAME=series COLNAME=namenew]; APPEND FROM newvar[ROWNAME=series];"! CLOSE &outnew._2;""5!%(%INDEX(&method,4) AND (&arima EQ 2))" nblags=&nblaga; newvar=J(nvar,nblags,.); DO i=1 TO nvar; cc=LOC(x[,i] ^=.); a=x[cc,i]; CALL TSUNIMAR(arcoef,ev,nar,aic,a,nblags,{-1 0}); newvar[i,]=T(arcoef); END; cc=LOC(NMISS(newvar[,1])); IF (NCOL(cc)^=0) THEN"  CALL SYMPUT('error',TRIM(LEFT(series[cc[1]]))); ELSE CALL SYMPUT('error','0'); namenew=CONCAT(J(1,nblags,'AR'),LEFT(CHAR(1:nblags,5))); CALL SYMPUT('namenew4',COMPBL(ROWCAT(namenew))); cc=LOC(UPCASE(series)^=UPCASE("&var")); IF (NCOL(cc)"^=0) THEN newvar=newvar[cc,]; CREATE &outnew._4 FROM newvar[ROWNAME=series COLNAME=namenew]; APPEND FROM newvar[ROWNAME=series]; CLOSE &outnew._4;"!" QUIT;"( (&error NE 0)"J:ERROR: Estimation failed in TSUNIMAR with variable &error."}mERROR: Try to reduce the number of AR coefficients or remove the involved variables (see &outnew._4 dataset)."FINMACRO" ;"("!3%INDEX(&method,3)"  DATA _NULL_; SET &outdata (OBS=1); LENGTH per $ 15; IF (period=12) THEN per='month'; ELSE IF (period=6) THEN per='month1.2'; ELSE IF (period=4) THEN per='qtr'; ELSE IF (period=3) THEN per='month1.4'; ELSE IF (period=2) THEN"  per='semiyear'; ELSE IF (period=1) THEN per='year'; CALL SYMPUT('period',TRIM(LEFT(per))); RUN; PROC TIMESERIES DATA=_trav_ OUT=mseries OUTCORR=&outnew._3; ID &date INTERVAL=. VAR &listvar; CORR LAG ACF PACF IACF / NLAG=")&nblagf TRANSPOSE=no; RUN;"_NETTOY"! &_nettoy mseries"  DATA &outnew._3; LENGTH Series $ 32 Id $ 10 Type $ 4 liste $ 30000; SET &outnew._3(RENAME=(_name_=Series)) END=fin; KEEP Series Lag Type Id Corr; RETAIN liste ' '; IF (Lag > 0); Type='ACF'; Id=TRIM(LEFT(COMPRESS(type||TRIM(" LEFT(PUT(Lag,10.)))))); Corr=ACF; lisLDte=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Id))))); OUTPUT; Type='PACF'; Id=TRIM(LEFT(COMPRESS(type||TRIM(LEFT(PUT(Lag,10.)))))); Corr=PACF; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste" ))||' '||TRIM(LEFT(Id))))); OUTPUT; Type='IACF'; Id=TRIM(LEFT(COMPRESS(type||TRIM(LEFT(PUT(Lag,10.)))))); Corr=IACF; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Id))))); OUTPUT; IF fin THEN CALL SYMPUT('namenew3',"TRIM(LEFT(liste))); RUN; PROC SORT DATA=&outnew._3; BY Series Type Lag; RUN; PROC TRANSPOSE DATA=&outnew._3 OUT=&outnew._3(DROP=_name_); BY Series; ID Id; VAR Corr; RUN;"3"5@%(%INDEX(&method,4) AND (&arima EQ 1))"%=fI1&_nvar1"NAMESER"" %SCAN(&listvar,&i)" PROC DATASETS LIB=work NOLIST; DELETE outest; RUN; QUIT; PROC ARIMA DATA=_trav_; IDENTIFY VAR=&nameser NOPRINT; ESTIMATE P=&nblaga METHOD=cls OUTEST=outest(WHERE=(_TYPE_=:'EST')) NOPRINT MAXITER=200; RUN; QUIT;"; (&i EQ 1)"~r DATA &outnew._4; LENGTH Series $ 32; SET outest(DROP=_TYPE_); Series="&nameser"; RUN;"<"{ DATA &outnew._4; SET &outnew._4 outest(DROP=_TYPE_ IN=in); IF in THEN Series="&nameser"; RUN;"f"  PROC CONTENTS DATA=&outnew._4(KEEP=_numeric_) NOPRINT OUT=nomvar(KEEP=name); RUN; DATA _NULL_; LENGTH liste $ 30000; RETAIN liste ' '; SET nomvar END=fin; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(name))))); IF"H< fin THEN CALL SYMPUT('namenew4',TRIM(LEFT(liste))); RUN;"@"!D%INDEX(&method,5)"  PROC PRINCOMP DATA=_trav_(KEEP=&date &listvar) NOPRINT N=&nbcomp PREFIX=Factor OUTSTAT=&outnew._5(WHERE=(_TYPE_='SCORE')); VAR &listvar; RUN; PROC TRANSPOSE DATA=&outnew._5(DROP=_TYPE_) OUT=&outnew._5(DROP=_Label_ RENAME=("F:_Name_=Series)); VAR _NUMERIC_; ID _NAME_; RUN;"D"%d(%LENGTH(&vary) NE 0)"  DATA _NULL_; SET &outdata(OBS=1); LENGTH per $ 15; IF (period=12) THEN per='month'; ELSE IF (period=6) THEN per='month1.2'; ELSE IF (period=4) THEN per='qtr'; ELSE IF (period=3) THEN per='month1.4'; ELSE IF (period="vj2) THEN per='semiyear'; ELSE IF (period=1) THEN per='year'; CALL SYMPUT('period',TRIM(LEFT(per)));"&J(%LENGTH(&nlagx) EQ 0)"C7 CALL SYMPUT('nlagx',TRIM(LEFT(PUT(period,10.))));"J" RUN; PROC TIMESERIES DATA=_trav_ OUT=_null_ OUTCROSSCORR=_crosscorr_(WHERE=(lag>=0)); ID &date INTERVAL=. VAR &vary; CROSSVAR &listvar; CROSSCORR LAG CCF CCF2STD / NLAGS=&nlagx; RUN; DATA _crosscorr_; SET"  _crosscorr_; ccf=ABS(ccf); RUN; PROC SORT DATA=_crosscorr_; BY _Name_ _Cross_ DESCENDING ccf; RUN; DATA _crosscorr_; SET _crosscorr_; BY _Name_ _Cross_ DESCENDING ccf; IF FIRST._cross_; RUN; DATA &outdata; LENGTH" Series $ 32; MERGE &outdata _crosscorr_(RENAME=(_CROSS_=Series) DROP=_Name_); BY Series; LABEL Series=' ' Lag=' ' CCF=' ' CCF2STD=' '; RUN;"_NETTOY"$ &_nettoy _crosscorr_"-R%SYSFUNC(EXIST(work.Granger))"\P PROC DATASETS LIBRARY=work NOLIST; DELETE Granger; RUN; QUIT;"R"  PROC IML; START TestC(maty,matx1,matx2,test,lags,alph); nobs=NROW(maty); Test=J(1,6,.); a1=T(matx1)*matx1; a2=T(matx2)*matx2; GE"4$ERROR: Vous devez avoir &lphase > 0"FINMACRO" ;""((%LENGTH(&moymob ) EQ 0)"MOYMOB" 12""?/(%LENGTH(%QSCAN(%BQUOTE(&moymob ),2, )) NE 0)"`PERROR: Vous devez prciser une seule valeur pour le paramtre moymob (&moymob )"FINMACRO" ;"",(%DATATYP(&moymob ) EQ CHAR)"TDERROR: La valeur du paramtre moymob (&moymob ) doit tre numrique"FINMACRO" ;""(&moymob LE 0 )"4$ERROR: Vous devez avoir &moymob > 0"FINMACRO" ;""%(%LENGTH(&mcd ) EQ 0)"MCD" 0""<,(%LENGTH(%QSCAN(%BQUOTE(&mcd ),2, )) NE 0)"ZJERROR: Vous devez prciser une seule valeur pour le paramtre mcd (&mcd )"FINMACRO" ;"")(%DATATYP(&mcd ) EQ CHAR)"N>ERROR: La valeur du paramtre mcd (&mcd ) doit tre numrique"FINMACRO" ;""%(%LENGTH(&log ) EQ 0)"LOG" 0""<,(%LENGTH(%QSCAN(%BQUOTE(&log ),2, )) NE 0)"ZJERROR: Vous devez prciser une seule valeur pour le paramtre log (&log )"FINMACRO" ;"")(%DATATYP(&log ) EQ CHAR)"N>ERROR: La valeur du paramtre log (&log ) doit tre numrique"FINMACRO" ;""-((&log NE 0) AND (&log NE 1))"YIERROR: La valeur du paramtre log (&log ) doit tre choisie parmi (0 1 )"FINMACRO" ;""((%LENGTH(&nmonth ) EQ 0)"NMONTH" 6""?/(%LENGTH(%QSCAN(%BQUOTE(&nmonth ),2, )) NE 0)"`PERROR: Vous devez prciser une seule valeur pour le paramtre nmonth (&nmonth )"FINMACRO" ;"",(%DATATYP(&nmonth ) EQ CHAR)"TDERROR: La valeur du paramtre nmonth (&nmonth ) doit tre numrique"FINMACRO" ;""(&nmonth LE 0 )"4$ERROR: Vous devez avoir &nmonth > 0"FINMACRO" ;""%(%LENGTH(&ird ) EQ 0)"IRD" 0""<,(%LENGTH(%QSCAN(%BQUOTE(&ird ),2, )) NE 0)"ZJERROR: Vous devez prciser une seule valeur pour le paramtre ird (&ird )"FINMACRO" ;"")(%DATATYP(&ird ) EQ CHAR)"N>ERROR: La valeur du paramtre ird (&ird ) doit tre numrique"FINMACRO" ;""-((&ird NE 0) AND (&ird NE 1))"YIERROR: La valeur du paramtre ird (&ird ) doit tre choisie parmi (0 1 )"FINMACRO" ;""&(%LENGTH(&ndtr ) EQ 0)"NDTR" 0""= -(%LENGTH(%QSCAN(%BQUOTE(&ndtr ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre ndtr (&ndtr )HF(&xvarreg EQ 1)"B6 PUT 'x11regression {save=(ao td hol usr xrm) ';"(m(%LENGTH(&xvarreg) NE 0)"." PUT "variables=(&xvarreg)";"m"p(&xaictest NE)"-! PUT "aictest=(&xaictest)";"p"q"(t(%LENGTH(&history) NE 0)"nb PUT "history {estimates=(sadj trend sadjchng trendchng seasonal) fstep=(1 2 3" +1 per ") }";"t"(w(%LENGTH(&sliding) NE 0)") PUT "slidingspans { }";"w"x"=1 PUT 'regression {save=(ao td hol usr rmx) ';"'|(%LENGTH(&varreg) NE 0)"+ PUT "variables=(&varreg)";"|" (&aictest NE)"* PUT "aictest=(&aictest)";"" (&userreg NE)"  PUT "user=(&userreg)"; PUT "usertype=(®eff)"; PUT "data=(" ; njk=0; IF (NCOL(cc)^=0) THEN DO j=cc[1] TO (cc[NCOL(cc)]+ &maxlead); DO k=1 TO NCOL(userreg); njk=njk+1; IF (j <= NROW(userreg)) THEN xx=userreg[j",k]; ELSE DO; CALL SYMPUT('_erreg','1'); xx=0; END; IF (xx=.) THEN xx=0; IF ((njk > 1) & (MOD(njk,6)=1)) THEN PUT; PUT xx 20.5 @ +1; END; END; PUT ")";"" PUT "}";""." FILE "&dx12ar.\data\metaf.mta";"%6I1&_nser1";/ PUT "&dx12ar\data\X&i &dx12ar.\output\X&i";"6"((%LENGTH(&weights) NE 0)"9- PUT "&dx12ar\data\X0 &dx12ar.\output\X0";"" FILE "&dx12ar.\data\x12arima.bat"; PUT "&dx12ar.\x13as -m &dx12ar.\data\metaf -g &dx12ar.\graph -s -w> &dx12ar.\data\x12arima.txt"; QUIT;"_NETTOY_"! &_nettoy_ _stat_"((%LENGTH(&weights) NE 0)"_NETTOY_"$ &_nettoy_ _agregat_"" X "cd .."; X "cd &dx12ar.\data"; X "x12arima"; %ListX12(DIR=&dx12ar.\graph,TABOUT=&out,OUTSER=_series_,OUTT=&outtb1);"(&errx12 EQ 1)"H8ERROR: A problem occured in the execution of X-12-ARIMA."N>ERROR: Check the error files in the &dx12ar.\OUTPUT directory."FINMACRO" ;""_NETTOY_"" &_nettoy_ _series_"  DATA &out; SET &out; LENGTH series $ 32; DROP num; IF INDEX(name,'X0') THEN DO; series=TRANWRD(name,'X0',"&nameagr"); END; ELSE DO; num=INPUT(SUBSTR(SCAN(name,1),2),5.); series=TRIM(LEFT(SCAN("&tseries",num))); END; RUN; PROC"  SORT DATA=&out OUT=&out; BY series; RUN; PROC SORT DATA=_stat_; BY series; RUN; DATA &out; LENGTH library data series $ 32 period 8 firstdat lastdat $5 nobs nmiss nbyear max min 8; RETAIN maxdate 0; MERGE _stat_ &out END=fin; BY series;" firstdat=PUT(first,MONYY5.); lastdat=PUT(last,MONYY5.); maxdate=MAX(maxdate,last); DROP num maxdate; IF INDEX("&data",'.') THEN DO; data=SCAN("&data",2,'.'); library=SCAN("&data",1,'.'); END; ELSE DO; data="&data"; library="'Work'; END; IF (num>=0) THEN CALL SYMPUT('_mean'||LEFT(PUT(num,5.)),LEFT(PUT((Finmode='multiplicative'),2.))); IF fin THEN CALL SYMPUT('maxdate',TRIM(LEFT(PUT(maxdate,10.)))); RUN; DATA _NULL_; LENGTH liste $ 30000; SET &out END=fin;"  RETAIN liste ' ';" (&x11 NE 1)"' IF (aape0 = .) THEN DO;""& IF (fail = .) THEN DO;" IG"FINMACRO" ;" "*(%DATATYP(&ndtr ) EQ CHAR)"P@ERROR: La valeur du paramtre ndtr (&ndtr ) doit tre numrique"FINMACRO" ;""/((&ndtr NE 0) AND (&ndtr NE 1))"[KERROR: La valeur du paramtre ndtr (&ndtr ) doit tre choisie parmi (0 1 )"FINMACRO" ;""%(%LENGTH(&inv ) EQ 0)"INV" 0"("<,(%LENGTH(%QSCAN(%BQUOTE(&inv ),2, )) NE 0)"ZJERROR: Vous devez prciser une seule valeur pour le paramtre inv (&inv )"FINMACRO" ;"")#(%DATATYP(&inv ) EQ CHAR)"N>ERROR: La valeur du paramtre inv (&inv ) doit tre numrique"FINMACRO" ;"("-(((&inv NE 0) AND (&inv NE 1))"YIERROR: La valeur du paramtre inv (&inv ) doit tre choisie parmi (0 1 )"FINMACRO" ;"("&,(%LENGTH(&amul ) EQ 0)"AMUL" 3.5";"=1-(%LENGTH(%QSCAN(%BQUOTE(&amul ),2, )) NE 0)"\LERROR: Vous devez prciser une seule valeur pour le paramtre amul (&amul )"FINMACRO" ;"1"*6(%DATATYP(&amul ) EQ CHAR)"P@ERROR: La valeur du paramtre amul (&amul ) doit tre numrique"FINMACRO" ;";"; (&amul LE 0 )"2"ERROR: Vous devez avoir &amul > 0"FINMACRO" ;";"'?(%LENGTH(&print ) EQ 0)"PRINT" oui"N">D.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre print (&print )"FINMACRO" ;"D"*I(%DATATYP(&print ) EQ NUM)"RBERROR: La valeur du paramtre print (&print ) doit tre caractre"FINMACRO" ;"N"5N%((&print NE oui) AND (&print NE non))"aQERROR: La valeur du paramtre print (&print ) doit tre choisie parmi (oui non )"FINMACRO" ;"N"'R(%LENGTH(&graph ) EQ 0)"GRAPH" oui"a">W.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"^NERROR: Vous devez prciser une seule valeur pour le paramtre graph (&graph )"FINMACRO" ;"W"*\(%DATATYP(&graph ) EQ NUM)"RBERROR: La valeur du paramtre graph (&graph ) doit tre caractre"FINMACRO" ;"a"5a%((&graph NE oui) AND (&graph NE non))"aQERROR: La valeur du paramtre graph (&graph ) doit tre choisie parmi (oui non )"FINMACRO" ;"a"'e(%LENGTH(&cbrut ) EQ 0)"CBRUT" black"o">j.(%LENGTH(%QSCAN(%BQUOTE(&cbrut ),2, )) NE 0)"]MERROR: Vous devez prciser une seule valeur pour le paramtre cbrut (&cbrut )"FINMACRO" ;"j"*o(%DATATYP`H PUT 'WARNING: problem with X12arima with series' +1 series; liste=TRIM(LEFT(TRIM(LEFT(liste)) || ' ' || TRIM(LEFT(series)))); END; IF fin THEN CALL SYMPUT('pbx12a',LEFT(TRIM(liste))); RUN;"&(%LENGTH(&excel) NE 0)" X "del &excel\&out..xls"; PROC DBLOAD DBMS=EXCEL DATA=&out; PATH="&excel\&out..xls"; PUTNAMES YES; LIMIT=0; LOAD; RUN;""J:((%UPCASE(&listing) EQ ALL) OR (%UPCASE(&listing) EQ YES))"%=I1&_nser1"  DATA _null_; INFILE "&dx12ar.\output\X&i..out" LENGTH=l; INPUT xx $varying200. l; FILE PRINT; IF INDEX(xx,"U. S. Department of Commerce") THEN DO; xx="X-12-ARIMA run of &&_var&i"; PUT / xx $varying200. l /; END; ELSE"+ PUT xx $varying200. l; RUN;"=""((%LENGTH(&weights) NE 0)"DEB" 0"_VAR0" &nameagr"NB DATA __trav__; MERGE _Agregat_ __trav__; BY &date; RUN;""DEB" 1"  PROC SORT DATA=_series_ OUT=_seriesb_; BY name date type; RUN; PROC TRANSPOSE DATA=_seriesb_ OUT=_seriesb_(RENAME=(date=&date)); BY name date; VAR value; ID type; RUN; PROC SORT DATA=&out(KEEP=Series Name Finmode) OUT=__scheme__; BY Name;" RUN; DATA _seriesb_; LENGTH name $ 32; MERGE _seriesb_ __scheme__; BY Name; ARRAY varx Calendar TradingDays Holidays Outliers UserReg AO LS TC SO ; Model=(Finmode='multiplicative'); DROP Finmode _Name_ Model; DO OVER varx; IF (varx=.)"' THEN varx=Model;END; RUN;"_NETTOY_"/ &_nettoy_ _seriesb_ __scheme__"0 ((&outtype EQ 1) OR (&graph NE))" DATA"%@I1&_nser1"." &&_var&i(RENAME=(Xorig=&&_var&i))"@" ; LENGTH &date Xorig Xlin Calendar TradingDays Holidays Outliers UserReg TrendCycle Sadjust Season Irregular AO LS TC SO &outtabl 8; KEEP &date Xorig Xlin Calendar TradingDays Holidays Outliers UserReg TrendCycle Sadjust Season Irregular AO LS TC"  SO &outtabl; ARRAY varx Calendar TradingDays Holidays Outliers UserReg AO LS TC SO ; SET _seriesb_; DROP name; IF N(OF Xorig Xlin Calendar TradingDays Holidays Outliers UserReg TrendCycle Sadjust Season Irregular AO LS TC SO )=0 THEN DELETE;"%AI1&_nser1"4( IF name="X&i" THEN OUTPUT &&_var&i;"A" RUN;"(&outtype EQ 2)"%BI1&_nser1"_NETTOY_"" &_nettoy_ &&_var&i"B""((%LENGTH(&weights) NE 0)"  DATA &nameagr(RENAME=(Xorig=&nameagr)); LENGTH &date Xorig Xlin Calendar TradingDays Holidays Outliers UserReg TrendCycle Sadjust Season Irregular &outtabl Season_Ind Irregular_Ind TrendCycle_Ind Sadjust_Ind 8; KEEP &date Xorig Xlin"  Calendar TradingDays Holidays Outliers UserReg TrendCycle Sadjust Season Irregular &outtabl Season_Ind Irregular_Ind TrendCycle_Ind Sadjust_Ind; ARRAY varx Calendar TradingDays Holidays Outliers UserReg; SET _seriesb_(WHERE=(name='X0'))"j^; DROP name; RUN; DATA &nameagr; MERGE _Agregat_ &nameagr; BY &date; RUN;"(&outtype EQ 2)"_NETTOY_"" &_nettoy_ &nameagr"""&(%LENGTH(&excel) NE 0)"(DI&deb&_nser1" X "del &excel\&&_var&i...xls"; PROC DBLOAD DBMS=EXCEL DATA=&&_var&i; PATH="&excel\&&_var&i...xls"; PUTNAMES YES; FORMAT &date JI(&cbrut ) EQ NUM)"QAERROR: La valeur du paramtre cbrut (&cbrut ) doit tre caractre"FINMACRO" ;"o"&s(%LENGTH(&clis ) EQ 0)"CLIS" blue"}"=x-(%LENGTH(%QSCAN(%BQUOTE(&clis ),2, )) NE 0)"[KERROR: Vous devez prciser une seule valeur pour le paramtre clis (&clis )"FINMACRO" ;"x")}(%DATATYP(&clis ) EQ NUM)"O?ERROR: La valeur du paramtre clis (&clis ) doit tre caractre"FINMACRO" ;"}"((%LENGTH(&cturnp ) EQ 0)"CTURNP" red""?/(%LENGTH(%QSCAN(%BQUOTE(&cturnp ),2, )) NE 0)"_OERROR: Vous devez prciser une seule valeur pour le paramtre cturnp (&cturnp )"FINMACRO" ;""+(%DATATYP(&cturnp ) EQ NUM)"SCERROR: La valeur du paramtre cturnp (&cturnp ) doit tre caractre"FINMACRO" ;""ERREUR" 0"  DATA _NULL_; IF (MOD(&iterm ,2) = 0) THEN CALL SYMPUT('erreur','1'); IF (INT(&lcycle ) ^= &lcycle ) THEN CALL SYMPUT('erreur','1'); IF (INT(&lphase ) ^= &lphase ) THEN CALL SYMPUT('erreur','1'); IF (INT(&moymob ) ^= &moymob ) THEN CALL SYMPUT("'erreur','1'); IF (INT(&mcd ) ^= &mcd ) THEN CALL SYMPUT('erreur','1'); IF (INT(&nmonth ) ^= &nmonth ) THEN CALL SYMPUT('erreur','1'); RUN;"(&erreur EQ 1)"_OERROR: Vrifiez le type des paramtres (iterm lcycle lphase moymob mcd nmonth )"FINMACRO" ;""ERR1" 0" DATA &out(KEEP=&xx &date) _annee(KEEP=_annee); SET &data(KEEP=&xx &date) END=f; RETAIN per; _annee=YEAR(&date); IF &xx ^= . THEN ndon+1; IF (ndon=1) THEN DO;" (&nfor EQ 2)"" per=QTR(&date);""$ per=MONTH(&date);"  END; IF ((&xx ^= .) AND (LAG(&xx)=.) AND (ndon > 1)) THEN CALL SYMPUT('err1','1'); IF f THEN DO; ndon + 2*ndon*(&nfor=2); CALL SYMPUT('_ndon1',LEFT(PUT(ndon,8.))); CALL SYMPUT('_per1',LEFT(PUT(per,8.))); END; IF &xx ^=" .;" (&nfor EQ 2)" &date=MDY(3*QTR(&date)-2,1,YEAR(&date)); OUTPUT; &date=INTNX('MONTH',&date,1);OUTPUT; &date=INTNX('MONTH',&date,1);OUTPUT;""k_ RUN; DATA _annee; SET _annee; BY _annee NOTSORTED; IF FIRST._annee; RUN;" (err1 = 1)"2"VALEUR MANQUANTE DANS LA SERIE &xx"ERREUR" 1""YI(&_ndon1 < (&iterm + 2*(4*(&nfor EQ 2)+ 12*(&nfor EQ 1)))) & (&ndtr EQ 0)"ERREUR:"iYLE NOMBRE DE VALEURS DE LA SERIE EST INSUFFISANT POUR LA MOYENNE MOBILE SUR &iterm POINTS"ERREUR" 1"" (&erreur=1)"FINMACRO"" (&nfor EQ 1)"FORMAT" monyy5.""FORMAT" yyq4."g[ PROC IML SYMSIZE=1000; START impres(xserie,annee);" (&nfor EQ 1)" periode=1;"" periode=3;" (&_KJper1 GT 1)"xl avant=J(periode *(&_per1-1),1,.); avant=avant//xserie; impres=SHAPE(avant,NROW(annee),12,.);""8, impres=SHAPE(xserie,NROW(annee),12,.);"~r mois={JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC}; trim={T1,T2,T3,T4}; an={ANNEE}; RESET NONAME;" (&nfor EQ 1)"L@ PRINT annee[COLNAME=an] impres[COLNAME=mois FORMAT=10.2] /;""l` impres=impres[,{1 4 7 10}]; PRINT annee[COLNAME=an] impres[COLNAME=trim FORMAT=10.2] /;" RESET NAME; FINISH impres; START printtp(xser,points,date); peaks=xser[LOC((points = 1) | (points=-1))]; dpeaks=date[LOC((points = 1) | (points=-1))]; ipeaks=T(LOC((points = 1) | (points=-1))); troughs=xser[LOC(("points = 2) | (points=-2))]; dtroughs=date[LOC((points = 2) | (points=-2))]; itroughs=T(LOC((points = 2) | (points=-2))); PRINT " Pics potentiels Creux potentiels"; PRINT ipeaks dpeaks[FORMAT=&format] peaks[FORMAT=10.2]"  itroughs[FORMAT=15.] dtroughs[FORMAT=&format] troughs[FORMAT=10.2]; FINISH printtp; START printtpr(xser,points,date); IF (NROW(LOC(points=-1)) ^= 0) THEN DO; peaks=xser[LOC(points = -1)]; dpeaks=date[LOC(points"  = -1)]; ipeaks=T(LOC(points=-1)); PRINT "Pics rejets: " ipeaks dpeaks[FORMAT=&format] peaks[FORMAT=6.2]; END; IF (NROW(LOC(points=-2)) ^= 0) THEN DO; troughs=xser[LOC(points =-2)]; dtroughs=date[LOC(points =-2)]; itroughs="T(LOC(points=-2)); PRINT "Creux rejets: " itroughs dtroughs[FORMAT=&format] troughs[FORMAT=6.2]; END; FINISH printtpr; START qtr1(xserie); DO i=1 TO &_ndon1 BY 3; xserie[i]=SUM(xserie[i:i+2])/3; xserie[i+1]=" xserie[i]; xserie[i+2]=xserie[i]; END; FINISH qtr1; START piccreux(xser,tp,nbr); ind=LOC(tp); nbr=NCOL(ind); extrem=tp[LOC(tp)]; DO i=2 TO nbr-1; IF (extrem[1:i-1]=J(i-1,1,extrem[i]))"  THEN tp[ind[i]]=-extrem[i]; ELSE IF (extrem[i+1:nbr]=J(nbr-i,1,extrem[i])) THEN tp[ind[i]]=-extrem[i]; IF (extrem[i]=extrem[i-1]) THEN DO; IF (extrem[i]=1) THEN DO; IF (xser[ind[i-1]] > xser[ind[i]]) THEN tp[ind[i]]=-1;ELSE" tp[ind[i-1]]=-1; END; IF (extrem[i]=2) THEN DO; IF (xser[ind[i-1]] < xser[ind[i]]) THEN tp[ind[i]]=-2;ELSE tp[ind[i-1]]=-2; END; END; END; nbr=NCOL(LOC(tp > 0)); FINISH piccreux;"  START spencer(xserie,movav); movav=J(&_ndon1,1,0); nb=7; mm={-3,-6,-5,3,21,46,67,74,67,46,21,3,-5,-6,-3} / 320; DO i=1+nb TO &_ndon1-nb; movav[i]=T(xserie[i-nb:i+nb])*mm; END; deb=J(7,1,SUM(xserie[1":4]) / 4)//xserie[1:14]; fin=xserie[&_ndon1-13:&_ndon1] // J(7,1,SUM(xserie[&_ndon1-3:&_ndon1]) / 4); DO i=1 TO nb; movav[i]=T(deb[i:i+14])*mm; movav[&_ndon1-nb+i]=T(fin[i:i+14])*mm; END;" (&nfor EQ 2)"! RUN qtr1(movav);""  FINISH spencer; START wtp(xserie,nterm,ttp,nbr); DO i=1 TO nterm; IF xserie[i]=MIN(xserie[1:i+nterm]) THEN ttp[i]=2; ELSE IF xserie[i]=MAX(xserie[1:i+nterm]) THEN ttp[i]=1; END; DO"  i=1+nterm TO &_ndon1-nterm; IF xserie[i]=MIN(xserie[i-nterm:i+nterm]) THEN ttp[i]=2; ELSE IF xserie[i]=MAX(xserie[i-nterm:i+nterm]) THEN ttp[i]=1; END; DO i=1+&_ndon1-nterm TO &_ndon1; IF xserie[i]=MIN(xserie[i-nterm:&_ndon1])"g[ THEN ttp[i]=2; ELSE IF xserie[i]=MAX(xserie[i-nterm:&_ndon1]) THEN ttp[i]=1; END;" (&nfor EQ 2)"^R DO iXK=0 TO (&_ndon1/3 -1) ; ttp[3*i+3]=0; ttp[3*i+1]=0; END;"" RUN piccreux(xserie,ttp,nbr); FINISH wtp; START test(xserie,ttp,nbr,date); ind=LOC(ttp); nbr=NCOL(ind); extrem=ttp[LOC(ttp)]; DO i=3 TO nbr; IF ((ind[i]-ind[i-2]) <"  &lcycle) THEN DO; IF (extrem[i]=1) THEN DO; IF (xserie[ind[i-2]] > xserie[ind[i]]) THEN ttp[ind[i]]=-1; ELSE ttp[ind[i-2]]=-1; END; ELSE IF (extrem[i]=2) THEN DO; IF (xserie"[ind[i-2]] < xserie[ind[i]]) THEN ttp[ind[i]]=-2; ELSE ttp[ind[i-2]]=-2; END; ttp[ind[i-1]]=-ttp[ind[i-1]]; END; END;"%(%UPCASE(&print)=OUI)" PRINT ,,"TEST POUR UNE LONGUEUR DE CYCLE SUPERIEURE A &lcycle MOIS"; IF (NROW(LOC(ttp < 0)) = 0) THEN PRINT "Pas de points rejets"; ELSE RUN printtpr(xserie,ttp,date);""YM ttp=CHOOSE(ttp<0,0,ttp); RUN piccreux(xserie,ttp,nbr);"%(%UPCASE(&print)=OUI)" PRINT ,,"CONTROLE DE LA SUCCESSION PIC-CREUX"; IF (NROW(LOC(ttp < 0)) = 0) THEN PRINT "Pas de points rejets"; ELSE RUN printtpr(xserie,ttp,date);""  ttp=CHOOSE(ttp<0,0,ttp); FINISH test; START mdp(xserie,mc,ttp,mcd); IF (mcd=mc) THEN mr=MAX(mcd,4); ELSE mr=6; ntp=J(&_ndon1,1,0); ind=LOC(ttp > 0); extrem=ttp[LOC(ttp > 0)]; DO i=1" TO NCOL(LOC(ttp > 0)); a=MAX(ind[i]-mr+(&nfor=2),1); b=MIN(ind[i]+mr-(&nfor=2),&_ndon1); IF extrem[i]=1 THEN DO j=a TO b; max=MAX(xserie[a:b]); IF xserie[j]=max THEN ntp[j]=1; END; ELSE DO j=a TO b;"nb min=MIN(xserie[a:b]); IF xserie[j]=min THEN ntp[j]=2; END; END; ttp=ntp;" (&nfor EQ 2)"^R DO i=0 TO (&_ndon1/3 -1) ; ttp[3*i+3]=0; ttp[3*i+1]=0; END;""x FINISH mdp; START triple(xserie,xser,date,ttp,m,annee,resul_,nameres);" (&log EQ 0)"# lxser=LOG(xserie);"" lxser=xserie;"  obs1=J(&_ndon1,1,0); obst=J(&_ndon1,1,0); obst[1]=lxser[1]; ind=LOC(ttp > 0); nbr=NCOL(ind); phase=J(nbr,1,0); debut=J(nbr,1,0); fin=J(nbr,1,0); moy=J(nbr,2,0); moy[1,2]=.; moy[nbr,2]=.; dat=J(nbr,"1,0); d=J(nbr,1,0); dseg=J(nbr,1,0); dseg[1]=.; dseg[nbr]=.; dmp=J(nbr,1,0); dmp[1]=.; dmp[nbr]=.; pmm=J(nbr,1,0); pmm[1]=.; pmm[nbr]=.; pente=J(nbr,1,0); pente[1]=.; pente[nbr]=.;"  pentm=J(nbr,1,0); pentm[1]=.; pentm[nbr-1]=.; pentm[nbr]=.; diff=J(nbr,1,0); diff[1]=.; diff[nbr-1]=.; diff[nbr]=.; DO i=1 TO nbr; phase[i]=i; IF i=1 THEN DO; debut[1]=date[1]; moy[1,1]=(SUM(lxser[2:"ind[i]-1]) + (lxser[1]+lxser[ind[i]])/2)/(ind[i]-1); d[1]=INT((ind[1]+1)/2); END; ELSE DO; nb=ind[i]-ind[i-1]; debut[i]=date[ind[i-1]]; moy[i,1]=(SUM(lxser[ind[i-1]+1:ind[i]-1]) + (lxser[ind[i-1]]+lxser[ind[i]])/2)"  /nb; d[i]=(ind[i-1]+ind[i])/2; END; fin[i]=date[ind[i]]; dat[i]=date[INT(d[i])]; END; DO i=2 TO nbr-1; y=moy[i-1:i+1,1]; IF i=2 THEN dseg[2]=date[INT((ind[i+1]+1)/2)]; ELSE dseg[i]=date" [INT((ind[i+1]+ind[i-2])/2)]; moy[i,2]=SUM(y)/3; x=J(3,1,1)||d[i-1:i+1]; est=INV(T(x)*x)*T(x)*y; pente[i]=est[2]; pmm[i]=SUM(d[i-MLIF ((DET(a1) > 10**(-6)) & (DET(a2) > 10**(-" 6))) THEN DO; res1 =maty-matx1*INV(T(matx1)*matx1)*(T(matx1)*maty); sse1=SSQ(res1); res2 =maty-matx2*INV(T(matx2)*matx2)*(T(matx2)*maty); sse2=SSQ(res2); test1 = ((sse1 - sse2)/lags)/(sse2/(nobs - 2*lags - 1));"  Pval1 = 1 - PROBF(test1,lags,nobs - 2*lags - 1); test2 = (nobs * (sse1 - sse2))/sse2; Pval2 = 1 - PROBCHI(test2,lags); vrai1=0; det1=DET(T(res1)*res1/nobs); IF (det1 ^=0) THEN vrai1=(-nobs/2)*LOG(" det1); vrai2=0; det2=DET(T(res2)*res2/nobs); IF (det2 ^=0) THEN vrai2=(-nobs/2)*LOG(det2); test3=2*(vrai2-vrai1); Pval3 = 1 - PROBCHI(test3,lags); Test=Test1 || Pval1 || Test2 || Pval2 || Test3 || Pval3; END" ; FINISH TestC; START Hsiao(maty,matx,test); ylag=NCOL(maty); xlag=NCOL(matx); test=J(1,3,.); DO i=1 TO ylag; DO j=1 TO xlag; nmiss=(NMISS(maty[,1:i] || matx[,1:j]))[,+]; cc=" LOC(nmiss=0); nobs=NCOL(cc); IF nobs THEN DO; y=maty[cc,1]; IF (i>1) THEN x=J(nobs,1,1) || maty[cc,2:i] || matx[cc,1:j]; ELSE x=J(nobs,1,1) || matx[cc,1:j]; END; res =y-x*INV(T(x)*x)*(T(x)*y);"  sse=SSQ(res); fpe=sse*(nobs+i+j-1)/(nobs-i-j+1); test=test // ((i-1)||(j-1)||fpe); END; END; test=test[2:NROW(test),]; FINISH Hsiao; USE _trav_ ; READ all VAR {&vary} INTO y; READ all VAR {" &listvar} INTO x; CLOSE _trav_; Series={&listvar}; nlags=MAX(&nlagy,&nlagx); nobs=NROW(y); Granger=J(1,6,.); Coherence=J(1,nlags,.); Hsiao=J(1,3,.); NamesHsiao=' '; ylag=J(nobs,nlags+" 1,.); DO i=1 TO nlags+1; ylag[i:nobs,i]=y[1:nobs-i+1]; END; signgry=SIGN(ylag[,1]-ylag[,2]); ylag=ylag[,2:nlags+1]; nvar=NCOL(x); DO i=1 TO nvar; xlag=J(nobs,nlags+1,.); DO j=1 TO nlags+1; xlag[j:nobs,j]=x" [1:nobs-j+1,i]; END; signgrx=SIGN(xlag[,1:nlags]-xlag[,2:nlags+1]); xlag2= ylag || xlag; nmissx=(NMISS(y || xlag2))[,+]; cc=LOC(nmissx=0); IF NCOL(cc) THEN DO; xlag2=J(NCOL(cc),1,1) || xlag2[cc,]; ylag2=J(NCOL(cc)" ,1,1) || ylag[cc,]; END; vary=y[cc]; RUN TestC(vary,ylag2,xlag2,test,nlags,0.05); Granger=Granger // test; aa=((REPEAT(signgry[cc,],1,nlags)#Signgrx[cc,])>0)[:,]; Coherence=Coherence // aa; vary=ylag[,1:&nlagy]" ; varx=xlag[,1:&nlagx]; RUN Hsiao(vary,varx,Htest); NamesHsiao=NamesHsiao // J(NROW(Htest),1,Series[i]); Hsiao=Hsiao // Htest; END; Coherence=Coherence[2:nvar+1,<>] || (Coherence[2:nvar+1,<:>]-1); Granger=Granger[2:nvar+1,]" || Coherence; CREATE Granger FROM Granger[COLNAME={'Ftest' 'Pval_F' 'Chi2' 'Pval_C' 'Wald' 'Pval_W' 'Coherence' 'Clag'} ROWNAME=Series]; APPEND FROM Granger[ROWNAME=Series]; CLOSE Granger; Hsiao=Hsiao[2:NROW(Hsiao),]; Series=" NamesHsiao[2:NROW(NamesHsiao),]; CREATE Hsiao FROM Hsiao[COLNAME={'Ylag' 'Xlag' 'FPE'} ROWNAME=Series]; APPEND FROM Hsiao[ROWNAME=Series]; CLOSE Hsiao; QUIT; PROC SORT DATA=Hsiao; BY Series FPE; RUN; PROC SORT DATA=Granger;" BY Series; RUN; DATA &outdata; MERGE &outdata Granger Hsiao; BY Series; IF FIRST.Series; FORMAT First Last MONYY7. CCF Pval_F Pval_C Pval_W Coherence 7.4; RUN;"_NETTOY"& &_nettoy Granger Hsiao"d"xl DATA _NULL_; CALL SYMPUT('nbmeth',TRIM(LEFT(PUT(COUNT(TRIM(LEFT("&method")),' ')+1,5.)))); RUN;"&:mI1&nbmeth1]M"JJ"! %SCAN(&method,&i)" Method &jj"l (&jj EQ 0)"t PROC VARCLUS DATA=&outnew._&jj OUTTREE=&outcah._&jj CENTROID NOPRINT MAXC=&nbclus; VAR &namenew0; RUN;"m"rf PROC CLUSTER DATA=&outnew._&jj METHOD=ward OUTTREE=&outcah._&jj NOPRINT; ID series; RUN;"(s(%UPCASE(&graph) EQ YES)"7q'(%SYSFUNC(CEXIST(work.Method&jj)) EQ 1)"@4 PROC CATALOG C=work.Method&jj KILL; QUIT;"q" AXIS1 LABEL=NONE; PROC TREE DATA=&outcah._&jj(WHERE=(_ncl_ <= &gmax)) HORIZONTAL VAXIS=axis1 NCLUSTERS=&nbclus GOUT=Method&jj NAME=Tree_&jj; RUN; AXIS;TITLE;"s" PROC TREE DATA=&outcah._&jj NOPRINT NCLUSTERS=&nbclus OUT=_outtree_&jj(RENAME=(_name_=series)); RUN; PROC SORT DATA=_outtree_&jj(KEEP=Series Cluster); BY series; RUN; DATA &outdata; LENGTH Series $ 32; MERGE &outdata"  _outtree_&jj(RENAME=(Cluster=Cluster&jj)); BY series; LABEL Series=' ' Cluster&jj=' '; RUN; PROC SORT DATA=_outtree_&jj; BY Cluster; RUN; PROC TRANSPOSE DATA=_outtree_&jj OUT=_t1_; VAR series; BY Cluster; RUN; PROC"y TRANSPOSE DATA=_t1_(DROP=_name_ _label_ Cluster) OUT=&clusters._&jj(DROP=_name_) PREFIX=CL; VAR _CHARACTER_; RUN;"(y(%UPCASE(&print) EQ YES)"nb PROC PRINT DATA=&clusters._&jj; TITLE 'Composition of the Clusters'; RUN; TITLE;"y"_NETTOY"2 "&_nettoy _outtree_&jj &outcah._&jj"4~$(%SYSFUNC(EXIST(work.Medoids)) EQ 1)"RF PROC DATASETS LIBRARY=work NOLIST; DELETE Medoids; QUIT;"~"  DATA _NULL_; SET _outtree_&jj END=fin; LENGTH liste $ 30000; RETAIN liste; BY Cluster; IF FIRST.Cluster THEN DO; liste=' '; n+1; NbCl=0; END; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series)))" )); NbCl+1; IF LAST.Cluster THEN DO; CALL SYMPUT('ListCl'||TRIM(LEFT(PUT(Cluster,5.))),TRIM(LEFT(liste))); CALL SYMPUT('NbCl'||TRIM(LEFT(PUT(Cluster,5.))),TRIM(LEFT(PUT(NbCl,5.)))); END; IF fin THEN CALL SYMPUT('NumCl',TRIM(LEFT("!PUT(n,5.)))); RUN;" (&jj NE 0)"j^ PROC TRANSPOSE DATA=&outnew._&jj OUT=Factor; VAR _numeric_; ID Series; RUN;""=1 DATA Factor; SET &outnew._&jj; RUN;"F: DATA &outmed._&jj; SET _trav_(KEEP=&date); RUN;"%(%LENGTH(&vary) NE 0)" DATA &outmed.C_&jj &outmed.H_&jj; SET _trav_(KEEP=&date); RUN; PROC SORT DATA=&outdata; BY Cluster&jj; RUN; PROC RANK DATA=&outdata OUT=&outdata TIES=LOW; VAR FPE; BY Cluster&jj; RANKS MedoidsH&jj; RUN;" PROC RANK DATA=&outdata OUT=&outdata TIES=LOW DESCENDING; VAR Coherence; BY Cluster&jj; RANKS MedoidsC&jj; RUN; PROC SORT DATA=&outdata; BY Series; RUN;""&wIK1&NumCl1" (&&NbCl&ik GT 1)" PROC FACTOR DATA=Factor(KEEP=&&ListCl&ik) NOPRINT NFACTORS=1 OUTSTAT=Fstat(WHERE=(_TYPE_=:'PATTERN')); VAR &&ListCl&ik; RUN; PROC TRANSPOSE DATA=Fstat OUT=Fstat(KEEP=_Name_ Factor1 RENAME=(_Name_=Series)); VAR _NUMERIC_;"  RUN; DATA Fstat; SET Fstat; Factor1=ABS(Factor1); RUN; PROC RANK DATA=Fstat OUT=Fstat TIES=LOW DESCENDING; VAR Factor1; RANKS Medoids&jj; RUN; PROC APPEND BASE=Medoids DATA=Fstat; RUN; DATA"  _NULL_; SET Fstat END=fin; NFINMACRO" ;"",(%DATATYP(&nblaga ) EQ CHAR)"F6ERROR: The nblaga (&nblaga ) parameter must be numeric"FINMACRO" ;""(&nblaga LE 0 )"1!ERROR: You must have &nblaga > 0"FINMACRO" ;""((%LENGTH(&nbcomp ) EQ 0)"NBCOMP" 10""?/(%LENGTH(%QSCAN(%BQUOTE(&nbcomp ),2, )) NE 0)"ZJERROR: You must precise just one value for the nbcomp (&nbcomp ) parameter"FINMACRO" ;"",(%DATATYP(&nbcomp ) EQ CHAR)"F6ERROR: The nbcomp (&nbcomp ) parameter must be numeric"FINMACRO" ;""(&nbcomp LE 0 )"1!ERROR: You must have &nbcomp > 0"FINMACRO" ;""'(%LENGTH(&arima ) EQ 0)"ARIMA" 2"">.(%LENGTH(%QSCAN(%BQUOTE(&arima ),2, )) NE 0)"XHERROR: You must precise just one value for the arima (&arima ) parameter"FINMACRO" ;""+(%DATATYP(&arima ) EQ CHAR)"D4ERROR: The arima (&arima ) parameter must be numeric"FINMACRO" ;""C3((%UPCASE(&arima) NE 1) AND (%UPCASE(&arima) NE 2))"P@ERROR: The arima (&arima ) parameter must be choosen among (1 2)"FINMACRO" ;""((%LENGTH(&outnew ) EQ 0)"OUTNEW" _outnew_""?/(%LENGTH(%QSCAN(%BQUOTE(&outnew ),2, )) NE 0)"ZJERROR: You must precise just one value for the outnew (&outnew ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outnew ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outnew (&outnew ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outcah ) EQ 0)"OUTCAH" _outcah_""?/(%LENGTH(%QSCAN(%BQUOTE(&outcah ),2, )) NE 0)"ZJERROR: You must precise just one value for the outcah (&outcah ) parameter"FINMACRO" ;""3' %sasnom(_IN_=&outcah ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outcah (&outcah ) parameter must be a valid SAS dataset name"FINMACRO" ;"")(%LENGTH(&outdata ) EQ 0)"OUTDATA" _outdata_""@0(%LENGTH(%QSCAN(%BQUOTE(&outdata ),2, )) NE 0)"\LERROR: You must precise just one value for the outdata (&outdata ) parameter"FINMACRO" ;""4( %sasnom(_IN_=&outdata ,TYPE=DATASET);" (&_ret_ NE 0)"YIERROR: The outdata (&outdata ) parameter must be a valid SAS dataset name"FINMACRO" ;""((%LENGTH(&outmed ) EQ 0)"OUTMED" _outmed_""? /(%LENGTH(%QSCAN(%BQUOTE(&outmed ),2, )) NE 0)O"ZJERROR: You must precise just one value for the outmed (&outmed ) parameter"FINMACRO" ;" "3' %sasnom(_IN_=&outmed ,TYPE=DATASET);" (&_ret_ NE 0)"WGERROR: The outmed (&outmed ) parameter must be a valid SAS dataset name"FINMACRO" ;""*(%LENGTH(&clusters ) EQ 0)"CLUSTERS" _clusters_""A1(%LENGTH(%QSCAN(%BQUOTE(&clusters ),2, )) NE 0)"^NERROR: You must precise just one value for the clusters (&clusters ) parameter"FINMACRO" ;""5) %sasnom(_IN_=&clusters ,TYPE=DATASET);" (&_ret_ NE 0)"[KERROR: The clusters (&clusters ) parameter must be a valid SAS dataset name"FINMACRO" ;""("(%LENGTH(&nbclus ) EQ 0)"NBCLUS" 5"1"?'/(%LENGTH(%QSCAN(%BQUOTE(&nbclus ),2, )) NE 0)"ZJERROR: You must precise just one value for the nbclus (&nbclus ) parameter"FINMACRO" ;"'",,(%DATATYP(&nbclus ) EQ CHAR)"F6ERROR: The nbclus (&nbclus ) parameter must be numeric"FINMACRO" ;"1"1(&nbclus LE 0 )"1!ERROR: You must have &nbclus > 0"FINMACRO" ;"1")5(%LENGTH(&summary ) EQ 0)"SUMMARY" 0"D"@:0(%LENGTH(%QSCAN(%BQUOTE(&summary ),2, )) NE 0)"\LERROR: You must precise just one value for the summary (&summary ) parameter"FINMACRO" ;":"-?(%DATATYP(&summary ) EQ CHAR)"H8ERROR: The summary (&summary ) parameter must be numeric"FINMACRO" ;"D" D(&summary LT 0 )"3#ERROR: You must have &summary >= 0"FINMACRO" ;"D"'H(%LENGTH(&graph ) EQ 0)"GRAPH" NO"W">M.(%LENGTH(%QSCAN(%BQUOTE(&graph ),2, )) NE 0)"XHERROR: You must precise just one value for the graph (&graph ) parameter"FINMACRO" ;"M"*R(%DATATYP(&graph ) EQ NUM)"F6ERROR: The graph (&graph ) parameter must be character"FINMACRO" ;"W"FW6((%UPCASE(&graph) NE YES) AND (%UPCASE(&graph) NE NO))"TDERROR: The graph (&graph ) parameter must be choosen among (YES NO )"FINMACRO" ;"W")[(%LENGTH(&graphsh ) EQ 0)"GRAPHSH" NO"j"@`0(%LENGTH(%QSCAN(%BQUOTE(&graphsh ),2, )) NE 0)"\LERROR: You must precise just one value for the graphsh (&graphsh ) parameter"FINMACRO" ;"`",e(%DATATYP(&graphsh ) EQ NUM)"J:ERROR: The graphsh (&graphsh ) parameter must be character"FINMACRO" ;"j"Jj:((%UPCASE(&graphsh) NE YES) AND (%UPCASE(&graphsh) NE NO))"XHERROR: The graphsh (&grapPhsh ) parameter must be choosen among (YES NO )"FINMACRO" ;"j")n(%LENGTH(&medoids ) EQ 0)"MEDOIDS" 1"}"@s0(%LENGTH(%QSCAN(%BQUOTE(&medoids ),2, )) NE 0)"\LERROR: You must precise just one value for the medoids (&medoids ) parameter"FINMACRO" ;"s"-x(%DATATYP(&medoids ) EQ CHAR)"H8ERROR: The medoids (&medoids ) parameter must be numeric"FINMACRO" ;"}" }(&medoids LE 0 )"2"ERROR: You must have &medoids > 0"FINMACRO" ;"}"&(%LENGTH(&gmax ) EQ 0)"GMAX" 50""=-(%LENGTH(%QSCAN(%BQUOTE(&gmax ),2, )) NE 0)"VFERROR: You must precise just one value for the gmax (&gmax ) parameter"FINMACRO" ;""*(%DATATYP(&gmax ) EQ CHAR)"B2ERROR: The gmax (&gmax ) parameter must be numeric"FINMACRO" ;"" (&gmax LE 0 )"/ERROR: You must have &gmax > 0"FINMACRO" ;""'(%LENGTH(&print ) EQ 0)"PRINT" NO"">.(%LENGTH(%QSCAN(%BQUOTE(&print ),2, )) NE 0)"XHERROR: You must precise just one value for the print (&print ) parameter"FINMACRO" ;""*(%DATATYP(&print ) EQ NUM)"F6ERROR: The print (&print ) parameter must be character"FINMACRO" ;""F6((%UPCASE(&print) NE YES) AND (%UPCASE(&print) NE NO))"TDERROR: The print (&print ) parameter must be choosen among (YES NO )"FINMACRO" ;""((%LENGTH(&method ) EQ 0)"METHOD" 2""ERREUR" 0"l` PROC IML; method={&method}; IF (TYPE(method) = 'C') THEN CALL SYMPUT('erreur','1'); QUIT;"(&erreur EQ 1)"XHERROR: the method parameter (&method) should contain numeric values only"FINMACRO" ;""ERREUR" 0"  PROC IML; method={&method}; newmeth=.; cc=LOC((method=0) | (method=1) | (method=2) | (method=3) | (method=4) | (method=5) | (method=9)); IF (NCOL(cc)=0) THEN CALL SYMPUT('erreur','1'); IF (NCOL(LOC(method=9))^=0) THEN newmeth={. 0 1 2 3 4};" ELSE DO; IF (NCOL(LOC(method=0))^=0) THEN newmeth=newmeth || {0}; IF (NCOL(LOC(method=1))^=0) THEN newmeth=newmeth || {1}; IF (NCOL(LOC(method=2))^=0) THEN newmeth=newmeth || {2}; IF (NCOL(LOC(method=3))^=0) THEN newmeth=newmeth || {3};" IF (NCOL(LOC(method=4))^=0) THEN newmeth=newmeth || {4}; IF (NCOL(LOC(method=5))^=0) THEN newmeth=newmeth || {5}; END; CALL SYMPUT('newmeth',TRIM(LEFT(COMPBL(ROWCAT(CHAR(newmeth,5,0)))))); QUIT;"(&erreur EQ 1)"qaERROR: the method parameter (&method) should contain at least a value among (0, 1, 2, 3, 4, 5, 9)"FINMACRO" ;""METHOD" &newmeth"  DATA _NULL_; CALL SYMPUT('nblaga',TRIM(LEFT(PUT(INQT(&nblaga),10.)))); CALL SYMPUT('nblagf',TRIM(LEFT(PUT(INT(&nblagf),10.)))); CALL SYMPUT('summary',TRIM(LEFT(PUT(INT(&summary),10.)))); CALL SYMPUT('gmax',TRIM(LEFT(PUT(INT(&gmax),10.))))" ; CALL SYMPUT('medoids',TRIM(LEFT(PUT(INT(&medoids),10.)))); RUN; PROC CONTENTS DATA=&data(KEEP=&var) OUT=_nomvar_(KEEP=name label) NOPRINT; RUN; DATA _nomvar_; LENGTH List $ 32000;; SET _nomvar_ END=f; KEEP Name Series Label; RETAIN" List ' '; RENAME name=Ident; IF ((UPCASE(name) ^= UPCASE("&date")) AND (UPCASE(name) ^= UPCASE("&vary"))) THEN DO; ii+1; Series=TRIM(LEFT(COMPRESS('X'||PUT(ii,8.)))); CALL SYMPUT('_v'!!LEFT(PUT(ii,6.)),TRIM(LEFT(name))); CALL SYMPUT("'_var'!!LEFT(PUT(ii,6.)),TRIM(LEFT(Series))); List=TRIM(LEFT(COMPBL(TRIM(LEFT(List))||' '||TRIM(LEFT(Series))))); OUTPUT; END; IF f THEN DO; CALL SYMPUT('_nvar',LEFT(PUT(ii,6.))); CALL SYMPUT ('listvar',TRIM(LEFT(List))); END; RUN;"9- PROC SORT DATA=_nomvar_; BY Series; RUN;"_NETTOY" "j^ DATA _trav_; SET &data(KEEP=&var &date &vary); _datechar_=PUT(&date,MONYY5.); RENAME"%SI1&_nvar1" &&_v&i=&&_var&i"S"; RUN;"_NETTOY" &_nettoy _trav_"((%UPCASE(&graph) EQ YES)" (&gmax EQ)"GMAX" &_nvar""L@ GOPTIONS CBACK=white BORDER DEVICE=win FTEXT=swissb noPROMPT"$(%LENGTH(&eps) NE 0)"bV DEVICE=psepsf GSFNAME=grafout GSFMODE=replace &rotate; FILENAME grafout "&eps";""%(%LENGTH(&jpeg) NE 0)"YM DEVICE=jpeg GSFNAME=grafout GSFMODE=replace; FILENAME grafout "&jpeg";""; DATA _NULL_; gmax=MIN(&_nvar,INT(&gmax)); k=LOG(gmax)/LOG(2); gmax=2**(k+1)-1; CALL SYMPUT('gmax',LEFT(PUT(gmax,4.))); CALL SYMPUT('div',LEFT(PUT(INT(&nbclus/4),4.))); CALL SYMPUT('mod',LEFT(PUT(MOD(&nbclus,4),4.))); RUN;""  PROC IML; USE _trav_; READ all VAR{&listvar &vary} INTO x; READ all VAR{&date} INTO date; CLOSE _trav_; nvar=NCOL(x); nobs=NROW(x); series=T({&listvar &vary}); mean=x[:,]; std=SQRT((x-REPEAT(mean,nobs,1))[##,]); first=J("nvar,1,.); last=J(nvar,1,.); numobs=J(nvar,1,0); nmiss=J(nvar,1,0); max=x[<>,]; min=x[><,]; period=J(nvar,1,.); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]];"  aa=x[cc,i]; numobs[i]=NCOL(cc); nmiss[i]=(cc[NCOL(cc)]-cc[1]+1)-numobs[i]; jj=(last[i]-first[i])/numobs[i]; IF ((25<=jj) & (jj<=35)) THEN period[i]=12; ELSE IF ((50<=jj) & (jj<=70)) THEN period[i]=6; ELSE IF ((80<=jj) & (jj<=" 100)) THEN period[i]=4; ELSE IF ((115<=jj) & (jj<=135)) THEN period[i]=3; ELSE IF ((175<=jj) & (jj<=195)) THEN period[i]=2; ELSE IF ((345<=jj) & (jj<=375)) THEN period[i]=1; END; END; nbyear=INT(numobs/period); results=period || first" || last || numobs || nmiss || nbyear || T(max) || T(min) || T(mean) || T(std); nomcols={period first last nobs nmiss nbyear max min mean std}; CREATE &outdata FROM results[ROWNAME=series COLNAME=nomcols]; APPEND FROM results[ROWNAME=series];" CLOSE &outdata; missing=(NMISS(x))[,+]; cc=LOC(missing=0); CALL SYMPUT('nbcom',TRIM(LEFT(CHAR((NCOL(cc)>=(3*period[1])),5,0)))); cc=LOC(std=0); CALL SYMPUT('nbcst',TRIM(LEFT(CHAR(NCOL(cc),5,0)))); CALL SYMPUT('nbmiss',TRIM(LEFT(CHAR(MAX("^Rnmiss),5,0)))); CALL SYMPUT('nbper',TRIM(LEFT(CHAR(RANGE(period),5,0)))); QUIT;"(&nbmiss NE 0)"RBERROR: RNo series should have missing values (see &outdata dataset)"FINMACRO" ;"" (&nbper NE 0)"QAERROR: Mixed periodicities are not allowed (see &outdata dataset)"FINMACRO" ;"" (&nbcst NE 0)"rbERROR: Some variables are constant and have been excluded from the analysis (see &outdata dataset)" DATA _NULL_; LENGTH List $ 32000;; SET &outdata END=f; RETAIN List ' ' yvar 0; IF ((std^=0) AND (UPCASE(Series) ^= UPCASE("&vary"))) THEN List=TRIM(LEFT(COMPBL(TRIM(LEFT(List))||' '||TRIM(LEFT(Series))))); IF ((std=0) AND (UPCASE("Series) = UPCASE("&vary"))) THEN yvar=1; IF f THEN DO; CALL SYMPUT('_yvar',LEFT(PUT(yvar,6.))); CALL SYMPUT ('listvar',TRIM(LEFT(List))); END; RUN;" (&_yvar NE 0)"scERROR: The Yvar (&vary) is constant and should be excluded from the analysis (see &outdata dataset)"FINMACRO" ;""" (&nbcom EQ 0)"wERROR: The common span is less than 3 years long. The varclus analysis, the PCA and the direct HCA cannot be performed.">.ERROR: The summary parameter is also set to 0."SUMMARY" 0" DATA _NULL_; method=COMPBL(TRANWRD("&method",'0',' ')); method=COMPBL(TRANWRD(method,'1',' ')); method=COMPBL(TRANWRD(method,'5',' ')); CALL SYMPUT('method',TRIM(LEFT(method))); RUN;" (&method EQ)"*ERROR: No method to apply."FINMACRO" ;"""9- PROC SORT DATA=&outdata; BY series; RUN;"ERROR" 0"  PROC IML; START moymob(xserie,movav,coef); movav=J(NROW(xserie),1,0); mmob1=xserie[LOC(xserie ^= .)]; nobs=NROW(mmob1); mmob2=J(nobs,1,.); ordre=NROW(coef); ncols=NCOL(coef); nb=INT(ordre / 2); IF (ordre <= nobs) THEN DO;"  mmob2[nb+1:nobs-nb]=T(PRODUCT(T(coef[,ncols]),T(mmob1))[ordre:nobs]); END; ELSE mmob2=J(nobs,1,mmob1[:]); mmob2[1:nb]=T(T(mmob1[1:ordre])*coef[,1:nb]); mmob2[nobs:nobs-nb+1]=T(T(mmob1[nobs:nobs-ordre+1])*coef[,1:nb]); movav[LOC(xserie" ^= .)]=mmob2; FINISH moymob; USE _trav_; READ all VAR{&listvar &vary} INTO x; READ all VAR{&date} INTO date; READ all VAR{_datechar_} INTO datechar; CLOSE _trav_; nvar=NCOL(x); nobs=NROW(x); xx=J(nobs,nvar,.); listvar={"&date"" &listvar &vary}; series={&listvar}; numobs=J(nvar,1,0); mean=x[:,]; std=SQRT((x-REPEAT(mean,nobs,1))[##,]); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; aa=x[cc,i]; numobs[i]=NCOL(cc);"$(%UPCASE(&dif) NE 0)"qe x[cc[1+&dif]:cc[NCOL(cc)],i]=aa[&dif+1:numobs[i]]-aa[1:numobs[i]-&dif]; x[1:cc[&dif],i]=.;"" END; END;"+ (%UPCASE(&standard) EQ YES)" cc=LOC(std > 10**-8); ncolcc=NCOL(cc); IF (ncolcc ^=0) THEN DO i=1 TO ncolcc; dd=LOC(x[,cc[i]]^=.); IF (NCOL(dd)^=0) THEN DO; aa=(x[dd,cc[i]]-REPEAT(mean[cc[i]],NCOL(dd),1))/REPEAT(std[cc[i]],NCOL(dd),1); x[dd,cc[i]]=aa;" END; END; cc=LOC(std < 10**-8); ncolcc=NCOL(cc); IF (ncolcc ^=0) THEN DO i=1 TO ncolcc; dd=LOC(x[,cc[i]]^=.); IF (NCOL(dd)^=0) THEN x[dd,cc[i]]=0; END;" " x0= date || x; CREATE _trav_ FROM x0[ROWNAME=datechar COLNAME=listvar]; APPEND FROM x0[ROWNAME=datechar]; CLOSE _trav_;"!%INDEX(&method,0)" missing=(NMISS(x))[,+]; S cc=LOC(missing=0); newvar=date[cc]||x[cc,]; CALL SYMPUT('namenew0',TRIM(LEFT("&listvar"))); CREATE &outnew._0 FROM newvar[COLNAME=listvar]; APPEND FROM newvar; CLOSE &outnew._0;""!%INDEX(&method,1)" missing=(NMISS(x))[,+]; cc=LOC(missing=0); newvar=T(x[cc,]); namenew=datechar[cc]; CALL SYMPUT('namenew1',COMPBL(ROWCAT(namenew))); cc=LOC(UPCASE(series)^=UPCASE("&var")); IF (NCOL(cc)^=0) THEN newvar=newvar[cc,]; CREATE"u &outnew._1 FROM newvar[ROWNAME=series COLNAME=namenew]; APPEND FROM newvar[ROWNAME=series]; CLOSE &outnew._1;""!%INDEX(&method,2)" pi=2*ARCOS(0); frq=DO(0,0.5,1/120); frq=frq || {.348125 .431458}; frq=frq || {.294375 .338750}; frq=T(frq)*2*pi; CALL SORT(frq,{1}); nfrq=NROW(frq); nq=INT(2*(nfrq**(1/5))/3); ww=T(DO(-nq,nq,1))/(2*nq+1);" ww2=(1+cos(pi*ww))/2; wn=ww2/(4*pi*ww2[+]); newvar=J(NROW(frq),nvar,.); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; xx=x[cc,i]; nobs=NROW(xx); dd=REPEAT(DO(0,nobs-1,1),nfrq,1)#REPEAT(frq,1,nobs);" xsin=SIN(dd)*xx; xcos=COS(dd)*xx; fft=(2*(xcos#xcos+xsin#xsin)/nobs); RUN moymob(fft,mfft,wn); newvar[,i]=mfft; END; END; newvar=T(newvar[2:nfrq-1,]); namenew=CONCAT(J(1,nfrq-2,'FREQ'),LEFT(CHAR(1:(nfrq-2),5)));" CALL SYMPUT('namenew2',COMPBL(ROWCAT(namenew))); cc=LOC(UPCASE(series)^=UPCASE("&var")); IF (NCOL(cc)^=0) THEN newvar=newvar[cc,]; CREATE &outnew._2 FROM newvar[ROWNAME=series COLNAME=namenew]; APPEND FROM newvar[ROWNAME=series];"! CLOSE &outnew._2;""5!%(%INDEX(&method,4) AND (&arima EQ 2))" nblags=&nblaga; newvar=J(nvar,nblags,.); DO i=1 TO nvar; cc=LOC(x[,i] ^=.); a=x[cc,i]; CALL TSUNIMAR(arcoef,ev,nar,aic,a,nblags,{-1 0}); newvar[i,]=T(arcoef); END; cc=LOC(NMISS(newvar[,1])); IF (NCOL(cc)^=0) THEN"  CALL SYMPUT('error',TRIM(LEFT(series[cc[1]]))); ELSE CALL SYMPUT('error','0'); namenew=CONCAT(J(1,nblags,'AR'),LEFT(CHAR(1:nblags,5))); CALL SYMPUT('namenew4',COMPBL(ROWCAT(namenew))); cc=LOC(UPCASE(series)^=UPCASE("&var")); IF (NCOL(cc)"^=0) THEN newvar=newvar[cc,]; CREATE &outnew._4 FROM newvar[ROWNAME=series COLNAME=namenew]; APPEND FROM newvar[ROWNAME=series]; CLOSE &outnew._4;"!" QUIT;"( (&error NE 0)"J:ERROR: Estimation failed in TSUNIMAR with variable &error."}mERROR: Try to reduce the number of AR coefficients or remove the involved variables (see &outnew._4 dataset)."FINMACRO" ;"("!3%INDEX(&method,3)"  DATA _NULL_; SET &outdata (OBS=1); LENGTH per $ 15; IF (period=12) THEN per='month'; ELSE IF (period=6) THEN per='month1.2'; ELSE IF (period=4) THEN per='qtr'; ELSE IF (period=3) THEN per='month1.4'; ELSE IF (period=2) THEN"  per='semiyear'; ELSE IF (period=1) THEN per='year'; CALL SYMPUT('period',TRIM(LEFT(per))); RUN; PROC TIMESERIES DATA=_trav_ OUT=mseries OUTCORR=&outnew._3; ID &date INTERVAL=. VAR &listvar; CORR LAG ACF PACF IACF / NLAG=")&nblagf TRANSPOSE=no; RUN;"_NETTOY"! &_nettoy mseries"  DATA &outnew._3; LENGTH Series $ 32 Id $ 10 Type $ 4 liste $ 30000; SET &outnew._3(RENAME=(_name_=Series)) END=fin; KEEP Series Lag Type Id Corr; RETAIN liste ' '; IF (Lag > 0); Type='ACF'; Id=TRIM(LEFT(COMPRESS(type||TRIM(" LEFT(PUT(Lag,10.)))))); Corr=ACF; liste=TRITM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Id))))); OUTPUT; Type='PACF'; Id=TRIM(LEFT(COMPRESS(type||TRIM(LEFT(PUT(Lag,10.)))))); Corr=PACF; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste" ))||' '||TRIM(LEFT(Id))))); OUTPUT; Type='IACF'; Id=TRIM(LEFT(COMPRESS(type||TRIM(LEFT(PUT(Lag,10.)))))); Corr=IACF; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Id))))); OUTPUT; IF fin THEN CALL SYMPUT('namenew3',"TRIM(LEFT(liste))); RUN; PROC SORT DATA=&outnew._3; BY Series Type Lag; RUN; PROC TRANSPOSE DATA=&outnew._3 OUT=&outnew._3(DROP=_name_); BY Series; ID Id; VAR Corr; RUN;"3"5@%(%INDEX(&method,4) AND (&arima EQ 1))"%=fI1&_nvar1"NAMESER"" %SCAN(&listvar,&i)" PROC DATASETS LIB=work NOLIST; DELETE outest; RUN; QUIT; PROC ARIMA DATA=_trav_; IDENTIFY VAR=&nameser NOPRINT; ESTIMATE P=&nblaga METHOD=cls OUTEST=outest(WHERE=(_TYPE_=:'EST')) NOPRINT MAXITER=200; RUN; QUIT;"; (&i EQ 1)"~r DATA &outnew._4; LENGTH Series $ 32; SET outest(DROP=_TYPE_); Series="&nameser"; RUN;"<"{ DATA &outnew._4; SET &outnew._4 outest(DROP=_TYPE_ IN=in); IF in THEN Series="&nameser"; RUN;"f"  PROC CONTENTS DATA=&outnew._4(KEEP=_numeric_) NOPRINT OUT=nomvar(KEEP=name); RUN; DATA _NULL_; LENGTH liste $ 30000; RETAIN liste ' '; SET nomvar END=fin; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(name))))); IF"H< fin THEN CALL SYMPUT('namenew4',TRIM(LEFT(liste))); RUN;"@"!D%INDEX(&method,5)"  PROC PRINCOMP DATA=_trav_(KEEP=&date &listvar) NOPRINT N=&nbcomp PREFIX=Factor OUTSTAT=&outnew._5(WHERE=(_TYPE_='SCORE')); VAR &listvar; RUN; PROC TRANSPOSE DATA=&outnew._5(DROP=_TYPE_) OUT=&outnew._5(DROP=_Label_ RENAME=("F:_Name_=Series)); VAR _NUMERIC_; ID _NAME_; RUN;"D"%d(%LENGTH(&vary) NE 0)"  DATA _NULL_; SET &outdata(OBS=1); LENGTH per $ 15; IF (period=12) THEN per='month'; ELSE IF (period=6) THEN per='month1.2'; ELSE IF (period=4) THEN per='qtr'; ELSE IF (period=3) THEN per='month1.4'; ELSE IF (period="vj2) THEN per='semiyear'; ELSE IF (period=1) THEN per='year'; CALL SYMPUT('period',TRIM(LEFT(per)));"&J(%LENGTH(&nlagx) EQ 0)"C7 CALL SYMPUT('nlagx',TRIM(LEFT(PUT(period,10.))));"J" RUN; PROC TIMESERIES DATA=_trav_ OUT=_null_ OUTCROSSCORR=_crosscorr_(WHERE=(lag>=0)); ID &date INTERVAL=. VAR &vary; CROSSVAR &listvar; CROSSCORR LAG CCF CCF2STD / NLAGS=&nlagx; RUN; DATA _crosscorr_; SET"  _crosscorr_; ccf=ABS(ccf); RUN; PROC SORT DATA=_crosscorr_; BY _Name_ _Cross_ DESCENDING ccf; RUN; DATA _crosscorr_; SET _crosscorr_; BY _Name_ _Cross_ DESCENDING ccf; IF FIRST._cross_; RUN; DATA &outdata; LENGTH" Series $ 32; MERGE &outdata _crosscorr_(RENAME=(_CROSS_=Series) DROP=_Name_); BY Series; LABEL Series=' ' Lag=' ' CCF=' ' CCF2STD=' '; RUN;"_NETTOY"$ &_nettoy _crosscorr_"-R%SYSFUNC(EXIST(work.Granger))"\P PROC DATASETS LIBRARY=work NOLIST; DELETE Granger; RUN; QUIT;"R"  PROC IML; START TestC(maty,matx1,matx2,test,lags,alph); nobs=NROW(maty); Test=J(1,6,.); a1=T(matx1)*matx1; a2=T(matx2)*matx2; IF ((DUET(a1) > 10**(-6)) & (DET(a2) > 10**(-" 6))) THEN DO; res1 =maty-matx1*INV(T(matx1)*matx1)*(T(matx1)*maty); sse1=SSQ(res1); res2 =maty-matx2*INV(T(matx2)*matx2)*(T(matx2)*maty); sse2=SSQ(res2); test1 = ((sse1 - sse2)/lags)/(sse2/(nobs - 2*lags - 1));"  Pval1 = 1 - PROBF(test1,lags,nobs - 2*lags - 1); test2 = (nobs * (sse1 - sse2))/sse2; Pval2 = 1 - PROBCHI(test2,lags); vrai1=0; det1=DET(T(res1)*res1/nobs); IF (det1 ^=0) THEN vrai1=(-nobs/2)*LOG(" det1); vrai2=0; det2=DET(T(res2)*res2/nobs); IF (det2 ^=0) THEN vrai2=(-nobs/2)*LOG(det2); test3=2*(vrai2-vrai1); Pval3 = 1 - PROBCHI(test3,lags); Test=Test1 || Pval1 || Test2 || Pval2 || Test3 || Pval3; END" ; FINISH TestC; START Hsiao(maty,matx,test); ylag=NCOL(maty); xlag=NCOL(matx); test=J(1,3,.); DO i=1 TO ylag; DO j=1 TO xlag; nmiss=(NMISS(maty[,1:i] || matx[,1:j]))[,+]; cc=" LOC(nmiss=0); nobs=NCOL(cc); IF nobs THEN DO; y=maty[cc,1]; IF (i>1) THEN x=J(nobs,1,1) || maty[cc,2:i] || matx[cc,1:j]; ELSE x=J(nobs,1,1) || matx[cc,1:j]; END; res =y-x*INV(T(x)*x)*(T(x)*y);"  sse=SSQ(res); fpe=sse*(nobs+i+j-1)/(nobs-i-j+1); test=test // ((i-1)||(j-1)||fpe); END; END; test=test[2:NROW(test),]; FINISH Hsiao; USE _trav_ ; READ all VAR {&vary} INTO y; READ all VAR {" &listvar} INTO x; CLOSE _trav_; Series={&listvar}; nlags=MAX(&nlagy,&nlagx); nobs=NROW(y); Granger=J(1,6,.); Coherence=J(1,nlags,.); Hsiao=J(1,3,.); NamesHsiao=' '; ylag=J(nobs,nlags+" 1,.); DO i=1 TO nlags+1; ylag[i:nobs,i]=y[1:nobs-i+1]; END; signgry=SIGN(ylag[,1]-ylag[,2]); ylag=ylag[,2:nlags+1]; nvar=NCOL(x); DO i=1 TO nvar; xlag=J(nobs,nlags+1,.); DO j=1 TO nlags+1; xlag[j:nobs,j]=x" [1:nobs-j+1,i]; END; signgrx=SIGN(xlag[,1:nlags]-xlag[,2:nlags+1]); xlag2= ylag || xlag; nmissx=(NMISS(y || xlag2))[,+]; cc=LOC(nmissx=0); IF NCOL(cc) THEN DO; xlag2=J(NCOL(cc),1,1) || xlag2[cc,]; ylag2=J(NCOL(cc)" ,1,1) || ylag[cc,]; END; vary=y[cc]; RUN TestC(vary,ylag2,xlag2,test,nlags,0.05); Granger=Granger // test; aa=((REPEAT(signgry[cc,],1,nlags)#Signgrx[cc,])>0)[:,]; Coherence=Coherence // aa; vary=ylag[,1:&nlagy]" ; varx=xlag[,1:&nlagx]; RUN Hsiao(vary,varx,Htest); NamesHsiao=NamesHsiao // J(NROW(Htest),1,Series[i]); Hsiao=Hsiao // Htest; END; Coherence=Coherence[2:nvar+1,<>] || (Coherence[2:nvar+1,<:>]-1); Granger=Granger[2:nvar+1,]" || Coherence; CREATE Granger FROM Granger[COLNAME={'Ftest' 'Pval_F' 'Chi2' 'Pval_C' 'Wald' 'Pval_W' 'Coherence' 'Clag'} ROWNAME=Series]; APPEND FROM Granger[ROWNAME=Series]; CLOSE Granger; Hsiao=Hsiao[2:NROW(Hsiao),]; Series=" NamesHsiao[2:NROW(NamesHsiao),]; CREATE Hsiao FROM Hsiao[COLNAME={'Ylag' 'Xlag' 'FPE'} ROWNAME=Series]; APPEND FROM Hsiao[ROWNAME=Series]; CLOSE Hsiao; QUIT; PROC SORT DATA=Hsiao; BY Series FPE; RUN; PROC SORT DATA=Granger;" BY Series; RUN; DATA &outdata; MERGE &outdata Granger Hsiao; BY Series; IF FIRST.Series; FORMAT First Last MONYY7. CCF Pval_F Pval_C Pval_W Coherence 7.4; RUN;"_NETTOY"& &_nettoy Granger Hsiao"d"xl DATA _NULL_; CALL SYMPUT('nbmeth',TRIM(LEFT(PUT(COUNT(TRIM(LEFT("&method")),' ')+1,5.)))); RUN;"&:mI1&nbmeth1"VJJ"! %SCAN(&method,&i)" Method &jj"l (&jj EQ 0)"t PROC VARCLUS DATA=&outnew._&jj OUTTREE=&outcah._&jj CENTROID NOPRINT MAXC=&nbclus; VAR &namenew0; RUN;"m"rf PROC CLUSTER DATA=&outnew._&jj METHOD=ward OUTTREE=&outcah._&jj NOPRINT; ID series; RUN;"(s(%UPCASE(&graph) EQ YES)"7q'(%SYSFUNC(CEXIST(work.Method&jj)) EQ 1)"@4 PROC CATALOG C=work.Method&jj KILL; QUIT;"q" AXIS1 LABEL=NONE; PROC TREE DATA=&outcah._&jj(WHERE=(_ncl_ <= &gmax)) HORIZONTAL VAXIS=axis1 NCLUSTERS=&nbclus GOUT=Method&jj NAME=Tree_&jj; RUN; AXIS;TITLE;"s" PROC TREE DATA=&outcah._&jj NOPRINT NCLUSTERS=&nbclus OUT=_outtree_&jj(RENAME=(_name_=series)); RUN; PROC SORT DATA=_outtree_&jj(KEEP=Series Cluster); BY series; RUN; DATA &outdata; LENGTH Series $ 32; MERGE &outdata"  _outtree_&jj(RENAME=(Cluster=Cluster&jj)); BY series; LABEL Series=' ' Cluster&jj=' '; RUN; PROC SORT DATA=_outtree_&jj; BY Cluster; RUN; PROC TRANSPOSE DATA=_outtree_&jj OUT=_t1_; VAR series; BY Cluster; RUN; PROC"y TRANSPOSE DATA=_t1_(DROP=_name_ _label_ Cluster) OUT=&clusters._&jj(DROP=_name_) PREFIX=CL; VAR _CHARACTER_; RUN;"(y(%UPCASE(&print) EQ YES)"nb PROC PRINT DATA=&clusters._&jj; TITLE 'Composition of the Clusters'; RUN; TITLE;"y"_NETTOY"2 "&_nettoy _outtree_&jj &outcah._&jj"4~$(%SYSFUNC(EXIST(work.Medoids)) EQ 1)"RF PROC DATASETS LIBRARY=work NOLIST; DELETE Medoids; QUIT;"~"  DATA _NULL_; SET _outtree_&jj END=fin; LENGTH liste $ 30000; RETAIN liste; BY Cluster; IF FIRST.Cluster THEN DO; liste=' '; n+1; NbCl=0; END; liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series)))" )); NbCl+1; IF LAST.Cluster THEN DO; CALL SYMPUT('ListCl'||TRIM(LEFT(PUT(Cluster,5.))),TRIM(LEFT(liste))); CALL SYMPUT('NbCl'||TRIM(LEFT(PUT(Cluster,5.))),TRIM(LEFT(PUT(NbCl,5.)))); END; IF fin THEN CALL SYMPUT('NumCl',TRIM(LEFT("!PUT(n,5.)))); RUN;" (&jj NE 0)"j^ PROC TRANSPOSE DATA=&outnew._&jj OUT=Factor; VAR _numeric_; ID Series; RUN;""=1 DATA Factor; SET &outnew._&jj; RUN;"F: DATA &outmed._&jj; SET _trav_(KEEP=&date); RUN;"%(%LENGTH(&vary) NE 0)" DATA &outmed.C_&jj &outmed.H_&jj; SET _trav_(KEEP=&date); RUN; PROC SORT DATA=&outdata; BY Cluster&jj; RUN; PROC RANK DATA=&outdata OUT=&outdata TIES=LOW; VAR FPE; BY Cluster&jj; RANKS MedoidsH&jj; RUN;" PROC RANK DATA=&outdata OUT=&outdata TIES=LOW DESCENDING; VAR Coherence; BY Cluster&jj; RANKS MedoidsC&jj; RUN; PROC SORT DATA=&outdata; BY Series; RUN;""&wIK1&NumCl1" (&&NbCl&ik GT 1)" PROC FACTOR DATA=Factor(KEEP=&&ListCl&ik) NOPRINT NFACTORS=1 OUTSTAT=Fstat(WHERE=(_TYPE_=:'PATTERN')); VAR &&ListCl&ik; RUN; PROC TRANSPOSE DATA=Fstat OUT=Fstat(KEEP=_Name_ Factor1 RENAME=(_Name_=Series)); VAR _NUMERIC_;"  RUN; DATA Fstat; SET Fstat; Factor1=ABS(Factor1); RUN; PROC RANK DATA=Fstat OUT=Fstat TIES=LOW DESCENDING; VAR Factor1; RANKS Medoids&jj; RUN; PROC APPEND BASE=Medoids DATA=Fstat; RUN; DATA"  _NULL_; SET Fstat END=fin; LENGTWH liste $ 30000; RETAIN liste ' '; IF (Medoids&jj <= &medoids) THEN liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series))))); IF fin THEN CALL SYMPUT('ListCl',TRIM(LEFT(liste)));"}q RUN; DATA &outmed._&jj; MERGE &outmed._&jj _trav_(KEEP=&date &ListCl); BY &date; RUN;"(&summary GT 0)" DATA _NULL_; IF (&&NbCl&ik <= &summary) THEN nbfact=&&NbCl&ik -1; ELSE nbfact=&summary; CALL SYMPUT('nbfact',TRIM(LEFT(PUT(nbfact,5.)))); RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT" NFACTORS=&nbfact OUT=FactorX(KEEP=&date Factor1-Factor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"(&syserr NE 0)" PROC PRINCOMP DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT N=&nbfact PREFIX=Factor OUT=FactorX(KEEP=&date Factor1-Factor&nbfact); VAR &&ListCl&ik; RUN;""PD DATA &outmed._&jj; MERGE &outmed._&jj FactorX(RENAME=("'{IJ1&nbfact1"( Factor&ij=M&jj._CL&ik._F&ij"{"+)); BY &date; RUN;"""wk DATA &outmed._&jj; MERGE &outmed._&jj _trav_(KEEP=&date &&ListCl&ik); BY &date; RUN;"w"%(%LENGTH(&vary) NE 0)"&~IK1&NumCl1" (&&NbCl&ik GT 1)"  DATA _NULL_; SET &outdata(KEEP=Series MedoidsC&jj MedoidsH&jj Cluster&jj) END=fin; LENGTH listC listH $ 30000; RETAIN listC listH ' '; IF (Cluster&jj=&ik) THEN DO; IF (0 < MedoidsC&jj <= &medoids) THEN listC=TRIM"(LEFT(COMPBL(TRIM(LEFT(listC))||' '||TRIM(LEFT(Series))))); IF (0 < MedoidsH&jj <= &medoids) THEN listH=TRIM(LEFT(COMPBL(TRIM(LEFT(listH))||' '||TRIM(LEFT(Series))))); END; IF fin THEN DO; CALL SYMPUT('ListClC',TRIM(LEFT(" listC))); CALL SYMPUT('ListClH',TRIM(LEFT(listH))); END; RUN; DATA &outmed.H_&jj; MERGE &outmed.H_&jj _trav_(KEEP=&date &ListClH); BY &date; RUN; DATA &outmed.C_&jj; MERGE &outmed.C_&jj _trav_("=1KEEP=&date &ListClC); BY &date; RUN;"(&summary GT 0)"  DATA _NULL_; IF (&&NbCl&ik <= &summary) THEN nbfact=&&NbCl&ik -1; ELSE nbfact=&summary; CALL SYMPUT('nbfact',TRIM(LEFT(PUT(nbfact,5.)))); RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT" NFACTORS=&nbfact OUT=FactorC(KEEP=&date Factor1-Factor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"(&syserr NE 0)" PROC PRINCOMP DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT N=&nbfact PREFIX=Factor OUT=FactorC(KEEP=&date Factor1-Factor&nbfact); VAR &&ListCl&ik; RUN;""TH DATA &outmed.C_&jj; MERGE &outmed.C_&jj FactorC(RENAME=("'IJ1&nbfact1") Factor&ij=MC&jj._CL&ik._F&ij"")); BY &date; RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT NFACTORS=&nbfact OUT=FactorH(KEEP=&date Factor1-Factor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"(&syserr NE 0)" PROC PRINCOMP DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT N=&nbfact PREFIX=Factor OUT=FactorH(KEEP=&date Factor1-Factor&nbfact); VAR &&ListCl&ik; RUN;""TH DATA &outmed.H_&jj; MERGE &outmeYX1:i+1])/3; dmp[i]=date[INT(pmm[i])]; END; DO i=2 TO nbr-2; pentm[i]=(moy[i+1,2]-moy[i,2])/" (pmm[i+1]-pmm[i]); b=INT(pmm[i+1]); IF i=2 THEN a=1; ELSE a=INT(pmm[i]); DO j=a+1 TO b; obst[j]=obst[j-1]+pentm[i]; END; IF i < 4 THEN a=1; ELSE a=INT(pmm[i-1])+1; moymoy=SUM(lxser[a:b]) /(b-a+1); obsbar=SUM(obst[a:b]) /(" b-a+1); diff[i]=moymoy-obsbar; DO j=a TO b; obst[j]=obst[j]+diff[i]; END; END; n8=&_ndon1-INT(pmm[nbr-1]); IF (n8 <= 12) THEN pentm[nbr-1]=pentm[nbr-2]; ELSE pentm[nbr-1]=(SUM(lxser[INT(pmm[nbr-1])+1:&_ndon1])-n8*obst["INT(pmm[nbr-1])]) / ((1+n8)*n8/2); DO i=INT(pmm[nbr-1])+1 TO &_ndon1; obst[i]=obst[i-1]+pentm[nbr-1]; END;" (&log EQ 0)"  moy1=EXP(moy);"" (&nfor EQ 2)"  RUN qtr1(obst);""%(%UPCASE(&print)=OUI)" PRINT / "ETAPES PRELIMINAIRES POUR LE CALCUL DU TREND FINAL"; pha={PHASE}; deb={DE}; f={A}; d1={"DATE MOYENNE"}; d3={"DATE MOY2"}; d2={"DATE MEDIANE"}; p={"PENTE"}; pm={"PENTE MOYENNE"}; dif={"~"AJUSTEMENT DU NIVEAU"}; nom1={"ANTILOG MOYEN", "TRIPLET MOYEN"}; nom={"MOYENNE", "TRIPLET MOYEN"}; RESET NONAME;" (&log EQ 0)" PRINT phase[COLNAME=pha] debut[COLNAME=deb FORMAT=&format] fin[COLNAME=f FORMAT=&format] moy1[COLNAME=nom1 FORMAT=10.2] dat[COLNAME=d1 FORMAT=&format] dseg[COLNAME=d2 FORMAT=&format] dmp[COLNAME=d3 FORMAT=&format] pente[COLNAME=p"XL FORMAT=14.5] pentm[COLNAME=pm FORMAT=14.5] diff[COLNAME=dif FORMAT=14.5] /;""  PRINT phase[COLNAME=pha] debut[COLNAME=deb FORMAT=&format] fin[COLNAME=f FORMAT=&format] moy[COLNAME=nom FORMAT=10.2] dat[COLNAME=d1 FORMAT=&format] dseg[COLNAME=d2 FORMAT=&format] dmp[COLNAME=d3 FORMAT=&format] pente[COLNAME=p FORMAT"RF=14.5] pentm[COLNAME=pm FORMAT=14.5] diff[COLNAME=dif FORMAT=14.5] /;"y RESET NAME; PRINT / "LOGARITHME DU TREND FINAL AVANT MOYENNE MOBILE SUR 12 TERMES"; RUN impres(obst,annee);""  DO i=7 TO &_ndon1-5; obs1[i]=SUM(obst[i-6:i+5])/12; END; crdeb=((obs1[8]/obs1[7]) + (obs1[9]/obs1[8]))/2; DO i=6 TO 1 BY -1; obs1[i]=obs1[i+1]/crdeb; END; crfin=((obs1[&_ndon1-5]/obs1[&_ndon1-6]) + (obs1[&_ndon1-6]/obs1[&_ndon1"WK-7]))/2; DO i=&_ndon1-4 TO &_ndon1; obs1[i]=obs1[i-1]*crfin; END;"  (&nfor EQ 2)"  RUN qtr1(obs1);" "% (%UPCASE(&print)=OUI)"th PRINT / "LOGARITHME DU TREND FINAL APRES MOYENNE MOBILE SUR 12 TERMES"; RUN impres(obs1,annee);" " (&log EQ 0)"  obs1=EXP(obs1);""%(%UPCASE(&print)=OUI)"C7 PRINT / "TREND FINAL"; RUN impres(obs1,annee);""C7 nameres=nameres||{TRENDF}; resul_=resul_||obs1;" (&ird EQ 0)" (&inv EQ 0)"." xser = 100 # xserie / obs1;""-! xser = 100 # obs1 / xserie;"" (&inv EQ 0)"( xser = xserie - obs1;""' xser = xserie - obs1;"{o FINISH triple; START newsub(xserie,dtrend,annee,link,resul_,nameres);"A (&ndtr EQ 0)"  mindon=MIN(xserie); maxdon=MAX(xserie); IF (mindon <= 0) THEN maxdon=maxdon-2*mindon+1; tmax=maxdon; DO UNTIL ((tmZYax <= 10**5) & (tmax >= 10**4)); IF (tmax > 10**5) THEN tmax=tmax/10; IF (tmax < 10"t**4) THEN tmax=tmax*10; END; power=tmax/maxdon; IF (power ^= 1) THEN DO; xserie=xserie*power;"%%(%UPCASE(&print)=OUI)" RESET NONAME; PRINT "ATTENTION: CHANGEMENT D'UNITES. LA SERIE A ETE MULTIPLIEE PAR" power; PRINT "SERIE BRUTE APRES CHANGEMENT D'UNITE"; RESET NAME; RUN impres(xserie,annee);"%"pd END; IF (mindon <= 0) THEN DO; mindon=(1-2*mindon)*power; xserie = xserie+mindon;"%)(%UPCASE(&print)=OUI)" RESET NONAME; PRINT "ATTENTION: LA SERIE &xx POSSEDAIT DES VALEURS NEGATIVES, ELLE A ETE TRANSLATEE DE " mindon ; PRINT "SERIE BRUTE CORRIGEE POUR VALEURS NEGATIVES"; RESET NAME; RUN impres(xserie,annee);")"  END; nameres=nameres||{don}; resul_=resul_||xserie; xxmon=J(&_ndon1,1,0); nb=INT(&iterm/2); DO i=1+nb TO &_ndon1-nb; xxmon[i]=SUM(xserie[i-nb:i+nb])/&iterm; END; suma =SUM(xserie[1:&iterm" ])/&iterm; sumb =SUM(xserie[25:&iterm+24])/&iterm; txdeb=(LOG(sumb)-LOG(suma)) / 24; xxmon[nb]= suma - suma * txdeb; DO i=nb-1 TO 1 BY -1; xxmon[i]=xxmon[i+1] - xxmon[i+1] # txdeb; END; sumz =SUM(xserie[&_ndon1-&iterm+"1:&_ndon1])/&iterm; sumy =SUM(xserie[&_ndon1-&iterm-24+1:&_ndon1-24])/&iterm; txfin=(LOG(sumz)-LOG(sumy)) / 24; xxmon[&_ndon1-nb+1]= sumz + sumz * txfin; DO i=&_ndon1-nb+2 TO &_ndon1; xxmon[i]=xxmon[i-1] + xxmon[i-1] # txfin;" END;"3 (&ird EQ 0)"1 (&inv EQ 0)"2& rxmon = 100 # xserie / xxmon;"2"2& rxmon = 100 # xxmon / xserie;"7"6 (&inv EQ 0)", rxmon = xserie - xxmon;"7", rxmon = xxmon - xserie;": (&nfor EQ 2)":. RUN qtr1(xxmon); RUN qtr1(rxmon);":"  dtrend=rxmon;"%?(%UPCASE(&print)=OUI)"  PRINT "TAUX DE CROISSANCE UTILISES POUR LA MOYENNE MOBILE", txdeb [FORMAT=10.8] txfin [FORMAT=10.8] ; PRINT "MOYENNE MOBILE SIMPLE SUR &iterm TERMES"; RUN impres(xxmon,annee); PRINT "SERIE DEBARRASSEE DE SA TENDANCE";", RUN impres(dtrend,annee);"?"L@ nameres=nameres||{MM&iterm}; resul_=resul_||xxmon;"I"E9 nameres=nameres||{don}; resul_=resul_||xserie;"E (&inv EQ 1)"% xserie = -xserie;"E"  dtrend=xserie;"%I(%UPCASE(&print)=OUI)"j^ PRINT "SERIE DEBARRASSEE DE SA TENDANCE (option NDTR)"; RUN impres(dtrend,annee);"I"  nameres=nameres||{dtrend1}; resul_=resul_||dtrend; link=1; FINISH newsub; START tp1(xserie,spenc,xmoy,xcorr,mcd,annee,date,link,ifin,resul_,nameres); RUN spencer(xserie",xmoy); IF (ifin=1) THEN nameres=nameres||{spencer2}; ELSE nameres=nameres||{spencer1}; resul_=resul_||xmoy;"%N(%UPCASE(&print)=OUI)"QE PRINT "MOYENNE MOBILE DE SPENCER"; RUN impres(xmoy,annee);"N"  work=100 # xserie / xmoy; IF (mcd=0) THEN DO; wmcd=J(8,1,0); DO j=8 TO 1 BY -1; spenc=J(&_ndon1-j,1,0); ww=spenc; DO i= 1 TO &_ndon1-j; IF (work[i] ^= 0) THEN spenc[i][Z= 100 # (work[i+j]/work[i] -1); IF ("xmoy[i] ^= 0) THEN ww[i]= 100 # (xmoy[i+j]/xmoy[i] -1); END; wmcd[j]=SUM(ABS(spenc)) / SUM(ABS(ww)); IF wmcd[j] < 1 THEN mcd=j; END; IF (wmcd[8] > 1) THEN mcd=6; IF (mcd < 3) THEN mcd=3;"%S(%UPCASE(&print)=OUI)"F: PRINT "Estimation du MCD",mcd wmcd [FORMAT=10.6] /;"S"0$ END; IF (mcd < 3) THEN mcd=3;"W (&nfor EQ 2)"  RUN qtr1(xmoy);"W"-Z((&ird NE 0) OR (&ndtr NE 0))" work=work/100;"Z" spenc=xserie; amean=SUM(work) / &_ndon1; std=SQRT(SUM(work##2) / &_ndon1 - amean**2); cc=LOC((work < amean - &amul*std) | (work > amean + &amul*std)); IF NROW(cc) =0 THEN DO;"%^(%UPCASE(&print)=OUI)"y PRINT "DETECTION DES POINTS EXTREMES"; PRINT "Pas de valeurs extrmes dtectes au del de &amul cart-types";"^"PD ntru=0; END; ELSE DO; spenc[cc]=xmoy[cc]; ntru=1;"%c(%UPCASE(&print)=OUI)"  an1=date[cc]; extremes=work[cc]||xserie[cc]||xmoy[cc]; noman={DATE}; nomext={"RAPPORT","VALEUR EXTREME","VALEUR DE REMPLACEMENT"}; PRINT "DETECTION DES POINTS EXTREMES", amean[FORMAT=10.5] std[FORMAT=10.5]; RESET" NONAME; PRINT an1[COLNAME=noman FORMAT=&format] extremes [COLNAME=nomext FORMAT=10.2]; PRINT "SERIE DEBARRASSEE DE SA TENDANCE ET CORRIGEE DES EXTREMES"; RUN impres(spenc,annee);"c"  END; IF (ifin=1) THEN nameres=nameres||{dtrcor2}; ELSE nameres=nameres||{dtrcor1}; resul_=resul_||spenc; xcorr=spenc; past=INT(&moymob/2); futur=&moymob-past-1; IF ntru=0 THEN DO; spenc=xmoy; DO i="1 TO past; xmoy[i]=SUM(xserie[1:futur+i])/(futur+i); END; DO i=&_ndon1-futur TO &_ndon1; xmoy[i]=SUM(xserie[i-past:&_ndon1])/(&_ndon1-i+past+1); END; DO i=past+1 TO &_ndon1-futur-1; xmoy[i]=SUM(xserie[i-past:i+futur])/" &moymob; END; END; ELSE DO; DO i=1 TO past; xmoy[i]=SUM(spenc[1:futur+i])/(futur+i); END; DO i=&_ndon1-futur TO &_ndon1; xmoy[i]=SUM(spenc[i-past:&_ndon1])/(&_ndon1-i+past+1); END; DO i=past+1 TO &_ndon1-futur-1;" xmoy[i]=SUM(spenc[i-past:i+futur])/&moymob; END; wmd=J(&_ndon1,1,0); RUN spencer(spenc,wmd); spenc=wmd; END;"j (&nfor EQ 2)"  RUN qtr1(xmoy);"j"%m(%UPCASE(&print)=OUI)" PRINT "MOYENNE MOBILE SUR &moymob TERMES DE LA SERIE DEBARRASSEE DE SA TENDANCE ET CORRIGEE"; RUN impres(xmoy,annee);"m"  IF (ifin=1) THEN nameres=nameres||{MM&moymob._2}; ELSE nameres=nameres||{MM&moymob._1}; resul_=resul_||xmoy; IF (&ndtr=1) THEN ifin=1; link=2; FINISH tp1; START"  tp2(xser1,xser2,xser3,mcd,xwmd,tp,m,annee,date,ktru,link,ifin,resul_,nameres); xwmd=J(&_ndon1,1,0); nb=INT(mcd/2); IF (mcd-2*nb > 0) THEN DO; DO i=1+nb TO &_ndon1-nb; xwmd[i]=SUM(xser1[i-nb:i+nb])/mcd; END; DO i=" 1 TO nb; xwmd[i]=xwmd[1+nb]; xwmd[&_ndon1-i+1]=xwmd[&_ndon1-nb]; END; END; ELSE DO; DO i=1+nb TO &_ndon1-nb; xwmd[i]=SUM(xser1[i-nb:i+nb-1])/mcd; END; DO i=1 TO nb; xwmd[i]=xwmd[1+nb]; xwmd[&_ndon1"6*-i+1]=xwmd[&_ndon1-nb]; END; END;"t (&nfor EQ 2)"! RUN qtr1(xwmd);"t"%w(%UPCASE(&print)=OUI)" \[ PRINT "MOYENNE MOBILE MCD DE LA SERIE DEBARRASSEE DE SA TENDANCE ET NON CORRIGEE DES EXTREMES"; PRINT mcd; RUN impres(xwmd,annee);"w" IF (ifin=1) THEN nameres=nameres||{MCD_2}; ELSE nameres=nameres||{MCD_1}; resul_=resul_||xwmd; ktru=0; tp=J(&_ndon1,1,0); RUN wtp(xser2,&nmonth,tp,m);"%{(%UPCASE(&print)=OUI)" IF (m > 0) THEN DO; PRINT "POINTS DE RETOURNEMENT POTENTIELS SUR MM&moymob"; RUN printtp(xser2,tp,date); END;"{"+ RUN piccreux(xser2,tp,m);"%(%UPCASE(&print)=OUI)" PRINT ,,"CONTROLE DE LA SUCCESSION PIC-CREUX"; IF (NROW(LOC(tp < 0)) = 0) THEN PRINT "Pas de points rejets"; ELSE RUN printtpr(xser2,tp,date);"" tp=CHOOSE(tp<0,0,tp); IF (ifin=1) THEN nameres=nameres||{TPMM12_2}; ELSE nameres=nameres||{TPMM12_1}; resul_=resul_||tp; IF (2 < m < 50) THEN DO; RUN mdp(xser3,6,tp,mcd);"%(%UPCASE(&print)=OUI)"oc PRINT / "POINTS DE RETOURNEMENT POTENTIELS SUR SPENCER"; RUN printtp(xser3,tp,date);"" tp=CHOOSE(tp<0,0,tp); IF (ifin=1) THEN nameres=nameres||{TPSPEN_2}; ELSE nameres=nameres||{TPSPEN_1}; resul_=resul_||tp; END; ELSE IF (0 < m) THEN DO; RUN mdp(xser1,6,tp,mcd);"%(%UPCASE(&print)=OUI)"s PRINT / "POINTS DE RETOURNEMENT POTENTIELS SUR SERIE CORRIGEE DU TREND"; RUN printtp(xser1,tp,date);""  tp=CHOOSE(tp<0,0,tp); IF (ifin=1) THEN nameres=nameres||{TPSER_2}; ELSE nameres=nameres||{TPSER_1}; resul_=resul_||tp; END; link=3; FINISH tp2; START tp3" (xser1,xser2,tp,m,ktru,link,ifin,annee,date,xmon,resul_,nameres); IF (ktru=0) THEN DO; IF (m >= 4) THEN RUN test(xser1,tp,m,date); ktru=1; link=4; RETURN; END; IF (m >= 4) THEN RUN test(xser2,tp,m,date); ind=LOC(tp);"  nbr=NCOL(ind); extrem=tp[ind]; IF (nbr > 1) THEN DO; DO i=1 TO nbr-1; IF ((ind[i+1]-ind[i]) < &lphase) THEN DO; tp[ind[i]]=-extrem[i]; tp[ind[i+1]]=-extrem[i+1]; END; END; IF ((ind[nbr]-ind[nbr-1]) <"5) &lphase) THEN tp[ind[nbr]]=-extrem[nbr];"%(%UPCASE(&print)=OUI)" PRINT ,, "CONTROLE DES LONGUEURS DE PHASES SUPERIEURES A &lphase MOIS"; IF (NROW(LOC(tp <0)) = 0) THEN PRINT "Pas de point rejet"; ELSE RUN printtpr(xser2,tp,date);""eY END; tp=CHOOSE(tp<0,0,tp); m=NCOL(LOC(tp > 0)); IF (ifin ^= 0) THEN DO;"%(%UPCASE(&print)=OUI)"}q PRINT / "POINTS DE RETOURNEMENT POTENTIELS SUR SERIE CORRIGEE DU TREND"; RUN printtp(xser2,tp,date);"" IF (ifin=1) THEN nameres=nameres||{TPSERF_2}; ELSE nameres=nameres||{TPSERF_1}; resul_=resul_||tp; ifin=2; END; ELSE DO;"%(%UPCASE(&print)=OUI)"fZ PRINT / "POINTS DE RETOURNEMENT DE BRY-BOSCHRAN"; RUN printtp(xser2,tp,date);"" IF (ifin=1) THEN nameres=nameres||{TPBRY_2}; ELSE nameres=nameres||{TPBRY_1}; resul_=resul_||tp; RUN triple(xmon,xser2,date,tp,m,annee,resul_,nameres); IF (m < 4) & (&ndtr=0) THEN DO; PRINT"  "Le nombre final de points de retournement est infrieur 4," ,"Le trend final ne peut tre calcul et on arrte le traitement"; ifin=2; END; ELSE IF (m >= 4) THEN DO; ifin=1^\; END; END; link=1; FINISH" tp3; START tp4(xser1,xser2,mcd,tp,m,annee,date,ktru,link,ifin,resul_,nameres); RUN mdp(xser1,5,tp,mcd);"%(%UPCASE(&print)=OUI)"wk PRINT / "POINTS DE RETOURNEMENT POTENTIELS SUR MOYENNE MOBILE MCD"; RUN printtp(xser1,tp,date);"" IF (ifin=1) THEN nameres=nameres||{TPMCD_2}; ELSE nameres=nameres||{TPMCD_1}; resul_=resul_||tp; mcd1=mcd; RUN mdp(xser2,mcd1,tp,mcd);"%(%UPCASE(&print)=OUI)"} PRINT / "POINTS DE RETOURNEMENT POTENTIELS SUR LA SERIE DEBARRASSEE DE SA TENDANCE "; RUN printtp(xser2,tp,date);""h\ ind=LOC(tp >0); m=NCOL(ind); IF (m > 0) THEN DO; extrem=tp[ind];"%(%UPCASE(&print)=OUI)"[O PRINT ,,"CONTROLE DES POINTS DE RETOURNEMENT EN DEBUT ET FIN DE SERIE";""ui IF ( (extrem[m]=1) & (MAX(xser2[ind[m]:&_ndon1]) > xser2[ind[m]]) ) THEN DO; tp[ind[m]]=-1;"%(%UPCASE(&print)=OUI)" peaks=xser2[ind[m]]; ipeaks=ind[m]; dpeaks=date[ind[m]]; PRINT "Pic potentiel de fin de srie limin: " ipeaks dpeaks[FORMAT=&format] peaks[FORMAT=6.2];""y END; ELSE IF ( (extrem[m]=2) & (MIN(xser2[ind[m]:&_ndon1]) < xser2[ind[m]]) ) THEN DO; tp[ind[m]]=-2;"%(%UPCASE(&print)=OUI)" troughs=xser2[ind[m]]; itroughs=ind[m]; dtroughs=date[ind[m]]; PRINT "Creux potentiel de fin de srie limin: " itroughs dtroughs[FORMAT=&format] troughs[FORMAT=10.2];""zn END; IF ( (extrem[1]=1) & (MAX(xser2[1:ind[1]]) > xser2[ind[1]]) ) THEN DO; tp[ind[1]]=-1;"%(%UPCASE(&print)=OUI)" peaks=xser2[ind[1]]; ipeaks=ind[1]; dpeaks=date[ind[1]]; PRINT "Pic potentiel de dbut de srie limin: " ipeaks dpeaks[FORMAT=&format] peaks[FORMAT=10.2];""s END; ELSE IF ( (extrem[1]=2) & (MIN(xser2[1:ind[1]]) < xser2[ind[1]]) ) THEN DO; tp[ind[1]]=-2;"%(%UPCASE(&print)=OUI)" troughs=xser2[ind[1]]; itroughs=ind[1]; dtroughs=date[ind[1]]; PRINT "Creux potentiel de dbut de srie limin: " itroughs dtroughs[FORMAT=&format] troughs[FORMAT=10.2];""& END; ELSE DO;"%(%UPCASE(&print)=OUI)"ZN PRINT "Pas de problme de points multiples en dbut et fin de srie";"" END; END; tp=CHOOSE(tp<0,0,tp); ind=LOC(tp > 0); m=NCOL(ind); IF (m > 0) THEN DO; extrem=tp[ind]; IF (&_ndon1-ind[m]) < 6 THEN DO; IF (extrem[m]=2) THEN DO; tp[ind[m]]=-2;"%(%UPCASE(&print)=OUI)" troughs=xser2[ind[m]]; itroughs=ind[m]; dtroughs=date[ind[m]]; PRINT "Creux potentiel limin, trop proche de la fin de srie: " itroughs dtroughs[FORMAT=&format] troughs[FORMAT=10.2];""VJ END; ELSE IF (extrem[m]=1) THEN DO; tp[ind[m]]=-1;"%(%UPCASE(&print)=OUI)" peaks=xser2[ind[m]]; ipeaks=ind[m]; dpeaks=date[ind[m]]; PRINT "Pic potentiel limin, trop proche de la fin de srie: " ipeaks dpeaks[FORMAT=&format] peaks[FORMAT=10.2];""( END; E_] LENGTH liste $ 30000; RETAIN liste ' '; IF (Medoids&jj <= &medoids) THEN liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series))))); IF fin THEN CALL SYMPUT('ListCl',TRIM(LEFT(liste)));"}q RUN; DATA &outmed._&jj; MERGE &outmed._&jj _trav_(KEEP=&date &ListCl); BY &date; RUN;"(&summary GT 0)" DATA _NULL_; IF (&&NbCl&ik <= &summary) THEN nbfact=&&NbCl&ik -1; ELSE nbfact=&summary; CALL SYMPUT('nbfact',TRIM(LEFT(PUT(nbfact,5.)))); RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT" NFACTORS=&nbfact OUT=FactorX(KEEP=&date Factor1-Factor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"(&syserr NE 0)" PROC PRINCOMP DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT N=&nbfact PREFIX=Factor OUT=FactorX(KEEP=&date Factor1-Factor&nbfact); VAR &&ListCl&ik; RUN;""PD DATA &outmed._&jj; MERGE &outmed._&jj FactorX(RENAME=("'{IJ1&nbfact1"( Factor&ij=M&jj._CL&ik._F&ij"{"+)); BY &date; RUN;"""wk DATA &outmed._&jj; MERGE &outmed._&jj _trav_(KEEP=&date &&ListCl&ik); BY &date; RUN;"w"%(%LENGTH(&vary) NE 0)"&~IK1&NumCl1" (&&NbCl&ik GT 1)"  DATA _NULL_; SET &outdata(KEEP=Series MedoidsC&jj MedoidsH&jj Cluster&jj) END=fin; LENGTH listC listH $ 30000; RETAIN listC listH ' '; IF (Cluster&jj=&ik) THEN DO; IF (0 < MedoidsC&jj <= &medoids) THEN listC=TRIM"(LEFT(COMPBL(TRIM(LEFT(listC))||' '||TRIM(LEFT(Series))))); IF (0 < MedoidsH&jj <= &medoids) THEN listH=TRIM(LEFT(COMPBL(TRIM(LEFT(listH))||' '||TRIM(LEFT(Series))))); END; IF fin THEN DO; CALL SYMPUT('ListClC',TRIM(LEFT(" listC))); CALL SYMPUT('ListClH',TRIM(LEFT(listH))); END; RUN; DATA &outmed.H_&jj; MERGE &outmed.H_&jj _trav_(KEEP=&date &ListClH); BY &date; RUN; DATA &outmed.C_&jj; MERGE &outmed.C_&jj _trav_("=1KEEP=&date &ListClC); BY &date; RUN;"(&summary GT 0)"  DATA _NULL_; IF (&&NbCl&ik <= &summary) THEN nbfact=&&NbCl&ik -1; ELSE nbfact=&summary; CALL SYMPUT('nbfact',TRIM(LEFT(PUT(nbfact,5.)))); RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT" NFACTORS=&nbfact OUT=FactorC(KEEP=&date Factor1-Factor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"(&syserr NE 0)" PROC PRINCOMP DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT N=&nbfact PREFIX=Factor OUT=FactorC(KEEP=&date Factor1-Factor&nbfact); VAR &&ListCl&ik; RUN;""TH DATA &outmed.C_&jj; MERGE &outmed.C_&jj FactorC(RENAME=("'IJ1&nbfact1") Factor&ij=MC&jj._CL&ik._F&ij"")); BY &date; RUN; PROC FACTOR DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT NFACTORS=&nbfact OUT=FactorH(KEEP=&date Factor1-Factor&nbfact) PRIORS=smc HEYWOOD; VAR &&ListCl&ik; RUN;"(&syserr NE 0)" PROC PRINCOMP DATA=_trav_(KEEP=&date &&ListCl&ik) NOPRINT N=&nbfact PREFIX=Factor OUT=FactorH(KEEP=&date Factor1-Factor&nbfact); VAR &&ListCl&ik; RUN;""TH DATA &outmed.H_&jj; MEb^LSE DO;"%(%UPCASE(&print)=OUI)"ZN PRINT "Pas de pic potentiel trop proche des extrmits de la srie";""~r END; END; IF (ind[1] -1) < 6 THEN DO; IF (extrem[1]=2) THEN DO; tp[ind[1]]=-2;"%(%UPCASE(&print)=OUI)" troughs=xser2[ind[1]]; itroughs=ind[1]; dtroughs=date[ind[1]]; PRINT "Creux potentiel limin, trop proche du dbut de srie: " itroughs dtroughs[FORMAT=&format] troughs[FORMAT=10.2];""VJ END; ELSE IF (extrem[1]=1) THEN DO; tp[ind[1]]=-1;"%(%UPCASE(&print)=OUI)" peaks=xser2[ind[1]]; ipeaks=ind[1]; dpeaks=date[ind[1]]; PRINT "Pic potentiel limin, trop proche du dbut de srie: " ipeaks dpeaks[FORMAT=&format] peaks[FORMAT=10.2];""( END; ELSE DO;"%(%UPCASE(&print)=OUI)"\P PRINT "Pas de creux potentiel trop proche des extrmits de la srie";""  END; END; END; tp=CHOOSE(tp<0,0,tp); IF (ifin=1) THEN nameres=nameres||{TPDTR_2}; ELSE nameres=nameres||{TPDTR_1}; resul_=resul_||tp; m=NCOL(LOC(tp > 0)); IF (m > 0) THEN link=3; ELSE ifin" =2; FINISH tp4; START princ; debut: IF (link=1) THEN RUN tp1(obs,w,wma,obscor,mcd,annee,date,link,ifin,resul_,nameres); IF (link=2) THEN RUN tp2(obs,wma,w,mcd,wmd,np,m,annee,date,ktru,link,ifin,resul_,nameres); IF (link=3)"  THEN RUN tp3(w,obs,np,m,ktru,link,ifin,annee,date,xmon,resul_,nameres); IF (ifin = 2) THEN GOTO fin; IF (link=4) THEN RUN tp4(wmd,obs,mcd,np,m,annee,date,ktru,link,ifin,resul_,nameres); IF (ifin = 2) THEN GOTO fin; ELSE GOTO debut; fin":RETURN; FINISH princ; USE &out WHERE(&xx ^=.); READ all VAR{&xx} INTO donnees; READ all VAR{&date} INTO date; CLOSE &out; USE _annee WHERE(_annee ^=.);; READ all VAR{_annee} INTO annee; CLOSE _annee; xmon=donnees;"@4 nameres={&date &xx}; resul_=date||donnees;"%(%UPCASE(&print)=OUI)"MA PRINT "DONNEES BRUTES: SERIE &xx"; RUN impres(xmon,annee);""ma ifin=0; link=0; mcd=&mcd; RUN newsub(xmon,obs,annee,link,resul_,nameres); RUN princ;" (&nfor EQ 2)"|p cc=LOC(MOD(1:NROW(resul_),3)=2); resul_=resul_[cc,]; resul_[,1]=YYQ(YEAR(resul_[,1]),QTR(resul_[,1]));""  CREATE &out FROM resul_[COLNAME=nameres]; APPEND FROM resul_; CLOSE &out; tpserf=0; cc=LOC(nameres='TPSERF_1'); IF (NCOL(cc)^=0) THEN tpserf=1; cc=LOC(nameres='TPSERF_2'); IF (NCOL(cc)^=0) THEN tpserf=2; CALL SYMPUT('tpserf',CHAR(" tpserf,2,0)); QUIT;"(&tpserf NE 0)"NBVAL" 0"  DATA lengths; LENGTH Between $ 17; SET &out(KEEP=&date TPSERF_2 WHERE=(TPSERF_2=1) IN=in1) &out(KEEP=&date TPSERF_2 WHERE=(TPSERF_2=2) IN=in2) &out(KEEP=&date TPSERF_2 WHERE=(TPSERF_2 IN(1,2)) IN=in3); IF in1 THEN Between='Peaks'" ; ELSE IF in2 THEN Between='Troughs'; ELSE IF in3 THEN Between='Peaks_Troughs'; DROP TPSERF_2; RUN; PROC SORT DATA=lengths; BY Between &date; RUN; DATA lengths; SET lengths END=fin; BY Between &date; length=DIF(&date); IF"v FIRST.Between THEN length=.; IF (length ^=.) THEN n+1; IF fin THEN CALL SYMPUT('nbval',LEFT(PUT(n,5.))); RUN;" (&nbval NE 0)"  PROC FORMAT; VALUE $ fstat 'N'='1' 'Missing vac_RGE &outmed.H_&jj FactorH(RENAME=("'IJ1&nbfact1") Factor&ij=MH&jj._CL&ik._F&ij""-!)); BY &date; RUN;""" DATA &outmed.C_&jj; MERGE &outmed.C_&jj _trav_(KEEP=&date &&ListCl&ik); BY &date; RUN; DATA &outmed.H_&jj; MERGE &outmed.H_&jj _trav_(KEEP=&date &&ListCl&ik); BY &date; RUN;"~"_NETTOY"( &_nettoy FactorC FactorH""  PROC SORT DATA=Medoids; BY series; RUN; DATA &outdata(DROP=Factor1) Medoids(KEEP=Series Cluster&jj Factor1 Medoids&jj); LENGTH Series $ 32; MERGE _nomvar_ &outdata Medoids; BY series; IF ((Medoids&jj=.) AND (UPCASE(Series)^="wkUPCASE("&vary"))) THEN Medoids&jj=1; IF (Factor1=.) THEN Factor1=1; LABEL Series=' ' Medoids&jj=' '"%(%LENGTH(&vary) NE 0)"2& MedoidsH&jj=' ' MedoidsC&jj=' '""VJ; RUN; PROC SORT DATA=Medoids; BY Cluster&jj Medoids&jj; RUN;"((%UPCASE(&print) EQ YES)" PROC TABULATE DATA=Medoids; CLASS Cluster&jj; VAR Factor1; TABLE Cluster&jj all,Factor1*((Mean Median STD Qrange Min Q1 Q3 Max)*F=6.3 N*F=5.0 COLPCTN*F=5.1) /RTS=15; KEYLABEL COLPCTN='%'; LABEL Factor1="@4'Dispersion of the Series in each Cluster'; RUN;""((%UPCASE(&graph) EQ YES)"  PROC BOXPLOT DATA=Medoids GOUT=Method&jj; PLOT Factor1* Cluster&jj / NAME="Boxplots_&jj" CAXIS=black CTEXT=black CBOXES=black VAXIS=axis1 HAXIS=axis1 BOXSTYLE=schematic BOXWIDTHSCALE=0.5 IDCOLOR=black IDSYMBOL=" dot; TITLE ' '; SYMBOL1 C=black H=0.5; AXIS1 LABEL=none; RUN; QUIT; SYMBOL;AXIS;TITLE; DATA _NULL_; SET Medoids END=fin; LENGTH liste $ 30000; RETAIN liste; BY Cluster&jj; IF (Cluster&jj) THEN DO;" IF FIRST.Cluster&jj THEN DO; liste=' '; n+1; END; IF (Medoids&jj <= &medoids) THEN liste=TRIM(LEFT(COMPBL(TRIM(LEFT(liste))||' '||TRIM(LEFT(Series))))); IF LAST.Cluster&jj THEN CALL SYMPUT('ListCl'||TRIM(LEFT(PUT("Cluster&jj,5.))),TRIM(LEFT(liste))); END; IF fin THEN CALL SYMPUT('NumCl',TRIM(LEFT(PUT(n,5.)))); RUN; PROC IML; USE _trav_; READ all VAR {"&IJ1&NumCl1" &&ListCl&ij""  } INTO medoids; READ all VAR {&date} INTO date; CLOSE _trav_; nbmed=NCOL(medoids); mindate=J(1,nbmed,.); DO i=1 TO nbmed; mindate[i]=date[(LOC(medoids[,i]^=.))[1]]; END; mindate=MIN(mindate); max=ROUND(MAX("medoids)+0.1,0.1); min=ROUND(MIN(medoids)-0.1,0.1); k=(max-min)/10; IF (k>=1) THEN pas=CEIL(k); ELSE pas=CEIL(10*k)/10; maxcoef=100+(INT((max-100)/pas)+1)#pas; mincoef=100-(INT((100-min)/pas)+1)#pas; CALL"  SYMPUT('maxcoef',CHAR(maxcoef,20.1)); CALL SYMPUT('mincoef',CHAR(mincoef,20.1)); CALL SYMPUT('pas',CHAR(pas,20.1)); CALL SYMPUT('div',CHAR(INT(&NumCl/4),4.)); CALL SYMPUT('mod',CHAR(MOD(&NumCl,4),4.)); CALL SYMPUT('mindate',CHAR("$mindate,10.)); QUIT;"(IJ1&medoids1"* SYMBOL&ij I=join V=none;""@0((%LENGTH(&eps) EQ 0) AND (%LENGTH(&jpeg) EQ 0))"% GOPTIONS noDISPLAY;"" PROC GPLOT DATA=_trav_(WHERE=(date >= &mindate)) UNIFORM GOUT=Method&jj; AXIS1 LABEL=NONE ORDER=&mincoef TO &maxcoef BY &pas;"&IJ1&NumCl1" a`eurdfde9.; LIMIT=0; LOAD; RUN;"D"" (&graph NE)" (&_nser > &gmax)"O?ERROR: The graphs will not be output: there are too many series"/ERROR: Check the GMAX parameter""%GI1&_nser1" %SAgraph(DATA=&&_var&i,DATE=&date,RAW=&&_var&i,XLIN=xlin,SA=Sadjust, SEASON=Season,IRR=Irregular,TREND=TrendCycle,TDAYS=Calendar,OUTL=Outliers,USR=UserReg,DEBUG=&debug);"(&outtype NE 1)"_NETTOY_"" &_nettoy_ &&_var&i""G"""(&outtype EQ 2)" PROC TRANSPOSE DATA=_seriesb_ OUT=_seriesc_; BY name Series NOTSORTED date; VAR _numeric_; RUN; PROC SORT DATA=_seriesc_; WHERE (UPCASE(_NAME_)^=UPCASE("&date")); BY _Name_ date Name; RUN; PROC TRANSPOSE DATA=_seriesc_(RENAME=(" _Name_=Type)) OUT=_seriesc_(DROP=_Name_); BY Type date; VAR col1; ID Series; RUN; PROC FREQ DATA=_seriesc_ NOPRINT; TABLES type / OUT=_nomser_; RUN; DATA _NULL_; RETAIN nser 0; SET _nomser_; CALL SYMPUT('_typ'!!LEFT(PUT(_N_,"\P4.)),TRIM(LEFT(type))); CALL SYMPUT('_ntyp',LEFT(PUT(_N_,4.))); RUN; DATA"%II1&_ntyp1" &&_typ&i"I"; LENGTH &date"(JI&deb&_nser1"&&_var&i"J"7+ 8; DROP type &pbx12a; SET _seriesc_;"%KI1&_ntyp1"9- IF type="&&_typ&i" THEN OUTPUT &&_typ&i;"K"." IF &date <= &maxdate; RUN;"((%LENGTH(&weights) NE 0)"`T DATA Xorig; MERGE Xorig __trav__(KEEP=&date &nameagr); BY &date; RUN;""&(%LENGTH(&excel) NE 0)"%MI1&_ntyp1" X "del &excel\&&_typ&i...xls"; PROC DBLOAD DBMS=EXCEL DATA=&&_typ&i; PATH="&excel\&&_typ&i...xls"; PUTNAMES YES; FORMAT &date eurdfde9.; LIMIT=0; LOAD; RUN;"M""_NETTOY_", &_nettoy_ _nomser_ _seriesc_""0 ((&errx12 EQ 0) AND (&debug EQ))"oc X "del &dx12ar.\data\*.* /Q"; X "del &dx12ar.\graph\*.* /Q"; X "del &dx12ar.\output\*.* /Q";""j^ DATA ___tt___; SET ___tt___; end=DATETIME(); time=end-start; PUT time= time.; RUN;"0  ((&errx12 EQ 0) AND (&debug EQ))"_S PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_ ___tt___; RUN; QUIT;" "8# 0` P@p0`$TL| <l0` 4 0 X l 0 H X l Tl|4l<Tl0DXl| "# $,%8&@'H(T)`*h+t,-./0123456789;< =,>8?D@PAXB`ClDxE|FGHIJKLMNOPQRSUVW$X0Y 10**-8); ncolcc=NCOL(cc); IF (ncolcc ^=0) THEN DO i=1 TO ncolcc; dd=LOC(x[,cc[i]]^=.); IF (NCOL(dd)^=0) THEN DO; aa=(x[dd,cc[i]]-REPEAT(mean[cc" [i]],NCOL(dd),1))/REPEAT(std[cc[i]],NCOL(dd),1); x[dd,cc[i]]=aa; END; END; cc=LOC(std < 10**-8); ncolcc=NCOL(cc); IF (ncolcc ^=0) THEN DO i=1 TO ncolcc; dd=LOC(x[,cc[i]]^=.); IF (NCOL(dd)^=0) THEN x[dd,cc[i]]=0" ; END; pi=2*ARCOS(0); frq=DO(0,0.5,1/120); frq=frq || {.348125 .431458}; frq=frq || {.294375 .338750}; frq=T(frq)*2*pi; CALL SORT(frq,{1}); nfrq=NROW(frq); nq=INT(2*(nfrq**(1/5))/3"); ww=T(DO(-nq,nq,1))/(2*nq+1); ww2=(1+cos(pi*ww))/2; wn=ww2/(4*pi*ww2[+]); newvar=J(NROW(frq),nvar,.); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0) THEN DO; xx=x[cc,i]; nobs=NROW(xx);"  dd=REPEAT(DO(0,nobs-1,1),nfrq,1)#REPEAT(frq,1,nobs); xsin=SIN(dd)*xx; xcos=COS(dd)*xx; fft=(2*(xcos#xcos+xsin#xsin)/nobs); RUN moymob(fft,mfft,wn); newvar[,i]=mfft; END; END; newvar=10*LOG(newvar["2:nfrq-1,]); frq=(180*frq/pi)[2:nfrq-1,]; newvar=(frq || newvar); CREATE _spectra_ FROM newvar[COLNAME=series]; APPEND FROM newvar; CLOSE _spectra_; QUIT; DATA _NULL_; LENGTH haxis href $ 10000; RETAIN" haxis href ' ';" (&per EQ 12)"C7 href='(30, 60, 90, 120, 125.325, 150, 155.325)';" "9- href='(90, 105.975, 121.95, 137.925)';" haxis='(0'; freq=360/&per; DO i=1 TO INT(&per/2); haxis=TRIM(LEFT(COMPBL(TRIM(LEFT(haxis)) || ', ' || PUT(ROUND(i*freq),6.)))); END; haxis=TRIM(LEFT(COMPBL(haxis || ')'))); IF (&per NOT IN(4,12)) THEN CALL SYMPUT("{'href',TRIM(LEFT(haxis))); CALL SYMPUT('haxis',TRIM(LEFT(haxis))); CALL SYMPUT('href',TRIM(LEFT(href))); RUN;"@%0((%LENGTH(&eps) EQ 0) AND (%LENGTH(&jpeg) EQ 0))"% GOPTIONS noDISPLAY;"%"|p SYMBOL1 I=join C=black V=none; PROC GPLOT DATA=_spectra_ UNIFORM GOUT=Method&jj; AXIS1 LABEL=NONE;"&)IJ1&NumCl1" PLOT (&&ListCl&ij) * freq / OVERLAY FRAME VAXIS=axis1 HAXIS=&haxis HREF=&href LHREF=33 NAME="spgee_&jj._&ij"; TITLE "Cluster &ij"; RUN;""  QUIT; GOPTIONS display; PROC GREPLAY IGOUT=Method&jj TC=Method&jj NOFS GOUT=Method&jj; TDEF newfour DES='four squares of equal size' 1/LLX=1 LLY=51 ULX=1 ULY=99 URX=49 URY=99 LRX=49 LRY=51 color=grey 2/LLX=51 LLY=51 ULX=51" ULY=99 URX=99 URY=99 LRX=99 LRY=51 color=grey 3/LLX=1 LLY=1 ULX=1 ULY=49 URX=49 URY=49 LRX=49 LRY=1 color=grey 4/LLX=51 LLY=1 ULX=51 ULY=49 URX=99 URY=49 LRX=99 LRY=1 color=grey ; TEMPLATE newfour;"$.IJ1&div1" TREPLAY 1: spe_&jj._%EVAL(4*(&ij-1)+1) 2: spe_&jj._%EVAL(4*(&ij-1)+2) 3: spe_&jj._%EVAL(4*(&ij-1)+3) 4: spe_&jj._%EVAL(4*(&ij-1)+4) NAME="SP_&jj._&ij";""5 (&mod NE 0)" TREPLAY"$3IJ1&mod1", &ij: spe_&jj._%EVAL(4*&div+&ij)""* NAME="SP_&jj._%EVAL(&div+1)";"5"6* RUN; QUIT; AXIS;SYMBOL;TITLE;"_NETTOY", &_nettoy _spectra_ _outcorr_"9"m"_NETTOY"A 1&_nettoy _t1_ _eff_ Fstat Factor Medoids FactorX"&?(%LENGTH(&debug) EQ 0)"WK PROC DATASETS LIB=WORK NOLIST; DELETE &_nettoy ; RUN; QUIT;"?"' QUIT; AXIS;SYMBOL;TITLE;" #A0` P@p0` P@p\p   <  ( p  , H \ ,<,T,L(<hLdt,@$L`t0@TH`p,8P`t,DXl 0DpH`p,8P`t , D X l !!,!@!l!!!!!0"""""""#(#h####$4$T$$$$$%(%@%T%%%&&,&`&&&&''@'X't'''$(<(L(`((()()8)L)t)))))T*l*|****<+T+d+x+++++0,,,,,-$-------.$.d.....(/p/////00(0<0h00000D1\1l11112 242T22222233,3l33334,4t44444L5d5t5555554666666D7\7l777$8<8L8`88888 9h99999:4:D:X:x:::::;$;8;L;;;; < <L<<<<<<=4=D=X=====>X>p>>>>? ?0?D????@@D@\@p@@@@At>>>>?$?8?@,@P@d@@AAAXBlBBB(C@CTChCCCHD`DtDDDDDDEE0EHE`EEEFF0FPFFFGGGGH|HIJKLMNOPQRRRRSUlUUUUW XXXYY0ZXZ[[(\0]]]^0^^^^_(_4`8aDbHcTd`elfxg h(hHh\hxhhhhiXjtj|kkklHmmmnHodoooo4pHpdppppqq\qxqqqqrr8r`rtrrs4s@tttuuLvtvpwwxyzzzz({<{p{{{{{ |(|d|x|||}} ~X~l~~~~ ,Tp `t$DX$LԆ8`l<P\dp @T|(4@x̑DXXlLtț(h$Ԟdxp|,T̢H\ĤH\ԥئt<0تīث(Ю(PDXԲ,TH\(4@H0<\|DdpxDX`((,`tTg Xh|@ĘܘDěpĜ 4<Ddht $ؤĥ<dl8@hĩЪ0<ԬЭ8`DL|ܲtд<dXԶк4\о ȿhp|lLTp$\p |dl(<HT$<D(,8@\x `htdDLhTl8ih(ls)=a;"  studls(ls)=c; datels(ls)=SUBSTR(SCAN(xx,2,'$:'),3); END; %END; %IF (&nuser NE 0) %THEN %DO; IF (xx=:'User-defined$') THEN DO; d=TRIM(LEFT(SCAN(xx,2,'$:'))); n=INDEX(xx,':')+1; INPUT @n a b c; DO i=1 TO &nuser;"  IF d=SCAN("&listuser",i,' ') THEN DO; coefreg(i)=a; studreg(i)=c; END; END; END; IF (xx=:'chi$User-defined') THEN DO; n=INDEX(xx,':')+1; INPUT @n a b c; PchiUser=c; END; %END; IF (xx=:" 'indirect') THEN indirect=1; ELSE IF (xx=:'f2.mcd:') THEN INPUT @8 mcd; ELSE IF (xx=:'f2.ic') THEN INPUT @9 ric; ELSE IF (xx=:'f2.f:') THEN INPUT @7 (Irreg Tcycle Season Padj Tdays)(8.2); ELSE IF (xx=:'f2.is') THEN INPUT @9 ris; ELSE IF (xx" =:'f2.fsb1') THEN INPUT @10 fsb1 p_fsb1; ELSE IF (xx=:'f2.fsd8') THEN DO; xx=TRANWRD(xx,'***********',' 999999 '); INPUT @10 fsd8 p_fsd8; END; ELSE IF (xx=:'f2.kw') THEN INPUT @9 kw p_kw; ELSE IF (xx=:'f2.msf') THEN INPUT @9 msf p_msf;" ELSE IF (xx=:'f3.m01') THEN INPUT @9 m1; ELSE IF (xx=:'f3.m02') THEN INPUT @9 m2; ELSE IF (xx=:'f3.m03') THEN INPUT @9 m3; ELSE IF (xx=:'f3.m04') THEN INPUT @9 m4; ELSE IF (xx=:'f3.m05') THEN INPUT @9 m5; ELSE IF (xx=:'f3.m06') THEN" INPUT @9 m6; ELSE IF (xx=:'f3.m07') THEN INPUT @9 m7; ELSE IF (xx=:'f3.m08') THEN INPUT @9 m8; ELSE IF (xx=:'f3.m09') THEN INPUT @9 m9; ELSE IF (xx=:'f3.m10') THEN INPUT @9 m10; ELSE IF (xx=:'f3.m11') THEN INPUT @9 m11; ELSE IF (xx=:"'f3.q:') THEN INPUT @7 q; ELSE IF (xx=:'f3.qm2') THEN INPUT @9 qm2; ELSE IF (xx=:'f3.fail') THEN INPUT @10 fail; ELSE IF (xx=:'f2.idseasonal:') THEN idseas=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF ((xx=:'peaks.seas:') OR (xx=:'peaks.seas.dir:'))"  THEN peakseas=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF ((xx=:'peaks.td:') OR (xx=:'peaks.td.dir:')) THEN peaktd=LEFT(TRIM(SCAN(xx,2,':'))); %IF (&indirect EQ 1) %THEN %DO; ELSE IF (xx=:'if2.mcd:') THEN INPUT @9 imcd; ELSE IF (xx=:'if2.ic') THEN"  INPUT @9 iric; ELSE IF (xx=:'if2.f:') THEN INPUT @7 (iIrreg iTcycle iSeason iPadj iTdays)(8.2); ELSE IF (xx=:'if2.is') THEN INPUT @9 iris; ELSE IF (xx=:'if2.fsb1') THEN INPUT @10 ifsb1 ip_fsb1; ELSE IF (xx=:'if2.fsd8') THEN DO; xx="TRANWRD(xx,'***********',' 999999 '); INPUT @10 ifsd8 ip_fsd8; END; ELSE IF (xx=:'if2.kw') THEN INPUT @9 ikw ip_kw; ELSE IF (xx=:'if2.msf') THEN INPUT @9 imsf ip_msf; ELSE IF (xx=:'if3.m01') THEN INPUT @9 im1; ELSE IF (xx=:"'if3.m02') THEN INPUT @9 im2; ELSE IF (xx=:'if3.m03') THEN INPUT @9 im3; ELSE IF (xx=:'if3.m04') THEN INPUT @9 im4; ELSE IF (xx=:'if3.m05') THEN INPUT @9 im5; ELSE IF (xx=:'if3.m06') THEN INPUT @9 im6; ELSE IF (xx=:'if3.m07') THEN" INPUT @9 im7; ELSE IF (xx=:'if3.m08') THEN INPUT @9 im8; ELSE IF (xx=:'if3.m09') THEN INPUT @9 im9; ELSE IF (xx=:'if3.m10') THEN INPUT @9 im10; ELSE IF (xx=:'if3.m11') THEN INPUT @9 im11; ELSE IF (xx=:'if3.q:') THEN INPUT @7 iq;" ELSE IF (xx=:'if3.qm2') THEN INPUT @9 iqm2; ELSE IF (xx=:'if3.fail') THEN INPUT @10 ifail; ELSE IF (xx=:'if2.idseasonal:') THEN iidseas=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx=:'r1mse:') THEN INPUT @9 r1mse r1mse3; ELSE IF (xx=:"'r1rmse:') THEN INPUT @9 r1rmse r1rmse3; ELSE IF (xx=:'r2mse:') THEN INPUT @9 r2mse r2mse3; ELSE IF (xx=:'r2rmse:') THEN INPUT @9 r2rmse r2rmse3; ELSE IF (xx=:'peaks.seas.ind:') THEN ipeakseas=LEFT(TRIM(SCAN(xx,2,':'))); ELSE IF (xx=:"'peaks.td.ind:') THEN ipeaktd=LEFT(TRIM(SCAN(xx,2,':'))); %END; IF fin THEN DO; Outliers=ao+tc+ls; IF (Aictrans=' ') THEN Aictrans=Transform; Eeffect='No';TDeffect='No';LYeffect='No'; %IF (&leaster NE) %THEN %DO; IF (ABS(ji" Easter_t) > 2) THEN Eeffect='Yes'; %END; %IF (<rad2 NE) %THEN %DO; IF (MAX(ABS(Weekday_t),ABS(SatSun_t)) > 2) THEN TDeffect='Yes'; %END; %IF (<rad1 NE) %THEN %DO; IF (MAX(ABS(Monday_t),ABS(Tuesday_t),ABS(Wednesday_t),"ABS(Thursday_t),ABS(Friday_t), ABS(Saturday_t),ABS(Sunday_t))> 2) THEN TDeffect='Yes'; %END; %IF (&lly NE) %THEN %DO; IF (ABS(LeapYear_t) > 2) THEN LYeffect='Yes'; %END; OUTPUT; %IF (&indirect EQ 1) %THEN %DO;"  IF indirect THEN DO; name=COMPBL(name || " (Ind)"); DO OVER dirnum;dirnum=idirnum;END; DO OVER othernum;othernum=.;END; DO OVER othercar;othercar=' ';END; idseas=iidseas; peakseas=ipeakseas; peaktd=ipeaktd;" Outliers=.; OUTPUT; END; %END; END; RUN; X "cd &dir."; X "copy &outt series.txt"; %IF (%SYSFUNC(FILEEXIST(%CMPRES("&dir.\series.txt"))) EQ 0) %THEN %DO; %LET errx12=1; %GOTO finlec; %END; DATA &outser;" INFILE "&dir.\series.txt" EXPANDTABS LENGTH=l END=fin; LENGTH name type $ 15 year month 3 value 8; RETAIN name type ' '; KEEP date value name type; INPUT xx $VARYING200. l @; IF (xx=:'date') THEN DO; name=TRIM(LEFT(SCAN(xx,2)));" type=PUT(TRIM(LEFT(SCAN(xx,3))),$ftype.); END; ELSE IF ((xx=:'--') OR (xx=' ')) THEN DELETE; ELSE DO; INPUT year 1-4 month 5-6 value; IF (&period EQ 12) THEN date=MDY(month,1,year); ELSE date=YYQ(year,month); OUTPUT;"I= END; RUN; %finlec: %MEND; OPTIONS noxwait;"((%LENGTH(&tseries) EQ 0)"TSERIES" _NUMERIC_""_NETTOY_" __tables__"((%LENGTH(&tseries) NE 0)"  PROC CONTENTS DATA=&data(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN; DATA _null_; LENGTH liste $ 30000; RETAIN liste ' '; SET _nomvar_ END=fin; IF (name ^= UPCASE("&date")); liste=TRIM(LEFT(liste))||' '||TRIM(LEFT(name));"L@ IF fin THEN CALL SYMPUT('tseries',TRIM(LEFT(liste))); RUN;""((%LENGTH(&weights) NE 0)"  PROC IML; name={&tseries}; weights=T({&weights}); nvar=NCOL(name); nww=NROW(weights); IF (nww < nvar) THEN DO; weights=weights // J(nvar-nww,1,weights[nww]); END; CREATE _weights_ FROM weights[COLNAME={'weights'} ROWNAME=name];"~r APPEND FROM weights[ROWNAME=name]; CLOSE _weights_; QUIT; PROC SORT DATA=_weights_; BY name; RUN;""w DATA __trav__(KEEP=&date &tseries &userreg) __period__(KEEP=period); SET &data END=fin; period=DIF(&date); RUN;"_NETTOY_". &_nettoy_ __trav__ __period__" (&period EQ)" PROC SUMMARY DATA=__period__; VAR period; OUTPUT OUT=_means_ MEAN=period; RUN; DATA _NULL_; SET _means_; IF ((25<=period) AND (period<=35)) THEN period=12; ELSE IF ((50<=period) AND (period<=70)) THEN period=6; ELSE IF ((80<=" period) AND (period<=100)) THEN period=4; ELSE IF ((115<=period) AND (period<=135)) THEN period=3; ELSE IF ((175<=period) AND (period<=195)) THEN period=2; ELSE IF ((345<=period) AND (period<=375)) THEN period=1; CALL SYMPUT('period',TRIM(LEFT"&(PUT(period,2.)))); RUN;"_NETTOY_"" &_nettoy_ _means_""4$((&period NE 4) AND (&period NE 12))"bRERROR: The periodicity should be equal to (4, 12) if a seasonal adjustment is done"FINMACRO" ;"" PROC CONTENTS DATA=__trav__(KEEP=&tseries) NOPRINT OUT=_nomvar_(KEEP= name); RUN;kj DATA _nomvar_; SET _nomvar_(IN=in); LENGTH effect $ 32; IF in THEN prov=1; name=UPCASE(name); IF (name ^= UPCASE("&date")); effect=' '; RUN; PROC SORT"1% DATA=_nomvar_; BY name prov; RUN;"_NETTOY_"" &_nettoy_ _nomvar_"((%LENGTH(&userreg) NE 0)"  DATA __userreg__; LENGTH name effect aa $ 32; RETAIN aa ' '; KEEP name effect; liste=UPCASE(TRIM(COMPBL(LEFT("&userreg")))); eff=UPCASE(TRIM(COMPBL(LEFT("®eff")))); nb=COUNT(liste,' '); aa=SCAN(eff,1,' '); IF (aa=' ') THEN aa" ='user'; DO i=1 TO nb+1; name=TRIM(LEFT(SCAN(liste,i,' '))); effect=SCAN(eff,i,' '); IF (effect=' ') THEN effect=aa; IF (name ^= UPCASE("&date")) THEN OUTPUT; aa=effect; END; RUN; PROC SORT DATA=__userreg__; BY name; RUN"; PROC CONTENTS DATA=__trav__(KEEP=&userreg) NOPRINT OUT=_nomvar1_(KEEP= name); RUN; DATA _nomvar1_; SET _nomvar1_; name=UPCASE(name); IF (name ^= UPCASE("&date")); RUN; PROC SORT DATA=_nomvar1_; BY name; RUN; DATA _nomvar_;"g[ MERGE _nomvar_ _nomvar1_(IN=in) __userreg__; BY name; prov=SUM(prov,2*in); RUN;"_NETTOY_"# &_nettoy_ _nomvar1_""  DATA _null_; LENGTH liste list1 list2 list3 $ 30000; RETAIN liste list1 list2 list3 ' '; SET _nomvar_ END=fin; IF (prov=1) THEN DO; ii+1; CALL SYMPUT('_var'!!LEFT(PUT(ii,4.)),TRIM(LEFT(name))); list1=TRIM(LEFT(list1))||' '||TRIM(LEFT(" name)); END; ELSE IF (prov IN(2,3)) THEN DO; jj+1; CALL SYMPUT('_rvar'!!LEFT(PUT(jj,4.)),TRIM(LEFT(name))); list2=TRIM(LEFT(list2))||' '||TRIM(LEFT(name)); list3=TRIM(LEFT(list3))||' '||TRIM(LEFT(effect)); IF (prov=3) THEN DO; liste"=TRIM(LEFT(liste))||' '||TRIM(LEFT(name)); END; END; IF fin THEN DO; CALL SYMPUT('_nser',LEFT(PUT(ii,4.))); CALL SYMPUT('ireg',LEFT(PUT(jj,4.))); CALL SYMPUT('tseries',TRIM(LEFT(list1))); CALL SYMPUT('userreg',TRIM(LEFT(list2)));"pd CALL SYMPUT('regeff',TRIM(LEFT(list3))); CALL SYMPUT('liste',TRIM(LEFT(liste))); END; RUN;" (&liste NE)"tdWARNING: The following variables are both regression variables and variables to be analyzed (&liste)"YIWARNING: They have been removed from the list of variables to be analyzed""((%LENGTH(&weights) NE 0)" DATA _weights_; LENGTH list1 $ 30000 name $ 32; RETAIN list1 ' '; MERGE _weights_ _nomvar_(WHERE=(prov=1)) END=fin; BY name; list1=TRIM(LEFT(list1))||' '||TRIM(LEFT(weights)); IF fin THEN CALL SYMPUT('weights',TRIM(LEFT(list1)));" RUN;"_NETTOY_"$ &_nettoy_ _weights_""wk X "del &dx12ar.\data\*.* /Q"; X "del &dx12ar.\graph\*.* /Q"; X "del &dx12ar.\output\*.* /Q";"_ERREG" 0"k_ PROC IML; USE __trav__; READ all VAR{&tseries} INTO x; READ all VAR{&date} INTO date;" (&userreg NE)"5) READ all VAR{&userreg} INTO userreg;""L@ CLOSE __trav__; series={&tseries}; num=T(1:NCOL(series));"((%LENGTH(&weights) NE 0)"  weights={&weights}; nmiss=(NMISS(x))[,+]; cc=LOC(nmiss=0); Agregat=J(NROW(x),1,.); Agregat[cc]=x[cc,]*T(weights); x=x || Agregat; series=series || {"&nameagr"}; num=num//{0}; Agregat=date || Agregat; CREATE _Agregat_ FROM"`T agregat[COLNAME={"&date" "&nameagr"}]; APPEND FROM agregat; CLOSE _Agregat_;""  x=x+&add; nvar=NCOL(x); add=J(nvar,1,&add); first=J(nvar,1,.); last=J(nvar,1,.); nobs=J(nvar,1,0);lk miss=J(nvar,1,0); max=T(x[<>,]); min=T(x[><,]); period=J(nvar,1,&period); DO i=1 TO nvar; cc=LOC(x[,i]^=.); IF (NCOL(cc)^=0)" THEN DO; first[i]=date[cc[1]]; last[i]=date[cc[NCOL(cc)]]; aa=x[cc[1]:cc[NCOL(cc)],i]; nobs[i]=NCOL(LOC(aa^=.)); miss[i]=NCOL(LOC(aa=.)); x[cc[1]:cc[NCOL(cc)],i]=CHOOSE(aa=.,-99999,aa); END; END; nbyear=INT(nobs/period);"  results=period || first || last || nobs || nbyear || miss || add || max || min || num; nomcols={period first last nobs nbyear nmiss add max min num}; CREATE _stat_ FROM results[COLNAME=nomcols ROWNAME=series]; APPEND FROM results[ROWNAME=series]"; CLOSE _stat_;"%NI1&_nser1" FILE "&dx12ar.\data\X&i..spc"; PUT 'series{'; per=period[&i]; PUT "period=" per; PUT "decimals=&ndec"; PUT "spectrumtype=&spectype peakwidth=&peakw spectrumseries=&specseries";"*(%LENGTH(&specfdate) NE 0)"0$ PUT "spectrumstart=&specfdate";""  cc=LOC(x[,&i]^=.); perdeb=INT(period[&i] * (MONTH(first[&i]) -1) / 12) +1; start=COMPRESS(CONCAT(CHAR(YEAR(first[&i]),4),'.',CHAR(perdeb,2))); PUT "start=" start; PUT "data=(" ; IF (NCOL(cc)^=0) THEN DO j=cc[1] TO cc[NCOL(cc)]; xx=x"g[[j,&i]; IF ((j > 1) & (MOD(j,6)=1)) THEN PUT; PUT xx 16.5 @ +1; END; PUT ")";"((%LENGTH(&weights) NE 0)" ww=weights[&i]; wwabs=ABS(ww); IF (ww >=0) THEN PUT 'comptype=add'; ELSE PUT 'comptype=sub'; PUT "compwt=" wwabs;"" PUT '}';"&(%LENGTH(&model) NE 0)"-! PUT "arima {model=&model }";""((%LENGTH(&pickmdl) NE 0)";/ PUT "pickmdl {file='&dx12ar.\&pickmdl' }";"")(%UPCASE(&automdl) NE NO)"$ PUT "automdl { }";""G!7((%UPCASE(&automdl) NE NO) OR (%LENGTH(&pickmdl) NE 0))"ma PUT "estimate {}"; PUT "forecast {maxlead = &maxlead}"; PUT "outlier {types=(all)}";"!" IF ((&mode = -1) & (min[&i] > 0)) THEN PUT "transform {function =(auto)}"; IF ((&mode = 0) & (min[&i] > 0)) THEN PUT "transform {function =(log)}";"A(&xx11 EQ YES)" PUT "x11 { ";"('(%UPCASE(&maxlead) NE 0)"( PUT "appendfcst=yes ";"'"**(%UPCASE(&listing) EQ ALL)"$ PUT "print=(all)";"*"%-(%UPCASE(&seasma) NE)"-! PUT "seasonalma=(&seasma)";"-"#0(%UPCASE(&tcma) NE)"( PUT "trendma=(&tcma)";"0" IF ((&mode = 0) & (min[&i] > 0)) THEN PUT "mode=mult"; IF ((&mode = 1) | (min[&i]<=0)) THEN PUT "mode=add"; PUT "}";":(&xvarreg EQ 1)"B6 PUT 'x11regression {save=(ao td hol usr xrm) ';"(6(%LENGTH(&xvarreg) NE 0)"." PUT "variables=(&xvarreg)";"6"9(&xaictest NE)"-! PUT "aictest=(&xaictest)";"9":"(=(%LENGTH(&history) NE 0)"nb PUT "history {estimates=(sadj trend sadjchng trendchng seasonal) fstep=(1 2 3" +1 per ") }";"="(@(%LENGTH(&sliding) NE 0)"G; PUT "slidingspans {print=all fixmdl=no save=(tds) }";"@"A"G; PUT 'regression {save=(otl ao ls tc td hol usr rmx) ';"'E(%LENGTH(&varreg) NE 0)ml"+ PUT "variables=(&varreg)";"E"H (&aictest NE)"* PUT "aictest=(&aictest)";"H"L (&userreg NE)"  PUT "user=(&userreg)"; PUT "usertype=(®eff)"; PUT "data=(" ; njk=0; IF (NCOL(cc)^=0) THEN DO j=cc[1] TO (cc[NCOL(cc)]+ &maxlead); DO k=1 TO NCOL(userreg); njk=njk+1; IF (j <= NROW(userreg)) THEN xx=userreg[j",k]; ELSE DO; CALL SYMPUT('_erreg','1'); xx=0; END; IF (xx=.) THEN xx=0; IF ((njk > 1) & (MOD(njk,6)=1)) THEN PUT; PUT xx 20.5 @ +1; END; END; PUT ")";"L" PUT "}";""Q(&_erreg EQ 1)"gWWARNING: For some user regression variables, forecasted values have been put equal to 0"Q"((%LENGTH(&weights) NE 0)" small=min[><]; FILE "&dx12ar.\data\X0.spc"; PUT 'composite{'; PUT "decimals=&ndec"; PUT "spectrumtype=&spectype peakwidth=&peakw"; PUT '}';"&V(%LENGTH(&model) NE 0)"-! PUT "arima {model=&model }";"Z"(Y(%LENGTH(&pickmdl) NE 0)";/ PUT "pickmdl {file='&dx12ar.\&pickmdl' }";"Z"# PUT "automdl { }";" PUT "estimate {}"; PUT "forecast {maxlead = &maxlead}"; PUT "outlier {types=(all)}"; IF ((&mode = -1) & (small > 0)) THEN PUT "transform {function =(auto)}"; IF ((&mode = 0) & (small > 0)) THEN PUT "transform {function =(log)}";"t(&xx11 EQ YES)" PUT "x11 { ";"(`(%UPCASE(&maxlead) NE 0)"( PUT "appendfcst=yes ";"`"*c(%UPCASE(&listing) EQ ALL)"$ PUT "print=(all)";"c"~ IF ((&mode = 0) & (small > 0)) THEN PUT "mode=mult"; IF ((&mode = 1) | (small <=0)) THEN PUT "mode=add"; PUT "}";"m(&xvarreg EQ 1)"B6 PUT 'x11regression {save=(ao td hol usr xrm) ';"(i(%LENGTH(&xvarreg) NE 0)"." PUT "variables=(&xvarreg)";"i"l(&xaictest NE)"-! PUT "aictest=(&xaictest)";"l"m"(p(%LENGTH(&history) NE 0)"nb PUT "history {estimates=(sadj trend sadjchng trendchng seasonal) fstep=(1 2 3" +1 per ") }";"p"(s(%LENGTH(&sliding) NE 0)") PUT "slidingspans { }";"s"t"=1 PUT 'regression {save=(ao td hol usr rmx) ';"'x(%LENGTH(&varreg) NE 0)"+ PUT "variables=(&varreg)";"x"{ (&aictest NE)"* PUT "aictest=(&aictest)";"{" (&userreg NE)"  PUT "user=(&userreg)"; PUT "usertype=(®eff)"; PUT "data=(" ; njk=0; IF (NCOL(cc)^=0) THEN DO j=cc[1] TO (cc[NCOL(cc)]+ &maxlead); DO k=1 TO NCOL(userreg); njk=njk+1; IF (j <= NROW(userreg)) THEN xx=userreg[j",k]; ELSE DO; CALL SYMPUT('_erreg','1'); xx=0; END; IF (xx=.) THEN xx=0; IF ((njk > 1) & (MOD(njk,6)=1)) THEN PUT; PUT xx 16.5 @ +1; END; END; PUT ")";"" PUT "}";""." FILE "&dx12ar.\data\metaf.mta";"%7I1&_nser1";/ PUT "&dx12ar\data\X&i &dx12ar.\output\X&i";"7"((%LENGTH(&weights) NE 0)"9- PUT "&dnmx12ar\data\X0 &dx12ar.\output\X0";"" FILE "&dx12ar.\data\x12arima.bat"; PUT "&dx12ar.\x12a -m &dx12ar.\data\metaf -g &dx12ar.\graph -s -w> &dx12ar.\data\x12arima.txt"; QUIT;"_NETTOY_"! &_nettoy_ _stat_"((%LENGTH(&weights) NE 0)"_NETTOY_"$ &_nettoy_ _agregat_"" X "cd .."; X "cd &dx12ar.\data"; X "x12arima"; %ListX12(DIR=&dx12ar.\graph,TABOUT=&out,OUTSER=_series_,OUTT=&outtb1);"(&errx12 EQ 1)"H8ERROR: A problem occured in the execution of X-12-ARIMA."N>ERROR: Check the error files in the &dx12ar.\OUTPUT directory."FINMACRO" ;""_NETTOY_"" &_nettoy_ _series_"  DATA &out; SET &out; LENGTH series $ 32; DROP num; IF INDEX(name,'X0') THEN DO; series=TRANWRD(name,'X0',"&nameagr"); END; ELSE DO; num=INPUT(SUBSTR(SCAN(name,1),2),5.); series=TRIM(LEFT(SCAN("&tseries",num))); END; RUN; PROC"  SORT DATA=&out OUT=&out; BY series; RUN; PROC SORT DATA=_stat_; BY series; RUN; DATA &out; LENGTH library data series $ 32 period 8 firstdat lastdat $5 nobs nmiss nbyear max min 8; RETAIN maxdate 0; MERGE _stat_ &out END=fin; BY series;" firstdat=PUT(first,MONYY5.); lastdat=PUT(last,MONYY5.); maxdate=MAX(maxdate,last); DROP num maxdate; IF INDEX("&data",'.') THEN DO; data=SCAN("&data",2,'.'); library=SCAN("&data",1,'.'); END; ELSE DO; data="&data"; library="'Work'; END; IF (num>=0) THEN CALL SYMPUT('_mean'||LEFT(PUT(num,5.)),LEFT(PUT((Finmode='multiplicative'),2.))); IF fin THEN CALL SYMPUT('maxdate',TRIM(LEFT(PUT(maxdate,10.)))); RUN; DATA _NULL_; LENGTH liste $ 30000; SET &out END=fin;"  RETAIN liste ' ';" (&xx11 EQ NO)"' IF (aape0 = .) THEN DO;""& IF (fail = .) THEN DO;" PUT 'WARNING: problem with X12arima with series' +1 series; liste=TRIM(LEFT(TRIM(LEFT(liste)) || ' ' || TRIM(LEFT(series)))); END; IF fin THEN CALL SYMPUT('pbx12a',LEFT(TRIM(liste))); RUN;"&(%LENGTH(&excel) NE 0)" X "del &excel\&out..xls"; PROC EXPORT DATA= &out OUTFILE= "&excel" DBMS=EXCEL REPLACE; SHEET="ResultsX12"; RUN;""J:((%UPCASE(&listing) EQ ALL) OR (%UPCASE(&listing) EQ YES))"%>I1&_nser1" DATA _null_; INFILE "&dx12ar.\output\X&i..out" LENGTH=l; INPUT xx $varying200. l; FILE PRINT; IF INDEX(xx,"U. S. Department of Commerce") THEN DO; xx="X-12-ARIMA run of &&_var&i"; PUT / xx $varying200. l /; END;"4( ELSE PUT xx $varying200. l; RUN;">""((%LENGTH(&weights) NE 0)"DEB" 0"_VAR0" &nameagr"NB DATA __trav__; MERGE _Agregat_ __trav__; BY &date; RUN;""DEB" 1"  PROC SORT DATA=_series_ OUT=_seriesb_; BY name date type; RUN; PROC TRANSPOSE DATA=_seriesb_ OUT=_seriesb_(RENAME=(date=&date)); BY name date; VAR value; ID type; RUN; PROC SORT DATA=&out(KEEP=Series Name Finmode) OUT=__scheme__; BY Name;"  RUN; DATA _seriesb_; LENGTH name $ 32; MERGE _seriesb_ __scheme__; BY Name; ARRAY varx Calendar TradingDays Holidays Outliers UserReg AO LS TC SO RP; Model=(Finmode='multiplicative'); DROP Finmode _Name_ Model; DO OVER varx; IF (varx=.)"' THEN varx=Model;END; RUN;"_NETTOYon_"/ &_nettoy_ _seriesb_ __scheme__"0 ((&outtype EQ 1) OR (&graph NE))" DATA"%AI1&_nser1"." &&_var&i(RENAME=(Xorig=&&_var&i))"A" ; LENGTH &date Xorig Xlin Calendar TradingDays Holidays Outliers UserReg TrendCycle Sadjust Season Irregular AO LS TC SO RP &outtabl 8; KEEP &date Xorig Xlin Calendar TradingDays Holidays Outliers UserReg TrendCycle Sadjust Season Irregular AO LS TC"  SO RP &outtabl; ARRAY varx Calendar TradingDays Holidays Outliers UserReg AO LS TC SO RP; SET _seriesb_; DROP name; IF N(OF Xorig Xlin Calendar TradingDays Holidays Outliers UserReg TrendCycle Sadjust Season Irregular AO LS TC SO RP)=0 THEN" DELETE;"%BI1&_nser1"4( IF name="X&i" THEN OUTPUT &&_var&i;"B" RUN;"(&outtype EQ 2)"%CI1&_nser1"_NETTOY_"" &_nettoy_ &&_var&i"C""((%LENGTH(&weights) NE 0)"  DATA &nameagr(RENAME=(Xorig=&nameagr)); LENGTH &date Xorig Xlin Calendar TradingDays Holidays Outliers UserReg TrendCycle Sadjust Season Irregular &outtabl Season_Ind Irregular_Ind TrendCycle_Ind Sadjust_Ind 8; KEEP &date Xorig Xlin"  Calendar TradingDays Holidays Outliers UserReg TrendCycle Sadjust Season Irregular &outtabl Season_Ind Irregular_Ind TrendCycle_Ind Sadjust_Ind; ARRAY varx Calendar TradingDays Holidays Outliers UserReg; SET _seriesb_(WHERE=(name='X0'))"j^; DROP name; RUN; DATA &nameagr; MERGE _Agregat_ &nameagr; BY &date; RUN;"(&outtype EQ 2)"_NETTOY_"" &_nettoy_ &nameagr"""&(%LENGTH(&excel) NE 0)"(EI&deb&_nser1" PROC EXPORT DATA= &&_var&i OUTFILE= "&excel" DBMS=EXCEL REPLACE; SHEET="&&_var&i"; RUN;"E"" (&graph NE)" (&_nser > &gmax)"O?ERROR: The graphs will not be output: there are too many series"/ERROR: Check the GMAX parameter""%HI1&_nser1" %SAgraph(DATA=&&_var&i,DATE=&date,RAW=&&_var&i,XLIN=xlin,SA=Sadjust, SEASON=Season,IRR=Irregular,TREND=TrendCycle,TDAYS=Calendar,OUTL=Outliers,USR=UserReg,DEBUG=&debug);"(&outtype NE 1)"_NETTOY_"" &_nettoy_ &&_var&i""H"""(&outtype EQ 2)" PROC TRANSPOSE DATA=_seriesb_ OUT=_seriesc_; BY name Series NOTSORTED date; VAR _numeric_; RUN; PROC SORT DATA=_seriesc_; WHERE (UPCASE(_NAME_)^=UPCASE("&date")); BY _Name_ date Name; RUN; PROC TRANSPOSE DATA=_seriesc_(RENAME=(" _Name_=Type)) OUT=_seriesc_(DROP=_Name_); BY Type date; VAR col1; ID Series; RUN; PROC FREQ DATA=_seriesc_ NOPRINT; TABLES type / OUT=_nomser_; RUN; DATA _NULL_; RETAIN nser 0; SET _nomser_; CALL SYMPUT('_typ'!!LEFT(PUT(_N_,"\P4.)),TRIM(LEFT(type))); CALL SYMPUT('_ntyp',LEFT(PUT(_N_,4.))); RUN; DATA"%JI1&_ntyp1" &&_typ&i"J"; LENGTH &date"(KI&deb&_nser1"&&_var&i"K"7+ 8; DROP type &pbx12a; SET _seriesc_;"%LI1&_ntyp1"9- IF type="&&_typ&i" THEN OUTPUT &&_typ&i;"L"." IF &date <= &maxa odate; RUN;"((%LENGTH(&weights) NE 0)"`T DATA Xorig; MERGE Xorig __trav__(KEEP=&date &nameagr); BY &date; RUN;""&(%LENGTH(&excel) NE 0)"%NI1&_ntyp1" PROC EXPORT DATA= &&_typ&i OUTFILE= "&excel" DBMS=EXCEL REPLACE; SHEET="&&_typ&i"; RUN;"N""_NETTOY_", &_nettoy_ _nomser_ _seriesc_""0 ((&errx12 EQ 0) AND (&debug EQ))"oc X "del &dx12ar.\data\*.* /Q"; X "del &dx12ar.\graph\*.* /Q"; X "del &dx12ar.\output\*.* /Q";""j^ DATA ___tt___; SET ___tt___; end=DATETIME(); time=end-start; PUT time= time.; RUN;"0  ((&errx12 EQ 0) AND (&debug EQ))"_S PROC DATASETS LIBRARY=work NOLIST; DELETE &_nettoy_ ___tt___; RUN; QUIT;" ",# 0` P@p0`$TL| <l0` 4 0 X l 0 H X l Tl|4l@Xl,@T| $0 , 8!@"L#T$`%h&t'()*+,-./01234678$90:<;H<L=T>`?h@tABCDEFGHIJKLMNOQRS$T0U