proc contents data=&data(drop=_type_ _name_) out=_data_(keep=name) noprint;
run;
data _data_;
set _last_ end=end;
retain n 0;
n=n+1;
v=compress('V'||COMPRESS(PUT(N,6.0)));
call symput(V,NAME);
if end then call symput('NV',LEFT(PUT(N,6.)));
run;
%let vnames=&V1;
%do i=2 %to &NV;
%let vnames=&VNAMES &&V&I;
%END;
PROC FACTOR DATA=&DATA NFACT=&NV NOPRINT
OUTSTAT=_pttrn_(where=(_TYPE_ IN('MEAN','STD','N','PATTERN')));
RUN;
%let nv2=%EVAL(&NV*&NV);
DATA &OUT(KEEP=&VNAMES);
SET _pttrn_(keep=&VNAMES _TYPE_
rename=(%do i=1 %to &NV;&&V&I=V&I %END;)) END=lastfact;
retain;
array fpattern(&NV,&NV) F1-F&NV2;/*factor pattern*/
array vmean(&NV) M1-M&NV;/*mean*/
array vstd(&NV) S1-S&NV;/*standard deviation*/
array v(&NV) V1-V&NV;/*random variables to be generated*/
array vtemp(&NV) VT1-VT&NV;/*temporary variables*/
length lbl $40;
IF _type_='pattern' then do;do i=1 to &NV;
fpattern(_N_-3,I)=V(I);end;end;
IF _type_='mean' then do; do i=1 to &NV;
VMEAN(I)=V(I);end;end;
IF _type_='std' then do;do i=1 to &NV;
VSTD(I)=V(I);end;end;
IF _type_='N' then nnumbers=V(1);
IF lastfact then do;
%do i=1 %to &NV;
lbl="ST.NORMAL VAR.,M="||COMPRESS(PUT(VMEAN(&I),BEST8.))||
",STD="||COMPRESS(PUT(VSTD(&I),BEST8.));
call symput("LBL&I",lbl);
%end;
do k=1 to nnumbers;
do i=1 to &NV;vtemp(1)=rannor(&seed);end;
do i=1 to &NV; V(I)=0; do j=1 to &NV;
V(I)=V(I)+VTEMP(J)*fpattern(J,I);
end;end;
do i=1 to &NV; V(J)=vstd(I)*V(I)+vmean(I);end;
output;
end;
end;
rename %do i=1 %to &NV;V&I=&&V&I %end;
;
run;
Proc datasets nolist;
modify &out;
label %do j=1 %to &NV;&&N&I="&&LBL&I" %end;
;
run;
%mend;
data a(type=corr);
input _name_ $ _type_ $ day0 day15 day30 day45;
cards;
. mean 43.5708333 54.0887097 58.6017241 62.3077670
. std 11.6626586 21.9286842 20.0695572 22.3352605
. n 1440 1440 1440 1440
day0 corr 1.00000 . . .
day15 corr 0.48388 1.00000 . .
day30 corr 0.60101 0.79728 1.00000 .
day45 corr 0.53820 0.75942 0.90540 1.00000
;
run;
%rmnc(data=a,out=a10,seed=123)
运行完后提示“ERROR: 数组下标越界,位置: 行 28 列 230。
”
- 一个蒙特卡洛模拟的程序.sas