计数器/在SAS宏内循环

时间:2017-08-08 20:45:28

标签: loops macros sas dataset

我正在教授SAS课程,并且正在尝试模拟。我目前正在尝试模拟棒球阵容。我对宏不是很强大,并且能够通过MUCH试验和错误以及此网站上的一些帮助来完成此代码。我希望有人能帮助我走到终点。

我的目标是能够正确使用计数器 我正在读取一个有9个观测值的数据集,并且有一个名为cutoff的变量(它是根据击球手确定命中的能力而使用的截止值,并将与randvar进行比较)。变量'order'只是为了让它更容易理解(请注意截止周期每9个击球员循环)。一旦三分之一出局(局内结束),Count_outs将出局重置为0。

我需要能够在这9个观察数据集中重复阅读,我所做的方式(前面有一些帮助)是创建一个名为'out'的数据集,我已附加到我的数据按照我下面的方式设置'orig'。

除了一些例外,一切都按照我的意愿行事。我希望一个计数器在27次出局时重置为0。

经过18次观察,它按照我的意愿工作,虽然第19次观察,但注意到第19次观察的缺失。所以,当然,我想要的是第19次(及以后)观察中有一个随机变量(从第19次观察开始缺少每第9次观察)以及相应地更新计数器。

另一个我认为应该是一个容易解决的问题是,计数不会在正确的位置下降。注意第一个观察的randvar = 0.18(小于截止值,这应该导致out并且count = 1.但是,之后它正常工作。我尝试修改了几十次)。有人可以帮忙吗?

非常感谢

%macro replicate(new,out,n)/des=’&out is &new repeated &n times.’;
  Data & out;
  Set &new;
  %do i=1 %to &n;
    Data &out;
      randvar=uniform(1);
      if randvar<cutoff then do;
        count+1;
        count_outs+1;
      end;
      set &out &new;
      if count_outs=3 then count_outs=0;
      if count=28 then do;
        set &new;
        count=1;
      end;
    run;
  run;
  %end;
%mend;

注意:我尝试显示输出,但无法正确格式化。

1 个答案:

答案 0 :(得分:1)

您以非常不必要或不合适的方式使用宏。宏只是编写SAS代码 - 因此不要将任何内容放入正常写入的宏中,除非它之前有%

这里有一个类似的结构:

data out;
  set in;
  data out; 
    set in out;
  run;
run;
那显然不会起作用,对吧?外部数据/集合将快速结束,然后内部数据/集合将运行。

无论如何,您不需要执行任何操作来进行模拟。你可以在宏外做任何事情。

data out;
  call streaminit(7);           *seed better random number engine;
  do pointvar = 1 by 1 until (outs=27);   *iterate starting at 1 and stop when 27 outs;
    randvar = rand('Uniform');  *better random number engine;
    if pointvar > 9 then pointvar=1;      *reset to 1 if over 9;
    set in point=pointvar;      *pull the row we need;
    if randvar < cutoff then do;
      outs+1;
      outs_inning+1;
    end;
    output;
    if outs_inning=3 then outs_inning=0;
  end;
  stop;
run;

这可以做你想要的(或多或少,你不提供样本数据,所以我无法测试)。不需要宏;您当然可以根据需要定义任意数量的宏变量(输入,输出等)。