楼主您别怪我,你这东西···真的不值这个价钱。。。我发出来了。
*Avec ces deux méthodes ,vous n'aurez pas besoin de proc iml */
/*1 ère méthode pour calculer la var hs */
data zozo;
input p1 p5;
cards;
run;
%macro insert_percentile;
proc sql;
insert into zozo
values (&p1,&p5);
quit;
%mend insert_percentile;
data toto;
do t = 1 to 500;
rdt= ranuni(-2)*t;
output;
end ;
run;
%macro creation_percentile;
ods listing close;
%do i=0 %to 249;
data tata ;
set toto (firstobs=%eval(1+&i) obs=%eval(250+&i));
run;
proc univariate data= tata;
var rdt;
output out= percentile p1= p1 p5=p5;
run;
data _null_;
set percentile;
call symput ('p1',p1);
call symput ('p5',p5);
call execute ('%insert_percentile');
run;
%end;
%mend creation_percentile ;
%creation_percentile;
ods listing;
*création d'une table temporaire zozo,qui va servir plutard à insérer les
percentiles ;
*macro 'insert_percentile' permettant d'insérer les percentiles estimés dans
la table temporaire zozo avec sql;
*ici j'ai pris une table 'toto' quelconque ressemblant à peu près à la table
que vous allez utilisez,juste pour décrire ce que je fais;
*création de la macro 'creation_percentile' ,qui va utiliser les facilités des
data step: firstobs et obs pour faire une table glissante;
* j'utilise ici 'ods listing close' pour bloquer toute sortie dans ma fenêtre
de résultats,sans cette option on aurait compter 250 icones 'proc univariate'
dans la fenêtre de résultats;
*je prends le soin d'utiliser 'ods listing' à la fin de l'exécution de ma macro
pour débloquer la fenêtre de résultats que j'avais bloqué;
*création de macro variables contenant les percentiles avec 'call symput' dans
le step 'data _null_';
*cérise sur le gateau je fais tourner une procédure sas dans une étape data
grace à la commande 'call execute' ;
/*2ème méthode plus subtile ,plus short, et plus fast que la précédente , car
je code en sql/macro*/
data zozo;
input p1 p5;
cards;
run;
data toto;
do t = 1 to 500;
rdt= ranuni(-2)*t;
output;
end ;
run;
%macro creation_percentile;
ods listing close;
%do i=0 %to 249;
data tata ;
set toto (firstobs=%eval(1+&i) obs=%eval(250+&i));
run;
proc univariate data= tata;
var rdt;
output out= percentile p1= p1 p5=p5;
run;
proc sql;
select p1,p5 into :p1,:p5 from percentile ;
insert into zozo
values (&p1,&p5);
quit;
%end;
%mend creation_percentile ;
%creation_percentile;
ods listing;