全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1373 2
2014-10-26
%macro rmnc(data=,out=,seed=0);
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。



一个蒙特卡洛模拟的程序.zip
大小:(1.25 KB)

 马上下载

本附件包括:

  • 一个蒙特卡洛模拟的程序.sas

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-10-26 22:36:44
错误的直接原因是V(J) =vstd(i)*V(I)+vmean(I); 里的J总解析为&NV+1。retain;的作用是什么呢?
及时如此,程序的逻辑和某些细节也好像有些问题。
京剧
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-27 08:53:47
这个程序是我在一篇论文上摘录的,不知道为何就跑不出来,都两天了,烦死了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群