楼主: txyw
1085 2

一个蒙特卡洛模拟的程序,不知道错误在哪,希望大牛们提示!谢谢! [推广有奖]

  • 6关注
  • 1粉丝

教师

副教授

11%

还不是VIP/贵宾

-

威望
0
论坛币
7254 个
通用积分
9.2401
学术水平
0 点
热心指数
0 点
信用等级
-2 点
经验
59129 点
帖子
400
精华
0
在线时间
949 小时
注册时间
2010-7-26
最后登录
2022-11-25

楼主
txyw 在职认证  发表于 2014-10-26 15:09:00 |只看作者 |坛友微信交流群|倒序 |AI写论文
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
%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
二维码

扫码加我 拉你入群

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

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

关键词:蒙特卡洛模拟 蒙特卡洛 不知道 蒙特卡 Variables contents 蒙特卡洛 程序

天下有我!天下有你!天下有我和你!
沙发
jingju11 发表于 2014-10-26 22:36:44 |只看作者 |坛友微信交流群
错误的直接原因是V(J) =vstd(i)*V(I)+vmean(I); 里的J总解析为&NV+1。retain;的作用是什么呢?
及时如此,程序的逻辑和某些细节也好像有些问题。
京剧

使用道具

藤椅
txyw 在职认证  发表于 2014-10-27 08:53:47 |只看作者 |坛友微信交流群
这个程序是我在一篇论文上摘录的,不知道为何就跑不出来,都两天了,烦死了

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 19:09