Dans l'étape Import_This, préférez toujours les instructions CALL RANNOR aux fonctions RANNOR() traditionnelles. Sur des simulations à grande échelle (ici configurées jusqu'à 50 000 itérations), la version CALL est nettement plus performante en termes de gestion mémoire et de temps CPU.
Type : CREATION_INTERNE
Toutes les données sont générées de manière synthétique à l'intérieur du script. Aucune source de données externe n'est lue. La génération commence par une boucle DO pour créer une table de paramètres, qui est ensuite étendue et enrichie avec des données aléatoires pour simuler un processus réel.
| 1 | DATA Test_Matrix; LENGTH Vendor $21.; |
| 2 | DO Month=1 TO 12; |
| 3 | Mon="2008-"||PUT(Month, Z2.0); |
| 4 | Num=20+3*INT(Month/3); Mean=18; Sigma=2; DA=120; DB=.75; D_Sig=10; |
| 5 | Rate=.75; Vendor="ChiTronix Components"; OUTPUT; |
| 6 | Num=25+INT(Month/3); Mean=17; Sigma=2+(Month/12); DA=120; DB=2; D_Sig=20; |
| 7 | Rate=4-Month/4; Vendor="Duality Logic"; OUTPUT; |
| 8 | Num=15; Mean=13; Sigma=3; DA=140; DB=.5; D_Sig=15; |
| 9 | Rate=ROUND(1+Month/3, .1); Vendor="Empirical Engineering"; OUTPUT; |
| 10 | END; |
| 11 | RUN; |
| 1 | DATA Test_Matrix; SET Test_Matrix; |
| 2 | Mean = ROUND(Mean, .1); |
| 3 | Sigma = ROUND(Sigma, .1); |
| 4 | RUN; |
| 5 | PROC SORT DATA=Test_Matrix; BY Vendor Month; RUN; |
| 1 | DATA RECORDS; SET TEST_MATRIX; |
| 2 | DO Unit=1 TO Num; |
| 3 | OUTPUT; |
| 4 | END; |
| 5 | RUN; |
| 1 | %let D=500; %let D=7500; %LET D = 50000; %let B = 1; |
| 2 | DATA Import_This; SET RECORDS; retain SEED0 SEED1 SEED2 SEED3; |
| 3 | FORMAT Test_Time $25. Delay $12. Del 8.0 Resistance 8.2 RESULT $8. Fail 8.0; |
| 4 | FORMAT TestTime DATETIME20. TestDate MMDDYY10.; |
| 5 | TestTime=MDY(Month, min(30,Unit), 2008)*60*60*24; |
| 6 | TestDate=DATEPART(TestTime); |
| 7 | Test_Time=PUT(TestTime, DateTime20.); |
| 8 | IF Vendor="Empirical Engineering" THEN Test_Time=PUT(TestDate, MMDDYY10.); |
| 9 | IF _N_=1 THEN DO; SEED0=12345; SEED1=54321; SEED2=15243; SEED3=34251; END; |
| 10 | CALL RANNOR(SEED0, Z); |
| 11 | Resistance = Mean + Sigma*Z; |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | FORMAT RESULT $8.; |
| 17 | RESULT = "Pass"; Fail=0; |
| 18 | IF Resistance < 12.5 THEN RESULT="Fail Low"; |
| 19 | IF Resistance > 22.5 THEN RESULT="Fail Hi"; |
| 20 | IF RESULT ne "Pass" THEN Fail=1; |
| 21 | CALL RANNOR(SEED1, De); |
| 22 | Del = DA + DB*Resistance + .2*Resistance**2 + D_Sig*De; |
| 23 | Delay=PUT(Del, 8.0); |
| 24 | IF Vendor="Duality Logic" THEN DO; |
| 25 | IF Month=12 AND Unit>20 THEN Delay="N/A"; |
| 26 | END; |
| 27 | IF Vendor="Empirical Engineering" THEN DO; |
| 28 | IF Month=4 AND Unit>10 THEN Delay="N/A"; |
| 29 | END; |
| 30 | |
| 31 | |
| 32 | FORMAT Defects 8.0; |
| 33 | CALL RANPOI(Seed3, Rate, Defects); |
| 34 | DROP Mean Sigma Z Num DA DB D_Sig De Rate |
| 35 | SEED0 SEED1 SEED2 SEED3 |
| 36 | TestTime TestDate Del Defects; |
| 37 | RUN; |
| 1 | |
| 2 | PROC DATASETS LIBRARY=WORK GENNUM=ALL NOLIST; |
| 3 | DELETE Test_Matrix Records; |
| 4 | RUN; |
| 5 | |
| 6 | QUIT; |
| 7 |
| 1 | PROC EXPORT DATA=Import_This |
| 2 | OUTFILE ="&JES.input_data/import_this.csv" REPLACE; |
| 3 | RUN; |
| 4 | |
| 5 | PROC IMPORT DATAFILE="&JES.input_data/import_this.csv" |
| 6 | OUT =Import REPLACE; |
| 7 | RUN; |